Skip to content
4 changes: 2 additions & 2 deletions .conductor/render-stamp.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"renderedAt": "2026-07-30T23:25:25.028Z",
"stateMtimeMs": 1785453924990.2876
"renderedAt": "2026-07-31T17:27:24.546Z",
"stateMtimeMs": 1785518844528.5571
}
89 changes: 86 additions & 3 deletions .conductor/state.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 1,
"active": null,
"active": "platform-parity-mechanism",
"epics": [
{
"id": "pm-fix-link-flag-validation-and-update",
Expand Down Expand Up @@ -1149,12 +1149,13 @@
"id": "platform-parity-mechanism",
"title": "Build the mechanism that keeps every supported platform at parity with the Claude Code base, BEFORE any second platform exists. Three layers, mirroring how this repo already enforces documentation currency: (1) MECHANICAL -- a machine-parseable parity ledger (one markdown file with a table, OpenSpec supported-tools.md style, parsed directly by a CI test so exemptions are real config not prose) plus a conductor.test.mjs gate that enumerates Claude Code artifacts (commands/*.md, hook events in hooks/hooks.json, skills/, agents/) and FAILS CI when any lacks either a per-platform counterpart or an explicit exemption row with a reason; generic over whatever platforms the ledger lists, so it passes trivially at zero platforms and starts enforcing the moment codex is added. (2) PROCEDURAL -- a project-local skill that walks each platform directory in order, reads what changed in the Claude Code base, determines the per-platform delta, applies it, and updates the ledger; same shape as release-checklist/mintlify-doc-sync. (3) Semantic parity is explicitly NOT this epic's job -- a structural test can prove a counterpart file exists but never that it behaves the same; that gap is closed by the edd-harness sibling epic. Deliberately sequenced before codex-platform-support so the gate never has a window where drift could start unobserved.",
"priority": "P1",
"status": "queued",
"status": "active",
"role": "epic",
"lane": "openspec",
"links": [],
"reconcileNeeded": false,
"parent": "multi-platform-agent-support"
"parent": "multi-platform-agent-support",
"startedAt": "2026-07-31T03:07:34.379Z"
},
{
"id": "codex-platform-support",
Expand Down Expand Up @@ -1608,6 +1609,88 @@
"done": false
}
]
},
{
"id": "edd-corpus-expansion-nondeterministic-surfaces",
"title": "EDD corpus covers ONE scenario; expand to the judgment-dependent surfaces where drift actually hides",
"priority": "P2",
"status": "queued",
"role": "epic",
"lane": "claude-code",
"links": [],
"reconcileNeeded": false,
"stories": [
{
"title": "the harness existing is NOT the same as EDD being done -- corpus has 1 scenario (lane routing) against ~21 artifacts",
"done": false
},
{
"title": "inclusion criterion from the EDD design: an artifact earns a scenario when correct handling depends on agent JUDGMENT, not mechanical execution. Candidates: detour minimal-vs-substantial classification, the autonomy decision rule, the reconcile gate, hierarchy orchestration",
"done": false
},
{
"title": "each scenario must be mutation-tested -- this session found 4 of 5 guard tests passing on an unrelated rule, so a scenario that cannot fail is worse than none",
"done": false
}
]
},
{
"id": "parity-reassessment-per-platform",
"title": "RECURRING: on every new platform, re-run the corpus, reassess ledger exemptions, and compare drift",
"priority": "P2",
"status": "planned",
"role": "epic",
"lane": "claude-code",
"links": [
{
"type": "blocks",
"epic": "hermes-platform-support",
"reason": "Hermes is the first platform that must go through this reassessment, under the ledger gate"
}
],
"reconcileNeeded": false,
"stories": [
{
"title": "not a one-time task -- re-open this on EACH platform added. Add the platform to parity-ledger.json platforms[], fill its column, run the corpus against the blessed baseline, and record what differed",
"done": false
},
{
"title": "the ledger catches FORGOTTEN capabilities; EDD catches capabilities that exist but BEHAVE differently. Both must run per platform -- neither substitutes for the other",
"done": false
}
]
},
{
"id": "parity-propagation-skill",
"title": "Procedural half of the parity model: the propagation skill, written against a real port",
"priority": "P3",
"status": "planned",
"role": "epic",
"lane": "claude-code",
"links": [],
"reconcileNeeded": false,
"stories": [
{
"title": "DEFERRED from platform-parity-mechanism on purpose: writing the procedure before any port has happened would infer steps from design docs rather than from what a port actually required",
"done": false
}
]
},
{
"id": "parity-ledger-exemptions",
"title": "Ledger exemptions (capability genuinely unsupportable on a platform), designed against a real case",
"priority": "P3",
"status": "planned",
"role": "epic",
"lane": "claude-code",
"links": [],
"reconcileNeeded": false,
"stories": [
{
"title": "DROPPED from the initial ledger deliberately: with zero exemptions the 'every exemption has a reason' assertion could never fail -- the vacuous-coverage pattern that bit this session four times. Design it when Hermes hits a real cannot-support case.",
"done": false
}
]
}
],
"detourStack": [],
Expand Down
9 changes: 9 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@
(`.claude/skills/release-checklist/SKILL.md`) — repo-maintenance tooling, not part of what
the plugin ships to users. Follow it every time `plugin.json`'s version bumps; don't
re-derive the checklist from memory.
- **Parity ledger.** Every file under `commands/`, `agents/`, `skills/`, `hooks/`, and
`.claude-plugin/` must be claimed by exactly one capability in `docs/parity-ledger.json`, and
every path it claims must exist. Git-ignored paths (e.g. a macOS `.DS_Store`) are skipped by
the walk, so local cruft can never trip this gate. `scripts/test/parity.test.mjs` enforces
both and fails CI otherwise. Adding a command/agent/skill file means adding it to a capability
in the same commit — either an existing one or a new one with its `claude-code` mechanism
described. Unported platforms are **absent** from `platforms[]`, never present with null
values; a port adds itself and fills its column as it goes. See
`docs/superpowers/specs/2026-07-31-platform-parity-mechanism-design.md`.
- Engine subcommands are dispatched at the bottom of `conductor.mjs`; every new subcommand needs
a matching command doc under `commands/` and coverage in `scripts/test/*.test.mjs`.
- **State-transition flags are not pure functions of current state.** `reconcileNeeded` in
Expand Down
26 changes: 17 additions & 9 deletions PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
> GENERATED by the `pm` plugin — do not hand-edit. Source of truth is
> `.conductor/state.json` (ordering, detours, links) + OpenSpec `tasks.md` (stories).
> Regenerate: `/pm:status` (or `node scripts/conductor.mjs render`).
> Last rendered: 2026-07-30T23:25:25.015Z
> Last rendered: 2026-07-31T17:27:24.539Z

## Now

_No active epic set._
**`platform-parity-mechanism`** — Build the mechanism that keeps every supported platform at parity with the Claude Code base, BEFORE any second platform exists. Three layers, mirroring how this repo already enforces documentation currency: (1) MECHANICAL -- a machine-parseable parity ledger (one markdown file with a table, OpenSpec supported-tools.md style, parsed directly by a CI test so exemptions are real config not prose) plus a conductor.test.mjs gate that enumerates Claude Code artifacts (commands/*.md, hook events in hooks/hooks.json, skills/, agents/) and FAILS CI when any lacks either a per-platform counterpart or an explicit exemption row with a reason; generic over whatever platforms the ledger lists, so it passes trivially at zero platforms and starts enforcing the moment codex is added. (2) PROCEDURAL -- a project-local skill that walks each platform directory in order, reads what changed in the Claude Code base, determines the per-platform delta, applies it, and updates the ledger; same shape as release-checklist/mintlify-doc-sync. (3) Semantic parity is explicitly NOT this epic's job -- a structural test can prove a counterpart file exists but never that it behaves the same; that gap is closed by the edd-harness sibling epic. Deliberately sequenced before codex-platform-support so the gate never has a window where drift could start unobserved. (epic, P1) — —

## Detour stack

Expand Down Expand Up @@ -48,11 +48,13 @@ _Empty — no work is paused._
| P2 | `df-verify-worktrees-merged-not-just-archived` | claude-code | epic | archived 🤖 | — | - |
| P2 | `docs-site-cleanup` | claude-code | epic | archived | 3/9 stories | - |
| P2 | `edd-adapter-discards-agent-stdout` | claude-code | epic | queued | — | - |
| P2 | `edd-corpus-expansion-nondeterministic-surfaces` | claude-code | epic | queued | 0/3 stories | - |
| P2 | `edd-measures-installed-plugin-not-worktree` | claude-code | epic | queued | — | blocks→hermes-platform-support |
| P2 | `gh-64-sync-duplicate-shipped-plan` | claude-code | epic | queued | 0/3 stories | - |
| P2 | `gh-69-sync-no-done-signal-for-plans` | claude-code | epic | queued | — | relates-to→gh-64-sync-duplicate-shipped-plan |
| P2 | `gh-70-link-validation-gap` | claude-code | epic | queued | — | - |
| P2 | `github-issue-tracker-sync` | claude-code | epic | archived 🤖 | — | relates-to→ai-feedback-loop-github-issues |
| P2 | `parity-reassessment-per-platform` | claude-code | epic | planned | 0/2 stories | blocks→hermes-platform-support |
| P2 | `platform-switch-orphans-old-rules-block` | claude-code | epic | queued | 0/2 stories | blocks→hermes-platform-support |
| P2 | `pm-plugin-improvements-2026-07-14` | claude-code | epic | archived | 19/19 children archived | - |
| P0 | └─ `df-plan-hierarchy-includes-archived-children` | claude-code | epic | archived | — | - |
Expand Down Expand Up @@ -80,11 +82,13 @@ _Empty — no work is paused._
| P3 | `gh-66-update-epic-missing-flags` | claude-code | epic | queued | — | blocks→gh-69-sync-no-done-signal-for-plans |
| P3 | `init-detects-foreign-agent-instruction-files` | claude-code | epic | planned | 0/1 stories | - |
| P3 | `multi-platform-agent-support` | claude-code | epic | queued | 2/5 children archived | - |
| P1 | └─ `platform-parity-mechanism` | openspec | epic | queued ⚠ no change on disk | — | - |
| P1 | └─ `platform-parity-mechanism` | openspec | epic | active ⚠ no change on disk | — | - |
| P1 | └─ `rules-block-hardcodes-claude-slash-commands` | claude-code | epic | archived | — | - |
| P1 | └─ `edd-harness-agent-behavior-testing` | decision | epic | archived | — | - |
| P2 | └─ `hermes-platform-support` | openspec | epic | queued ⚠ no change on disk | — | depends-on→platform-parity-mechanism; depends-on→edd-harness-agent-behavior-testing; depends-on→rules-block-hardcodes-claude-slash-commands |
| P3 | └─ `codex-platform-support` | openspec | epic | queued ⚠ no change on disk | — | depends-on→platform-parity-mechanism; depends-on→edd-harness-agent-behavior-testing; depends-on→rules-block-hardcodes-claude-slash-commands; depends-on→hermes-platform-support |
| P3 | `parity-ledger-exemptions` | claude-code | epic | planned | 0/1 stories | - |
| P3 | `parity-propagation-skill` | claude-code | epic | planned | 0/1 stories | - |
| P3 | `rules-block-cli-fallback` | claude-code | epic | planned | 0/1 stories | - |
| P3 | `portfolio-architecture-consistency-scan` | decision | epic | archived | — | depends-on→epic-hierarchy-orchestration |
| P? | `2026-07-14-epic-hierarchy-orchestration` | superpowers | epic | archived | 0/17 tasks | - |
Expand All @@ -108,20 +112,23 @@ _Empty — no work is paused._
## Briefing (what a fresh session sees)

```
⚠ pm 0.24.0 → 0.25.0 available — run `/reload-plugins` (if you just updated the plugin), then `/pm:upgrade`.
- **`rules-target` — a read-only query printing the absolute path of the file the resolved

CONDUCTOR STATE — where we are and what's next

NOW: (no active epic set)
NOW: `platform-parity-mechanism` (openspec, epic, P1) — —

NEXT UP (by priority, then lane):
• `autodetour-parser-misses-am-and-f` (P2, claude-code, queued) — 0/3 stories
• `edd-adapter-discards-agent-stdout` (P2, claude-code, queued) — —
• `edd-corpus-expansion-nondeterministic-surfaces` (P2, claude-code, queued) — 0/3 stories
• `edd-measures-installed-plugin-not-worktree` (P2, claude-code, queued) — —
• `gh-64-sync-duplicate-shipped-plan` (P2, claude-code, queued) — 0/3 stories
• `gh-69-sync-no-done-signal-for-plans` (P2, claude-code, queued) — —
(+4 more — see PROJECT.md)
lanes: openspec 2 · superpowers 5 · claude-code 55 · decision 7
(+5 more — see PROJECT.md)
lanes: openspec 2 · superpowers 5 · claude-code 56 · decision 7

planned: 2 — see PROJECT.md
planned: 5 — see PROJECT.md

EPIC LINKS:
• `edd-observe-hardcodes-claude-md` depends-on `rules-block-hardcodes-claude-slash-commands` — observe.py correctly observes what the engine WRITES; the engine hardcodes CLAUDE.md (constants.mjs:14) and writes only there, so parameterizing observe first would abstract over a filename nothing produces
Expand All @@ -133,6 +140,7 @@ EPIC LINKS:
• `edd-measures-installed-plugin-not-worktree` blocks `hermes-platform-support` — editing an evaluated artifact must be measurable before the port, and the baseline must record which plugin version it describes
• `gh-69-sync-no-done-signal-for-plans` relates-to `gh-64-sync-duplicate-shipped-plan` — same root cause -- dedup keys on the plan's filename-derived id instead of a plan<->epic association, so any epic whose plan is named differently is re-registered forever
• `github-issue-tracker-sync` relates-to `ai-feedback-loop-github-issues` — issues created by the feedback loop are exactly what this syncs back in
• `parity-reassessment-per-platform` blocks `hermes-platform-support` — Hermes is the first platform that must go through this reassessment, under the ledger gate
• `platform-switch-orphans-old-rules-block` blocks `hermes-platform-support` — a switched repo would leave stale conductor instructions in the file the previous platform read
• `codex-platform-support` depends-on `platform-parity-mechanism` — the structural parity gate and ledger must exist before any second-platform port
• `codex-platform-support` depends-on `edd-harness-agent-behavior-testing` — semantic parity needs a blessed Claude Code baseline to compare against
Expand All @@ -142,7 +150,7 @@ EPIC LINKS:
• `portfolio-architecture-consistency-scan` depends-on `epic-hierarchy-orchestration` — C presumes B's hierarchy execution exists to propagate cross-cutting decisions into

TRACKER SYNC (github-issues):
⚠ not yet in github-issues — create issues + record keys (update-epic): `autodetour-parser-misses-am-and-f`, `edd-adapter-discards-agent-stdout`, `edd-measures-installed-plugin-not-worktree`, `platform-switch-orphans-old-rules-block`, `multi-platform-agent-support`
⚠ not yet in github-issues — create issues + record keys (update-epic): `autodetour-parser-misses-am-and-f`, `edd-adapter-discards-agent-stdout`, `edd-corpus-expansion-nondeterministic-surfaces`, `edd-measures-installed-plugin-not-worktree`, `platform-switch-orphans-old-rules-block`, `multi-platform-agent-support`

💡 1 tracker configured (github-issues) — consider `/pm:sync` this session to pull in any new issues.

Expand Down
73 changes: 73 additions & 0 deletions docs/parity-ledger.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"platforms": ["claude-code"],
"capabilities": [
{
"id": "conductor-discipline",
"artifacts": ["skills/conductor/SKILL.md"],
"platforms": { "claude-code": "skill loaded by name (skills/<name>/SKILL.md)" }
},
{
"id": "epic-index",
"artifacts": [
"commands/epic.md",
"commands/status.md",
"commands/next.md",
"commands/sync.md"
],
"platforms": { "claude-code": "slash commands (/pm:epic, /pm:status, /pm:next, /pm:sync)" }
},
{
"id": "detour-lifecycle",
"artifacts": [
"commands/detour.md",
"commands/resume.md",
"commands/gate-guard.md",
"agents/reconciler.md"
],
"platforms": { "claude-code": "slash commands + reconciler subagent + a PreToolUse gate-guard hook" }
},
{
"id": "epic-hierarchy-orchestration",
"artifacts": [
"commands/hierarchy.md",
"agents/hierarchy-child-executor.md",
"agents/merge-conflict-resolver.md"
],
"platforms": { "claude-code": "slash command dispatching two subagents into git worktrees" }
},
{
"id": "repo-configuration",
"artifacts": [
"commands/tracker.md",
"commands/lane-routing.md",
"commands/review-mode.md"
],
"platforms": { "claude-code": "slash commands writing settings into .conductor/state.json" }
},
{
"id": "install-and-upgrade",
"artifacts": [
"commands/init.md",
"commands/upgrade.md",
"commands/changelog.md",
"commands/changesets.md"
],
"platforms": { "claude-code": "slash commands (/pm:init scaffolds; /pm:upgrade migrates and rewrites the rules block)" }
},
{
"id": "feedback-channel",
"artifacts": ["commands/feedback.md"],
"platforms": { "claude-code": "slash command instructing the agent to file a GitHub issue (the engine never calls gh)" }
},
{
"id": "session-lifecycle-hooks",
"artifacts": ["hooks/hooks.json"],
"platforms": { "claude-code": "SessionStart / PreCompact / PostToolUse hooks in hooks.json, each passing --platform claude-code" }
},
{
"id": "plugin-packaging",
"artifacts": [".claude-plugin/plugin.json"],
"platforms": { "claude-code": "plugin manifest consumed by the Claude Code marketplace loader" }
}
]
}
Loading
Loading