Deferred: file now, work it after the v2.0.0 major release. Not a blocker for 2.0.
The evidence
PR fix/563-636-clean-round-1-and-base-ancestry (#563 + #636) ran eight review rounds on ~2 files. Rounds 6–8 were self-inflicted: the driver volunteered a guard mid-review on a field disclosed as binding to nothing, and two full rounds were spent reviewing it. The guard was deleted at the end (#643).
skills/sdlc/SKILL.md already contained four separate rules that each independently end that at round 6 or 7:
:136 — reviewers may return WRONG SHAPE (stop, redesign)
:152 — "No test costs more rounds than the change it guards"
:163 — "Blame the line: a blocker in code nobody asked for — cut it, don't repair it"
:273 — "If you are repairing a guard for the second time this cycle, ask whether it should exist"
None of them fired. Not concealed, not unknown — read, and not applied under momentum. Fable's diagnosis: they are ambient driver-memory prose, and this repo has a proven failure record for that mechanism and a proven success record for the other one (:273's own note: "Reviewers only pick outcomes the prompt offers. Rounds 1–3 kept it off the menu; round 4 put it on and it was taken immediately").
The immediate remedy is scoped and shipping separately (reframed #617: shape + target as required reviewer fields). This issue is the general problem behind it.
The general problem
Our instructions live scattered across .md and config surfaces, each one authoritative for something, none of them reconciled against the others:
skills/sdlc/SKILL.md (ships), skills/setup/, skills/update/, skills/feedback/
CLAUDE_CODE_SDLC_WIZARD.md, AI_SETUP_LANES.md, ARCHITECTURE.md, ROADMAP.md
CLAUDE.md — repo-local, and a different CLAUDE.md in every consumer repo
cowork/ — byte-parity copies of skills/, a second place the same prose lives
.claude/settings.json, hooks/hooks.json, .claude-plugin/ manifests
- global
~/.claude/settings.json, whose env block silently overrides explicit tool params
Questions this issue is to answer, with evidence, not opinion:
- Do rules collide? Find pairs of instructions across these surfaces that contradict, or that a reader would apply inconsistently.
SKILL.md:163 vs. the recheck contract at :161 is one candidate — both are about what a finding authorizes, in different words, in the same file.
- What is the firing rate of a prose rule? We have the data: rules in prompt templates (copied verbatim into a review every round) vs. rules in ambient skill prose (relied on from memory). Measure, don't guess — this is the whole basis for preferring one mechanism.
- Is there a budget?
SKILL.md keeps growing, and skill listings are budget-clamped (a skill over ctx x 4 x 0.01 chars goes name-only). More prose is not free and past some size it is actively harmful — a rule nobody reaches is worse than no rule, because we cite it as coverage.
- Which surface should own which kind of rule? Rough hypothesis to test: things that must fire → prompt templates and hooks. Things that inform a judgement → skill prose. Things that are facts about the repo →
CLAUDE.md. Today they are mixed arbitrarily.
- Config collision specifically. Global settings silently overriding per-call params has already bitten us once (subagent model/effort pins). Enumerate every override path where a local instruction can be silently defeated by a broader config.
Why after 2.0
This is an audit-and-restructure of the shipped instruction surface. It will move prose that consumers depend on, so it wants a major boundary behind it, not in front of it. #617's reframe covers the specific defect that cost us the eight rounds; this covers the class.
Related: #617 (design judgement is never the momentum-holder's), #516 (two harnesses colliding at the root docs), #485 (replace hand-rolled doc guards with declarative consistency checking), #643 (the deleted guard that produced the evidence).
Deferred: file now, work it after the v2.0.0 major release. Not a blocker for 2.0.
The evidence
PR
fix/563-636-clean-round-1-and-base-ancestry(#563 + #636) ran eight review rounds on ~2 files. Rounds 6–8 were self-inflicted: the driver volunteered a guard mid-review on a field disclosed as binding to nothing, and two full rounds were spent reviewing it. The guard was deleted at the end (#643).skills/sdlc/SKILL.mdalready contained four separate rules that each independently end that at round 6 or 7::136— reviewers may return WRONG SHAPE (stop, redesign):152— "No test costs more rounds than the change it guards":163— "Blame the line: a blocker in code nobody asked for — cut it, don't repair it":273— "If you are repairing a guard for the second time this cycle, ask whether it should exist"None of them fired. Not concealed, not unknown — read, and not applied under momentum. Fable's diagnosis: they are ambient driver-memory prose, and this repo has a proven failure record for that mechanism and a proven success record for the other one (
:273's own note: "Reviewers only pick outcomes the prompt offers. Rounds 1–3 kept it off the menu; round 4 put it on and it was taken immediately").The immediate remedy is scoped and shipping separately (reframed #617:
shape+targetas required reviewer fields). This issue is the general problem behind it.The general problem
Our instructions live scattered across
.mdand config surfaces, each one authoritative for something, none of them reconciled against the others:skills/sdlc/SKILL.md(ships),skills/setup/,skills/update/,skills/feedback/CLAUDE_CODE_SDLC_WIZARD.md,AI_SETUP_LANES.md,ARCHITECTURE.md,ROADMAP.mdCLAUDE.md— repo-local, and a differentCLAUDE.mdin every consumer repocowork/— byte-parity copies ofskills/, a second place the same prose lives.claude/settings.json,hooks/hooks.json,.claude-plugin/manifests~/.claude/settings.json, whose env block silently overrides explicit tool paramsQuestions this issue is to answer, with evidence, not opinion:
SKILL.md:163vs. the recheck contract at:161is one candidate — both are about what a finding authorizes, in different words, in the same file.SKILL.mdkeeps growing, and skill listings are budget-clamped (a skill overctx x 4 x 0.01chars goes name-only). More prose is not free and past some size it is actively harmful — a rule nobody reaches is worse than no rule, because we cite it as coverage.CLAUDE.md. Today they are mixed arbitrarily.Why after 2.0
This is an audit-and-restructure of the shipped instruction surface. It will move prose that consumers depend on, so it wants a major boundary behind it, not in front of it. #617's reframe covers the specific defect that cost us the eight rounds; this covers the class.
Related: #617 (design judgement is never the momentum-holder's), #516 (two harnesses colliding at the root docs), #485 (replace hand-rolled doc guards with declarative consistency checking), #643 (the deleted guard that produced the evidence).