name: reconcile description: Cross-validates ecosystem assumptions against project semantic memory. Identifies drift, schema divergence, and misalignments across multiple codebases. stage: 5
Reconcile Skill (Stage 5)
This skill compares what each project says about itself (via .gt/memory/semantic.json) against what the ecosystem assumes, producing an alignment report and checkpoint.
When to Use
Use this skill when:
- A plugin ships a new version
- A new project is added to the ecosystem
- Quality gates or schemas change across plugins
- Steering questions are resolved and decisions recorded
- Prior reconcile is stale (check
.checkpoint.jsontimestamp)
Output Structure
project/
└── scopecraft/
├── ALIGNMENT_REPORT.md # Human-readable findings
├── PERSPECTIVES.md # Side-by-side project self-reports
└── .checkpoint.json # Machine-readable state for recovery
Output templates: templates/ | Checkpoint schema: checkpoint-schema.json
Ecosystem Configuration
The reconcile skill reads project locations from ~/.lisa/ecosystem.json.
Schema: ecosystem-config-v2
{
"$schema": "ecosystem-config-v2",
"name": "ecosystem-name",
"projects": [
{
"name": "project-name",
"path": "~/github/org/repo",
"remote": "https://github.com/org/repo",
"role": "role-description",
"active": true,
"notes": "optional context"
}
],
"updated": "YYYY-MM-DD"
}
New in v2: The remote field (optional) specifies the git remote URL. When present, reconcile can locate projects even if cloned to non-standard paths by matching git remote get-url origin. The path field remains the primary lookup; remote is a fallback for project identification and portability.
Backward compatibility: ecosystem-config-v1 (without remote field) is still fully supported. Reconcile will not fail on v1 configs.
Path handling: All paths use ~/ for portability. Expand tildes to absolute paths before file access. Example: ~/github/auge2u/lisa3 becomes /Users/<user>/github/auge2u/lisa3.
Standalone Mode
When ~/.lisa/ecosystem.json is missing or contains only one project, reconcile runs in standalone mode:
- Reports on the single project only (current directory)
- Reads local
.gt/memory/semantic.jsonandscopecraft/artifacts - Produces a simplified ALIGNMENT_REPORT.md (no cross-project comparison)
- Checkpoint records single-project state for context recovery
- Prints informational message: "Running in standalone mode (1 project). Add projects to ~/.lisa/ecosystem.json for ecosystem reconciliation."
Reconciliation Procedure
Step 0: Check for Incremental Mode
If a prior checkpoint exists (scopecraft/.checkpoint.json):
- Read each project's last known git commit hash from
checkpoint.projects.<name>.git_hash - For each active project with a known path, check current
git rev-parse HEAD - If the hash matches, the project is unchanged -- skip re-scanning its semantic.json (use cached state from checkpoint)
- If the hash differs or is missing, mark as changed -- perform full scan
- If
--forceflag is set (or user explicitly requests full re-scan), skip this optimization and scan everything
This makes reconcile faster for large ecosystems where most projects haven't changed.
Step 1: Load Ecosystem Config
- Read
~/.lisa/ecosystem.json - Validate it has
projectsarray with at least 1 entry - Expand all
~paths to absolute paths - Note which projects are
active: true - For each project with a
remotefield, if thepathdoesn't exist, try to locate the repo by scanning common clone directories for a matchinggit remote get-url origin
If ~/.lisa/ecosystem.json is missing:
- If the current directory has
.gt/memory/semantic.json, run in standalone mode (see above) - Otherwise, stop and instruct user to create the config. Provide the schema above.
Step 2: Gather Semantic Memory
For each active project:
- Check if
<project.path>exists locally - If local: read
<project.path>/.gt/memory/semantic.json - If not local: try GitHub API as fallback (e.g.
gh api repos/<org>/<repo>/contents/.gt/memory/semantic.json) - If neither works: record project as
status: "not-found"and continue
Handle different schemas gracefully:
- Lisa and Carlos use
semantic-memory-v1schema withecosystem_role,integration_points,non_goals - Conductor (and other gastown projects) may use
https://gastown.dev/schemas/semantic-memory.jsonwithout ecosystem fields - Extract common fields regardless of schema:
project.name,project.type,project.primary_language,tech_stack - Flag schema differences as a finding (not an error)
Step 3: Read Existing Ecosystem State
If running from ecosystem root:
- Read
scopecraft/ALIGNMENT_REPORT.mdif it exists (prior findings) - Read
scopecraft/.checkpoint.jsonif it exists (prior state) - Note the prior reconcile version and timestamp for change tracking
Step 4: Compare Perspectives
For each pair of projects, check:
| Check | What to compare |
|---|---|
| Role conflicts | Do any two projects claim the same role or write to the same outputs? |
| Interface agreements | Does what project A says it writes match what project B says it reads? |
| Tech stack drift | Are shared dependencies on compatible versions? |
| Constraint violations | Does any project violate another's stated constraints or non-goals? |
| Capability gaps | Are expected capabilities (from design docs) missing from self-reports? |
| Schema divergence | Do projects use different semantic.json schemas? What fields are missing? |
| Stale assumptions | Are any assumptions from prior reconcile now outdated? |
Classify each finding as:
- Alignment — Both projects agree
- Misalignment — Projects contradict each other (assign severity: HIGH/MEDIUM/LOW)
- Gap — Expected information is missing
Step 5: Validate Gate Configs
For each project that has quality gates:
- Check if
gates.yamlexists (declarative) or gates are hardcoded - Compare gate definitions across plugins — look for:
- Same gate name, different criteria
- Missing gates that another plugin expects
- Format inconsistencies (declarative vs hardcoded)
- Record gate config misalignments
Step 6: Generate Outputs
ALIGNMENT_REPORT.md
# Ecosystem Alignment Report
**Generated:** YYYY-MM-DD (reconcile vX.Y.Z)
**Previous reconcile:** YYYY-MM-DD vX.Y.Z (or "none")
**Ecosystem root:** <repo name>
**Projects:** <list with status>
---
## Summary
| Status | Count | Change from previous |
|--------|-------|----------------------|
| Aligned | N | +/- N |
| Misaligned | N | +/- N |
| Gaps | N | +/- N |
**Overall assessment:** <2-3 sentence summary>
---
## Changes Since vX.Y.Z
<!-- Only if prior checkpoint exists -->
| Item | Previous | Current | Impact |
|------|----------|---------|--------|
---
## Alignments (What's Working)
### A1: <title>
<description of what both projects agree on>
<!-- Repeat for each alignment -->
---
## Misalignments (Need Resolution)
### M1: <title> (PRIORITY: HIGH/MEDIUM/LOW)
**<Project A>'s view:** ...
**<Project B>'s view:** ...
**Impact:** ...
**Resolution:** ...
**Status:** new/unchanged/worsened
<!-- Repeat for each misalignment -->
---
## Gaps (Missing Information)
### G1: <title>
<what's missing and why it matters>
---
## Steering Questions
| # | Question | Decision or Options |
|---|----------|---------------------|
---
## Next Actions
| Priority | Action | Owner | Blocks |
|----------|--------|-------|--------|
PERSPECTIVES.md
# Ecosystem Perspectives
**Generated:** YYYY-MM-DD (reconcile vX.Y.Z)
**Projects scanned:** N attempted, N found
---
## Project Status Matrix
| Field | Project A | Project B | ... |
|-------|-----------|-----------|-----|
| Status | found/not-found | ... | |
| Version | X.Y.Z | ... | |
| Schema | semantic-memory-v1 | ... | |
<!-- Key fields from each semantic.json -->
---
## <Project Name> Self-Report
**Source:** <path to semantic.json>
| Attribute | Value |
|-----------|-------|
<!-- Extracted fields -->
**Reads from:** ...
**Writes to:** ...
**Does not own:** ...
<!-- Repeat for each project -->
---
## Ecosystem Role Comparison
| Responsibility | Project A | Project B | Conflict? |
|----------------|-----------|-----------|-----------|
---
## Interface Agreement Check
| Interface | Project A says | Project B says | Match? |
|-----------|---------------|----------------|--------|
---
## Schema Divergence Note
<!-- Only if schemas differ across projects -->
.checkpoint.json
Formal JSON Schema: checkpoint-schema.json
{
"$schema": "reconcile-checkpoint-v1",
"reconcile": {
"timestamp": "ISO-8601",
"version": "X.Y.Z",
"previous_version": "X.Y.Z or null",
"ecosystem_root": "repo-name",
"method": "lisa reconcile skill (Stage 5)"
},
"projects": {
"<name>": {
"path": "~/...",
"status": "found|not-found",
"source": "local filesystem|GitHub API",
"semantic_json": {
"exists": true,
"version": "X.Y.Z",
"schema": "schema-identifier",
"last_scan": "ISO-8601",
"project_name": "name",
"role": "role"
},
"scopecraft": {
"exists": true,
"files": ["..."],
"level": "project|ecosystem"
},
"alignment": "aligned|mostly-aligned|divergent|not-found"
}
},
"alignment_summary": {
"total_projects": 0,
"found": 0,
"missing": 0,
"aligned": 0,
"mostly_aligned": 0,
"divergent": 0,
"alignments": 0,
"misalignments": 0,
"gaps": 0
},
"misalignments": [
{
"id": "M1",
"severity": "high|medium|low",
"description": "...",
"affects": ["project-names"],
"resolution": "...",
"status": "new|unchanged|worsened|resolved"
}
],
"resolved": [],
"decisions": {
"resolved_date": "YYYY-MM-DD",
"steering_questions": [],
"open_questions": []
},
"next_reconcile_triggers": []
}
Schema Tolerance
External projects (e.g., Conductor) may produce their own reconcile checkpoints with different field names. When reading external checkpoints during reconcile, extract common fields regardless of schema:
misalignments/remaining_misalignments— treat as equivalentsteering_questions/steering_questions_resolved+open_queries— extract both- Different severity scales or status enums — normalize to Lisa's convention
The reconcile-checkpoint-v1 schema (see checkpoint-schema.json) is canonical for Lisa's own checkpoints. External formats are tolerated as input, not required to conform.
Error Handling
| Error | Response |
|---|---|
~/.lisa/ecosystem.json missing |
If local .gt/memory/semantic.json exists, run in standalone mode. Otherwise, stop and print schema for user. |
~/.lisa/ecosystem.json has only 1 project |
Run in standalone mode with informational message. |
| Project path doesn't exist locally | Check remote field if present; try GitHub API; record as "source": "GitHub API" or "not-found" |
semantic.json missing for a project |
Record semantic_json.exists: false, continue with other projects. Do not crash. |
semantic.json malformed |
Record error in checkpoint, skip project's comparison. Do not crash. |
| Different schema than expected | Extract common fields, flag divergence as a finding (not an error) |
| No prior checkpoint | First reconcile -- skip "Changes Since" section and incremental check |
| Fewer than 2 projects reachable | Warn but still produce report (standalone comparison against own state) |
| Git not available | Skip git hash check, skip remote lookup, fall back to path-only |
| Ecosystem partner not installed | Informational message: "Carlos not found -- Lisa works standalone. Install Carlos for specialist analysis." Do not error. |
Quality Gates
Reconcile quality gates are defined in gates.yaml (9 gates, automated via validate.py --stage reconcile):
| Gate | Check | Severity |
|---|---|---|
config_loaded |
Checkpoint confirms ecosystem config was loaded | blocker |
projects_found |
2+ projects found in checkpoint | blocker |
alignment_report_exists |
ALIGNMENT_REPORT.md generated | blocker |
perspectives_exists |
PERSPECTIVES.md generated | blocker |
checkpoint_valid |
.checkpoint.json is valid JSON | blocker |
checkpoint_schema |
Checkpoint has reconcile-checkpoint-v1 schema | blocker |
report_has_summary |
Report has Summary section | blocker |
report_has_misalignments |
Report has Misalignments section | warning |
changes_tracked |
Prior version tracked in checkpoint | warning |
Next Steps
After reconcile completes:
- Run
validate.py --stage reconcileto verify outputs - Review
ALIGNMENT_REPORT.mdfor action items - Address HIGH priority misalignments first
- Re-run reconcile after significant changes (see
next_reconcile_triggersin checkpoint)

