chore: review-ui route never reads the text verdict, so its prescribed clause can assert a PASS that is not there - #9310
Conversation
No preview deploy
|
|
governance: FAIL @ cc3656a content:3fe6d5e1cceb — decision id 0396 is already claimed by an open PR Corpus halfQuestions this change decides. May a Sweep. FAIL: the decision id is already claimed. Evidence: Remedy: renumber this record to the id Gate half
Self fence
Not this gate's questionWhether a code-owner approval is required here is CODEOWNERS' answer, not this namespace's. The |
|
review-code: FAIL @ cc3656a content:3fe6d5e1cceb — the refusal precedence the verb takes is not the one its contract states Judged the 6 code-class files at Per criterion
Finding — refusal precedenceThe text read is placed before the This is round 1's appended criterion on #9196, so it binds the next cycle explicitly as well. Execution evidence
Other reads, no finding
Deviations
Verdict-written: 2026-09-16T17:38:31Z |
|
review-doc: FAIL @ cc3656a content:3fe6d5e1cceb — the record mints an id an open PR already claims, and the exception text is still unamended Judged the 2 doc-class files at Finding 1 — the decision id is already claimed
Renumber to the id Finding 2 — criterion 3 is undischarged on a closing PR"ADR 0391 / the #7306 exception text is amended so both bullets say text-review PASS plus The PR body's Deviations disclose this honestly and file it as #9308 — that is the right shape for Two ways out, either of which clears this: post the dated amendment on #7306 in the shape the new What holds
Deviations
Verdict-written: 2026-09-16T17:39:04Z |
|
review-skill: FAIL @ cc3656a content:3fe6d5e1cceb — the contract states a refusal order the verb does not take Judged the 2 skill-class files at Finding — the behaviour sequence states an order the verb does not take
What holds
Deviations
Verdict-written: 2026-09-16T17:39:34Z |
…rder the verb takes (#9196)
|
Repair round 2 at governance FAIL / review-doc finding 1 — the decision id is already claimed. review-doc finding 2 — criterion 3 undischarged on a closing PR. The amendment is landed in the review-code / review-skill finding — the refusal precedence. The code's order is the one kept, Validated in this tree: Read first: the — at 4e2d309 |
|
governance: PASS @ 4e2d309 content:49de95954951 — the id collision is cleared; no contradiction and no weakening Round 2 at Corpus halfQuestions this change decides. May a The id collision is cleared. The record is renumbered The renumbering is carried through: the filename, the record's Sweep.
Gate half
Read by hand beside that: the diff adds a refusal ( No gate invariant in this diff's reach is weakened. Self fence
Routed, not judged hereOne code-class finding at this head — the new text reader's polarity rule for the advisory carrier Not this gate's questionWhether a code-owner approval is required here is CODEOWNERS' answer, not this namespace's. |
|
review-code: FAIL @ 4e2d309 content:49de95954951 — the new text reader is the only one of three that reads a FAIL advisory as a PASS Round 2 at Round 1's finding is dischargedThe refusal precedence now matches in both surfaces. Per criterion
Finding — the advisory carrier's polarity, in the one reader that drops the guard
claims.push({
namespace: advisory.namespace,
// The advisory carrier is PASS-only; `review post` refuses a FAIL through it on `10`.
polarity: "PASS",Both sibling readers refuse to make that assumption. // The advisory carrier is PASS-only. A `[FAIL]` row inside one is an invalid
// emission, caught below and reported — never read as a pass.
polarity: /\[FAIL\]/.test(comment.body) ? "FAIL" : "PASS",and The consequence is the exact failure this PR exists to end. A That is also the claim the module's own header makes and does not keep:
The ordering and the currency are genuinely shared — The fix is one predicate, and the honest shape is to lift the carrier parse the three readers now Related, not the finding: Execution evidence
Ran the touched directories' unit subset at this head as a second read: Other reads, no finding
Deviations
Verdict-written: 2026-09-16T17:58:44Z |
|
review-doc: FAIL @ 4e2d309 content:49de95954951 — the doc class is clean; the round carries an appended row that has to be read Round 2 at Read this polarity right. Round 1's two doc findings are both discharged and I found nothing new Round 1's two findings are dischargedFinding 1 — the decision id. The record is renumbered
Finding 2 — criterion 3. Met. The dated amendment is posted on the exception issue and appended What holds
Notes, not findings
Deviations
Portability
Verdict-written: 2026-09-16T18:00:42Z |
|
review-skill: FAIL @ 4e2d309 content:49de95954951 — the contract claims a reader parity the code does not hold Round 2 at Round 1's finding is dischargedThe behaviour sequence now states the order Finding — the contract asserts a reader parity the code does not hold
Two of the three clauses are true: Fix the code and the sentence becomes true as written. Fix only the sentence and the contract stops
What holds
Deviations
Verdict-written: 2026-09-16T18:01:17Z |
… cannot clear a route (#9196)
|
Round 3 at
The PR body's Validation in this tree. Read first: — at b33ef70 |
|
governance: PASS @ b33ef70 content:1866d6ad3870 — no contradiction, no weakening Questions this diff decides
Corpus half
No contradiction found. Gate half
Read the unanchored surface by hand, since that is the gap the scan cannot cover:
No gate invariant in this diff's reach is removed or softened. Self fence
|
|
review-code: PASS @ b33ef70 content:1866d6ad3870 — merge-ready Round 3, judged at Code slice: 8 files — Per-criterion evidence1 — 2 — with no verdict at the head, the answer is explicit, one documented choice. Met, and the 3 — the exception text amended. Met. Verified the artifact rather than the claim: comment 4 — a unit case pins FAIL refuses, PASS proceeds. Met, and wider than asked: standing FAIL 5 — contract states the read runs before the 6 — the advisory carrier gets the same polarity rule its sibling readers give it, pinned. Met. Fan-out
Execution evidence
Locally, the unit subset for the touched directories only: Deviations
Both follow-ups named in the section are open issues that exist. Verdict-written: 2026-09-16T18:19:34Z |
|
review-doc: PASS @ b33ef70 content:1866d6ad3870 — the record and the verb reference match the shipped behaviour Round 3, judged at Per-criterion evidence3 — the exception text amended so both bullets say text-review PASS plus hand-verification stand 2 and 5 — the documented choice and the read order. The record states both and the verb The record itself
Editorial craft —
|
|
review-skill: PASS @ b33ef70 content:1866d6ad3870 — the skill and its contract describe the verb the code ships Round 3, judged at Per-criterion evidence1 — the exit code named in the codes table and 2 — the absent-verdict answer is one documented choice. Met. The contract's 5 — the read order is stated in the order the verb performs it. Met, in the Craft —
|
review-ui routeposts a record whose prescribed clause asserts "Text review PASS + builderhand-verification stand in", and it read neither half. This lands the first half: the verb resolves
the
review-codeverdict in force at--shaand refuses on a standing FAIL with its own exit code,20. Founder ruling on #9196, transcribed as.decisions/0397-a-tuval-route-rests-on-a-standing-text-pass.md, which names the ruling comment.The reader is
review verdicts' own two carriers — theverdict-markerfirst line and the §CPadvisory — ordered by
ship gate'sinForce, judged current by the samebindToContent, and giventhe advisory's polarity by the same
advisoryPolarity, so the two gates cannot answer one questiondifferently. An absent verdict refuses on the same
20wherethe route carries
--verified-at, because that record is the one asserting the conjunction; aprose-only route asserts nothing about the text lane, so it posts and says so on stderr and in the
answer's new
textReviewfield.Start with
packages/fabrika-cli/src/review-ui/text-verdict.ts(the reader) and the block it iscalled from in
route-verb.ts, then the absence arm in.decisions/0397…§2 — that is the oneplace this narrows the ruling's direction, and the acceptance criteria leave the choice to the
implementation as long as it is documented and never silent.
Round 2 answers the three findings at
cc3656aa. The record is renumbered0396to0397, the idfabrika adr nextreports at this head —0396is in flight on PR #9305, and whichever mergedsecond would have landed a duplicate. The exception text amendment is landed on #7306 as a dated
comment and appended to its body in the same shape, so the closing criterion is met rather than
deferred. The contract's and SKILL.md's behaviour sequence now states the order
runRoutetakes:the text verdict is read before the
--verified-atcomparison, so a route that is both spent andstanding-FAIL exits
20, not12.Round 3 answers the round-2 finding at
4e2d309f. The advisory carrier's polarity was a third copyof a rule the two sibling readers held inline, and the copy diverged:
text-verdict.tshardcodedPASS, so a[FAIL]row inside an advisory cleared the route whileship gaterefused on the samecomment. The predicate moves to
review/advisory.tsasadvisoryPolarity, and all three readerscall it. A unit case pins the refusal.
Follow-up still open: #9309 (the contract's group code
table skips
19).Fixes #9196
Deviations
both bullets say text-review PASS plus hand-verification stand in. Did: round 1 recorded the
condition in the ADR's §5 without writing the exception issue; round 2 posted the dated amendment
on review-ui cannot judge localhost-only rendered products #7306 and appended it to the issue body below the standing text, and the ADR's §5 names that
comment. Why: the deferral's reason — that a build lane writes a branch — does not hold for an
issue comment, which is the shape ADR 0391 §5 already prescribes. Disposition: corrected —
the amendment is landed at
review-ui cannot judge localhost-only rendered products #7306 (comment), and
The interim renderer exception's clause is now enforced by a verb, and its body text does not say so #9308 is the follow-up that tracks it and is still open.
review-codeFAILor absence. Did: a standing FAIL refuses every route; an absent verdict refuses only a route
carrying
--verified-at. Why: the acceptance criteria make the absence arm an explicitdocumented choice, and refusing it everywhere orders the two gates on PRs whose record makes no
claim about the text lane — a review-ui lane running before the text one would park on sequencing.
The ruling's own wording refuses "on a standing FAIL". Disposition: stated here, and recorded
with its reasoning in ADR 0397 §2 and the
routecontract section.review-ui route. Did: also madeship gate'sinForcegeneric in its claim type. Why: the new reader passes a narrower claim(two polarities, no route carrier) and would otherwise need a cast to read its own fields back.
Disposition: stated here; no behaviour changes, and
shipandheal-ci's suites are green.review-ui route. Did: also moved the §CPadvisory's polarity predicate out of
ship/gate-verb.tsandlane/prove-verb.tsintoreview/advisory.ts, and pointed both at it. Why: the finding was that the rule was held intriplicate and the third copy diverged; patching only the third copy leaves the shape that produced
it. Disposition: stated here — the two sibling readers keep the behaviour they had, and the
ship,lane,reviewandreview-uiunit subsets are green.20row to the contract'sgroup code table and left the missing
19row alone. Why: it predates this change and fixingit here would widen a scoped diff. Disposition: filed as
The review-ui contract's group exit table skips 19, so one code has no single-meaning row #9309.