Cross-validates ecosystem assumptions against project semantic memory. Identifies drift, schema divergence, and misalignments across multiple codebases.
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.
Use this skill when:
.checkpoint.json timestamp)project/
└── scopecraft/
├── ALIGNMENT_REPORT.md # Human-readable findings
├── PERSPECTIVES.md # Side-by-side project self-reports
└── .checkpoint.json # Machine-readable state for recovery
templates/The reconcile skill reads project locations from ~/.lisa/ecosystem.json.
{
"$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.
When ~/.lisa/ecosystem.json is missing or contains only one project, reconcile runs in standalone mode:
.gt/memory/semantic.json and scopecraft/ artifactsIf a prior checkpoint exists (scopecraft/.checkpoint.json):
checkpoint.projects.<name>.git_hashgit rev-parse HEAD--force flag is set (or user explicitly requests full re-scan), skip this optimization and scan everythingThis makes reconcile faster for large ecosystems where most projects haven't changed.
~/.lisa/ecosystem.jsonprojects array with at least 1 entry~ paths to absolute pathsactive: trueremote field, if the path doesn't exist, try to locate the repo by scanning common clone directories for a matching git remote get-url originIf ~/.lisa/ecosystem.json is missing:
.gt/memory/semantic.json, run in standalone mode (see above)For each active project:
<project.path> exists locally<project.path>/.gt/memory/semantic.jsongh api repos/<org>/<repo>/contents/.gt/memory/semantic.json)status: "not-found" and continueHandle different schemas gracefully:
semantic-memory-v1 schema with ecosystem_role, integration_points, non_goalshttps://gastown.dev/schemas/semantic-memory.json without ecosystem fieldsproject.name, project.type, project.primary_language, tech_stackIf running from ecosystem root:
scopecraft/ALIGNMENT_REPORT.md if it exists (prior findings)scopecraft/.checkpoint.json if it exists (prior state)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:
For each project that has quality gates:
gates.yaml exists (declarative) or gates are hardcoded# 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 |
|----------|--------|-------|--------|
# 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 -->
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": []
}
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 bothThe 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 | 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. |
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 |
After reconcile completes:
validate.py --stage reconcile to verify outputsALIGNMENT_REPORT.md for action itemsnext_reconcile_triggers in checkpoint)