fix(fabrika): give the adr and spend verb groups one exit table each - #5309
Conversation
No preview deploy
|
|
review-skill: FAIL @ c88195e Verified against issue #5294 at the pinned head, read-only via a per-run ref. Class set from Blocking: the
|
| line | message | documented | actual (from source) |
|---|---|---|---|
| 136 | adr next: cannot fetch <ref> |
3 |
17 BASE_UNFETCHABLE |
| 137-138 | adr next: cannot enumerate open pull requests |
4 |
18 IN_FLIGHT_UNKNOWN |
| 139 | adr next: cannot read <dir> at <ref> |
6 |
11 DIR_UNREADABLE |
| 284 | adr new: <path> already exists |
3 |
12 ALREADY_EXISTS |
| 285-286 | adr new: bad id / bad slug |
4 |
1 (the deliberate BAD_ARGUMENT move) |
| 379 | adr resolve: cannot fetch <ref> |
3 |
17 |
| 380 | adr resolve: cannot enumerate open pull requests |
4 |
18 |
| 381 | adr resolve: cannot read <dir> at <ref> |
6 |
11 |
| 488 | adr supersede: no record for id <id> |
3 |
7 NO_SUBJECT |
| 489 | adr supersede: no record for --by id |
4 |
13 NO_BY |
| 490 | adr supersede: no single frontmatter status: line |
5 |
14 NO_STATUS_LINE |
| 491 | adr supersede: rewrite would have changed <n> line(s) |
6 |
15 MULTI_LINE_DIFF |
| 492 | adr amend-in-part: already "superseded by ..." |
7 |
16 ALREADY_SUPERSEDED |
| 655 | adr sweep: cannot read <dir> |
3 |
11 DIR_UNREADABLE |
| 656 | adr sweep: no readable ADR for --new |
4 |
7 NO_SUBJECT |
Actuals read from relate-verb.ts, sweep-verb.ts, new-verb.ts, next-verb.ts, resolve-verb.ts at this head — each imports its constants from the new adr/codes.ts, so the code is right and only the contract is wrong.
Three reasons this blocks rather than nits:
- The contract now contradicts itself on one page, in the exact shape fabrika
adrandspendallocate exit codes per-verb instead of from a group table #5294 exists to kill. In theadr supersedesection the Exit status table (line 478) says7= "<id>has no record under--dir"; the Errors table ten lines later (line 492) says7= "already superseded by ...". One number, two meanings, in one verb section of the artifact whose whole purpose in this PR is to establish one meaning per number. - It re-publishes the vacated
5. Line 490 documents exit5as a liveadr supersederefusal.5is genuinely gone from the code —adr/codes.unit.test.tsassertsallocatedCodes(codes).has(5) === false, the private band starts at12, and I found no reachable path to it — but the SKILL contract is what an agent reads to interpret$?, and it still saysadr supersedeexits5. That is the seat fix(fabrika): a readable-but-empty .decisions/ mints 0001 instead of exiting 5 #5297 deliberately cleared so a readable-but-empty.decisions/can mint0001. Requirement holds in code and fails in the contract. - It contradicts a fix this same PR made.
SKILL.mdline 25 was correctly updatedexit 6toexit 11for "a directory it could not read at all".contract.mdline 139 documents the same refusal as6. The PR fixed the prose mention and missed the table.
The PR body states "Prose consumers updated: claude-plugins/fabrika/skills/adr/contract.md" and "the adr contract's four per-verb tables plus a new group table". That is true of the Exit status tables and not true of the Errors tables. This is the consumer the re-seat missed — the machine-facing spec, not a shell script.
Fix: re-seat all fifteen Errors rows above, then re-run the review.
Verified sound (non-blocking)
SKILL.md6to11is correct.triage/contract.md,docs/cli-interface-convention.mdre-pointadrtoreport dedupas the standing per-verb example; no stale number survives in either.- No skill, script, workflow or
pipeline-clitool branches on a numeric status fromfabrika adr/fabrika spend— I greppedclaude-plugins/and.github/for$? -eq <n>/exitCode === <n>patterns and found no adr/spend-related hit. The author's consumer claim holds everywhere except the contract tables above. - All six
## Deviationsentries are literal and TRUE at source (verified individually).
|
review-code: FAIL @ c88195e Verified against issue #5294 at the pinned head, read-only via a per-run ref plus an isolated throwaway worktree. Not control-plane on both axes, so a PASS auto-ships with no human approval — this verdict binds. Sibling verdict: The exit-code work itself is correct and well-proven. One defect introduced by this diff blocks. Blocking: the new export was spliced between a docblock and the function it documentsIn Two consequences: Fix: move the Also worth fixing while in there (non-blocking)
Verified at source — all four brief items
Shared-file check. Scope ruling (asked for explicitly). The Tooling. Ran in my own throwaway worktree, not via |
c88195e to
229b0c6
Compare
|
review-code: FAIL @ 229b0c6 Re-gate after repair round 1. Verified against the PR head, read from a per-run ref, not a checkout. Required namespaces from The re-derivation, done against source rather than against the diffGround truth, read from
Then the reachable-code set per verb, read from each What passes. The repair's headline claims hold:
Blocking —
|
|
review-skill: PASS @ 229b0c6 Re-gate after repair round 1. Verified against the PR head, read from a per-run ref, not a checkout. Required namespaces from Skill surfaces verifiedThree skill files change here, and all three are truth-accurate against
All fifteen The new group table at L66-78 is accurate cell by cell against each verb's imports:
No skill-hygiene issue: no home/absolute/sibling path, links resolve (CI's dead-internal-link and Not decided — resolves to UNKNOWN
Whether a write-up that enumerates surfaces must account for every one, or may omit those with VerdictThe skill surfaces are correct and internally consistent, and the round-1 defect is fully discharged. This PR is not mergeable yet — Verdict-written: 2026-08-10T08:01:45Z |
229b0c6 to
718bed6
Compare
|
review-code: FAIL @ 718bed6 Re-gate after repair round 3. Verified PR #5309 against the acceptance criteria of #5294, one at a time, sourcing every file from the PR head (per-run ref + throwaway worktree; the launched tree was never switched). Ground truth for every literal below was re-derived from the
Per-criterion
Standing sub-gates
§CP
Why this is round 4 and not a nitRounds 1, 2 and 3 each failed the same way: a second stale instance inside a file the round had already edited. Round 3 fixed that for
Verdict-written: 2026-08-10T08:34:14Z |
|
review-skill: FAIL @ 718bed6 Re-gate after repair round 3. Behavioral-artifact class: Ground truth re-derived from What is correct at this head
The blocker — five stale sites, all in
|
| Line | What it publishes | Ground truth |
|---|---|---|
| L183 | adr next in-flight enumeration failure → $? = 4 |
IN_FLIGHT_UNKNOWN = 18 (this file's own L130 / L137) |
| L303 | adr new target path exists → $? = 3 |
ALREADY_EXISTS = 12 (L278 / L284) |
| L412 | adr resolve --base unfetchable → $? = 3 |
BASE_UNFETCHABLE = 17 (L370 / L379) |
| L515 | adr supersede no --by record → $? = 4 |
NO_BY = 13 (L479 / L489) |
| L525 | prose: "Exit 6 is that rule made mechanical rather than remembered" (the one-line-diff immutability rule) | MULTI_LINE_DIFF = 15 — and this file already says 15 at L468 and L491. 6 is not a seat in the adr table at all. |
This is the same failure shape as rounds 1, 2 and 3: a second stale instance inside a file the round had already edited. Rounds 1 and 2 swept this file's tables; nobody swept its fenced examples or its Grounding prose. Sweep by number, not by file — grep every 3/4/5/6 on an adr/spend surface and check each against codes.ts.
There is a sixth site on the code surface (packages/fabrika-cli/src/adr/resolve.ts:7), gated separately in the review-code verdict on this PR.
Criterion 10 (#5290) — applied, not reported UNKNOWN
claude-plugins/fabrika/docs/cli-interface-convention.md:120 enumerates six groups that ship a <group>/codes.ts where more do. I read the founder ruling on #5290 first-party (issue comment, 2026-08-10T07:53:39Z): silent omission discharges the criterion — no explicit "not applicable" line is owed. Leaving L120 untouched is therefore sanctioned, and I record it as not a defect, not as UNKNOWN. Independently: the sentence is true as written (those six groups do each ship a table), it does not claim to be exhaustive, and it is outside #5294's acceptance criteria. Nothing here blocks.
Skill-hygiene
- No frontmatter, trigger-phrase, or cross-reference change in this diff — the edits are body prose and tables only.
- Every in-repo link checked in the touched sections resolves (CI's dead-internal-link job is green at this head).
- No home-directory, machine-local, or sibling-repo path in any touched line.
validate skill frontmatterandlint skill corpus …bothsuccessat this head.
§CP
not-control-plane [path-clear-no-content-source] — claude-plugins/fabrika/** matches no CODEOWNERS row, and the live CONTROL_PLANE_RE anchors the gate-critical skills at claude-plugins/kampus-pipeline/skills/. Binding, SHA-bound verdict; no human approval gate stands behind it.
review-skill does not merge. ship-it is the authorised merge step.
Verdict-written: 2026-08-10T08:34:24Z
The adr group seated NO_SUBJECT on 3 in relate-verb and on 4 in sweep-verb, and exit 3 carried four meanings across its five verbs. spend never collided but allocated the same distinctions per verb. Both groups now allocate from a single <group>/codes.ts, share the base's target and precondition seats, and keep their own codes at 12 and up. 5 stays vacated in adr (#5254, #5297).
…e a docblock The round-1 diff rewrote every Exit status table in adr/contract.md and touched none of the five Errors tables, so fifteen rows still published the pre-fix per-verb numbers - including a live 5 on a seat #5297 vacated, and a 7 that meant two different things ten lines apart. Re-seats all fifteen, plus the spend paragraph in the package README that a repo-wide re-grep turned up. verbLocalCodesIn had been spliced between codeTableGroupsIn's docblock and its function; it moves below, and its .sort() moves outside the flatMap so the whole result is ordered rather than each file's share of it. Refs #5294
…false per-verb adr claim Round 3. README L556-559 published 3/4/5/6 for `spend rollup`; the group's seats are 7/11/12/13, and 3/4 are live seats with other meanings in the shared `report` base, so the package shipped two contradictory contracts for one verb. The "`adr` allocates per verb" assertion was false in three places at this head, not one: README L235, src/triage/codes.ts and skills/review/contract.md. All three now point at `report dedup` (#5296) as the surviving cross-group difference; the codes.ts docblock collapses to that pointer rather than re-narrating the why a fourth time.
Rounds 1-3 swept this corpus by file and by phrase; each round left a second stale instance inside a file it had already edited. This round swept by NUMBER instead — every occurrence of the vacated 3/4/5/6 and the re-seated 7/11/12/13/15/17/18 across the whole worktree, in every context (tables, fenced examples, prose, .ts docblocks), judged against the codes.ts files at head. Six sites, all contradicting a table in their own file: - adr/contract.md L183: `adr next` in-flight enumeration failure printed 4 -> IN_FLIGHT_UNKNOWN = 18 - adr/contract.md L303: `adr new` path exists printed 3 -> ALREADY_EXISTS = 12 - adr/contract.md L412: `adr resolve` base unfetchable printed 3 -> BASE_UNFETCHABLE = 17 - adr/contract.md L515: `adr supersede` no --by record printed 4 -> NO_BY = 13 - adr/contract.md L525: Grounding prose said "Exit 6"; 6 is not an adr seat at all -> MULTI_LINE_DIFF = 15, which the same file already states at L468 and L491 - src/adr/resolve.ts:7: the docblock said a failed read exits 3 or 4. The verb imports DIR_UNREADABLE / BASE_UNFETCHABLE / IN_FLIGHT_UNKNOWN, so its failed reads are 11 / 17 / 18. This file was never opened in any prior round because every sweep scoped to *-verb.ts. Four of the five doc sites are worked examples — the part a reader copies. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
718bed6 to
9c75658
Compare
|
review-code: PASS @ 9c75658 — merge-ready Verified PR #5309 against the acceptance criteria of #5294, one at a time, at head Ground truth re-derived from the
Independent by-number sweep for a seventh site — run fresh at the head, not taken from the PR's report. Scope: the whole tree at head (excluding Check on the six "correct, not stale" dismissals — each independently re-derived, since a wrongly-dismissed hit is indistinguishable from a missed one:
Sub-gates:
§CP: not-control-plane, both axes — the canonical classifier at this head over all 33 changed files returns Run-evidence bundle: UNKNOWN, not absent. The materialize-head helper aborted at this head ( Read the PR head (§HEAD): all files under review sourced from All criteria pass. This PR is merge-ready. review-code does not merge — Verdict-written: 2026-08-10T09:08:20Z |
|
review-skill: PASS @ 9c75658 — merge-ready Verified PR #5309's skills class against #5294's acceptance criteria plus the skill-rigor checklist, at head Class routing: Skill-class surface in the diff (4 files, all Acceptance criteria touching this class (the same conjunctive list, judged on the skill surface):
Skill-rigor checklist (run regardless of AC):
Independent by-number sweep over the skill surface — run fresh at head, not taken from the PR's report: every Criterion 10 is not reported as UNKNOWN: the founder ruled directly (2026-08-10T07:53:39Z, issue-comment 5237387187 on #5290) that silent omission discharges it. I read the ruling myself. deviation-disclosure (§DEV): PASS — the body's §CP: not-control-plane, both axes (path-clear and content-clear, Read the PR head (§HEAD): every file under review sourced from All acceptance criteria and all five rigor checks pass. This PR is merge-ready on the skills class. review-skill does not merge — Verdict-written: 2026-08-10T09:10:04Z |
The
adrverbs each invented their own exit numbers, and they disagreed:NO_SUBJECTmeant exit 3 fromadr supersedeand exit 4 fromadr sweep, while exit 3 meant four different things depending on which verb you ran.spendhad the same per-verb habit without the collision. Both groups now read their codes from one table per group, so a caller can look at$?and know what happened without first asking which verb produced it.Fixes #5294
What changed
packages/fabrika-cli/src/adr/codes.tsandpackages/fabrika-cli/src/spend/codes.ts. Every verb in each group imports from its table; no verb file declares a numeric exit constant any more.ALIGNED_GROUPSinpackages/fabrika-cli/src/exit-code-alignment.ts, each sharing two seats with thereportbase —NO_TARGET(7) for "the thing you named is not there" andPRECONDITION_UNKNOWN(11) for "the read that would have proven it failed".UNTABLED_GROUPSis now empty; the registry stays so a future untabled group is recorded rather than silent.adr new'sBAD_ARGUMENTmoved to exit 1 and the constant is gone (see below).adrcontract's two tables per verb — the five Exit status tables and the five Errors tables (fifteen rows, re-seated in repair round 1) — plus a new group table, bothcommand.tshelp strings, theindex.tsdocblock, and four other surfaces that cited the old numbers.The final tables
adr—packages/fabrika-cli/src/adr/codes.ts7NO_SUBJECTreport'sNO_TARGET)11DIR_UNREADABLEreport'sPRECONDITION_UNKNOWN)12ALREADY_EXISTS13NO_BY--byhas no record under--dir14NO_STATUS_LINEstatus:line15MULTI_LINE_DIFF16ALREADY_SUPERSEDEDsuperseded by …17BASE_UNFETCHABLE--basecould not be fetched18IN_FLIGHT_UNKNOWNspend—packages/fabrika-cli/src/spend/codes.ts7INPUT_ABSENT11INPUT_UNREADABLE12NOTHING_MEASURED13WINDOW_SELECTED_NO_ROWSA proven result and an UNKNOWN never share a code in either table:
INPUT_ABSENT(7) andNOTHING_MEASURED(12) are proven,INPUT_UNREADABLE(11) is the read that could not execute.5stayed vacatedNeither table seats
5, and the reason is stated once inadr/codes.tsrather than re-derived per verb: it meant "the record directory was read and is empty — refusing" until #5254 and #5297 made that state an answer, so a new meaning there would hand a caller pinned to the old reading a wrong answer under a familiar number. Because theadrgroup's own band starts at12, the seat is structurally out of reach, andadr/codes.unit.test.tsasserts it stays empty.The
adr newBAD_ARGUMENTquestion, settledBAD_ARGUMENTwas a usage error sitting on a proven code, and it exits1now. The deciding evidence is inside the group:adr resolvealready refuses a non-four-digit id withFAILED(exit 1). Seating the same fact — a malformed<id>— on4underadr newand on1underadr resolveis the one-fact-two-numbers defect this issue is about, at the reserved end of the table.packages/fabrika-cli/src/verb.tsreserves1for exactly this, and3+ for outcomes a verb PROVED; a bad flag value is not an outcome.Who consumes these numbers — checked before re-seating
Searched
origin/mainfor anything that branches on a value fromfabrika adrorfabrika spend:.githubworkflow, nopipeline-clitool invokes either group.claude-plugins/fabrika/skills/adr/SKILL.mdstates only "a non-zero exit is UNKNOWN" — value-agnostic. Its one numeric mention (exit 6) was prose and is updated.adr/relate-verb.unit.test.ts's[3, 4, 5, 6, 7]tuple and the>= 3/ distinctness assertions inspend/read-verb.unit.test.tsandspend/rollup-verb.unit.test.ts.claude-plugins/fabrika/skills/adr/contract.md— both its table kinds, Exit status and Errors; round 1 shipped only the Exit status tables and the review caught the fifteen stale Errors rows — plusclaude-plugins/fabrika/docs/cli-interface-convention.md,claude-plugins/fabrika/skills/triage/contract.md,packages/fabrika-cli/README.md(including itsspend"never a zero" paragraph, found in the repair round's re-grep), bothcommand.tshelp strings.Nothing outside the package branches on a specific value, so this re-seat cannot silently mis-branch a caller; it fails loudly in tests, which is the good failure.
The regression test fails against pre-fix code
verbLocalCodesIn(new, inexit-code-alignment.ts) reads verb sources, because a module namespace cannot tell an import from a declaration — and that difference is the whole defect. Run against the pre-fixadrverb modules restored fromorigin/mainit reports fifteen declarations across five files, includingNO_SUBJECTtwice on two numbers; run against this diff it reports none. Both group tests assert it is empty, and both refuse to pass over an empty table (ADR 0092).The guard genuinely sees both groups
adrandspendare inALIGNED_GROUPSwith real seat maps, not parked inUNTABLED_GROUPS.coverageGapsover the shipped registry reports{unclassified: [], unshipped: [], untabledWithTable: [], tableMissing: []}, and thedescribe.each(ALIGNED_GROUPS)block inexit-code-alignment.unit.test.tsnow runs the drift and collision checks over both tables.Tooling, re-run at the repair-round head and deliberately uncached:
pnpm exec tsgo -p packages/fabrika-cli/tsconfig.jsonexits 0, andpnpm --filter @kampus/fabrika-cli exec vitest runis 201 files / 2912 tests green, resolving inside this worktree.pnpm lint:worktreereports no diagnostic on any file this PR touches (its remaining output is pre-existing, on untouched generated.js).Deviations
Class: narrowed/widened the suggested fix-shape. Said: give each group a
codes.tsand re-seat the per-verb constants. Did: also mergedadr sweep'sCORPUS_UNREADABLEintoDIR_UNREADABLE, and replacedspend's seven per-verb names (TRANSCRIPT_ABSENT/LEDGER_ABSENT,TRANSCRIPT_UNREADABLE/LEDGER_UNREADABLE,NO_BILLED_TURNS/LEDGER_HOLDS_NO_ROWS) with four group names. Why: a table whose point is "one meaning per number" reads badly with two names for one fact, and triage's note observed thatspend's two verbs were already structurally parallel. Disposition: no action needed — the stderr line still names the transcript or the ledger, so nothing a caller reads was lost.Class: changed a test that asserted the old shape. Said: nothing about it. Did: rewrote
adr/relate-verb.unit.test.ts's "the exit codes are the contract's" test from a literal[3, 4, 5, 6, 7]tuple to a>= 3+ mutual-distinctness assertion, since the tuple pinned exactly the per-verb numbering being removed. Why: pinning literals in a per-verb file re-creates the coupling the group table exists to end. Disposition: no action needed — the stronger group-wide assertions live in the newadr/codes.unit.test.ts.Class: touched a file another lane also edits. Said: keep any edit to
exit-code-alignment.tsminimal. Did: three edits — the two registry entries (ADR_SEATS,SPEND_SEATS, both added toALIGNED_GROUPS), emptyingUNTABLED_GROUPSwith a docblock explaining why the export stays, and one new 12-line exportverbLocalCodesInused by both new group tests. Why: the source-level check has no other honest home, and duplicating it in two group test files would be worse. Disposition: for the reviewer to judge — the alignment machinery itself is otherwise untouched.Class: edited files the acceptance criteria did not list. Said: update
adr/contract.md, bothcommand.tshelp strings, and theindex.tsdocblock. Did: alsoclaude-plugins/fabrika/docs/cli-interface-convention.md,claude-plugins/fabrika/skills/triage/contract.md,claude-plugins/fabrika/skills/adr/SKILL.mdandpackages/fabrika-cli/README.md. Why: each citedadr's per-verb allocation or a specific old number as a live fact, so leaving them would ship a published contradiction — exactly the risk triage flagged. Disposition: no action needed. Where those docs usedadras the standing example of the per-verb shape, they now point atreport dedup(fabrikareport— the alignment base — seats two exit codes per-verb, colliding with its own group table #5296), which is still live.Class: resolved a flagged prerequisite rather than escalating. Said: if the
index.ts"the contract assigns each verb its own codes" claim reads as a real prior ruling, stop and escalate. Did: read it as a description of the status quo and rewrote it. Why: the actual ruling lives incli-interface-convention.md, which says both shapes are correct and a group picks by whether its verbs share refusal meanings. That ruling is untouched —adrandspendsimply exercise the choice it grants. Disposition: no action needed; flagging it here so a reviewer can disagree.Class: left a sibling defect alone. Said: do not absorb fabrika
report— the alignment base — seats two exit codes per-verb, colliding with its own group table #5296. Did: leftreport/dedup-verb.ts's out-of-table codes exactly as they are, and scoped the new source-level check to the two groups this issue owns rather than every tabled group. Why: a repo-wide version of that check would red onreporttoday. Disposition:#5296owns it.No ADR. This re-seats numbers inside an existing, already-ruled discipline; it establishes no new rule. Pre-assigned
0267is unused.(repair round 1) Class: edited files the acceptance criteria did not list. Said: fix the fifteen stale
Errorsrows inadr/contract.mdand moveverbLocalCodesIn. Did: also re-seatedpackages/fabrika-cli/README.md'sspend"I could not measure it is never a zero" paragraph, which still published3/4/5forINPUT_ABSENT/INPUT_UNREADABLE/NOTHING_MEASURED. Why: the verdict asked for a repo-wide re-grep for surviving old literals, and this is what it turned up — the same published-contradiction risk, one group over. Disposition: no action needed.(repair round 1) Class: narrowed/widened the suggested fix-shape. Said (non-blocking):
verbLocalCodesIn's.sort()sits inside theflatMap, and the scan covers*-verb.tsonly. Did: moved the.sort()outside theflatMapso the whole result is ordered, and recorded the*-verb.tsscope as a stated limit in the docblock rather than widening the scan. Why: the ordering fix is one line and makes the docblock's stable-list claim true; widening the scan is a behaviour change with its own false-positive question (a non-exit-codeUPPER = <digit>constant), which does not belong in a repair round. Disposition: for the reviewer to judge — the scope limit is now documented rather than fixed.(repair round 1) Class: edited a line the verdict did not name. Said: nothing about it. Did:
adr/contract.md'sadr resolveandadr sweepsections each said "5is vacated here for the same reason it is underadr next", but theadr nextsection carries no such note — the reason lives once in the group-level table above. Both now point there. Why: a cross-reference to a note that does not exist sends a reader looking for the one thing this PR is trying to make findable. Disposition: no action needed.(repair round 3) Class: edited lines the verdict did not name. Said: re-seat
README.mdL556-559 and rewrite L235'sadrclause. Did: also rewrote the identical "adrallocates per verb" claim inpackages/fabrika-cli/src/triage/codes.tsandclaude-plugins/fabrika/skills/review/contract.md, which a repo-wide re-grep at the PR head found still false. Why: fixing only the named line would have produced a round 4 on the identical shape — the exact failure rounds 1 and 2 each hit by stopping at the first hit in a file. Disposition: no action needed.(repair round 3) Class: narrowed the suggested fix-shape. Said: rewrite the
adrclause "the way the other two copies were rewritten". Did: insrc/triage/codes.tsthe clause collapses to a#5296pointer instead of restating the queue unreadable / search index unreadable gloss a fourth time. Why: CLAUDE.md's comments convention — a why is stated at its one load-bearing site and a docblock that re-derives it collapses to a pointer. Disposition: for the reviewer to judge; the prose surfaces (README,review/contract.md) keep the full gloss, only the code docblock points.(repair round 3) Class: left a flagged item alone deliberately. Said (recorded UNKNOWN, not blocking):
docs/cli-interface-convention.mdL120 enumerates 6 of the 16 shippedcodes.tsfiles. Did: nothing — not made exhaustive, no "no flaw here" wording, no restructuring. Why: that is open, unruled v1-surface coverage criterion enforced inconsistently: grilling passed, graduate failed #5290 (type:decision,status:triaged); resolving it here in either direction would decide it by precedent. Disposition:#5290owns it.(repair round 3) Class: pushed a head the prior verdict is not bound to. Said: nothing about it. Did: rebased onto latest
origin/mainbefore fixing (clean, no conflicts) per the repair step, so the push is--force-with-leaseand the head moved past229b0c62. Why: the repair step freshens the base to surface a textual conflict at code-time. Disposition: no action needed — the re-review re-binds the verdict to the new head.(repair round 4) Class: narrowed the suggested fix-shape — by inverting the sweep method. Said: sweep by number, not by file. Did exactly that, and it is the only reason this round found the sixth site: the sweep enumerated every occurrence of the vacated
3/4/5/6and the re-seated7/11/12/13/15/17/18across the whole checked-out worktree — tables, fenced examples, prose,.tsdocblocks,.sh,.yml— and judged each hit against thecodes.tsfiles at head, rather than scoping to a file list or a file-name pattern.src/adr/resolve.tshad never been opened in any prior round because every earlier sweep scoped to*-verb.ts. GitHubsearch/codewas deliberately not used: it indexes the default branch only and cannot see text living solely on this branch. Disposition: no action needed.(repair round 4) Class: left a flagged item alone deliberately. Said:
docs/cli-interface-convention.mdL120 is not a defect (true as written, non-exhaustive by design, outside this issue's acceptance criteria), and criterion 10 is discharged by silent omission (founder ruling on v1-surface coverage criterion enforced inconsistently: grilling passed, graduate failed #5290). Did: nothing — the line is untouched and no "not applicable" or "no flaw here" wording was added anywhere. Disposition:#5290owns the enumeration question.(repair round 4) Class: left a by-number sweep hit alone deliberately. Said: nothing about it. Did: the sweep surfaced
docs/cli-interface-convention.mdL367-378, where the worked block seats a refusal on3and a usage error on1. Left untouched. Why: that block documentsdecisions next-id, a hypothetical illustration verb the same file explicitly labels "Illustration only. It is not a commissioned verb, and it does not pre-commit the/adrcontract" (L340-343) — it is not theadrgroup and its3is not anadrseat. Re-seating it would make the illustration cite numbers from a table it is documented as not belonging to. Disposition: recorded so a reviewer re-running the by-number sweep sees the hit was judged, not missed.(repair round 4) Class: pushed a head the prior verdict is not bound to. Said: nothing about it. Did: rebased onto latest
origin/mainbefore fixing (clean, no conflicts) per the repair step, so the push is--force-with-leaseand the head moved past718bed60. Why: the repair step freshens the base to surface a textual conflict at code-time. Disposition: no action needed — the re-review re-binds the verdict to the new head. The suite at the new base is 201 files / 2917 tests green (2912 before the rebase; the five added came in withmain).