diff --git a/docs/plans/roadmap.md b/docs/plans/roadmap.md index a0cb94c..8f55da8 100644 --- a/docs/plans/roadmap.md +++ b/docs/plans/roadmap.md @@ -36,7 +36,7 @@ no other guidance is needed. Follow it top to bottom: | ---- | ----- | ------ | ------------- | | **W1** | 2.1.169 adoption + 2.1.168 orphan/boot correctness | #58 #45 #43 #26 | none — active now | | **W2** | Verdict-signal trust (triage decisions) | — (#62 shipped) | none — triage anytime | -| **—** | Cross-cutting / later | #11 #8 #76 #77 #75 | n/a | +| **—** | Cross-cutting / later | #11 #8 #80 #81 (#83 #84 #85) #76 #77 #75 | n/a | ## Master census (all issues) @@ -45,10 +45,15 @@ no other guidance is needed. Follow it top to bottom: | - | ----- | ---- | ------ | ----- | -------- | ---- | ----- | | 58 | Adopt CC 2.1.169 | W1 | Backlog | human | `/release-adoption` | — | **Both leaf sides now AUTHORED.** Patcher half MERGED → skrabe/tweakcc-fixed#5 (prompts + extractor); skrabe adopted the extractor as-is, verified independently (same 6 gaps / 2 `@internal` excludes) and on merge **regenerated the JSON via the canonical pipeline** (`e335fb9`, `TWEAKCC_UPSTREAM_JSON` set) — fixing an `agent-prompt-worker-fork` mis-bind (`WORKER_DIRECTIVE`/`ADDITIONAL_CONTEXT` slot-shift from inserted `AGENT_TOOL_NAME`) the carryover JSON had. **Lesson:** our seed-from-prior-JSON (no `TWEAKCC_UPSTREAM_JSON`) yields valid-but-wrong slot binds the union/skip guards miss — validate overrides vs **canonical main** JSON, not the adopt branch. Lobotomized half **shipped by skrabe** → lobotomized-claude-code@411f5e6 (opus-4-8 realigned onto 2.1.169 pristine: RETRIM×5, RESYNC×1, KEEP_SUPPRESSED×1, NET-NEW×3; his verify: four-zeros + mis-bind 0 + version-bump 0 blocking / 0 UNKNOWN) — so #26 no longer gates the 4-8 2.1.169 path (its croncreate-4-7 / inline-blob residual is a separate item). **Remaining = control-plane (HITL):** add 2.1.169 to the Support matrix + `pnpm tsx src/cli.ts` + save the Adoption record. Re-scope detail in #58 comment (2026-06-09). | | 45 | Swap tweakcc-fixed#4 detector to the identifierMap-union check | W1 | Blocked | human | `/tdd` | — | agent work **done** (commit `bc60baa` on leaf PR #4); owner now human — remaining is HITL boot-verify vs stock 2.1.168 + skrabe merge (both his), relabeled `ready-for-human`. Not agent-pickable. Re-verified 2026-06-09: `pnpm build` + `pnpm test` green (275 pass), commit on the fork branch, skrabe notified — awaiting his merge | -| 43 | Patcher `--report-orphans` (producer, leaf PR to skrabe) | W1 | Backlog | human | `/release-adoption` | — | skrabe-facing PR + merge timing not ours. On landing, also wire `RealAdoptionEnvironment.adopt` to call the flag and populate `orphanReport` — the consumer is ready (#31), the env just omits the call until the flag exists. **Fresh-eyes 2026-06-09:** confirmed NOT superseded — auditMisbinds checks slot *correctness* (pre-apply) and versionBumpReport scans the JSON for `UNKNOWN_*` (build-time); neither emits the **apply-time surviving-placeholder** set this asks for. Reframe the ask as an **extension of `auditMisbinds` output** (skrabe's architecture; he's already extending that file) rather than a standalone flag, and open it **draft + intent ping** per the leaf-PR coordination rule (it's a feature ask into his patcher, a real imposition) | +| 43 | Patcher `--report-orphans` (producer, leaf PR to skrabe) | W1 | Backlog | human | `/release-adoption` | — | skrabe-facing PR + merge timing not ours. On landing, also wire `RealAdoptionEnvironment.adopt` to call the flag and populate `orphanReport` — the consumer is ready (#31), the env just omits the call until the flag exists. **Fresh-eyes 2026-06-09:** confirmed NOT superseded — auditMisbinds checks slot *correctness* (pre-apply) and versionBumpReport scans the JSON for `UNKNOWN_*` (build-time); neither emits the **apply-time surviving-placeholder** set this asks for. Reframe the ask as an **extension of `auditMisbinds` output** (skrabe's architecture; he's already extending that file) rather than a standalone flag, and open it **draft + intent ping** per the leaf-PR coordination rule (it's a feature ask into his patcher, a real imposition). **2026-06-09 reframe (issue comment):** largely SUPERSEDED by skrabe's published `driver.mjs` — `report` already emits the orphan-not-in-JSON + `UNKNOWN_N` counts and `auditMisbinds` is the slot gate; only the apply-time *surviving-placeholder set* remains, and that's now an ask against `driver.mjs report`/`auditMisbinds` output (his architecture), not a bespoke flag. Consumer routes through #80 | | 26 | Leaf finding: lobotomized breaks CC 2.1.168 (evidence) | W1 | Backlog | human | — | — | **Un-parked** — live blocker for #58's lobotomized half. Pre-existing & version-independent: overrides ref slot names absent from the canonical identifierMap → guard-skip (override silently inert) or boot `ReferenceError`. **opus-4-7 vocab alignment shipped** → skrabe/lobotomized-claude-code#5 (4-7 lagged: `767011b` converged only 4-8 onto upstream vocab): memory-synthesis `OPTIONAL_TAIL_NOTE`→`EMPTY_STRING`, enterplanmode →`CONDITIONAL_WHAT_HAPPENS_NOTE_FN()`, workflow 5-slot rename — all 3 confirmed correct by skrabe vs committed `prompts-2.1.169.json`. Validated vs **canonical** tweakcc-fixed `main` JSON (post `e335fb9` regen — NOT the pre-regen adopt branch; that flipped my first memory-synthesis edit, reverted). **2026-06-09 correction:** the 2 opus-4-8 `\${VERSION}`/`\${GITHUB_TOKEN}`/`\${DATADOG_*}` escapes also in PR #5 were **wrong and rejected by skrabe** — `data-anthropic-cli`/`skill-cowork-…mcp-discovery` are stored under quote (not backtick) delimiters in `cli.js`, so `${VAR}` is inert literal text and the patcher's backslash-doubling makes escaping corrupt the rendered output. Escape-or-not is decided by quote-vs-backtick delimiter, not "looks like a doc example." **Remainder open (`ready-for-human`):** croncreate-4-7 (expression-form `${CRON_DURABLE_FLAG?…}`→bundle-owned `CRON_DURABILITY_SECTION`, real restructure) + inline-blob minified ids (`inline-*`, both 4-7/4-8 — need re-extraction). Static pre-check only; HITL boot-verify is authority | | 11 | Roadmap: behavioral A/B benchmark (stock vs lobotomized) | — | Parked | human | — | — | roadmap item | -| 8 | Roadmap: leaf test broadening (tweakcc-fixed + lobotomized) | — | Blocked | human | `/tdd` | — | **Agent work DONE (2026-06-09)** — gap inventory posted (issue comment, grouped per leaf, ranked); tweakcc-fixed test PR prepared → skrabe/tweakcc-fixed#6 (escape/identifier customization units + pinned 2.1.169 golden digest; +17 tests, full suite + lint green). Lobotomized per-override coverage resolved as **already covered by `tools/auditMisbinds.mjs`** (the slot-binding gate, confirmed by skrabe on lobotomized#5) — no parallel harness in the data-only repo (ADR 0001); the only residual (gate-ify auditMisbinds + a quote-context escape check) is patcher-altitude and skrabe-owned, not a lobotomized PR. Remaining: per the leaf-PR coordination rule, #6 was set to **draft + intent ping** — awaiting skrabe's call on whether he wants the tests and in what shape (he may want the version-pinned golden dropped, keeping only the maintenance-free helper units). Not a plain merge-wait. Relabeled `ready-for-human`, owner→human | +| 8 | Roadmap: leaf test broadening (tweakcc-fixed + lobotomized) | — | Blocked | human | `/tdd` | — | **Agent work DONE (2026-06-09)** — gap inventory posted (issue comment, grouped per leaf, ranked); tweakcc-fixed test PR prepared → skrabe/tweakcc-fixed#6. Lobotomized per-override coverage resolved as **already covered by `tools/auditMisbinds.mjs`** (the slot-binding gate, confirmed by skrabe on lobotomized#5) — no parallel harness in the data-only repo (ADR 0001). **2026-06-09 — skrabe reviewed #6:** keep `systemPromptCustomization.test.ts` (version-independent pipeline-helper units — "exactly the shape I want"), **drop** `promptsGolden.test.ts` + the 2.1.169 snapshot (redundant with his showtime no-regression check + auditMisbinds + capture/read-consistency tests; regen-every-bump friction; snapshots quirks rather than root-causing them). Done (commit `e835b4f`, suite green), PR **un-drafted** → now a plain merge-wait. Bonus: our snapshot surfaced a real extractor finding (`system-reminder-cross-session-peer…` flip-flop 2.1.167↔2.1.169 + 4× dup-id) he'll root-cause; evidence left on the PR. Relabeled `ready-for-human`, owner→human | +| 80 | Gate shells to skrabe's published `driver.mjs` instead of reconstructing the four-zeros verdict | — | Backlog | agent | `/tdd` | — | **Filed 2026-06-09** from skrabe's `skills/showtime/` publish (`c5fabdf`). `real-adoption-environment.ts` + `four-zeros-verdict.ts` hand-roll a parser of his `--apply` output (the #58 drift risk); shell to `driver.mjs check` (zeros #1/#2) + `report` (zero #3 + UNKNOWN) instead, keep static validator advisory (ADR 0005), driver-absent fallback like #31. Treat `auditMisbinds=0` as four-zero #4. Needs-triage | +| 81 | Maintenance machine — epic: index both leaf repos, synthesize, extract a defer-vs-lead improvement backlog | — | Tracking | mixed | — | — | **Tracking epic (2026-06-09).** North star: a first-class maintenance machine that doesn't replicate skrabe but stands on his canonical work to make meaningful improvements/bug-fixes. Ships via 3 phase children #83→#84→#85. Holds the operating doctrine + seed findings (private third layer `91df974`, publish-hygiene, the canonical showtime skill, his PR-#6 review bar) | +| 83 | Maintenance machine — Phase A: index both leaf repos (tree + history + PRs) | — | Backlog | agent | `/improve-codebase-architecture` | _#81_ | **Phase A of #81.** Read-only per-repo sub-agent fan-out → ref-anchored index artifact (no judgment yet). Blocks #84/#85. Needs-triage | +| 84 | Maintenance machine — Phase B: synthesize the index into durable knowledge | — | Blocked | mixed | — | #83 | **Phase B of #81.** Route findings → CONTEXT/ADR/skill/runbook/memory + no-synonyms terminology pass + explicit defer-vs-reinvent calls. Blocked on #83. Needs-triage | +| 85 | Maintenance machine — Phase C: extract the defer-vs-lead improvement backlog (the value-add) | — | Blocked | mixed | — | #84 | **Phase C of #81 — load-bearing payoff.** Ranked defer-vs-lead backlog (bug discovery / hardening / anticipation / cross-leaf invariants), filtered by skrabe's PR-#6 bar; top "lead" items opened as their own issues + operating-doctrine note. Blocked on #84. Needs-triage | | 76 | deepening: export `versionPassed` from integration-gate so adoption-history doesn't redefine it | — | Backlog | agent | `/improve-codebase-architecture` | — | **Loop-filed** (architecture-review loop, from #52). Dedup: adoption-history redefines the `versionPassed` predicate instead of importing the gate's. Needs-triage (only `source:architecture-review` label). Agent-doable code change | | 77 | Add PreToolUse hook to gate typecheck before git commits | — | Backlog | agent | `/update-config` | — | **Loop-filed** (apply-agent-research Consumer, from #51). Proposes a project-scope typecheck gate in the git-guard/secret-guard mold (ADR 0006). Needs-triage (only `source:agent-research`); confirm it earns its line vs CI before wiring — a slow pre-commit hook can be friction | | 75 | staleness-review: Node + pnpm pins (2 satisfy, 1 floor; no Dependabot config) | — | Backlog | mixed | `/staleness-audit` | — | **Loop-filed** (staleness-review loop, from #53). 2 pins satisfy, 1 at floor; no Dependabot config. Needs-triage (only `source:staleness-review`). **EOL ranking absent** — the harness web-validate is disabled (dividedby/skills#179), so this report is unverified/un-EOL-ranked until that lands. In-major bumps are gate-guarded auto-apply; cross-major stays a recommendation |