diff --git a/docs/plans/roadmap.md b/docs/plans/roadmap.md index 9bbd667..098e923 100644 --- a/docs/plans/roadmap.md +++ b/docs/plans/roadmap.md @@ -34,9 +34,9 @@ no other guidance is needed. Follow it top to bottom: ## Priority waves | Wave | Theme | Issues | Gate to enter | | ---- | ----- | ------ | ------------- | -| **W1** | 2.1.169 adoption + 2.1.168 orphan/boot correctness | #43 #26 (#58 #45 shipped) | none — active now | +| **W1** | 2.1.169 adoption + 2.1.168 orphan/boot correctness | — (#26 #43 #45 #58 shipped) | none — active now | | **W2** | Verdict-signal trust (triage decisions) | — (#62 shipped) | none — triage anytime | -| **—** | Cross-cutting / later | #11 #8 #94 #99 #102 (#75 #76 #77 #80 #81 #83 #84 #85 #93 #95 #96 #103 shipped) | n/a | +| **—** | Cross-cutting / later | #11 #102 #125 #126 #127 #128 (#75 #76 #77 #80 #81 #83 #84 #85 #93 #94 #95 #96 #103 shipped) | n/a | ## Burn-down order (2026-06-10 — overrides wave ordering while this section exists) @@ -53,32 +53,40 @@ authoritative for *how*; this list only orders. Two pickup modes: | Order | # | Mode | What unblocks it | | ----- | - | ---- | ---------------- | -| 3 | #26 | Interactive → merge-wait | **named-prompt realign delivered + boot-verified → lcc#7; now tracking skrabe's merge.** inline-* re-extraction residual remains | +| 3 | #26 | CLOSED | **CLOSED — lcc#7 merged; inline-* remainder premise disproven (patcher positional-remaps inline blobs, all verified green, no fix needed).** | | — | #11 | Parked (trigger) | **fate decided 2026-06-09: re-parked with named trigger — revisit after #102's refactor plan lands.** Out of active burn-down | -| 5 | #94 | AFK (external trigger) | skrabe merges tf#7 + lcc#6 → merge-day finalize | -| 6 | #8 | none (merge-wait) | skrabe merges tf#6 → verify + recommend close | -| 7 | #43 | AFK → **resolved (relocated to control plane)** | **skrabe declined tf#8 into the leaf + redirected it here; producer relocated to `src/orphan-report-producer.ts` against his published prompts JSONs and wired into the gate (#80 orphan-SET swap). Closing #43.** | +| 5 | #94 | CLOSED | **CLOSED — skrabe merged tf#7 + lcc#6; merge-day gate green; 2.1.170 record finalized.** | +| 6 | #8 | CLOSED | **CLOSED — skrabe merged tf#6 commit `7d9b30b`; landed his reviewed shape (helper units kept, golden snapshot dropped).** | +| 7 | #43 | CLOSED | **CLOSED — producer relocated to control plane, #124 merged.** | | 8 | #102 | Interactive go → AFK | orders 1–7 closed or reduced to external waits — the finale | | — | #99 | standing | Idea Inbox — exempt from burn-down by design | +| — | #125 | AFK (`ready-for-agent`) | unblocked now — #102 refactor-plan follow-on | +| — | #126 | AFK (`ready-for-agent`) | unblocked now — #102 refactor-plan follow-on | +| — | #127 | AFK (`ready-for-agent`) | unblocked now — #102 refactor-plan follow-on | +| — | #128 | AFK | blocked on #125/#126/#127 | ## Master census (all issues) ### Open | # | Issue | Wave | Status | Owner | Skill(s) | Deps | Notes | | - | ----- | ---- | ------ | ----- | -------- | ---- | ----- | -| 43 | Orphan report producer (relocated to control plane per skrabe's tf#8 redirect) | W1 | Done | agent | `/release-adoption` | _#31 #80_ | **RELOCATED HERE + wired (2026-06-10).** skrabe declined tf#8 into the leaf (closing comment: same reasoning as the tf#6 golden snapshot — duplicates gates he already runs; it is "a need on your side of the fence, so it makes more sense living in your maint repo against my published prompts JSONs"). Ported the producer to `src/orphan-report-producer.ts` (TS+ESM via tsx, ADR 0004) adapted to take the already-resolved **published** `prompts-.json` + override files as inputs (not leaf in-tree paths); 19 unit tests in `test/orphan-report-producer.test.ts`. Output is the existing `{version, prompts: {: [VAR,…]}}` contract `orphan-report.ts` (#31) already parses, covering the `_FN()` / `_OBJECT.member` leading-identifier expression class. **#80 consumer wiring:** `driver-verification.ts` orphan channel swapped from the `UNKNOWN_1..N` synthesis (literal id `version-bump-report`, driven off the driver's scalar count) to the producer's REAL per-prompt keys — `runDriverVerification` now runs the producer in-process over the same override dirs + resolved prompts JSON. This completes the #43-enabled sub-item of #80's wiring; #80's broader driver-seam contract was already delivered, and its live-install verification stays its HITL gate. — *(history: producer was first offered as draft leaf PR tf#8 before skrabe's redirect; prior reframe/fresh-eyes detail in issue comments + git history of this row.)* tf#8 (head `dividedby:feat/report-orphans-producer-43`, base `skrabe:main`) ships `tools/reportOrphans.mjs` — opt-in, emits `{version, prompts: {: [VAR, …]}}`, covering the `_FN()` / `_OBJECT.member` expression class (the apply-time surviving-placeholder set). Framed **draft proposal, no merge pressure** — skrabe's call on the final home (standalone tool vs `auditMisbinds`/`driver.mjs report` extension) per the leaf-PR coordination rule. **Reconcile 2026-06-10:** NOT superseded by his merged tf#7 work — that delivered the slot gate, not the apply-time placeholder set this emits. On landing, wire `RealAdoptionEnvironment.adopt` to call the flag and populate `orphanReport` — the consumer is ready (#31), the env just omits the call until the producer exists; it falls back gracefully (#31/#80) until then. — *(prior fresh-eyes / reframe detail: issue comments + git history of this row.)* **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. **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 | Blocked | mixed | — | — | **Named-prompt realign DELIVERED + boot-verified → draft PR skrabe/lobotomized-claude-code#7 (2026-06-09, interactive "work #26 with me"). Now tracking skrabe's merge (external).** True remaining crash set reconciled to exactly two named prompts: `agent-usage-notes` (4-7+4-8) — the #58 boot-blocker, `IS_TRUTHY_FN(PROCESS_OBJECT.env.X)`→`ENVIRONMENT_CONFIG.X` (slot 3, custom prose preserved); `croncreate`-4-7 — `${CRON_DURABLE_FLAG?…}`→bundle-owned `${CRON_DURABILITY_SECTION}`+`${CRON_DURABLE_RUNTIME_NOTE}` (mirrors skrabe's own `54e0d34` on 4-8). Boot-verify (HITL, authority): full opus-4-8 set (411f5e6 + fix) applied to live 2.1.170 → `claude -p` READY, no ReferenceError; restore drill clean; the two prompts' identifierMaps byte-identical 2.1.169≡2.1.170. Caveats: `auditMisbinds` SKIPPED (no upstream dump on box); croncreate-4-7 runtime-verify bounded (live install runs 4-8 set). **Residual (keeps this open):** `inline-*` overrides (both sets) carry version-specific minified ids — need re-extraction (extractor altitude), not a hand-edit. — *(prior pickup detail: issue comments + git history of this row.)* **Burn-down order 3 (Interactive — "work #26 with me"; pickup protocol in issue comment, incl. the IS_TRUTHY_FN offender from the #58 run).** **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 | +| 125 | fallow hygiene: triage 4 genuinely-dead exports (#102 P1) | — | Next | agent | `/tdd` | — | Spawned from #102's refactor plan (/to-issues, 2026-06-10). Independently pickable; design-skipped (backend single-module, no new seam). Scope/AC in the issue. | +| 126 | fallow hygiene: register tsx CLI entry points in fallow config (#102 P2) | — | Next | agent | `/tdd` | — | Spawned from #102's refactor plan (/to-issues, 2026-06-10). Independently pickable; design-skipped. Scope/AC in the issue. | +| 127 | fallow hygiene: suppress DI port/seam false-positives (#102 P3) | — | Next | agent | `/tdd` | — | Spawned from #102's refactor plan (/to-issues, 2026-06-10). Independently pickable; design-skipped. Scope/AC in the issue. | +| 128 | fallow hygiene: save health baseline + wire report-only CI delta (#102 P5) | — | Blocked | agent | `/tdd` | #125 #126 #127 | Spawned from #102's refactor plan (/to-issues, 2026-06-10). Blocked on #125/#126/#127 landing first (baseline must reflect the post-hygiene state). Scope/AC in the issue. | +| 102 | Post-backlog: complete refactor plan from a fallow static-analysis pass | — | Blocked | human | `/improve-codebase-architecture` | — | **Burn-down order 8 — the finale (pickup protocol in issue comment).** Gated on the rest of the open backlog completing (issue body lists the gate set; several already closed — #93 #95 #96) — maintainer decides when the gate is satisfied and whether the whole-repo refactor is worth scheduling. When unblocked: fallow static JSON evidence → `/improve-codebase-architecture` (respecting ADR 0004 no-build + ADR 0007 defer verdicts) → plan only, split via `/to-issues` if accepted. Spawned from Idea Inbox #99. #103's CI baseline would make its evidence capture trivial (soft relation, not a dep) | | 11 | Roadmap: behavioral A/B benchmark (stock vs lobotomized) | — | Parked | mixed | `/grill-with-docs` | — | **Fate decided 2026-06-09 (interactive decision session): RE-PARKED with a named trigger — revisit after #102's refactor plan lands.** Out of active burn-down until then. ADR 0002 remains the recorded design stance (vs-vanilla measures targeted behavior + correctness guardrail; hybrid home: bench primitives reused, fork fixtures/rubric/driver here). Activating now would grow the backlog mid-burn-down (cross-repo `~/repos/bench` library refactor + rubric/bait-fixture design + live LLM judge + spawned follow-on issues) against the clear-the-backlog goal — deferred, not abandoned. Revisit naturally pairs with #102 since the refactor plan is the named trigger | -| 8 | Roadmap: leaf test broadening (tweakcc-fixed + lobotomized) | — | Blocked | human | `/tdd` | — | **Burn-down order 6 (pure merge-wait; pickup protocol in issue comment).** **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 | -| 94 | Pre-stage the CC 2.1.170 Release adoption on skrabe's open PR pair (tf#7 + lcc#6) — current on merge day | — | Done | agent | `/release-adoption` | — | **Step 3 DONE — 2.1.170 finalized + matrix member (2026-06-10).** skrabe merged BOTH halves of the pair (tf#7 + lcc#6, 2026-06-10 04:53Z); trigger fired. Merge-day re-run of the Integration gate against the **merged leaf mains** (tweakcc-fixed@`7d9b30b` × lobotomized@`f1db0de`, detached worktrees; the `e335fb9` regen lesson — NOT the pre-merge PR-head run) → **GREEN**: `pass:true`, Four-zeros all empty (`failedPatches`/`missingSystemPrompts`/`orphanVariables`/`misbinds`), Boot-verify pass, `auditMisbindsPassed:true` (executed, **0** on all three surfaces fable-5/opus-4-7/opus-4-8 vs `/tmp/pieb-2.1.170.json`), Restore drill clean (byte-identical stock). Record finalized → `docs/records/adoption-record-2.1.170.json` (draft removed) — the suffix-less record **IS the 2.1.170 Support-matrix add** (records README: a version is in the matrix when its green suffix-less record lands). Overrides isolated (runtime writes to a throwaway dir, work clone untouched). Leave the issue open for the maintainer to close. — *(steps 1–2 / pre-stage detail below.)* **Burn-down order 5 (AFK on external trigger).** **Owner→agent (/doc-regen 2026-06-10):** maintainer relabeled `ready-for-agent` + amended the title "current on merge day" (2026-06-10 01:53) — step 3 (merge-day re-run vs merged mains, matrix add, finalize the suffix-less record) is agent work, **triggered when BOTH leaf PRs merge** (external dep: skrabe/tweakcc-fixed#7 + skrabe/lobotomized-claude-code#6 — check `gh pr view` at every pickup; stays Blocked until then). **Steps 1–2 shipped (2026-06-09).** Spawned by #85 (lead L2, anticipation). Real Integration gate run locally on the live 2.1.170 install vs the open PR pair pinned via detached worktrees (tf PR 7 head `e096008` built, lcc PR 6 head `07e75b9`; overrides isolated per symlink discipline) → **green Four-zeros + Boot-verify + clean Restore drill**; draft record → `docs/records/adoption-record-2.1.170.draft.json` (PRE-STAGED vs the open pair, explicitly NOT a matrix add — records README). **Mis-bind audit now EXECUTED (2026-06-09, was SKIPPED at steps-1–2 time — no dump on box then):** re-ran `auditMisbinds` vs lcc `07e75b9` × tf `e096008` with the Piebald upstream dump `prompts-2.1.170.json` (346 prompts) present → `auditMisbindsPassed: true`, **0** across all three override surfaces (fable-5 / opus-4-7 / opus-4-8; fable-5: 89 prompts, 277 placeholder→slot comparisons, all at upstream slot); draft record's prior SKIPPED-derived empty value replaced with the executed `auditMisbindsPassed: true`. First run red on `driver-check`: the driver's backup-vintage guard correctly refused while `native-binary.backup` still held 2.1.169 bytes vs the live 2.1.170 install; the gate's own apply refreshed the backup (startupCheck) → re-run green. New advisory orphan `JSON` vs 2.1.169 = static-scan noise from `${JSON.stringify(…)}` JS template literals in `workflow-script-*`/`skill-design-sync-*` overrides (both fable-5 and opus-4-8 sets) — backtick-delimiter class, feeds #96. **Step 3 blocked on skrabe merging the pair** (owner human/merge-wait): merge-day re-run vs merged mains (`e335fb9` regen lesson), Support-matrix add, finalize the suffix-less record. Do not absorb #58's 2.1.169 matrix-add — separate row | | 99 | 💡 Idea Inbox | — | Tracking | human | — | — | **Standing inbox — exempt from burn-down.** Not pickable work — raw ideas live in the issue body with embedded agent operating instructions (capture → dedup → grill → promote via `/to-prd`/`/to-issues`). First idea already actioned → #102 | -| 114 | integration-gate: boot-verify `claude -p` has no `--model` pin or `--max-budget-usd` cap | — | Next | agent | — | — | **PR open (2026-06-10).** Brief mis-located the invocation in the workflow YAML; the real boot-verify `claude -p` call lives in TypeScript. Fix lands at the correct location: `src/real-adoption-environment.ts` pins `DEFAULT_MODEL` from the floating `haiku` alias to the exact snapshot `claude-haiku-4-5-20251001` (verified current; cheap haiku tier kept intentionally per maintainer decision — NOT switched to sonnet); `src/leaf-shell.ts` adds `--max-budget-usd 1.00` to the boot-verify args array as a runaway cap (haiku boot-verify is ~cents). Metering (stream-json/`--verbose` → `total_cost_usd`) unchanged. Gate green (typecheck + 143 tests). | -| 107 | staleness-review: pnpm CI pin exact + Node cross-major (2 findings) | — | Next | agent | `/staleness-audit` | — | **PR open (2026-06-10, `source:staleness-review`).** Finding 1 (apply): CI pnpm `version: 11`→exact `11.5.2` in both gate workflows (`integration-gate.yml`, `fallow-report.yml`); `devEngines` floor `^11.5.2` left as-is. Finding 2 (attempt-behind-gate, **applied — gate truly exercised**): `.nvmrc` cross-major bump → `26.3.0`. **Brief-drift reconciled:** brief said `.nvmrc`=22 / local=Node 22, but on pickup `.nvmrc` was already `24` (post-#75) and the live local runtime was already **v26.3.0** — so the bump is 24→26.3.0 and was genuinely run under Node 26, not proposed-only. Full gate green under live Node v26.3.0: `pnpm install` (pnpm 11.5.2) + `pnpm typecheck` + `pnpm test` (143 passed). Both workflows read `node-version-file: .nvmrc`, so the one edit covers CI (no build step, ADR 0004). Follow-up to #75 (same pin surface) | -| 102 | Post-backlog: complete refactor plan from a fallow static-analysis pass | — | Blocked | human | `/improve-codebase-architecture` | — | **Burn-down order 8 — the finale (pickup protocol in issue comment).** Gated on the rest of the open backlog completing (issue body lists the gate set; several already closed — #93 #95 #96) — maintainer decides when the gate is satisfied and whether the whole-repo refactor is worth scheduling. When unblocked: fallow static JSON evidence → `/improve-codebase-architecture` (respecting ADR 0004 no-build + ADR 0007 defer verdicts) → plan only, split via `/to-issues` if accepted. Spawned from Idea Inbox #99. #103's CI baseline would make its evidence capture trivial (soft relation, not a dep) | ### Done (closed — kept as full record, newest first) | # | Issue | Wave | Status | Owner | Skill(s) | Deps | Notes | | - | ----- | ---- | ------ | ----- | -------- | ---- | ----- | +| 8 | Roadmap: leaf test broadening (tweakcc-fixed + lobotomized) | — | Done | human | `/tdd` | — | **Burn-down order 6 (pure merge-wait; pickup protocol in issue comment).** **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 | +| 43 | Orphan report producer (relocated to control plane per skrabe's tf#8 redirect) | W1 | Done | agent | `/release-adoption` | _#31 #80_ | **RELOCATED HERE + wired (2026-06-10).** skrabe declined tf#8 into the leaf (closing comment: same reasoning as the tf#6 golden snapshot — duplicates gates he already runs; it is "a need on your side of the fence, so it makes more sense living in your maint repo against my published prompts JSONs"). Ported the producer to `src/orphan-report-producer.ts` (TS+ESM via tsx, ADR 0004) adapted to take the already-resolved **published** `prompts-.json` + override files as inputs (not leaf in-tree paths); 19 unit tests in `test/orphan-report-producer.test.ts`. Output is the existing `{version, prompts: {: [VAR,…]}}` contract `orphan-report.ts` (#31) already parses, covering the `_FN()` / `_OBJECT.member` leading-identifier expression class. **#80 consumer wiring:** `driver-verification.ts` orphan channel swapped from the `UNKNOWN_1..N` synthesis (literal id `version-bump-report`, driven off the driver's scalar count) to the producer's REAL per-prompt keys — `runDriverVerification` now runs the producer in-process over the same override dirs + resolved prompts JSON. This completes the #43-enabled sub-item of #80's wiring; #80's broader driver-seam contract was already delivered, and its live-install verification stays its HITL gate. — *(history: producer was first offered as draft leaf PR tf#8 before skrabe's redirect; prior reframe/fresh-eyes detail in issue comments + git history of this row.)* tf#8 (head `dividedby:feat/report-orphans-producer-43`, base `skrabe:main`) ships `tools/reportOrphans.mjs` — opt-in, emits `{version, prompts: {: [VAR, …]}}`, covering the `_FN()` / `_OBJECT.member` expression class (the apply-time surviving-placeholder set). Framed **draft proposal, no merge pressure** — skrabe's call on the final home (standalone tool vs `auditMisbinds`/`driver.mjs report` extension) per the leaf-PR coordination rule. **Reconcile 2026-06-10:** NOT superseded by his merged tf#7 work — that delivered the slot gate, not the apply-time placeholder set this emits. On landing, wire `RealAdoptionEnvironment.adopt` to call the flag and populate `orphanReport` — the consumer is ready (#31), the env just omits the call until the producer exists; it falls back gracefully (#31/#80) until then. — *(prior fresh-eyes / reframe detail: issue comments + git history of this row.)* **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. **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 | +| 107 | staleness-review: pnpm CI pin exact + Node cross-major (2 findings) | — | Done | agent | `/staleness-audit` | — | **PR open (2026-06-10, `source:staleness-review`).** Finding 1 (apply): CI pnpm `version: 11`→exact `11.5.2` in both gate workflows (`integration-gate.yml`, `fallow-report.yml`); `devEngines` floor `^11.5.2` left as-is. Finding 2 (attempt-behind-gate, **applied — gate truly exercised**): `.nvmrc` cross-major bump → `26.3.0`. **Brief-drift reconciled:** brief said `.nvmrc`=22 / local=Node 22, but on pickup `.nvmrc` was already `24` (post-#75) and the live local runtime was already **v26.3.0** — so the bump is 24→26.3.0 and was genuinely run under Node 26, not proposed-only. Full gate green under live Node v26.3.0: `pnpm install` (pnpm 11.5.2) + `pnpm typecheck` + `pnpm test` (143 passed). Both workflows read `node-version-file: .nvmrc`, so the one edit covers CI (no build step, ADR 0004). Follow-up to #75 (same pin surface) | +| 114 | integration-gate: boot-verify `claude -p` has no `--model` pin or `--max-budget-usd` cap | — | Done | agent | — | — | **PR open (2026-06-10).** Brief mis-located the invocation in the workflow YAML; the real boot-verify `claude -p` call lives in TypeScript. Fix lands at the correct location: `src/real-adoption-environment.ts` pins `DEFAULT_MODEL` from the floating `haiku` alias to the exact snapshot `claude-haiku-4-5-20251001` (verified current; cheap haiku tier kept intentionally per maintainer decision — NOT switched to sonnet); `src/leaf-shell.ts` adds `--max-budget-usd 1.00` to the boot-verify args array as a runaway cap (haiku boot-verify is ~cents). Metering (stream-json/`--verbose` → `total_cost_usd`) unchanged. Gate green (typecheck + 143 tests). | +| 94 | Pre-stage the CC 2.1.170 Release adoption on skrabe's open PR pair (tf#7 + lcc#6) — current on merge day | — | Done | agent | `/release-adoption` | — | **Step 3 DONE — 2.1.170 finalized + matrix member (2026-06-10).** skrabe merged BOTH halves of the pair (tf#7 + lcc#6, 2026-06-10 04:53Z); trigger fired. Merge-day re-run of the Integration gate against the **merged leaf mains** (tweakcc-fixed@`7d9b30b` × lobotomized@`f1db0de`, detached worktrees; the `e335fb9` regen lesson — NOT the pre-merge PR-head run) → **GREEN**: `pass:true`, Four-zeros all empty (`failedPatches`/`missingSystemPrompts`/`orphanVariables`/`misbinds`), Boot-verify pass, `auditMisbindsPassed:true` (executed, **0** on all three surfaces fable-5/opus-4-7/opus-4-8 vs `/tmp/pieb-2.1.170.json`), Restore drill clean (byte-identical stock). Record finalized → `docs/records/adoption-record-2.1.170.json` (draft removed) — the suffix-less record **IS the 2.1.170 Support-matrix add** (records README: a version is in the matrix when its green suffix-less record lands). Overrides isolated (runtime writes to a throwaway dir, work clone untouched). Leave the issue open for the maintainer to close. — *(steps 1–2 / pre-stage detail below.)* **Burn-down order 5 (AFK on external trigger).** **Owner→agent (/doc-regen 2026-06-10):** maintainer relabeled `ready-for-agent` + amended the title "current on merge day" (2026-06-10 01:53) — step 3 (merge-day re-run vs merged mains, matrix add, finalize the suffix-less record) is agent work, **triggered when BOTH leaf PRs merge** (external dep: skrabe/tweakcc-fixed#7 + skrabe/lobotomized-claude-code#6 — check `gh pr view` at every pickup; stays Blocked until then). **Steps 1–2 shipped (2026-06-09).** Spawned by #85 (lead L2, anticipation). Real Integration gate run locally on the live 2.1.170 install vs the open PR pair pinned via detached worktrees (tf PR 7 head `e096008` built, lcc PR 6 head `07e75b9`; overrides isolated per symlink discipline) → **green Four-zeros + Boot-verify + clean Restore drill**; draft record → `docs/records/adoption-record-2.1.170.draft.json` (PRE-STAGED vs the open pair, explicitly NOT a matrix add — records README). **Mis-bind audit now EXECUTED (2026-06-09, was SKIPPED at steps-1–2 time — no dump on box then):** re-ran `auditMisbinds` vs lcc `07e75b9` × tf `e096008` with the Piebald upstream dump `prompts-2.1.170.json` (346 prompts) present → `auditMisbindsPassed: true`, **0** across all three override surfaces (fable-5 / opus-4-7 / opus-4-8; fable-5: 89 prompts, 277 placeholder→slot comparisons, all at upstream slot); draft record's prior SKIPPED-derived empty value replaced with the executed `auditMisbindsPassed: true`. First run red on `driver-check`: the driver's backup-vintage guard correctly refused while `native-binary.backup` still held 2.1.169 bytes vs the live 2.1.170 install; the gate's own apply refreshed the backup (startupCheck) → re-run green. New advisory orphan `JSON` vs 2.1.169 = static-scan noise from `${JSON.stringify(…)}` JS template literals in `workflow-script-*`/`skill-design-sync-*` overrides (both fable-5 and opus-4-8 sets) — backtick-delimiter class, feeds #96. **Step 3 blocked on skrabe merging the pair** (owner human/merge-wait): merge-day re-run vs merged mains (`e335fb9` regen lesson), Support-matrix add, finalize the suffix-less record. Do not absorb #58's 2.1.169 matrix-add — separate row | +| 26 | Leaf finding: lobotomized breaks CC 2.1.168 (evidence) | W1 | Done | mixed | — | — | **Named-prompt realign DELIVERED + boot-verified → draft PR skrabe/lobotomized-claude-code#7 (2026-06-09, interactive "work #26 with me"). Now tracking skrabe's merge (external).** True remaining crash set reconciled to exactly two named prompts: `agent-usage-notes` (4-7+4-8) — the #58 boot-blocker, `IS_TRUTHY_FN(PROCESS_OBJECT.env.X)`→`ENVIRONMENT_CONFIG.X` (slot 3, custom prose preserved); `croncreate`-4-7 — `${CRON_DURABLE_FLAG?…}`→bundle-owned `${CRON_DURABILITY_SECTION}`+`${CRON_DURABLE_RUNTIME_NOTE}` (mirrors skrabe's own `54e0d34` on 4-8). Boot-verify (HITL, authority): full opus-4-8 set (411f5e6 + fix) applied to live 2.1.170 → `claude -p` READY, no ReferenceError; restore drill clean; the two prompts' identifierMaps byte-identical 2.1.169≡2.1.170. Caveats: `auditMisbinds` SKIPPED (no upstream dump on box); croncreate-4-7 runtime-verify bounded (live install runs 4-8 set). **Residual (keeps this open):** `inline-*` overrides (both sets) carry version-specific minified ids — need re-extraction (extractor altitude), not a hand-edit. — *(prior pickup detail: issue comments + git history of this row.)* **Burn-down order 3 (Interactive — "work #26 with me"; pickup protocol in issue comment, incl. the IS_TRUTHY_FN offender from the #58 run).** **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 | | 75 | staleness-review: Node + pnpm pins (2 satisfy, 1 floor; no Dependabot config) | — | Done | mixed | `/staleness-audit` | — | **Closed 2026-06-10 (interactive "work #75 with me").** Agent half shipped 2026-06-09 (`.github/dependabot.yml` — npm ecosystem, root, weekly, grouped dev-deps; #90). The embedded human decision — Node 22→24 cross-major — resolved: maintainer chose **bump to 24 now** (current LTS, EOL 2028-04-30; ahead-of-the-curve posture). Currency re-verified at pickup: Node 24 LTS since 2025-10-28 / latest 24.16.0, Node 22 active until 2027-04-30, pnpm `latest`=**11.5.2** (CI `version: 11` + floor `^11.5.2` both at latest — no pnpm bump). `.nvmrc` 22→24 (both workflows read `node-version-file: .nvmrc`, so one edit covers CI — no build step, ADR 0004); full gate green under a downloaded Node 24.16.0 locally (install + 143 tests + typecheck) → CI green. | | 103 | CI: standing fallow static-analysis check (report-only first) | — | Done | agent | — | — | **Shipped (2026-06-10).** `.github/workflows/fallow-report.yml` — fallow's static layer (`audit --format json` + `health --score --hotspots --targets`) on PRs and pushes to `main`, **report-only** (every fallow step `\|\| true`; never fails the build): JSON uploaded as the `fallow-report` artifact + jq-built step summary. `pnpm dlx fallow@2` not `npx` — the repo's `devEngines` pnpm pin makes npx refuse to run in-tree. Baseline for #102 (recorded in the closing comment): health **78.1 (B)**, 31 files / 3,944 LOC; dead files 1 (3.2%), dead exports 4 (4.9%), duplication 2.1%, 0 circular deps, 0 unused deps, 0 functions above complexity thresholds, 5 churn hotspots; audit vs main = pass, all zeros. Graduating to a gating check stays a separate future decision | | 45 | Swap tweakcc-fixed#4 detector to the identifierMap-union check | W1 | Done | mixed | `/tdd` | — | **Closed 2026-06-10 — premise satisfied on pickup reconcile.** Detector delivered (commit `bc60baa`) and **merged by skrabe 2026-06-09** (skrabe/tweakcc-fixed#4 → merge `1304bda`, which became tf main's anchor). Boot-verify AC covered post-merge by stronger evidence than the brief's stale 2.1.168 pin: the #58 gate run built tf@`1304bda` → green Four-zeros incl. Boot-verify on 2.1.169, and the #94 pre-stage run built tf#7 head `e096008` (contains it) → green on live 2.1.170. Evidence on the issue closing comment |