HOMELAB-2682: fix(forgejo): documentation never supplies a verdict, stance or pin, and a section severity word never decides a finding #111

Merged
pi-landing merged 7 commits from plane/HOMELAB-2682-verdict-arm-fix into main 2026-11-06 17:41:48 +00:00
Collaborator

What

The verdict arm and the finding arm of the landing lock, after the round-4 blind seat's measured defects on the merged a570a5df (PR #108) and homelab-88's orch15 repro (working-files/infra-stability/orch15/lock-parser-repro.md).

Branch plane/HOMELAB-2682-verdict-arm-fix off main at a570a5df. Nothing placed anywhere: the merged parser at main is under HOLD and this PR is a branch and a PR, nothing else.

Defects fixed

BLK-1 — prose acquired a stance and shadowed a real hold (fail-open, merged). A first line whose subject merely mentions review/verdict/approval (Review notes on 4f2a1bc) opened a verdict statement, the paragraph under it was attached, its incidental "approved in principle" became the comment's stance, and that stance shadowed the whole-body hold-first read — so a real REQUEST_CHANGES at <head> later in the SAME comment was discarded and the lock permitted. The seat measured: base refused, a570a5df permitted.

Now: a statement's block supplies a stance only when the opener NAMES a verdict (**Verdict summary**, verdict: request_changes, **Verdict of record — <reviewer>**) — the round-3 shapes. A prose opener's stance is (1) its own line, else (2) a hold read anywhere in the body (fail-closed), else (3) a line that states a stance about a head it also names IN THAT LINE (the shape a reviewer's answer takes when it points at its own verdict: Comment 16035 is an approval of <sha> — the real corpus comment that pinned this). Prose no longer manufactures an APPROVE either: "approved in principle" with a sha above it is discussion, not a verdict.

BLK-2 / RISK-2 — fenced and blockquoted text was read as the verdict block. The findings arm has treated fences and blockquotes as documentation since round 3 (documentationLines); the verdict arm never did, so the same text was documentation when it would raise a finding and evidence when it would permit a merge:

  • a prose opener, a blank line, then a fenced verdict: pass + head: <sha> template (the blank-skip walked INTO the fence) — exact-head APPROVE at a570a5df, refusal at base;
  • a pure blockquote > verdict: pass / > head: <sha> — same flip;
  • RISK-2, the older half, at BOTH revisions: > ## Verdict — APPROVE at <head> (> ## is not /^#{1,6}\s/, so the quoted line was an "opener" and the quote supplied both polarity and pin).

verdictStatementLines is now documentation-aware: leading documentation is SKIPPED (so a quoted attribution line above a real verdict does not swallow it — homelab-88's shape, which reported "None carries a verdict statement in the recognised forms" for a comment that plainly carried one) and the statement block STOPS at the first documentation line rather than consuming it. A comment that is only a quote therefore has no statement at all: it is not a verdict, supplies no stance and no pin. The body fallback reads approve/concern from non-documentation lines only, with a raw-body hold still winning.

RISK-3 — a section's severity word decided whether its line was a finding. Under ## Blockers, - B1: blocker — … yielded ZERO findings while - B1: high — … and BLOCKER B1: … both counted: the severity WORD matched the token path, where every pattern wants the token at the line HEAD, and the token path never fell through to the section arm. A token standing in the label's own severity SLOT (<lead gap><id label><separator>blocker) is now read by the section's content rules, whose own guards (negation, zero-claims, resolution notes, documentation, non-blocker labels) still decide what the line is.

Deliberately NOT widened: a token MID-SENTENCE still does not count (- I checked whether the (blocker) tag applies …, - no new blockers were introduced at this head). Round 2's rule — a parenthetical token is a LABEL, never prose — is unchanged; the r2/B1 tests that pin it stay green, and the partial state of this branch (a blanket fall-through) broke them.

CONCERN-2 — docs. docs/forgejo.md claimed "Fenced and BLOCKQUOTED text is documentation in both arms". That sentence is now true, and it says what the verdict arm does with a quote: no stance, no head pin, and a comment that is only a quote is not a verdict.

Unchanged, recorded and accepted

  • RISK-1 — ### Findings no longer supplies severity. Unchanged.
  • RISK-4 — isVerdictShaped is narrower than isReviewVerdict. Unchanged.
  • homelab-88's orch15 repro items OUTSIDE the parser — findings are aggregated across all comments so a later clean verdict cannot withdraw an earlier parse, and an id-less finding that no comment can close — are NOT addressed here. They are supersession/reporting questions on HOMELAB-2682, not this diff.

Tests

forgejo/tests/landing-verdict-arm-2682.test.ts, written first, 30 cases: BLK-1 (including the APPROVE with concerns control and the round-3 machine-form controls), BLK-2a/2b, RISK-2, RISK-3 (every severity word, the zero-claims, the negations, the documented template, prose-outside-forms), homelab-88's orch15 regressions (## No blockers. over 15 evidence lines, the no-# body, Blockers: none., the attribution line above a verdict), and both directions of the finding rule (the three forms still count; only the forms).

Measured BOTH ways, not asserted:

run result
the 30 cases against CLEAN a570a5df (stashed tree) 13 red / 17 green — the whole BLK-1 group (4), the whole BLK-2/RISK-2 group (6), two RISK-3 cases, and homelab-88's attribution case
this head 30 / 30 green; package suite 993 / 993 green (36 files); tsc --noEmit clean

The three homelab-88 cases that are green at a570a5df as well are #108's own fixes, kept as guard rails against this change reopening them.

Files changed: forgejo/landing.ts, forgejo/tests/landing-verdict-arm-2682.test.ts (new), docs/forgejo.md (the one false sentence). Nothing wider.

Reviewer limitation (the fleet's own rule): a reviewer may read, comment and approve or request changes — never edit, commit or push, and nobody posts a verdict in a reviewer's place.

PR-description addendum — the accepted cost, recorded plainly (not a verdict; documentation for the seats)

The fix worker could not edit the description (no tool exists for it in this session), so ruling item 2 of working-files/ldv0/tooling10-ruling-1555.md is recorded here, in the form it should be pasted into the description, and in docs/forgejo.md. This comment is not verdict-shaped and carries no stance in either direction — checked against the deployed lock at 34fdf7f5 and against this head before posting.

Accepted cost:

A reviewer who writes a hold only as a quote, in a comment that does not read as verdict-shaped, is ignored if others have approved.

Three things follow, and the first is the cost:

  • Quoted and fenced text counts for nothing in either direction. A fence or a blockquote is how a reviewer SHOWS a shape, never how they post one, so it supplies no stance, no hold and no head pin. Approvals cannot be quoted into existence; neither can holds.
  • A hold must be a verdict or a line under ## Blockers. The exit for a reviewer whose objection was written as a quote is a rewrite, not a re-tone: post it as a verdict block (**Verdict of record — <reviewer> — head <sha>: REQUEST_CHANGES**, or verdict: request_changes plus head:), or list it under ## Blockers.
  • Nothing unquoted was lost. An unquoted hold naming the head still refuses, under every approve form (15 spellings × 3 openers in the suite), and the fail-closed arms are untouched: a verdict-shaped comment with no readable verdict block still refuses, and a quoted hold no longer rescues it into a readable stance — it refuses as no-verdict-block, which is what it always was.

Round 6's documented-hold leg is removed, not extended: requestChangesPinsIn's documented-text half, the stance-state documented-hold branch, and extractVerdict's "a documented hold takes its own pins" are all gone. The resolution carve-out now reads non-documentation lines only, so a quote cannot re-arm a resolution either.

Differs from the deployed lock at 34fdf7f5 in exactly the ruled direction: of a 109-shape corpus, 10 rows move refuses → permits, and every one is a hold that existed only as a quoted or fenced line (no unquoted hold, no fail-closed shape, no corpus verdict).

New head: 6f18ab9cbc7b85aa192679a3e091da525ee37b8e. Package suite 1022/1022 green, deployed-shape suite 1022/1022, tsc --noEmit clean. Nothing merged, nothing placed.

Loosening vs the deployed lock (recorded as a loosening)

478 rows (N4: 260, N5: 106, N6: 112): a mid-sentence severity marker in prose with no ## Blockers section no longer raises a finding. Reason: with no ## Blockers section these lines are prose, and the rule is that everything else never parses; failing them closed would re-create a false refusal (the #108 seat-1 B1 class). This loosens the lock against what is deployed at 34fdf7f5.

Refuses→permits additions, recorded before merge

Loosening, in addition to the 478 N4–N6 rows above:
(a) ## No blockers. over a defect line — 6 rows measured; the heading is not the exact ## Blockers, so the section rule does not apply; includes - B1: high and - RISK-2: forms.
(b) Malformed or glued markers with NO section — (blocker], (blocker ], [blocker), [ blockers ), - B1: ... (blocker], BLOCKER<B1>: — not fully counted.
(c) A verdict block plus prose about a REQUEST_CHANGES on an older head — 1 row measured.

Not a loosening (list only): - None., - **None.**, none, none!, blockers resolved, and lines after a nested heading or --- under ## Blockers raise no finding at this head — the structural rule names only exactly None. as the exception, so this is wider than the rule's letter; no refuse→permit move is involved.

## What The verdict arm and the finding arm of the landing lock, after the round-4 blind seat's measured defects on the merged `a570a5df` (PR #108) and homelab-88's orch15 repro (`working-files/infra-stability/orch15/lock-parser-repro.md`). Branch `plane/HOMELAB-2682-verdict-arm-fix` off `main` at `a570a5df`. Nothing placed anywhere: the merged parser at `main` is under HOLD and this PR is a branch and a PR, nothing else. ## Defects fixed **BLK-1 — prose acquired a stance and shadowed a real hold (fail-open, merged).** A first line whose subject merely mentions review/verdict/approval (`Review notes on 4f2a1bc`) opened a verdict statement, the paragraph under it was attached, its incidental "approved in principle" became the comment's stance, and that stance shadowed the whole-body hold-first read — so a real `REQUEST_CHANGES at <head>` later in the SAME comment was discarded and the lock permitted. The seat measured: base refused, `a570a5df` permitted. Now: a statement's block supplies a stance only when the opener NAMES a verdict (`**Verdict summary**`, `verdict: request_changes`, `**Verdict of record — <reviewer>**`) — the round-3 shapes. A prose opener's stance is (1) its own line, else (2) a hold read anywhere in the body (fail-closed), else (3) a line that states a stance about a head it also names IN THAT LINE (the shape a reviewer's answer takes when it points at its own verdict: `Comment 16035 is an approval of <sha>` — the real corpus comment that pinned this). Prose no longer manufactures an APPROVE either: "approved in principle" with a sha above it is discussion, not a verdict. **BLK-2 / RISK-2 — fenced and blockquoted text was read as the verdict block.** The findings arm has treated fences and blockquotes as documentation since round 3 (`documentationLines`); the verdict arm never did, so the same text was documentation when it would raise a finding and evidence when it would permit a merge: - a prose opener, a blank line, then a fenced `verdict: pass` + `head: <sha>` template (the blank-skip walked INTO the fence) — exact-head APPROVE at `a570a5df`, refusal at base; - a pure blockquote `> verdict: pass` / `> head: <sha>` — same flip; - RISK-2, the older half, at BOTH revisions: `> ## Verdict — APPROVE at <head>` (`> ##` is not `/^#{1,6}\s/`, so the quoted line was an "opener" and the quote supplied both polarity and pin). `verdictStatementLines` is now documentation-aware: leading documentation is SKIPPED (so a quoted attribution line above a real verdict does not swallow it — homelab-88's shape, which reported "None carries a verdict statement in the recognised forms" for a comment that plainly carried one) and the statement block STOPS at the first documentation line rather than consuming it. A comment that is only a quote therefore has no statement at all: it is not a verdict, supplies no stance and no pin. The body fallback reads approve/concern from non-documentation lines only, with a raw-body hold still winning. **RISK-3 — a section's severity word decided whether its line was a finding.** Under `## Blockers`, `- B1: blocker — …` yielded ZERO findings while `- B1: high — …` and `BLOCKER B1: …` both counted: the severity WORD matched the token path, where every pattern wants the token at the line HEAD, and the token path never fell through to the section arm. A token standing in the label's own severity SLOT (`<lead gap><id label><separator>blocker`) is now read by the section's content rules, whose own guards (negation, zero-claims, resolution notes, documentation, non-blocker labels) still decide what the line is. Deliberately NOT widened: a token MID-SENTENCE still does not count (`- I checked whether the (blocker) tag applies …`, `- no new blockers were introduced at this head`). Round 2's rule — a parenthetical token is a LABEL, never prose — is unchanged; the r2/B1 tests that pin it stay green, and the partial state of this branch (a blanket fall-through) broke them. **CONCERN-2 — docs.** `docs/forgejo.md` claimed "Fenced and BLOCKQUOTED text is documentation in both arms". That sentence is now true, and it says what the verdict arm does with a quote: no stance, no head pin, and a comment that is only a quote is not a verdict. ## Unchanged, recorded and accepted - **RISK-1** — `### Findings` no longer supplies severity. Unchanged. - **RISK-4** — `isVerdictShaped` is narrower than `isReviewVerdict`. Unchanged. - homelab-88's orch15 repro items OUTSIDE the parser — findings are aggregated across all comments so a later clean verdict cannot withdraw an earlier parse, and an id-less finding that no comment can close — are NOT addressed here. They are supersession/reporting questions on HOMELAB-2682, not this diff. ## Tests `forgejo/tests/landing-verdict-arm-2682.test.ts`, written first, 30 cases: BLK-1 (including the `APPROVE with concerns` control and the round-3 machine-form controls), BLK-2a/2b, RISK-2, RISK-3 (every severity word, the zero-claims, the negations, the documented template, prose-outside-forms), homelab-88's orch15 regressions (`## No blockers.` over 15 evidence lines, the no-`#` body, `Blockers: none.`, the attribution line above a verdict), and both directions of the finding rule (the three forms still count; only the forms). Measured BOTH ways, not asserted: | run | result | |---|---| | the 30 cases against CLEAN `a570a5df` (stashed tree) | **13 red / 17 green** — the whole BLK-1 group (4), the whole BLK-2/RISK-2 group (6), two RISK-3 cases, and homelab-88's attribution case | | this head | **30 / 30 green**; package suite **993 / 993 green** (36 files); `tsc --noEmit` clean | The three homelab-88 cases that are green at `a570a5df` as well are #108's own fixes, kept as guard rails against this change reopening them. Files changed: `forgejo/landing.ts`, `forgejo/tests/landing-verdict-arm-2682.test.ts` (new), `docs/forgejo.md` (the one false sentence). Nothing wider. Reviewer limitation (the fleet's own rule): a reviewer may read, comment and approve or request changes — never edit, commit or push, and nobody posts a verdict in a reviewer's place. ## PR-description addendum — the accepted cost, recorded plainly (not a verdict; documentation for the seats) The fix worker could not edit the description (no tool exists for it in this session), so ruling item 2 of `working-files/ldv0/tooling10-ruling-1555.md` is recorded here, in the form it should be pasted into the description, and in `docs/forgejo.md`. This comment is not verdict-shaped and carries no stance in either direction — checked against the deployed lock at `34fdf7f5` and against this head before posting. **Accepted cost:** > A reviewer who writes a hold only as a quote, in a comment that does not read as verdict-shaped, is ignored if others have approved. Three things follow, and the first is the cost: - **Quoted and fenced text counts for nothing in either direction.** A fence or a blockquote is how a reviewer SHOWS a shape, never how they post one, so it supplies no stance, no hold and no head pin. Approvals cannot be quoted into existence; neither can holds. - **A hold must be a verdict or a line under `## Blockers`.** The exit for a reviewer whose objection was written as a quote is a rewrite, not a re-tone: post it as a verdict block (`**Verdict of record — <reviewer> — head <sha>: REQUEST_CHANGES**`, or `verdict: request_changes` plus `head:`), or list it under `## Blockers`. - **Nothing unquoted was lost.** An unquoted hold naming the head still refuses, under every approve form (15 spellings × 3 openers in the suite), and the fail-closed arms are untouched: a verdict-shaped comment with no readable verdict block still refuses, and a quoted hold no longer rescues it into a readable stance — it refuses as `no-verdict-block`, which is what it always was. Round 6's documented-hold leg is **removed, not extended**: `requestChangesPinsIn`'s documented-text half, the stance-state documented-hold branch, and `extractVerdict`'s "a documented hold takes its own pins" are all gone. The resolution carve-out now reads non-documentation lines only, so a quote cannot re-arm a resolution either. Differs from the deployed lock at `34fdf7f5` in exactly the ruled direction: of a 109-shape corpus, **10 rows move refuses → permits**, and every one is a hold that existed only as a quoted or fenced line (no unquoted hold, no fail-closed shape, no corpus verdict). New head: `6f18ab9cbc7b85aa192679a3e091da525ee37b8e`. Package suite 1022/1022 green, deployed-shape suite 1022/1022, `tsc --noEmit` clean. Nothing merged, nothing placed. ## Loosening vs the deployed lock (recorded as a loosening) 478 rows (N4: 260, N5: 106, N6: 112): a mid-sentence severity marker in prose with no ## Blockers section no longer raises a finding. Reason: with no ## Blockers section these lines are prose, and the rule is that everything else never parses; failing them closed would re-create a false refusal (the #108 seat-1 B1 class). This loosens the lock against what is deployed at 34fdf7f5. ## Refuses→permits additions, recorded before merge Loosening, in addition to the 478 N4–N6 rows above: (a) `## No blockers.` over a defect line — 6 rows measured; the heading is not the exact `## Blockers`, so the section rule does not apply; includes `- B1: high` and `- RISK-2:` forms. (b) Malformed or glued markers with NO section — `(blocker]`, `(blocker ]`, `[blocker)`, `[ blockers )`, `- B1: ... (blocker]`, `BLOCKER<B1>:` — not fully counted. (c) A verdict block plus prose about a REQUEST_CHANGES on an older head — 1 row measured. Not a loosening (list only): `- None.`, `- **None.**`, `none`, `none!`, `blockers resolved`, and lines after a nested heading or `---` under `## Blockers` raise no finding at this head — the structural rule names only exactly `None.` as the exception, so this is wider than the rule's letter; no refuse→permit move is involved.
HOMELAB-2682: fix(forgejo): documentation never supplies a verdict, stance or pin, and a section's severity word never decides a finding
All checks were successful
CI / pr-title (pull_request) Successful in 1s
CI / forgejo-ci (pull_request) Successful in 45s
CI / mcp-bridge (pull_request) Successful in 33s
tests / python (pull_request) Successful in 5s
CI / pi-otel-telemetry (pull_request) Successful in 54s
CI / skill-args (pull_request) Successful in 49s
CI / ask-user-question (pull_request) Successful in 54s
CI / redact (pull_request) Successful in 37s
CI / todo (pull_request) Successful in 1m1s
CI / plane (pull_request) Successful in 1m10s
CI / forgejo (pull_request) Successful in 1m10s
CI / refocus (pull_request) Successful in 1m4s
CI / nats-intercom (pull_request) Successful in 58s
CI / pi-friction (pull_request) Successful in 1m3s
CI / pi-swarm-suite (pull_request) Successful in 3m39s
48509e5994
The verdict arm and the finding arm, from the round-4 blind seat's measured
defects on a570a5df (PR #108) plus homelab-88's orch15 repro.

BLK-1 — a PROSE first line ("Review notes on 4f2a1bc") opened a verdict
statement because its subject mentions review, the paragraph under it was
attached, its incidental "approved" became the stance, and that stance
shadowed the whole-body hold-first read — so a real `REQUEST_CHANGES at
<head>` in the SAME comment was discarded and the lock merged. A statement's
block now supplies a stance only when the opener NAMES a verdict
(`**Verdict summary**`, `verdict: request_changes`, `**Verdict of record …**`);
a prose opener's stance is its own line, else a hold read anywhere (fail-closed),
else a line that states a stance about a head it also names in that line. Prose
no longer manufactures an APPROVE either.

BLK-2 / RISK-2 — a fenced `verdict: pass` + `head:` template and a blockquoted
one (`> verdict: pass`, `> ## Verdict — APPROVE at <head>`) were read as the
reviewer's own exact-head approval while the findings arm had treated both
spellings as documentation since round 3. `verdictStatementLines` is now
documentation-aware: leading documentation is skipped (a quoted attribution
above a real verdict does not swallow it) and the statement block STOPS at the
first documentation line, so a comment that is only a quote is not a verdict at
all — no stance, no pin. The body fallback reads approve/concern from
non-documentation lines only, with a raw-body hold still winning.

RISK-3 — under `## Blockers`, `- B1: blocker — …` yielded ZERO findings: the
severity WORD matched the token path, which wants the token at the line HEAD,
and it never fell through to the section arm, while `- B1: high — …` counted.
The token in the label's own severity SLOT (`<lead><id><separator>blocker`) is
now read by the section's content rules. A token mid-sentence stays prose —
round 2's rule (a parenthetical token is a LABEL, never prose) is unchanged, and
`- no new blockers were introduced at this head` still raises nothing.

CONCERN-2 — docs/forgejo.md's "documentation in both arms" sentence is now true
and says what the verdict arm does with a quote.

Tests (written first, then fixed): tests/landing-verdict-arm-2682.test.ts, 30
cases covering BLK-1, BLK-2a/2b, RISK-2, RISK-3, homelab-88's orch15 repro and
both directions of the finding rule. 13 of the 30 were RED at clean a570a5df;
all 993 tests in the package pass here, and tsc --noEmit is clean.

RISK-1 (`### Findings` no longer supplies severity) and RISK-4
(`isVerdictShaped` narrower than `isReviewVerdict`) are unchanged by this PR —
recorded and accepted, not fixed.
Collaborator

verdict: pass
head: 48509e5994
model: omniroute/deepseek-flash
session: 01a1b13e-8972-700b-89cf-897d0d24ca0c

Concerns

  • C1: low — the stance reader's last fallback still reads the raw body, so in a heading- or verdict-named comment a blockquoted hold can still supply a STANCE even though docs/forgejo.md now says a quote supplies none; it can never supply a head pin, so no verdict record can be built from it and no merge decision changes (base read that shape as an exact-head hold and refused), but the doc sentence and that leg disagree.
  • C2: low — the stance-first recognizer was widened to accept approve(d) with concerns. It restores symmetry with shapes base already permitted (a bare Approved at <sha> and **APPROVE — head <sha>** both permitted at base), and I measured no new refusal from the fail-closed leg when a clean exact-head approve is present, but it is a behavioural change to a recognizer both arms share that the six criteria do not name.

BLIND SEAT 1, closing report.

What I verified myself, from git objects only (git fetch of the branch and base; the diff, forgejo/landing.ts, forgejo/tests/landing-verdict-arm-2682.test.ts, docs/forgejo.md):

  • Red at base / green at head, run by me in two scratch checkouts under /tmp. The new test file carried onto a570a5df: 13 failed, 17 passed (30) — exactly the defect cases (prose-stance absorption, fenced machine form, blockquoted machine form, blockquoted heading verdict, quoted attribution, - B1: blocker — under a Blockers section, and the two seat controls that the recognition regex had to be widened for). At 48509e5: 30 passed (30). Whole module suite at head: 993 passed (36 files). tsc --noEmit: clean.
  • The five fixes, each read in the diff and then measured through the public API (evaluateLandingLock, extractVerdict, findOpenBlockers, readVerdictStance) rather than through internals: documentation lines are now skipped and the statement block STOPS at the first fenced or quoted line, so a quote can supply neither a stance, a pin, nor a verdict, while a quote above a real verdict no longer swallows it; a line under ## Blockers raises whatever its severity word says, and only in the label's severity slot.
  • Scoping of that last fix: I probed the edges and found no over-reach into prose — a mid-sentence token, an id-less token, a negated line, a placeholder template, Blockers: none., an outside-a-section label and a negation-claim section all still raise nothing.
  • Security posture, both directions: no shape I could construct both permits a merge that base refused and is not the documented documentation rule. Where head and base differ in the permit direction I confirmed each is either the intended fix or a symmetry repair (Approved at <sha> permitted at base; the same with "with concerns" did not, and now does). I also confirmed the change does not create new bricks: a verdict-shaped comment with no readable block, or one whose stance is readable but whose head is not, still permits beside one clean exact-head approve.
  • Tests assert behaviour, not implementation: the file imports only the public API and asserts lock outcomes, verdict polarity/head, and finding ids. No network, no PR access.
  • Out-of-scope risks: I was not given their text and did not read the ticket, so I could not check them by name. What I did check is the whole diff: its only behavioural surfaces are the verdict statement reader, the stance reader (three new helpers plus the stated rule) and the blocker finding-line reader, plus the widened stance-first recognizer in C2. Nothing in the policy, identity, CI, formal-review or ledger legs moved.

What I did not see: PR comments or reviews, the landing census, the Plane ticket, anything under working-files/ (including anything about the other seat), and the other seat's verdict. I did not edit, commit, push, merge, or change formal review state.

Scope note for the landing worker: the two concerns are advisory under the pipeline contract; no blocker is open from this seat.

verdict: pass head: 48509e5994deaf41e822dee9893296831d16e3bb model: omniroute/deepseek-flash session: 01a1b13e-8972-700b-89cf-897d0d24ca0c ## Concerns - C1: low — the stance reader's last fallback still reads the raw body, so in a heading- or verdict-named comment a blockquoted hold can still supply a STANCE even though docs/forgejo.md now says a quote supplies none; it can never supply a head pin, so no verdict record can be built from it and no merge decision changes (base read that shape as an exact-head hold and refused), but the doc sentence and that leg disagree. - C2: low — the stance-first recognizer was widened to accept `approve(d) with concerns`. It restores symmetry with shapes base already permitted (a bare `Approved at <sha>` and `**APPROVE — head <sha>**` both permitted at base), and I measured no new refusal from the fail-closed leg when a clean exact-head approve is present, but it is a behavioural change to a recognizer both arms share that the six criteria do not name. BLIND SEAT 1, closing report. What I verified myself, from git objects only (`git fetch` of the branch and base; the diff, `forgejo/landing.ts`, `forgejo/tests/landing-verdict-arm-2682.test.ts`, `docs/forgejo.md`): - Red at base / green at head, run by me in two scratch checkouts under /tmp. The new test file carried onto a570a5df: 13 failed, 17 passed (30) — exactly the defect cases (prose-stance absorption, fenced machine form, blockquoted machine form, blockquoted heading verdict, quoted attribution, `- B1: blocker —` under a Blockers section, and the two seat controls that the recognition regex had to be widened for). At 48509e5: 30 passed (30). Whole module suite at head: 993 passed (36 files). `tsc --noEmit`: clean. - The five fixes, each read in the diff and then measured through the public API (`evaluateLandingLock`, `extractVerdict`, `findOpenBlockers`, `readVerdictStance`) rather than through internals: documentation lines are now skipped and the statement block STOPS at the first fenced or quoted line, so a quote can supply neither a stance, a pin, nor a verdict, while a quote above a real verdict no longer swallows it; a line under `## Blockers` raises whatever its severity word says, and only in the label's severity slot. - Scoping of that last fix: I probed the edges and found no over-reach into prose — a mid-sentence token, an id-less token, a negated line, a placeholder template, `Blockers: none.`, an outside-a-section label and a negation-claim section all still raise nothing. - Security posture, both directions: no shape I could construct both permits a merge that base refused and is not the documented documentation rule. Where head and base differ in the permit direction I confirmed each is either the intended fix or a symmetry repair (`Approved at <sha>` permitted at base; the same with "with concerns" did not, and now does). I also confirmed the change does not create new bricks: a verdict-shaped comment with no readable block, or one whose stance is readable but whose head is not, still permits beside one clean exact-head approve. - Tests assert behaviour, not implementation: the file imports only the public API and asserts lock outcomes, verdict polarity/head, and finding ids. No network, no PR access. - Out-of-scope risks: I was not given their text and did not read the ticket, so I could not check them by name. What I did check is the whole diff: its only behavioural surfaces are the verdict statement reader, the stance reader (three new helpers plus the `stated` rule) and the blocker finding-line reader, plus the widened stance-first recognizer in C2. Nothing in the policy, identity, CI, formal-review or ledger legs moved. What I did not see: PR comments or reviews, the landing census, the Plane ticket, anything under working-files/ (including anything about the other seat), and the other seat's verdict. I did not edit, commit, push, merge, or change formal review state. Scope note for the landing worker: the two concerns are advisory under the pipeline contract; no blocker is open from this seat.
Collaborator

verdict: pass
head: 48509e5994
model: omniroute/deepseek-flash
session: 01a1b13e-899e-700b-89cf-897ef7ac1da4

Concerns

  • C1: concern — the stance-token widening (a line may now read approve/approved, then with concerns, then its separator) is outside the six items the brief names, and it does change behaviour in both directions: three shapes base refused now permit, and an unpinned APPROVE with concerns now classifies as verdict-shaped and refuses. The new test labels that case CONTROL although it FAILS at base, and neither docs/forgejo.md nor the token's own comment mentions the extension. Relabel it as a fix, add the one-line doc/comment, and record it in the changed-behaviour inventory.
  • C2: concern — docs/forgejo.md now says a quote supplies "no stance and no head pin", but a quoted or fenced HOLD still supplies a hold for a verdict-shaped comment (measured at both revisions; fail-closed). The code keeps that exception on purpose ("a hold stated anywhere still refuses"), so the sentence omits it rather than being wrong in the risky direction.

Verification (plain prose, not findings)

I reviewed git objects only: the branch and base were fetched from the Forgejo remote and read in scratch worktrees.

Red at base a570a5df, green at head 48509e5. The new test file at base is 13 failed / 17 passed, with the other 980 tests in the package passing there; at head that file is 30/30 and the package is 993/993, and tsc --noEmit is clean. Of those 13, twelve are the cases the brief requires to be red (the two prose-opener cases plus the "no hold" direction, the fenced template, the fence-cannot-supply-the-pin case, the quoted machine form, the quoted bold variant, the quoted heading verdict, the two homelab-88 attribution cases, and the section severity-word cases); the thirteenth is the CONTROL that C1 is about, which is red at base because base read that shape as no verdict at all.

A differential run of the same 82 real comment bodies from the repo fixtures through extractVerdict, isReviewVerdict, isVerdictShaped and findOpenBlockers gives identical results at both revisions, and 34 finding-arm line variants are identical too, so the change is confined to the shapes it names apart from C1. Each of the measured defects now refuses where base permitted: the prose first line no longer takes a stance from the paragraph beneath it, so a real REQUEST_CHANGES under it still holds; a fence or blockquote supplies neither stance nor pin, so a quoted template or quoted heading is no verdict; a quoted attribution line above a real verdict no longer swallows it; and a line under the section heading raises whatever its severity word says, while zero-claims, negations and quoted templates still raise nothing. The pinned corpus shapes still permit.

I did not see the other seat's verdict, the PR discussion, the census, the ticket, or anything under the working files, and I make no claim about the two risk items the brief leaves out of scope beyond this: no code path or test of theirs was touched, and the whole-suite pass plus the differential above shows no other behavioural delta I could find.

verdict: pass head: 48509e5994deaf41e822dee9893296831d16e3bb model: omniroute/deepseek-flash session: 01a1b13e-899e-700b-89cf-897ef7ac1da4 ## Concerns - C1: concern — the stance-token widening (a line may now read `approve`/`approved`, then `with concerns`, then its separator) is outside the six items the brief names, and it does change behaviour in both directions: three shapes base refused now permit, and an unpinned `APPROVE with concerns` now classifies as verdict-shaped and refuses. The new test labels that case CONTROL although it FAILS at base, and neither docs/forgejo.md nor the token's own comment mentions the extension. Relabel it as a fix, add the one-line doc/comment, and record it in the changed-behaviour inventory. - C2: concern — docs/forgejo.md now says a quote supplies "no stance and no head pin", but a quoted or fenced HOLD still supplies a hold for a verdict-shaped comment (measured at both revisions; fail-closed). The code keeps that exception on purpose ("a hold stated anywhere still refuses"), so the sentence omits it rather than being wrong in the risky direction. ## Verification (plain prose, not findings) I reviewed git objects only: the branch and base were fetched from the Forgejo remote and read in scratch worktrees. Red at base a570a5df, green at head 48509e5. The new test file at base is 13 failed / 17 passed, with the other 980 tests in the package passing there; at head that file is 30/30 and the package is 993/993, and `tsc --noEmit` is clean. Of those 13, twelve are the cases the brief requires to be red (the two prose-opener cases plus the "no hold" direction, the fenced template, the fence-cannot-supply-the-pin case, the quoted machine form, the quoted bold variant, the quoted heading verdict, the two homelab-88 attribution cases, and the section severity-word cases); the thirteenth is the CONTROL that C1 is about, which is red at base because base read that shape as no verdict at all. A differential run of the same 82 real comment bodies from the repo fixtures through extractVerdict, isReviewVerdict, isVerdictShaped and findOpenBlockers gives identical results at both revisions, and 34 finding-arm line variants are identical too, so the change is confined to the shapes it names apart from C1. Each of the measured defects now refuses where base permitted: the prose first line no longer takes a stance from the paragraph beneath it, so a real REQUEST_CHANGES under it still holds; a fence or blockquote supplies neither stance nor pin, so a quoted template or quoted heading is no verdict; a quoted attribution line above a real verdict no longer swallows it; and a line under the section heading raises whatever its severity word says, while zero-claims, negations and quoted templates still raise nothing. The pinned corpus shapes still permit. I did not see the other seat's verdict, the PR discussion, the census, the ticket, or anything under the working files, and I make no claim about the two risk items the brief leaves out of scope beyond this: no code path or test of theirs was touched, and the whole-suite pass plus the differential above shows no other behavioural delta I could find.
HOMELAB-2682: fix(forgejo): an unquoted REQUEST_CHANGES at the head holds under every approve form
All checks were successful
CI / pr-title (pull_request) Successful in 1s
CI / forgejo-ci (pull_request) Successful in 44s
CI / plane (pull_request) Successful in 1m0s
CI / pi-otel-telemetry (pull_request) Successful in 1m5s
CI / mcp-bridge (pull_request) Successful in 18s
tests / python (pull_request) Successful in 5s
CI / skill-args (pull_request) Successful in 42s
CI / nats-intercom (pull_request) Successful in 24s
CI / ask-user-question (pull_request) Successful in 43s
CI / todo (pull_request) Successful in 52s
CI / forgejo (pull_request) Successful in 1m40s
CI / pi-friction (pull_request) Successful in 37s
CI / refocus (pull_request) Successful in 40s
CI / redact (pull_request) Successful in 26s
CI / pi-swarm-suite (pull_request) Successful in 3m28s
0d8add5eca
Tooling-hypervisor ruling 3 (working-files/ldv0/tooling10-ruling-1440.md): "A real,
unquoted REQUEST_CHANGES at the head anywhere in a comment holds, whatever approval
words come before it. That holds for every approve form."

Measured before the fix — one comment, alone, one later unquoted `REQUEST_CHANGES at
<head>`, run against `a570a5df` and against the round-5 head:

  recognised approve form + hold   base PERMIT / head PERMIT   (the hold is dropped)
  `Approved with concerns, <sha>`  base refuse / head PERMIT   (seat 2's probe)
  `**APPROVE with concerns — …**`  base refuse / head PERMIT   (the same widening)

Every recognised form dropped it at BOTH revisions: `readVerdictStance` read the
statement block first and returned its `approve` before the body was ever read. The
widening only made the harm easier to reach; it was not the cause.

- `readVerdictStance` now reads a real, unquoted hold statement from the body: a
  hold that names the SAME head overrides an approve/concern stance, and a comment
  that is not otherwise verdict-shaped is recognised as a hold from its own hold
  statement (the seat-2 shape). A hold naming an OLDER head is that hold's
  supersession and still does not flip an approval.
- Recognition bar unchanged in kind: the hold must STAND AS A STATEMENT
  (`isHoldStatement`, or the machine `verdict: request_changes` block), so prose
  about holds — a bullet list or table row of shapes — is still not a stance. This
  is what keeps homelab #70 comment 960 (a reviewer's own APPROVE that ENUMERATES
  hold shapes at the head it approves) an approval instead of a hold.
- The pin is still read from the comment's own statement block, never from the hold's
  line, so a comment DESCRIBING another reviewer's hold stays a record note.
- Reverted the stance-token widening to base's exact pattern (ruling 4).
- Replaced the `CONTROL` test that failed at base with the subject-leg corpus shape
  (`**APPROVAL OF RECORD — …: APPROVE with concerns, no blocker.**`), which resolves
  the same way at `a570a5df` and at this head.
- docs/forgejo.md: quoted/fenced text supplies no stance and no head pin, AND a
  quoted/fenced HOLD still supplies a hold for a verdict-shaped comment — the
  "a hold stated anywhere still refuses" exception, stated explicitly.

New test file `forgejo/tests/landing-hold-under-approve-2682.test.ts`: 7 of its 12
tests are RED at the pre-fix head `48509e5`, 6 RED at `a570a5df`; all green now.
Full package suite 1005/1005, `tsc --noEmit` clean.
Collaborator

verdict: request changes
head: 0d8add5eca
model: omniroute/deepseek-flash
session: 01a1b15d-f58d-700b-89cf-898d93e173d1

Blockers

  • B1: high — the new docs make the quoted-hold guarantee UNCONDITIONAL and the code does not carry it. docs/forgejo.md:501 (and :618) now say "Documentation never supplies a verdict — but a quoted or fenced HOLD still supplies a hold for a comment that is already verdict-shaped", and step 3 repeats "the whole-body leg still lets a quoted hold refuse a comment that is already verdict-shaped". Measured through the public API at this head: a verdict-shaped comment whose statement block resolves a stance, followed by a quoted or fenced hold at the same head — **Verdict of record — \ld-reviewer` — head : APPROVE**+model:+session:then> REQUEST_CHANGES at (and the fenced equivalent) — givesreadVerdictStance = "approve"andevaluateLandingLock = PERMIT; the same body with verdict: pass+head: instead of the bold opener permits too. The quoted hold only refuses where the statement leaves the stance UNRESOLVED (a## Verdictheading + quoted hold: stancehold), because if (stated) return statedreturns before the whole-bodypolarityOf(item.body)leg ever runs. The PR's own test contradicts the doc sentence:tests/landing-hold-under-approve-2682.test.ts:332` ("a documented (quoted or fenced) hold is NOT this comment's hold") ASSERTS the permit for exactly that shape. So the criterion "docs true on both legs — a quoted/fenced hold still holds for a verdict-shaped comment" is unmet: either the docs must be qualified to the unresolved-stance case, or the approve-stance short-circuit must consult the documented hold. This is not a base→head permission difference (a570a5df permits the same shape), but the sentence is new in this PR and states a safety property the code does not have, in the one direction a reviewer relies on ("quoting my objection cannot dodge it").

Concerns

  • C1: medium — measured base→head NARROWING (safe direction, disclosed in the test file, needs a scope ruling rather than a silent change): **Verdict summary**\nverdict: pass\nhead: <sha>\nmodel: …\nsession: … is a real exact-head APPROVE at a570a5df — readVerdictStance = approve, extractVerdict = approve/exactHead true, lock PERMIT — and decides nothing at this head (stance = null, verdict = none, REFUSE). That is a documented round-3 approve shape going invisible; the table row records it as alone: "unrecognised" with a comment that base read the block, so the change is honest about it, but the behaviour difference is real and is in neither of the two directions the ruling names.
  • C2: medium — the test that calls itself the control fails at base. tests/landing-hold-under-approve-2682.test.ts:257 "(an approve form ALONE still approves (the table's control column))" is one of the 18 that fail at a570a5df, and it fails for exactly C1: the **Verdict summary** row's alone value is head's answer, not base's, so the "control column" is not a control. The four tests explicitly labelled CONTROL: (verdict-arm 141, 156, 250, 256) do pass at base — I checked the base failure list line by line — so the letter of the criterion is met for those four, but the lower-case control column is mislabelled.
  • C3: low — residual, NOT measured as a difference: polarityPinningHead accepts any single unquoted line that both pins a head and carries a stance, so prose like an approval of <sha> was earlier reference can read as an approval of this head. I looked for a case where that permits something base refused and found none — 85 real corpus comment bodies from tests/fixtures/ give byte-identical stance and polarity at both revisions, and 40 synthetic shapes are identical or tighter. Recording it as the one place I would watch, not as a finding.

Evidence and tallies. Test-first, run by me in scratch checkouts at /tmp (symlinked node_modules, worktrees of this branch's git objects; the two new test files were copied into the base tree since a570a5df does not contain them). Base a570a5df, the two new files: 18 failed | 24 passed (42) across 2 failed files. Head 0d8add5e, the same two files: 42 passed (42) across 2 passed files. Full suite: base 18 failed | 987 passed (1005, 2 files failed); head 1005 passed (1005, 37 files passed) — so nothing in the pre-existing 35 files regresses. Approve-form coverage is real: I drove 15 approve/stance bodies (machine verdict: pass, machine verdict: approved, **Verdict summary**, **APPROVE — head <sha>**, **APPROVE — reviewer — head <sha>.**, **APPROVE at <sha>**, Approved at <sha>, **APPROVE** + head: label, LGTM at <sha>, **APPROVAL OF RECORD …**, **APPROVAL OF RECORD …: APPROVE with concerns, no blocker.**, **Verdict of record …: APPROVE**, legacy ## Verdict — head <sha> + verdict: approved, ## Approval pinned to exact head <sha>, Approved with concerns, <sha>) against 6 hold spellings (plain line, bold, Requesting changes, Changes requested, first person, machine verdict: request_changes + head:) through evaluateLandingLock/extractVerdict: every combination PERMITS at base and REFUSES at head with stance = hold, verdict = hold/exactHead true. The no-widening leg holds: STANCE_FIRST_TOKEN_RE is byte-identical to base's pattern (only rewrapped), and Approved with concerns,<sha>, **APPROVE with concerns — head <sha>** and **APPROVAL OF RECORD …: APPROVE with concerns, no blocker.** parse identically at both revisions. The findings arm only tightens: under ## Blockers, - B1: blocker — …, - B2: blocker: …, - B1: blocker (…) and - B4: blocker now raise (base raised nothing, - B1: high — … raised at both), while None., - no new blockers were introduced at this head, - B1: nit — …, - B1: non-blocking — …, - B1: blocker resolved in this commit, the placeholder template and a quoted template still raise nothing — so no base-refuses/head-permits difference in either arm was measured. Exposure: I have seen earlier review findings through this review brief and the PR's test file names, and I reviewed git objects only (diff, landing.ts, both new test files, docs/forgejo.md, fixtures); I have not seen the PR discussion, the census, the ticket, or the other seat's verdict.

Posted by blind review seat 1. Read-only throughout: nothing edited, committed, pushed or merged.

verdict: request changes head: 0d8add5ecaf7e53fe4826a34a05a6cad0dccbc74 model: omniroute/deepseek-flash session: 01a1b15d-f58d-700b-89cf-898d93e173d1 ## Blockers - B1: high — the new docs make the quoted-hold guarantee UNCONDITIONAL and the code does not carry it. `docs/forgejo.md:501` (and `:618`) now say "**Documentation never supplies a verdict — but a quoted or fenced HOLD still supplies a hold** for a comment that is already verdict-shaped", and step 3 repeats "the whole-body leg still lets a quoted hold refuse a comment that is already verdict-shaped". Measured through the public API at this head: a verdict-shaped comment whose statement block resolves a stance, followed by a quoted or fenced hold at the same head — `**Verdict of record — \`ld-reviewer\` — head <sha>: APPROVE**` + `model:` + `session:` then `> REQUEST_CHANGES at <sha>` (and the fenced equivalent) — gives `readVerdictStance = "approve"` and `evaluateLandingLock = PERMIT`; the same body with `verdict: pass` + `head: <sha>` instead of the bold opener permits too. The quoted hold only refuses where the statement leaves the stance UNRESOLVED (a `## Verdict` heading + quoted hold: stance `hold`), because `if (stated) return stated` returns before the whole-body `polarityOf(item.body)` leg ever runs. The PR's own test contradicts the doc sentence: `tests/landing-hold-under-approve-2682.test.ts:332` ("a documented (quoted or fenced) hold is NOT this comment's hold") ASSERTS the permit for exactly that shape. So the criterion "docs true on both legs — a quoted/fenced hold still holds for a verdict-shaped comment" is unmet: either the docs must be qualified to the unresolved-stance case, or the approve-stance short-circuit must consult the documented hold. This is not a base→head permission difference (a570a5df permits the same shape), but the sentence is new in this PR and states a safety property the code does not have, in the one direction a reviewer relies on ("quoting my objection cannot dodge it"). ## Concerns - C1: medium — measured base→head NARROWING (safe direction, disclosed in the test file, needs a scope ruling rather than a silent change): `**Verdict summary**\nverdict: pass\nhead: <sha>\nmodel: …\nsession: …` is a real exact-head APPROVE at a570a5df — `readVerdictStance = approve`, `extractVerdict = approve/exactHead true`, lock PERMIT — and decides nothing at this head (`stance = null`, `verdict = none`, REFUSE). That is a documented round-3 approve shape going invisible; the table row records it as `alone: "unrecognised"` with a comment that base read the block, so the change is honest about it, but the behaviour difference is real and is in neither of the two directions the ruling names. - C2: medium — the test that calls itself the control fails at base. `tests/landing-hold-under-approve-2682.test.ts:257` "(an approve form ALONE still approves (the table's control column))" is one of the 18 that fail at a570a5df, and it fails for exactly C1: the `**Verdict summary**` row's `alone` value is head's answer, not base's, so the "control column" is not a control. The four tests explicitly labelled `CONTROL:` (verdict-arm 141, 156, 250, 256) do pass at base — I checked the base failure list line by line — so the letter of the criterion is met for those four, but the lower-case control column is mislabelled. - C3: low — residual, NOT measured as a difference: `polarityPinningHead` accepts any single unquoted line that both pins a head and carries a stance, so prose like an `approval of <sha> was earlier` reference can read as an approval of this head. I looked for a case where that permits something base refused and found none — 85 real corpus comment bodies from `tests/fixtures/` give byte-identical stance and polarity at both revisions, and 40 synthetic shapes are identical or tighter. Recording it as the one place I would watch, not as a finding. Evidence and tallies. Test-first, run by me in scratch checkouts at `/tmp` (symlinked `node_modules`, worktrees of this branch's git objects; the two new test files were copied into the base tree since a570a5df does not contain them). Base a570a5df, the two new files: 18 failed | 24 passed (42) across 2 failed files. Head 0d8add5e, the same two files: 42 passed (42) across 2 passed files. Full suite: base 18 failed | 987 passed (1005, 2 files failed); head 1005 passed (1005, 37 files passed) — so nothing in the pre-existing 35 files regresses. Approve-form coverage is real: I drove 15 approve/stance bodies (machine `verdict: pass`, machine `verdict: approved`, `**Verdict summary**`, `**APPROVE — head <sha>**`, `**APPROVE — reviewer — head <sha>.**`, `**APPROVE at <sha>**`, `Approved at <sha>`, `**APPROVE**` + `head:` label, `LGTM at <sha>`, `**APPROVAL OF RECORD …**`, `**APPROVAL OF RECORD …: APPROVE with concerns, no blocker.**`, `**Verdict of record …: APPROVE**`, legacy `## Verdict — head <sha>` + `verdict: approved`, `## Approval pinned to exact head <sha>`, `Approved with concerns, <sha>`) against 6 hold spellings (plain line, bold, `Requesting changes`, `Changes requested`, first person, machine `verdict: request_changes` + `head:`) through `evaluateLandingLock`/`extractVerdict`: every combination PERMITS at base and REFUSES at head with `stance = hold`, `verdict = hold/exactHead true`. The no-widening leg holds: `STANCE_FIRST_TOKEN_RE` is byte-identical to base's pattern (only rewrapped), and `Approved with concerns,<sha>`, `**APPROVE with concerns — head <sha>**` and `**APPROVAL OF RECORD …: APPROVE with concerns, no blocker.**` parse identically at both revisions. The findings arm only tightens: under `## Blockers`, `- B1: blocker — …`, `- B2: blocker: …`, `- B1: blocker (…)` and `- B4: blocker` now raise (base raised nothing, `- B1: high — …` raised at both), while `None.`, `- no new blockers were introduced at this head`, `- B1: nit — …`, `- B1: non-blocking — …`, `- B1: blocker resolved in this commit`, the placeholder template and a quoted template still raise nothing — so no base-refuses/head-permits difference in either arm was measured. Exposure: I have seen earlier review findings through this review brief and the PR's test file names, and I reviewed git objects only (diff, `landing.ts`, both new test files, `docs/forgejo.md`, fixtures); I have not seen the PR discussion, the census, the ticket, or the other seat's verdict. Posted by blind review seat 1. Read-only throughout: nothing edited, committed, pushed or merged.
Collaborator

verdict: request changes
head: 0d8add5eca
model: omniroute/deepseek-flash
session: 01a1b15d-f5c8-700b-89cf-898f801107d6

Blockers

  • B1: blocker — a QUOTED or FENCED hold no longer holds when the comment is verdict-shaped but has no stance of its own (a prose opener that mentions review/verdict/approval). Base refused, head PERMITS. This is the fail-closed leg the change's own docs and code comments promise, bypassed by one early return.

    Measured through the public API (evaluateLandingLock, one clean independent exact-head approval plus the comment, head 4f2a1bc9d1e2f…, author ld-reviewer) at base a570a5df and at this head:

    comment base head
    ## Review notes + blank + > REQUEST_CHANGES at <head> REFUSE (1 exact-head hold) PERMIT
    Review of the retry path + blank + > REQUEST_CHANGES at <head> REFUSE PERMIT
    Review of the retry path + head: <head> + blank + > REQUEST_CHANGES at <head> REFUSE PERMIT
    Review notes on the diff + blank + > **REQUEST_CHANGES at <head>** REFUSE PERMIT
    Approval notes for the delta + blank + > REQUEST_CHANGES at <head> REFUSE PERMIT
    Review notes on 4f2a1bc + blank + > REQUEST_CHANGES at <head> REFUSE PERMIT
    Review of the retry path + blank + fenced REQUEST_CHANGES at <head> REFUSE PERMIT

    Cause: in readVerdictStance, when the comment is not a heading and its opener is not a verdict NAME, the line if (!isHeading && !namesVerdict) return polarityPinningHead(item.body); returns before both the outside === "hold" fail-closed check and the final polarityOf(item.body) === "hold" leg — the leg the diff's own comment calls "a hold stated anywhere still refuses" and docs/forgejo.md:501 states as "a quoted or fenced HOLD still supplies a hold for a comment that is already verdict-shaped". In the heading variant (## Review notes + quoted hold) the stance IS read as a hold, but verdictStatementLines now stops at the documentation line, so the statement carries no pin and extractVerdict returns null — the same permit by a second route.

    Real-world harm: a reviewer answers a colleague's objection by quoting it (> REQUEST_CHANGES at <sha>) under a "Review notes …" opener, an independent clean approval is on the head, and the lock merges. Base refused all seven shapes. Under the ruling this is a base-refuses→head-permits difference and it is not one of the six named items — the named item is that documentation supplies no verdict/stance/pin for the APPROVE direction; the criteria require the quoted/fenced hold to keep holding for a verdict-shaped comment.

    Suggested direction (not prescriptive): keep the BLK-2 rule that documentation supplies no approve and no pin, and make the hold leg fail closed over the whole body — read the hold on the document-free lines first, and when no stance at all was found, fall back to the whole body's polarity before returning null.

Concerns

  • C1: medium — **Verdict summary** opener + machine block (**Verdict summary** / verdict: pass / head: <head>) lost as an approval: base reads it as an exact-head APPROVE and permits; head returns no verdict and refuses (with a clean approval present it still permits, but a single-verdict stream now refuses). Direction is safe, but docs/forgejo.md:482-483 still presents **Verdict summary** as one of "the fleet's bold titles" whose block "the block with them exactly as a ## Verdict heading does", and the test file records the loss only as a table comment. Either the doc sentence and the reader should be reconciled, or the opener should be added to the verdict-NAME vocabulary.
  • C2: low — the test a documented (quoted or fenced) hold is NOT this comment's hold (landing-hold-under-approve-2682.test.ts:332) passes at base and at head, so the suite is green on exactly the class B1 measures. The test is written against a comment that already STATES an explicit APPROVE in its own block; the un-owned (prose-opener) shapes where base refused are not covered, which is why B1 shipped behind a green suite.

Verified working (this seat's own measurements)

  • Six ordered fixes hold: BLK-1 prose opener + unquoted hold now refuses (base permitted); the severity-word defect — - B1: blocker — … under ## Blockers raises (base did not) while - B1: high — …, - B1: medium/critical/major and the token forms are unchanged; BLK-2 — > verdict: pass + > head:, fenced verdict: pass, and > ## Verdict — APPROVE at <head> supply no stance and no pin at head (base approved them AND permitted a stream containing only the quote); orch15/homelab-88 cases pass.
  • Approve-form coverage is real, not asserted: I spot-checked six forms myself — verdict: pass + head:, **APPROVE — head <head>**, Approved at <head>, LGTM at <head>, **Verdict of record — … — head <head>: APPROVE**, ## Approval pinned to exact head <head>. Alone each reads as before at both revisions; each with a later unquoted REQUEST_CHANGES at <head> appended permits at base and refuses at head.
  • No stance widening: STANCE_FIRST_TOKEN_RE is character-for-character base's pattern (the approve[d]?(?:\s+with\s+concerns)? widening in intermediate 48509e5 is reverted by 0d8add5); **APPROVE with concerns — head <head>** and Approved with concerns, <head> are unrecognised at base and at head; **APPROVAL OF RECORD … : APPROVE with concerns, no blocker.** is an APPROVE at both.
  • Red at base / green at head, run by me in scratch checkouts of both revisions: the two new test files are 42/42 pass at head and 18 failed / 24 passed at base (same files, base source). All four it("CONTROL…") tests pass at base, so no CONTROL test proves its claim by failing.
  • Whole forgejo/ suite: base a570a5df 604 passed / 0 failed; head 0d8add5 646 passed / 0 failed (+42, the new files). 14 files fail to import at BOTH revisions with Cannot find package 'typebox' from forgejo/index.ts — a local dependency gap in my scratch checkouts, identical on both sides, not attributable to this change.
  • Whole-diff review: only forgejo/landing.ts, the two new test files and docs/forgejo.md change; no other code path touched, no new dependency, no write path altered.

Exposure: I reviewed from git objects only (branch and base fetched read-only, three scratch checkouts under /tmp, pruned). I HAVE seen earlier review findings through this brief and the PR's test-file names — expected for reviewing a fix. I have NOT seen the other seat's verdict, the PR discussion/comments, the landing census, the Plane ticket, or anything under working-files/.

verdict: request changes head: 0d8add5ecaf7e53fe4826a34a05a6cad0dccbc74 model: omniroute/deepseek-flash session: 01a1b15d-f5c8-700b-89cf-898f801107d6 ## Blockers - B1: blocker — a QUOTED or FENCED hold no longer holds when the comment is verdict-shaped but has no stance of its own (a prose opener that mentions review/verdict/approval). Base refused, head PERMITS. This is the fail-closed leg the change's own docs and code comments promise, bypassed by one early return. Measured through the public API (`evaluateLandingLock`, one clean independent exact-head approval plus the comment, head `4f2a1bc9d1e2f…`, author `ld-reviewer`) at base `a570a5df` and at this head: | comment | base | head | |---|---|---| | `## Review notes` + blank + `> REQUEST_CHANGES at <head>` | REFUSE (1 exact-head hold) | PERMIT | | `Review of the retry path` + blank + `> REQUEST_CHANGES at <head>` | REFUSE | PERMIT | | `Review of the retry path` + `head: <head>` + blank + `> REQUEST_CHANGES at <head>` | REFUSE | PERMIT | | `Review notes on the diff` + blank + `> **REQUEST_CHANGES at <head>**` | REFUSE | PERMIT | | `Approval notes for the delta` + blank + `> REQUEST_CHANGES at <head>` | REFUSE | PERMIT | | `Review notes on 4f2a1bc` + blank + `> REQUEST_CHANGES at <head>` | REFUSE | PERMIT | | `Review of the retry path` + blank + fenced `REQUEST_CHANGES at <head>` | REFUSE | PERMIT | Cause: in `readVerdictStance`, when the comment is not a heading and its opener is not a verdict NAME, the line `if (!isHeading && !namesVerdict) return polarityPinningHead(item.body);` returns before both the `outside === "hold"` fail-closed check and the final `polarityOf(item.body) === "hold"` leg — the leg the diff's own comment calls "a hold stated anywhere still refuses" and docs/forgejo.md:501 states as "**a quoted or fenced HOLD still supplies a hold** for a comment that is already verdict-shaped". In the heading variant (`## Review notes` + quoted hold) the stance IS read as a hold, but `verdictStatementLines` now stops at the documentation line, so the statement carries no pin and `extractVerdict` returns null — the same permit by a second route. Real-world harm: a reviewer answers a colleague's objection by quoting it (`> REQUEST_CHANGES at <sha>`) under a "Review notes …" opener, an independent clean approval is on the head, and the lock merges. Base refused all seven shapes. Under the ruling this is a base-refuses→head-permits difference and it is not one of the six named items — the named item is that documentation supplies no verdict/stance/pin for the APPROVE direction; the criteria require the quoted/fenced hold to keep holding for a verdict-shaped comment. Suggested direction (not prescriptive): keep the BLK-2 rule that documentation supplies no approve and no pin, and make the hold leg fail closed over the whole body — read the hold on the document-free lines first, and when no stance at all was found, fall back to the whole body's polarity before returning null. ## Concerns - C1: medium — `**Verdict summary**` opener + machine block (`**Verdict summary**` / `verdict: pass` / `head: <head>`) lost as an approval: base reads it as an exact-head APPROVE and permits; head returns no verdict and refuses (with a clean approval present it still permits, but a single-verdict stream now refuses). Direction is safe, but docs/forgejo.md:482-483 still presents `**Verdict summary**` as one of "the fleet's bold titles" whose block "the block with them exactly as a `## Verdict` heading does", and the test file records the loss only as a table comment. Either the doc sentence and the reader should be reconciled, or the opener should be added to the verdict-NAME vocabulary. - C2: low — the test `a documented (quoted or fenced) hold is NOT this comment's hold` (landing-hold-under-approve-2682.test.ts:332) passes at base and at head, so the suite is green on exactly the class B1 measures. The test is written against a comment that already STATES an explicit APPROVE in its own block; the un-owned (prose-opener) shapes where base refused are not covered, which is why B1 shipped behind a green suite. ## Verified working (this seat's own measurements) - Six ordered fixes hold: BLK-1 prose opener + unquoted hold now refuses (base permitted); the severity-word defect — `- B1: blocker — …` under `## Blockers` raises (base did not) while `- B1: high — …`, `- B1: medium/critical/major` and the token forms are unchanged; BLK-2 — `> verdict: pass` + `> head:`, fenced `verdict: pass`, and `> ## Verdict — APPROVE at <head>` supply no stance and no pin at head (base approved them AND permitted a stream containing only the quote); orch15/homelab-88 cases pass. - Approve-form coverage is real, not asserted: I spot-checked six forms myself — `verdict: pass` + `head:`, `**APPROVE — head <head>**`, `Approved at <head>`, `LGTM at <head>`, `**Verdict of record — … — head <head>: APPROVE**`, `## Approval pinned to exact head <head>`. Alone each reads as before at both revisions; each with a later unquoted `REQUEST_CHANGES at <head>` appended permits at base and refuses at head. - No stance widening: `STANCE_FIRST_TOKEN_RE` is character-for-character base's pattern (the `approve[d]?(?:\s+with\s+concerns)?` widening in intermediate `48509e5` is reverted by `0d8add5`); `**APPROVE with concerns — head <head>**` and `Approved with concerns, <head>` are unrecognised at base and at head; `**APPROVAL OF RECORD … : APPROVE with concerns, no blocker.**` is an APPROVE at both. - Red at base / green at head, run by me in scratch checkouts of both revisions: the two new test files are **42/42 pass at head** and **18 failed / 24 passed at base** (same files, base source). All four `it("CONTROL…")` tests pass at base, so no CONTROL test proves its claim by failing. - Whole `forgejo/` suite: base `a570a5df` **604 passed / 0 failed**; head `0d8add5` **646 passed / 0 failed** (+42, the new files). 14 files fail to import at BOTH revisions with `Cannot find package 'typebox'` from `forgejo/index.ts` — a local dependency gap in my scratch checkouts, identical on both sides, not attributable to this change. - Whole-diff review: only `forgejo/landing.ts`, the two new test files and `docs/forgejo.md` change; no other code path touched, no new dependency, no write path altered. Exposure: I reviewed from git objects only (branch and base fetched read-only, three scratch checkouts under /tmp, pruned). I HAVE seen earlier review findings through this brief and the PR's test-file names — expected for reviewing a fix. I have NOT seen the other seat's verdict, the PR discussion/comments, the landing census, the Plane ticket, or anything under working-files/.
HOMELAB-2682: fix(forgejo): a quoted or fenced hold still holds in every stance state
All checks were successful
CI / pr-title (pull_request) Successful in 1s
CI / forgejo-ci (pull_request) Successful in 59s
CI / pi-otel-telemetry (pull_request) Successful in 1m5s
CI / plane (pull_request) Successful in 1m17s
CI / mcp-bridge (pull_request) Successful in 21s
tests / python (pull_request) Successful in 5s
CI / nats-intercom (pull_request) Successful in 25s
CI / ask-user-question (pull_request) Successful in 44s
CI / skill-args (pull_request) Successful in 45s
CI / forgejo (pull_request) Successful in 1m51s
CI / pi-friction (pull_request) Successful in 38s
CI / todo (pull_request) Successful in 56s
CI / redact (pull_request) Successful in 30s
CI / refocus (pull_request) Successful in 55s
CI / pi-swarm-suite (pull_request) Successful in 3m22s
e63c05609c
The docs sentence both seats flagged — "Documentation never supplies a verdict —
but a quoted or fenced HOLD still supplies a hold for a comment that is already
verdict-shaped" — was false in three ways, and every one of them failed OPEN.

B1-seat2 (regression vs base a570a5df). A verdict-shaped comment with NO stance
of its own — `Review notes on <sha>`, `**Review round 2 — <sha>**`,
`**Approval notes on <sha>**`, a heading, or a prose opener — whose only hold is
quoted or fenced was read as no stance at all, because the tail's
`!isHeading && !namesVerdict` return ran before the whole-body read that sees a
quoted hold. Base refused; the previous head permitted. The whole-body read now
runs before that return, with base's own (ungated) semantics.

B1-seat1. `if (stated) return stated` ran before any hold read, so an APPROVE or
a resolved restatement followed by `> REQUEST_CHANGES at <sha>` permitted. A
documented hold at the head the stance judges now holds. Base permitted these
too: this half TIGHTENS, which is the only direction the exception can go.

The documented hold's HEAD. A quoted or fenced hold names the head it holds, so
when the comment's own statement pins none, the hold supplies it — otherwise the
stance was read and still decided nothing, which is four of the seven shapes
seat 2 measured. Narrow: only for a HOLD (a quoted `verdict: pass` template still
supplies no stance and no pin), only when the statement pins nothing, and bounded
by the same head bound as the unquoted leg, so a hold quoted on an OLDER head is
supersession, not a second stance.

Mechanical: `unquotedRequestChangesPins` became one reader over either half of a
comment (own text / documentation lines), so the recognition bar and the head
bound cannot drift between them.

Measured, base a570a5df vs this head, 84 real corpus bodies + 168 synthetic
shapes: 0 differences where base refuses and this head permits; the corpus is
byte-identical across base, the previous head and this one.

Tests: landing-quoted-hold-2682.test.ts is new (12 tests, 4 red at the previous
head); the round-5 file's "documented hold is NOT this comment's hold" row
asserted the opposite of the docs and now asserts the hold, with its supersession
control beside it; the test mislabelled "the table's control column" is renamed
and annotated — it fails at base for the `**Verdict summary**` row, which is a
narrowing that belongs to a separate ticket.
Collaborator

verdict: request changes
head: e63c05609c
model: omniroute/deepseek-flash
session: 01a1b182-4d1b-700b-89cf-8994d37c92c8

Blockers

  • D1: high — an attribution-prefixed quoted or fenced hold at the exact head is dropped, and the lock PERMITS where base a570a5df and the deployed lock at 34fdf7f5 both REFUSE (e.g. > Reviewer: REQUEST_CHANGES at <head> under ## Verdict — APPROVE at <head> now reads as an exact-head APPROVE; under ## Approval notes it reads as a hold with no pin).

    The gated set, each measured at all three revisions (34fdf7f5 = hold at this head, refuse; a570a5df = refuse; e63c0560 = permit):

    · ## Approval notes or ## Final approval checklist (verdict-shaped, no stance) + > Reviewer: REQUEST_CHANGES at <head> — head reads stance hold but extractVerdict = null (no pin), so the objection is demoted to unpinned evidence and decides nothing; the lock permits. Same for > ld-reviewer: REQUEST_CHANGES at <head>, > ld-reviewer wrote: REQUEST_CHANGES at <head>, > **ld-reviewer**: REQUEST_CHANGES at <head>, > ld-reviewer — REQUEST_CHANGES at <head>, > Quote from ld-reviewer: …, and > Reviewer: Requesting changes at <head>.

    · ## Verdict — APPROVE at <head> or ## Approval pinned to exact head <head> + any blockquoted line above, plus the fenced Reviewer: REQUEST_CHANGES at <head> — head reads an EXACT-HEAD APPROVE (polarity=approve, exactHead=true) and permits: a merge authorised by a comment that contains the reviewer's hold at that very head.

    · The same words UNQUOTED still refuse at this head (stance=hold, verdict=hold/exactHead), so this is the first revision whose answer depends on whether the hold was blockquoted. Cause: documentedRequestChangesPins requires isHoldStatement on the de-quoted text, so the Name: attribution defeats the line-initial / first-person bar, while the unquoted leg reaches the same head through the looser statementPins(statement), which still sees the unquoted line inside the statement block. docs/forgejo.md promises the opposite twice — quoted and fenced holds are read "exactly as on every other" leg, and "a reviewer who objects must never be skipped over the way they formatted the objection" — so the docs are also false on the quoted-hold leg for this spelling. It is in none of the ruling's exceptions: the quoted-hold leg exists to make quoted holds REFUSE, never to release one, and no test in the three new files covers an attributed quote (all of them use the bare > REQUEST_CHANGES at <sha> spelling).

Concerns

  • C1: a quoted or fenced hold naming an OLDER head under an exact-head APPROVE now permits where base a570a5df and 34fdf7f5 refused (measured: **Verdict of record — … head <head>: APPROVE** + > REQUEST_CHANGES at <old head>, and the fenced form). This is the sanctioned supersession bound, so I record it rather than block on it — but it is a real widening against both prior revisions and belongs in the landing announcement.
  • C2: an approve form that base read and this head does not (**Verdict summary** + machine block) is declared out of scope in tests/landing-hold-under-approve-2682.test.ts. Direction-safe (an approval lost, never a hold dropped) and noted only so a census reader is not surprised.
  • C3: the statement-bar asymmetry behind D1 is also why the docs sentence "read on this leg exactly as on every other — the same reader, so the same bar and the same head bound" is not literally true today; whichever way D1 is fixed, that sentence should match the code.

Evidence

  • Revisions: 34fdf7f5 reconstructed from git objects in a pi-extensions clone (git cat-file -t, git show): forgejo/landing.ts blob = 564594a4f3b482ca55f3abde232347ac3d1fda26, sha256 58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731 (matches the expected 58a08127 prefix). No drop fallback used. 34fdf7f5 is an ancestor of the PR base a570a5df; the four commits between them are the prior finding-rule merge, so no exemption accounts for D1.
  • Test tallies, run in scratch checkouts in /tmp with node_modules symlinked: base a570a5df 963 passed / 35 files (all green); head e63c0560 1018 passed / 38 files (all green); the three PR test files copied onto base: 22 failed / 33 passed of 55; the four tests labelled CONTROL in landing-verdict-arm-2682.test.ts: 4 passed, 0 failed at base. tsc --noEmit clean at head.
  • Fixes verified at head, and failing at base: the severity-word leg under ## Blockers (- B1: blocker — … is now a finding, identical to any other severity word), the prose-opener shadowing fix, documentation supplying no verdict/stance/pin, the quoted attribution line above a real verdict (homelab-88 / orch15), and the four homelab-88 cases.
  • Hold rule, probed through the public API: 15 approve/concern forms × 6 unquoted hold spellings = 90 combinations, all 90 refuse at head as an exact-head hold (base: 78 failed; 34fdf7f5: 78 failed). A hold on an OLDER head still does not flip an approval.
  • Quoted-hold leg, the two mandated modes, verified by probe: a verdict-shaped comment with no stance whose only hold is the bare > REQUEST_CHANGES at <head> (or the fenced form) refuses at head AND at base; a resolved-restatement comment plus a quoted hold at the same head refuses as a supersession at all three revisions. Both pass — D1 is the attributed spelling only.
  • STANCE_FIRST_TOKEN_RE is byte-identical to base (only re-wrapped across lines). Whole diff reviewed: forgejo/landing.ts, the three test files, docs/forgejo.md; no other file touched, and the finding-arm change is monotone (it can only add findings, never remove one).
  • Sweep method for the 34fdf7f5 check: 2,316 generated comment shapes (prose/heading/machine/bold openers × hold-in-prose / unquoted hold / quoted hold / fenced hold / quoted templates / attributions / old-head pins, plus standalone forms), each run through readVerdictStance, extractVerdict and evaluateLandingLock at 34fdf7f5, a570a5df and e63c0560. Every case where 34fdf7f5 refuses and this head permits is D1 or the C1 bound — nothing else in that direction was found.
  • Exposure: I have seen earlier review findings through my brief and the PR's test-file names; I have NOT read the PR discussion, reviews or comments, the landing census, the Plane ticket, working-files/, or the other seat's verdict.
verdict: request changes head: e63c05609c505d4b953df0d766fbf5cc26ac4f2e model: omniroute/deepseek-flash session: 01a1b182-4d1b-700b-89cf-8994d37c92c8 ## Blockers - D1: high — an attribution-prefixed quoted or fenced hold at the exact head is dropped, and the lock PERMITS where base `a570a5df` and the deployed lock at `34fdf7f5` both REFUSE (e.g. `> Reviewer: REQUEST_CHANGES at <head>` under `## Verdict — APPROVE at <head>` now reads as an exact-head APPROVE; under `## Approval notes` it reads as a hold with no pin). The gated set, each measured at all three revisions (`34fdf7f5` = hold at this head, refuse; `a570a5df` = refuse; `e63c0560` = permit): · `## Approval notes` or `## Final approval checklist` (verdict-shaped, no stance) + `> Reviewer: REQUEST_CHANGES at <head>` — head reads stance `hold` but `extractVerdict` = null (no pin), so the objection is demoted to unpinned evidence and decides nothing; the lock permits. Same for `> ld-reviewer: REQUEST_CHANGES at <head>`, `> ld-reviewer wrote: REQUEST_CHANGES at <head>`, `> **ld-reviewer**: REQUEST_CHANGES at <head>`, `> ld-reviewer — REQUEST_CHANGES at <head>`, `> Quote from ld-reviewer: …`, and `> Reviewer: Requesting changes at <head>`. · `## Verdict — APPROVE at <head>` or `## Approval pinned to exact head <head>` + any blockquoted line above, plus the fenced `Reviewer: REQUEST_CHANGES at <head>` — head reads an EXACT-HEAD APPROVE (`polarity=approve, exactHead=true`) and permits: a merge authorised by a comment that contains the reviewer's hold at that very head. · The same words UNQUOTED still refuse at this head (`stance=hold, verdict=hold/exactHead`), so this is the first revision whose answer depends on whether the hold was blockquoted. Cause: `documentedRequestChangesPins` requires `isHoldStatement` on the de-quoted text, so the `Name:` attribution defeats the line-initial / first-person bar, while the unquoted leg reaches the same head through the looser `statementPins(statement)`, which still sees the unquoted line inside the statement block. `docs/forgejo.md` promises the opposite twice — quoted and fenced holds are read "exactly as on every other" leg, and "a reviewer who objects must never be skipped over the way they formatted the objection" — so the docs are also false on the quoted-hold leg for this spelling. It is in none of the ruling's exceptions: the quoted-hold leg exists to make quoted holds REFUSE, never to release one, and no test in the three new files covers an attributed quote (all of them use the bare `> REQUEST_CHANGES at <sha>` spelling). ## Concerns - C1: a quoted or fenced hold naming an OLDER head under an exact-head APPROVE now permits where base `a570a5df` and `34fdf7f5` refused (measured: `**Verdict of record — … head <head>: APPROVE**` + `> REQUEST_CHANGES at <old head>`, and the fenced form). This is the sanctioned supersession bound, so I record it rather than block on it — but it is a real widening against both prior revisions and belongs in the landing announcement. - C2: an approve form that base read and this head does not (`**Verdict summary**` + machine block) is declared out of scope in `tests/landing-hold-under-approve-2682.test.ts`. Direction-safe (an approval lost, never a hold dropped) and noted only so a census reader is not surprised. - C3: the statement-bar asymmetry behind D1 is also why the docs sentence "read on this leg exactly as on every other — the same reader, so the same bar and the same head bound" is not literally true today; whichever way D1 is fixed, that sentence should match the code. ## Evidence - Revisions: `34fdf7f5` reconstructed from git objects in a `pi-extensions` clone (`git cat-file -t`, `git show`): `forgejo/landing.ts` blob = `564594a4f3b482ca55f3abde232347ac3d1fda26`, sha256 `58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731` (matches the expected `58a08127` prefix). No drop fallback used. `34fdf7f5` is an ancestor of the PR base `a570a5df`; the four commits between them are the prior finding-rule merge, so no exemption accounts for D1. - Test tallies, run in scratch checkouts in `/tmp` with `node_modules` symlinked: base `a570a5df` 963 passed / 35 files (all green); head `e63c0560` 1018 passed / 38 files (all green); the three PR test files copied onto base: 22 failed / 33 passed of 55; the four tests labelled CONTROL in `landing-verdict-arm-2682.test.ts`: 4 passed, 0 failed at base. `tsc --noEmit` clean at head. - Fixes verified at head, and failing at base: the severity-word leg under `## Blockers` (`- B1: blocker — …` is now a finding, identical to any other severity word), the prose-opener shadowing fix, documentation supplying no verdict/stance/pin, the quoted attribution line above a real verdict (homelab-88 / orch15), and the four homelab-88 cases. - Hold rule, probed through the public API: 15 approve/concern forms × 6 unquoted hold spellings = 90 combinations, all 90 refuse at head as an exact-head `hold` (base: 78 failed; `34fdf7f5`: 78 failed). A hold on an OLDER head still does not flip an approval. - Quoted-hold leg, the two mandated modes, verified by probe: a verdict-shaped comment with no stance whose only hold is the bare `> REQUEST_CHANGES at <head>` (or the fenced form) refuses at head AND at base; a resolved-restatement comment plus a quoted hold at the same head refuses as a supersession at all three revisions. Both pass — D1 is the attributed spelling only. - `STANCE_FIRST_TOKEN_RE` is byte-identical to base (only re-wrapped across lines). Whole diff reviewed: `forgejo/landing.ts`, the three test files, `docs/forgejo.md`; no other file touched, and the finding-arm change is monotone (it can only add findings, never remove one). - Sweep method for the `34fdf7f5` check: 2,316 generated comment shapes (prose/heading/machine/bold openers × hold-in-prose / unquoted hold / quoted hold / fenced hold / quoted templates / attributions / old-head pins, plus standalone forms), each run through `readVerdictStance`, `extractVerdict` and `evaluateLandingLock` at `34fdf7f5`, `a570a5df` and `e63c0560`. Every case where `34fdf7f5` refuses and this head permits is D1 or the C1 bound — nothing else in that direction was found. - Exposure: I have seen earlier review findings through my brief and the PR's test-file names; I have NOT read the PR discussion, reviews or comments, the landing census, the Plane ticket, `working-files/`, or the other seat's verdict.
Collaborator

verdict: request changes
head: e63c05609c
model: omniroute/deepseek-flash
session: 01a1b182-4cf3-700b-89cf-8993a8f8e485

Blockers

  • B1: blocker — a quoted or fenced hold at the CURRENT head stops holding whenever the comment's own statement block pins a DIFFERENT sha; the PR base a570a5df and the deployed lock at 34fdf7f5 both REFUSED these shapes and this head PERMITS them, so the quoted-hold leg fails open in a stance state the change does not cover, and docs/forgejo.md's claim that documentation may only ever make a verdict harder to get is false for it. Minimal repro, measured through evaluateLandingLock with a clean exact-head approval paired so that a refusal could only mean the hold was read: a ## Review notes on <older sha> heading, an optional blank line, then a quoted > REQUEST_CHANGES at <current head sha>, then model: / session: labels. Every revision reads the stance as hold; the difference is the PIN. The statement block pins only the older sha, documentedRequestChangesPins is consulted only under if (!pins.length && stance === "hold"), so the hold's own head is discarded, the verdict is not exact-head, and the lock permits. Same outcome for the fenced spelling, for the fenced machine form (verdict: request_changes plus head: inside a fence), and for a ## Verdict — APPROVE at <older sha> heading followed by a quoted hold at the current head — where the stance is even read as approve and the objection is lost twice over. The docs' bound is not a licence for this: "a hold the reviewer quotes on an OLDER head is that hold's supersession" covers the opposite direction, and here the hold names the CURRENT head, which is exactly the case the leg exists to refuse. Fix direction: let a documented hold supply its head whenever the statement's pins do not name the head being judged (or refuse when the statement pins another head and a documented hold names the current one), and add these four shapes to landing-quoted-hold-2682.test.ts with their a570a5df and 34fdf7f5 columns recorded as measured.

Concerns

  • C1: concern — **Verdict summary** plus a machine block is disclosed in the PR as "approves nothing", safe direction, out of scope. At this head it also trips the finding rule's fail-closed leg, so one such comment refuses the whole PR with "1 piece(s) of PR text cannot be read in the finding rule" where base a570a5df permitted it. The legal exit exists (a later exact-head verdict from the same key supersedes it), but that is not what the disclosure says happens, and the disclosure is the only place a reader would learn it.
  • C2: concern — the documented-hold head bound applies only when the comment has a stance of its own; for a stance-less comment the tail deliberately keeps base's ungated whole-body read so that no base refusal is lost. The asymmetry is fail-closed and explained in the code, but it gives a documented hold at another head opposite answers in the two stance states, so it deserves a sentence in docs/forgejo.md beside the supersession bound.

Measurement record. Test files at head: 38 files, 1018 tests, all pass. The three head test files dropped into a frozen a570a5df checkout: 3 files failed, 22 tests failed, 996 passed of 1018, and no test labelled CONTROL fails at base (4 CONTROL tests in landing-verdict-arm-2682.test.ts, all green at base). STANCE_FIRST_TOKEN_RE is byte-identical to a570a5df — wrapped across two lines, same regex source. The 34fdf7f5 parser was reconstructed from git objects (git cat-file -t 34fdf7f5... answers commit in a pi-extensions clone, forgejo/landing.ts at that commit hashes to 58a08127..., matching the verified blob), so no mgmt-drop fallback was needed. The refuses-and-then-permits sweep covered the whole 34fdf7f5..head diff, not only this PR's delta: about 1200 hand-built and harvested shapes (comment and review kinds), the five real Forgejo bodies in verdict-shaped-controls.json, the 13 prose-attack lines, and 300 random recombination bodies. Three families came back in that direction. (i) Quoted ## Blockers text no longer refusing — the affected rows already permit at a570a5df, so that is the ruled documentation fix merged between 34fdf7f5 and this PR's base, an allowed prior-ruling change. (ii) The supersession case: a quoted hold on an OLDER head beneath an approve heading — states, and documented, in docs/forgejo.md. (iii) B1 above, which is new to this PR and fails open. Nothing else moved from refuses to permits.

Exposure: I have seen earlier review findings only through my brief and the PR's test-file names, which is the expected basis for reviewing a fix. I have not seen the other seat's verdict, the PR discussion, the census, or the ticket.

verdict: request changes head: e63c05609c505d4b953df0d766fbf5cc26ac4f2e model: omniroute/deepseek-flash session: 01a1b182-4cf3-700b-89cf-8993a8f8e485 ## Blockers - B1: blocker — a quoted or fenced hold at the CURRENT head stops holding whenever the comment's own statement block pins a DIFFERENT sha; the PR base a570a5df and the deployed lock at 34fdf7f5 both REFUSED these shapes and this head PERMITS them, so the quoted-hold leg fails open in a stance state the change does not cover, and docs/forgejo.md's claim that documentation may only ever make a verdict harder to get is false for it. Minimal repro, measured through evaluateLandingLock with a clean exact-head approval paired so that a refusal could only mean the hold was read: a `## Review notes on <older sha>` heading, an optional blank line, then a quoted `> REQUEST_CHANGES at <current head sha>`, then `model:` / `session:` labels. Every revision reads the stance as hold; the difference is the PIN. The statement block pins only the older sha, `documentedRequestChangesPins` is consulted only under `if (!pins.length && stance === "hold")`, so the hold's own head is discarded, the verdict is not exact-head, and the lock permits. Same outcome for the fenced spelling, for the fenced machine form (`verdict: request_changes` plus `head:` inside a fence), and for a `## Verdict — APPROVE at <older sha>` heading followed by a quoted hold at the current head — where the stance is even read as approve and the objection is lost twice over. The docs' bound is not a licence for this: "a hold the reviewer quotes on an OLDER head is that hold's supersession" covers the opposite direction, and here the hold names the CURRENT head, which is exactly the case the leg exists to refuse. Fix direction: let a documented hold supply its head whenever the statement's pins do not name the head being judged (or refuse when the statement pins another head and a documented hold names the current one), and add these four shapes to landing-quoted-hold-2682.test.ts with their a570a5df and 34fdf7f5 columns recorded as measured. ## Concerns - C1: concern — `**Verdict summary**` plus a machine block is disclosed in the PR as "approves nothing", safe direction, out of scope. At this head it also trips the finding rule's fail-closed leg, so one such comment refuses the whole PR with "1 piece(s) of PR text cannot be read in the finding rule" where base a570a5df permitted it. The legal exit exists (a later exact-head verdict from the same key supersedes it), but that is not what the disclosure says happens, and the disclosure is the only place a reader would learn it. - C2: concern — the documented-hold head bound applies only when the comment has a stance of its own; for a stance-less comment the tail deliberately keeps base's ungated whole-body read so that no base refusal is lost. The asymmetry is fail-closed and explained in the code, but it gives a documented hold at another head opposite answers in the two stance states, so it deserves a sentence in docs/forgejo.md beside the supersession bound. Measurement record. Test files at head: 38 files, 1018 tests, all pass. The three head test files dropped into a frozen a570a5df checkout: 3 files failed, 22 tests failed, 996 passed of 1018, and no test labelled CONTROL fails at base (4 CONTROL tests in landing-verdict-arm-2682.test.ts, all green at base). STANCE_FIRST_TOKEN_RE is byte-identical to a570a5df — wrapped across two lines, same regex source. The 34fdf7f5 parser was reconstructed from git objects (`git cat-file -t 34fdf7f5...` answers commit in a pi-extensions clone, forgejo/landing.ts at that commit hashes to 58a08127..., matching the verified blob), so no mgmt-drop fallback was needed. The refuses-and-then-permits sweep covered the whole 34fdf7f5..head diff, not only this PR's delta: about 1200 hand-built and harvested shapes (comment and review kinds), the five real Forgejo bodies in verdict-shaped-controls.json, the 13 prose-attack lines, and 300 random recombination bodies. Three families came back in that direction. (i) Quoted `## Blockers` text no longer refusing — the affected rows already permit at a570a5df, so that is the ruled documentation fix merged between 34fdf7f5 and this PR's base, an allowed prior-ruling change. (ii) The supersession case: a quoted hold on an OLDER head beneath an approve heading — states, and documented, in docs/forgejo.md. (iii) B1 above, which is new to this PR and fails open. Nothing else moved from refuses to permits. Exposure: I have seen earlier review findings only through my brief and the PR's test-file names, which is the expected basis for reviewing a fix. I have not seen the other seat's verdict, the PR discussion, the census, or the ticket.
HOMELAB-2682: fix(forgejo): quoted and fenced text counts for nothing in either direction
All checks were successful
CI / pr-title (pull_request) Successful in 1s
CI / forgejo-ci (pull_request) Successful in 45s
CI / pi-otel-telemetry (pull_request) Successful in 49s
CI / skill-args (pull_request) Successful in 53s
CI / todo (pull_request) Successful in 56s
CI / plane (pull_request) Successful in 1m15s
CI / mcp-bridge (pull_request) Successful in 19s
CI / nats-intercom (pull_request) Successful in 23s
tests / python (pull_request) Successful in 5s
CI / forgejo (pull_request) Successful in 1m41s
CI / redact (pull_request) Successful in 27s
CI / ask-user-question (pull_request) Successful in 55s
CI / pi-friction (pull_request) Successful in 38s
CI / refocus (pull_request) Successful in 1m1s
CI / pi-swarm-suite (pull_request) Successful in 3m34s
6f18ab9cbc
El Director's ruling (working-files/ldv0/tooling10-ruling-1555.md): "quoted and
fenced text counts for nothing, in either direction. That follows my rule, and
approvals can't be quoted into existence. … a hold must be a verdict or a line
under ## Blockers."

Round 6's documented-hold leg is REMOVED, not extended:

- `requestChangesPinsIn(body, documentation)` loses its documented-text half and
  becomes the single unquoted reader (`requestChangesPins`);
  `documentedRequestChangesPins` and `unquotedLine` are gone.
- `readVerdictStance` loses the stance-state documented-hold branch and the
  whole-body `polarityOf(item.body) === "hold"` read, so a comment whose only
  hold is quoted or fenced states no stance at all. The resolution carve-out now
  reads `polarityOutsideDocumentation`, so a quote cannot re-arm a resolution.
- `extractVerdict` no longer lets a documented hold supply the head it names: a
  hold without a pin in the comment's own statement block decides nothing.

Kept unchanged: the six ordered fixes (prose supplies no stance, the unquoted
hold-under-every-approve-form rule, the widening revert), the fail-closed arms
(`no-verdict-block`, `malformed-blockers`), and every unquoted hold spelling.

Tests written first and measured red then green: the same corpus that round 6
asserted as holds now asserts the opposite, in both directions, plus the 15
unquoted hold spellings x 3 approve openers as regression guards, the
fail-closed rows, corpus shapes showing a real verdict still counts wherever it
is quoted from, and one test naming the accepted cost.

Differential over 109 shapes against the deployed lock at 34fdf7f5 (landing.ts
sha256 58a08127…): exactly 10 rows move refuses -> permits, and every one of
them is the ruled class — a hold that existed only as a quoted or fenced line.
No unquoted hold, no fail-closed shape and no corpus comment moves that way.

Accepted cost, recorded in the PR and in docs/forgejo.md: a reviewer who writes
a hold only as a quote, in a comment that does not read as verdict-shaped, is
ignored if others have approved.
Owner

PR-description addendum — the accepted cost, recorded plainly (not a verdict; documentation for the seats)

The fix worker could not edit the description (no tool exists for it in this session), so ruling item 2 of working-files/ldv0/tooling10-ruling-1555.md is recorded here, in the form it should be pasted into the description, and in docs/forgejo.md. This comment is not verdict-shaped and carries no stance in either direction — checked against the deployed lock at 34fdf7f5 and against this head before posting.

Accepted cost:

A reviewer who writes a hold only as a quote, in a comment that does not read as verdict-shaped, is ignored if others have approved.

Three things follow, and the first is the cost:

  • Quoted and fenced text counts for nothing in either direction. A fence or a blockquote is how a reviewer SHOWS a shape, never how they post one, so it supplies no stance, no hold and no head pin. Approvals cannot be quoted into existence; neither can holds.
  • A hold must be a verdict or a line under ## Blockers. The exit for a reviewer whose objection was written as a quote is a rewrite, not a re-tone: post it as a verdict block (**Verdict of record — <reviewer> — head <sha>: REQUEST_CHANGES**, or verdict: request_changes plus head:), or list it under ## Blockers.
  • Nothing unquoted was lost. An unquoted hold naming the head still refuses, under every approve form (15 spellings × 3 openers in the suite), and the fail-closed arms are untouched: a verdict-shaped comment with no readable verdict block still refuses, and a quoted hold no longer rescues it into a readable stance — it refuses as no-verdict-block, which is what it always was.

Round 6's documented-hold leg is removed, not extended: requestChangesPinsIn's documented-text half, the stance-state documented-hold branch, and extractVerdict's "a documented hold takes its own pins" are all gone. The resolution carve-out now reads non-documentation lines only, so a quote cannot re-arm a resolution either.

Differs from the deployed lock at 34fdf7f5 in exactly the ruled direction: of a 109-shape corpus, 10 rows move refuses → permits, and every one is a hold that existed only as a quoted or fenced line (no unquoted hold, no fail-closed shape, no corpus verdict).

New head: 6f18ab9cbc7b85aa192679a3e091da525ee37b8e. Package suite 1022/1022 green, deployed-shape suite 1022/1022, tsc --noEmit clean. Nothing merged, nothing placed.

## PR-description addendum — the accepted cost, recorded plainly (not a verdict; documentation for the seats) The fix worker could not edit the description (no tool exists for it in this session), so ruling item 2 of `working-files/ldv0/tooling10-ruling-1555.md` is recorded here, in the form it should be pasted into the description, and in `docs/forgejo.md`. This comment is not verdict-shaped and carries no stance in either direction — checked against the deployed lock at `34fdf7f5` and against this head before posting. **Accepted cost:** > A reviewer who writes a hold only as a quote, in a comment that does not read as verdict-shaped, is ignored if others have approved. Three things follow, and the first is the cost: - **Quoted and fenced text counts for nothing in either direction.** A fence or a blockquote is how a reviewer SHOWS a shape, never how they post one, so it supplies no stance, no hold and no head pin. Approvals cannot be quoted into existence; neither can holds. - **A hold must be a verdict or a line under `## Blockers`.** The exit for a reviewer whose objection was written as a quote is a rewrite, not a re-tone: post it as a verdict block (`**Verdict of record — <reviewer> — head <sha>: REQUEST_CHANGES**`, or `verdict: request_changes` plus `head:`), or list it under `## Blockers`. - **Nothing unquoted was lost.** An unquoted hold naming the head still refuses, under every approve form (15 spellings × 3 openers in the suite), and the fail-closed arms are untouched: a verdict-shaped comment with no readable verdict block still refuses, and a quoted hold no longer rescues it into a readable stance — it refuses as `no-verdict-block`, which is what it always was. Round 6's documented-hold leg is **removed, not extended**: `requestChangesPinsIn`'s documented-text half, the stance-state documented-hold branch, and `extractVerdict`'s "a documented hold takes its own pins" are all gone. The resolution carve-out now reads non-documentation lines only, so a quote cannot re-arm a resolution either. Differs from the deployed lock at `34fdf7f5` in exactly the ruled direction: of a 109-shape corpus, **10 rows move refuses → permits**, and every one is a hold that existed only as a quoted or fenced line (no unquoted hold, no fail-closed shape, no corpus verdict). New head: `6f18ab9cbc7b85aa192679a3e091da525ee37b8e`. Package suite 1022/1022 green, deployed-shape suite 1022/1022, `tsc --noEmit` clean. Nothing merged, nothing placed.
Collaborator

verdict: pass
head: 6f18ab9cbc
model: omniroute/deepseek-flash
session: 01a1b1a2-4d18-700b-89cf-899a6f34cb8a

Blockers

None.

List

The rule's legs, as I applied them: quoted and fenced text counts for nothing in either direction — it supplies no verdict, no stance, no hold and no pin, cannot rescue anything and cannot block anything; a hold must be a verdict or a line under ## Blockers; approvals cannot be quoted into existence. Ruled, not a finding.

Verification I ran myself, both revisions:

  • Tests, scratch checkouts in /tmp with node_modules symlinked: base a570a5df — 35 files / 963 tests pass; head 6f18ab9c — 38 files / 1022 tests pass. tsc --noEmit at head: no errors.
  • The three new suites run against the base module: 29 failures of 59 (the intended deltas); run against the deployed module: 33 failures of 59. No test labelled CONTROL fails at base — all four CONTROL cases in the new files pass at a570a5df, as does the pre-existing CONTROL case in the finding-rule suite.
  • Exposure: the deployed parser was reconstructed from git objects only (git show 34fdf7f5:forgejo/landing.ts, sha256 58a08127…, matching the deployed fingerprint; base 0a4b36ca…, head 7aca64e9…), and the identical synthetic comment stream was driven through evaluateLandingLock / extractVerdict / readVerdictStance at each revision under node --experimental-strip-types. No network, no PR reads, no census, no ticket.

Refuses → permits: every row I measured in that direction

In the ruled class — the hold exists only as a quoted or fenced line. In these rows a clean exact-head approval from a second reviewer key carries the merge; the solo variants of the same bodies still refuse at head, because nothing approves them:

  • prose opener Review notes on <head>, and its bold, ## heading, **Review round 2 — <head>** and **Approval notes on <head>** spellings, each followed by a quoted hold.
  • **Review — head <head>** + a fenced hold.
  • a headless ## Review notes + a quoted hold (the comment pins no head of its own).
  • Review notes on <short sha> + a quoted hold.
  • a resolved-restatement comment + a quoted hold.
  • a heading statement ## Verdict — APPROVE at <head> + a quoted hold beneath, the same + a fenced hold beneath, and the same with model/session labels under it — the statement block used to consume the quote, so a real heading approval was lost.

Inside the rule's leg but not "hold only as a quote" — a quote may not BLOCK, so a real verdict beneath a quotation is read again. These are the ordered homelab-88 / orch15 cases; each refused at the deployed lock and at the base as well:

  • > **ld-reviewer** wrote: above ## Verdict — head <sha> with verdict: approved labels.
  • > Originally posted by another reviewer: above a verdict-of-record APPROVE block.
  • a quoted hold, or a fenced hold, above a real verdict-of-record APPROVE block.
  • a quoted attribution line above the machine-form approve block.

Pre-existing at base, not introduced by this head (the documentation / finding-rule work merged between 34fdf7f5 and a570a5df), recorded so the census does not read them as new:

  • the unquoted machine form (verdict: pass / verdict: approve with head: beneath) is a verdict of record — the deployed lock refused it outright.
  • a quoted ## Blockers section no longer raises a finding (the findings arm's half of the documentation rule).
  • several quoted-hold shapes that already permitted at base through an older or label-supplied pin.

Permit → refuse (safe direction), all measured at both revisions

  • a comment that is only a quoted template is no longer a verdict: quoted machine form, quoted heading verdict, quoted verdict-of-record. A quoted heading verdict approved at the deployed lock.
  • a fenced machine-form template under a prose opener no longer approves, and a fence can no longer supply the pin.
  • prose openers no longer manufacture a stance: Review notes on <sha> plus an incidental "approved", and Review notes on <head> plus "I approve this diff" with no sha on that line, now decide nothing.
  • the hold-under-approve family now refuses under every approve form: I spot-checked eight at base and at head (verdict-of-record block, the machine pass form, a bare approve at the head, APPROVAL OF RECORD, LGTM at the head, the legacy heading, "Approved with concerns", and the machine hold form) — head refuses for all eight, base permits for most of them; the control (a hold naming an OLDER head) still permits at head.
  • the severity word under ## Blockers now decides nothing: - B1: blocker — … raises a finding at head (none at base), every other severity word reads the same, mid-sentence prose and "no new blockers were introduced" still raise nothing, and no line that raised at base stops raising.

Other observations, no direction change

  • **Verdict summary** with a quoted hold refuses at head (fail-closed: verdict-shaped, no readable block) — it refused at base too.
  • a stance stated about a head named on the SAME line still counts, and a caveat below an unquoted exact-head approval still does not flip it (unchanged at all three revisions).
  • only one new export (unquotedRequestChangesPins, a pure helper); no IO, no network, no state; the stance token regex is byte-identical to base; docs/forgejo.md states the rule and the accepted cost as measured here.
verdict: pass head: 6f18ab9cbc7b85aa192679a3e091da525ee37b8e model: omniroute/deepseek-flash session: 01a1b1a2-4d18-700b-89cf-899a6f34cb8a ## Blockers None. ## List The rule's legs, as I applied them: quoted and fenced text counts for nothing in either direction — it supplies no verdict, no stance, no hold and no pin, cannot rescue anything and cannot block anything; a hold must be a verdict or a line under `## Blockers`; approvals cannot be quoted into existence. Ruled, not a finding. Verification I ran myself, both revisions: - Tests, scratch checkouts in `/tmp` with `node_modules` symlinked: **base `a570a5df` — 35 files / 963 tests pass; head `6f18ab9c` — 38 files / 1022 tests pass**. `tsc --noEmit` at head: no errors. - The three new suites run against the **base** module: 29 failures of 59 (the intended deltas); run against the **deployed** module: 33 failures of 59. **No test labelled CONTROL fails at base** — all four CONTROL cases in the new files pass at `a570a5df`, as does the pre-existing CONTROL case in the finding-rule suite. - Exposure: the deployed parser was reconstructed from git objects only (`git show 34fdf7f5:forgejo/landing.ts`, sha256 `58a08127…`, matching the deployed fingerprint; base `0a4b36ca…`, head `7aca64e9…`), and the identical synthetic comment stream was driven through `evaluateLandingLock` / `extractVerdict` / `readVerdictStance` at each revision under `node --experimental-strip-types`. No network, no PR reads, no census, no ticket. ### Refuses → permits: every row I measured in that direction **In the ruled class — the hold exists only as a quoted or fenced line.** In these rows a clean exact-head approval from a second reviewer key carries the merge; the solo variants of the same bodies still refuse at head, because nothing approves them: - prose opener `Review notes on <head>`, and its bold, `## heading`, `**Review round 2 — <head>**` and `**Approval notes on <head>**` spellings, each followed by a quoted hold. - `**Review — head <head>**` + a fenced hold. - a headless `## Review notes` + a quoted hold (the comment pins no head of its own). - `Review notes on <short sha>` + a quoted hold. - a resolved-restatement comment + a quoted hold. - a heading statement `## Verdict — APPROVE at <head>` + a quoted hold beneath, the same + a fenced hold beneath, and the same with model/session labels under it — the statement block used to consume the quote, so a real heading approval was lost. **Inside the rule's leg but not "hold only as a quote"** — a quote may not BLOCK, so a real verdict beneath a quotation is read again. These are the ordered homelab-88 / orch15 cases; each refused at the deployed lock and at the base as well: - `> **ld-reviewer** wrote:` above `## Verdict — head <sha>` with `verdict: approved` labels. - `> Originally posted by another reviewer:` above a verdict-of-record APPROVE block. - a quoted hold, or a fenced hold, above a real verdict-of-record APPROVE block. - a quoted attribution line above the machine-form approve block. **Pre-existing at base, not introduced by this head** (the documentation / finding-rule work merged between `34fdf7f5` and `a570a5df`), recorded so the census does not read them as new: - the unquoted machine form (`verdict: pass` / `verdict: approve` with `head:` beneath) is a verdict of record — the deployed lock refused it outright. - a quoted `## Blockers` section no longer raises a finding (the findings arm's half of the documentation rule). - several quoted-hold shapes that already permitted at base through an older or label-supplied pin. ### Permit → refuse (safe direction), all measured at both revisions - a comment that is only a quoted template is no longer a verdict: quoted machine form, quoted heading verdict, quoted verdict-of-record. A quoted heading verdict **approved** at the deployed lock. - a fenced machine-form template under a prose opener no longer approves, and a fence can no longer supply the pin. - prose openers no longer manufacture a stance: `Review notes on <sha>` plus an incidental "approved", and `Review notes on <head>` plus "I approve this diff" with no sha on that line, now decide nothing. - the hold-under-approve family now refuses under **every** approve form: I spot-checked eight at base and at head (verdict-of-record block, the machine pass form, a bare approve at the head, APPROVAL OF RECORD, LGTM at the head, the legacy heading, "Approved with concerns", and the machine hold form) — head refuses for all eight, base permits for most of them; the control (a hold naming an OLDER head) still permits at head. - the severity word under `## Blockers` now decides nothing: `- B1: blocker — …` raises a finding at head (none at base), every other severity word reads the same, mid-sentence prose and "no new blockers were introduced" still raise nothing, and **no line that raised at base stops raising**. ### Other observations, no direction change - `**Verdict summary**` with a quoted hold refuses at head (fail-closed: verdict-shaped, no readable block) — it refused at base too. - a stance stated about a head named on the SAME line still counts, and a caveat below an unquoted exact-head approval still does not flip it (unchanged at all three revisions). - only one new export (`unquotedRequestChangesPins`, a pure helper); no IO, no network, no state; the stance token regex is byte-identical to base; `docs/forgejo.md` states the rule and the accepted cost as measured here.
Collaborator

verdict: pass
head: 6f18ab9cbc
model: omniroute/deepseek-flash
session: 01a1b1a2-4ce6-700b-89cf-8998558ac349

Blockers

None.

List

  • The **Verdict summary** title now fails closed instead of deciding nothing. The body **Verdict summary** + verdict: approve + head: <sha> + model + session permitted at the deployed lock and at base; at this head the comment is verdict-shaped with no readable block, so the finding-rule arm refuses the whole merge (no-verdict-block). It refuses, so nothing is permitted that the deployed lock refused, but a reviewer using that common bold title now blocks the lock until they re-post in a named form. One docs line, or adding the phrase to the closed verdict-name vocabulary, closes it.

  • A hold that names an OLDER head flips 3 of the 14 approve forms I probed, which contradicts the sentence in docs/forgejo.md §3. With the verdict-of-record and machine openers the older-head hold is correctly read as supersession (permit). With a prose opener (Approved with concerns, <sha>, Approved in principle on <sha>.) the statement block's blank-line skip pulls the following paragraph into the block, so the older sha lands in judging and the same-head test matches. Safe direction (over-refusal), so it blocks nothing; either the sentence or the block termination wants a follow-up.

  • A pin supplied only inside a fence stops counting. **Verdict of record — <reviewer>: APPROVE** followed by a fenced head: line permitted at base and refuses here. That is the rule applied consistently; recorded so the narrowing is not later read as a regression.

  • Two rows of the table below were already permitted at BASE, i.e. they are PR #108's change and not this diff: the quoted ## Blockers section, and the mid-sentence (blocker) line under ## Blockers. The second is a FINDING that #108's defect-language filter drops rather than documentation text, so I name it explicitly for the rule owner even though base and this head agree.

  • Accepted cost, declared by the change itself. A hold that exists only as a quote, in a comment that does not otherwise read as verdict-shaped, is ignored when others have approved. The docs state it, and the suite pins it as an accepted-cost test rather than hiding it.

The rule's legs, as I applied them

  • Quoted and fenced text counts for nothing in either direction: it supplies no verdict, no stance, no hold and no pin, and it can neither rescue nor block anything.
  • A hold must be a verdict or a line under ## Blockers.
  • Approvals cannot be quoted into existence.
  • This is ruled, and it is not a finding.

Exposure and measurement

Exposure line: the deployed parser was reconstructed from git objects only — git show 34fdf7f5:forgejo/landing.ts | sha256sum in a scratch clone of Homelab/pi-extensions gives 58a081275575740c…, the stated 58a08127 prefix. The three revisions then ran beside each other (deployed 34fdf7f5 at /tmp/ldv0-deployed, base a570a5df at /tmp/ldv0-base, head 6f18ab9c at /tmp/ldv0-head), the identical input stream through evaluateLandingLock, with readVerdictStance, extractVerdict and findOpenBlockers compared comment by comment.

Tallies and checks:

  • base a570a5df: 35 test files / 963 tests, all pass.
  • head 6f18ab9c: 38 test files / 1022 tests, all pass.
  • the three new test files dropped into the base tree: 30 pass / 29 fail, and all four CONTROL-labelled tests pass at base — the fixes are what fail there, not the controls.
  • npx tsc --noEmit clean at head.
  • STANCE_FIRST_TOKEN_RE: identical regex literal at base and head (only the source line is wrapped); the pattern source was compared at all three revisions. No stance widening.
  • unquoted hold under an approve opener: 14 approve forms plus 7 further hold spellings. Base permits all 14, this head refuses all 14 with an exact-head hold; the older-head control still approves for the verdict-of-record and machine openers.

Rows where the deployed lock refuses and this head permits

Class 1 — the hold exists only as a quoted or fenced line (the ruled class). Base also refused, so this diff is the change:

  • quoted hold under a headless ## Review notes, beside a clean approval
  • the same body with the hold inside a fence, beside a clean approval
  • quoted hold under a prose Review notes on <sha> opener, beside a clean approval
  • a resolved restatement followed by a quoted hold, beside a clean approval
  • a comment that quotes another reviewer's hold and then states its own approval in prose (Approved, no blockers at <sha>.), alone and beside a clean approval

Class 2 — a quote was BLOCKING a real, unquoted verdict beneath it (documentation cannot block). Base also refused, so this diff is the change:

  • six spellings of "quoted attribution line above a real verdict", each ALONE: the heading verdict, the bold verdict of record, the machine form, **APPROVE at <sha>**, two quoted lines, and an attribution above a resolution. The homelab-88/orch15 case 4 is one of these
  • a leading fence, then a real verdict, alone
  • a leading quoted head: <older sha>, then a real verdict, alone
  • a leading quoted older-head hold, then a real verdict at this head, alone
  • a quoted line, then **APPROVE at <sha>** with no labels, alone

Class 3 — inherited from PR #108: base already permitted these, so this diff changes nothing.

  • a quoted ## Blockers section, alone and beside a clean approval
  • a mid-sentence (blocker) line under ## Blockers, alone and beside a clean approval

No other row in that direction exists in the roughly 230 shapes I pushed through all three revisions (108 generative rows plus 32 documentation-in-pin-position rows plus the 59 new tests replayed item for item). Every remaining difference runs the other way, permits to refuses, which is the direction that can only refuse more.

What I verified positively

  • Prose cannot acquire a stance: Review notes on <sha> with an incidental "approved" no longer approves, and a real unquoted hold below such a prose line still holds.
  • Documentation never supplies a verdict, stance or pin: the fenced machine form, the blockquoted machine form, the blockquoted heading verdict and a fenced-only pin are all inert, alone and beside a clean approval; a quoted approval beside a real hold does not become the record.
  • The severity word under ## Blockers no longer decides: - B1: blocker — … raises one finding at this head (base raised none), - B1: high — … reads the same, and a zero-claim under that heading still raises nothing.
  • A real verdict counts wherever it is quoted from, and quoting adds nothing: the corpus approval still counts once, the corpus hold still refuses, and a quoted approval beside an unquoted hold refuses here where base permitted it.
  • The four homelab-88/orch15 cases: ## No blockers. over fifteen evidence lines raises zero findings, the no-# variant is clean, all four Blockers: none. claim forms are clean, and the attribution line above a verdict no longer swallows the verdict.
  • The fail-closed arm is intact and has its lawful exit: a blockless verdict-shaped comment refuses as no-verdict-block (a quoted hold does not rescue it), a placeholder ## Blockers section refuses as malformed-blockers, and a later exact-head verdict from the same key lifts either.
  • Ordinary discussion never refuses: ## Approval notes, ## Final approval checklist with a disclaimer, ## Verdict grammar, a fix-worker note, a post-merge record and a ## Review round 1 — pinned to head … comment all permit beside a clean approval.
  • docs/forgejo.md states the rule as ruled, including the fail-closed paragraph, the accepted cost and the rewrite exit.
verdict: pass head: 6f18ab9cbc7b85aa192679a3e091da525ee37b8e model: omniroute/deepseek-flash session: 01a1b1a2-4ce6-700b-89cf-8998558ac349 ## Blockers None. ## List - **The `**Verdict summary**` title now fails closed instead of deciding nothing.** The body `**Verdict summary**` + `verdict: approve` + `head: <sha>` + model + session permitted at the deployed lock and at base; at this head the comment is verdict-shaped with no readable block, so the finding-rule arm refuses the whole merge (`no-verdict-block`). It refuses, so nothing is permitted that the deployed lock refused, but a reviewer using that common bold title now blocks the lock until they re-post in a named form. One docs line, or adding the phrase to the closed verdict-name vocabulary, closes it. - **A hold that names an OLDER head flips 3 of the 14 approve forms I probed, which contradicts the sentence in `docs/forgejo.md` §3.** With the verdict-of-record and machine openers the older-head hold is correctly read as supersession (permit). With a prose opener (`Approved with concerns, <sha>`, `Approved in principle on <sha>.`) the statement block's blank-line skip pulls the following paragraph into the block, so the older sha lands in `judging` and the same-head test matches. Safe direction (over-refusal), so it blocks nothing; either the sentence or the block termination wants a follow-up. - **A pin supplied only inside a fence stops counting.** `**Verdict of record — <reviewer>: APPROVE**` followed by a fenced `head:` line permitted at base and refuses here. That is the rule applied consistently; recorded so the narrowing is not later read as a regression. - **Two rows of the table below were already permitted at BASE**, i.e. they are PR #108's change and not this diff: the quoted `## Blockers` section, and the mid-sentence `(blocker)` line under `## Blockers`. The second is a FINDING that #108's defect-language filter drops rather than documentation text, so I name it explicitly for the rule owner even though base and this head agree. - **Accepted cost, declared by the change itself.** A hold that exists only as a quote, in a comment that does not otherwise read as verdict-shaped, is ignored when others have approved. The docs state it, and the suite pins it as an accepted-cost test rather than hiding it. ## The rule's legs, as I applied them - Quoted and fenced text counts for nothing in either direction: it supplies no verdict, no stance, no hold and no pin, and it can neither rescue nor block anything. - A hold must be a verdict or a line under `## Blockers`. - Approvals cannot be quoted into existence. - This is ruled, and it is not a finding. ## Exposure and measurement Exposure line: the deployed parser was reconstructed from git objects only — `git show 34fdf7f5:forgejo/landing.ts | sha256sum` in a scratch clone of Homelab/pi-extensions gives `58a081275575740c…`, the stated 58a08127 prefix. The three revisions then ran beside each other (deployed `34fdf7f5` at /tmp/ldv0-deployed, base `a570a5df` at /tmp/ldv0-base, head `6f18ab9c` at /tmp/ldv0-head), the identical input stream through `evaluateLandingLock`, with `readVerdictStance`, `extractVerdict` and `findOpenBlockers` compared comment by comment. Tallies and checks: - base `a570a5df`: 35 test files / 963 tests, all pass. - head `6f18ab9c`: 38 test files / 1022 tests, all pass. - the three new test files dropped into the base tree: 30 pass / 29 fail, and all four `CONTROL`-labelled tests pass at base — the fixes are what fail there, not the controls. - `npx tsc --noEmit` clean at head. - `STANCE_FIRST_TOKEN_RE`: identical regex literal at base and head (only the source line is wrapped); the pattern source was compared at all three revisions. No stance widening. - unquoted hold under an approve opener: 14 approve forms plus 7 further hold spellings. Base permits all 14, this head refuses all 14 with an exact-head hold; the older-head control still approves for the verdict-of-record and machine openers. ## Rows where the deployed lock refuses and this head permits Class 1 — the hold exists only as a quoted or fenced line (the ruled class). Base also refused, so this diff is the change: - quoted hold under a headless `## Review notes`, beside a clean approval - the same body with the hold inside a fence, beside a clean approval - quoted hold under a prose `Review notes on <sha>` opener, beside a clean approval - a resolved restatement followed by a quoted hold, beside a clean approval - a comment that quotes another reviewer's hold and then states its own approval in prose (`Approved, no blockers at <sha>.`), alone and beside a clean approval Class 2 — a quote was BLOCKING a real, unquoted verdict beneath it (documentation cannot block). Base also refused, so this diff is the change: - six spellings of "quoted attribution line above a real verdict", each ALONE: the heading verdict, the bold verdict of record, the machine form, `**APPROVE at <sha>**`, two quoted lines, and an attribution above a resolution. The homelab-88/orch15 case 4 is one of these - a leading fence, then a real verdict, alone - a leading quoted `head: <older sha>`, then a real verdict, alone - a leading quoted older-head hold, then a real verdict at this head, alone - a quoted line, then `**APPROVE at <sha>**` with no labels, alone Class 3 — inherited from PR #108: base already permitted these, so this diff changes nothing. - a quoted `## Blockers` section, alone and beside a clean approval - a mid-sentence `(blocker)` line under `## Blockers`, alone and beside a clean approval No other row in that direction exists in the roughly 230 shapes I pushed through all three revisions (108 generative rows plus 32 documentation-in-pin-position rows plus the 59 new tests replayed item for item). Every remaining difference runs the other way, permits to refuses, which is the direction that can only refuse more. ## What I verified positively - Prose cannot acquire a stance: `Review notes on <sha>` with an incidental "approved" no longer approves, and a real unquoted hold below such a prose line still holds. - Documentation never supplies a verdict, stance or pin: the fenced machine form, the blockquoted machine form, the blockquoted heading verdict and a fenced-only pin are all inert, alone and beside a clean approval; a quoted approval beside a real hold does not become the record. - The severity word under `## Blockers` no longer decides: `- B1: blocker — …` raises one finding at this head (base raised none), `- B1: high — …` reads the same, and a zero-claim under that heading still raises nothing. - A real verdict counts wherever it is quoted from, and quoting adds nothing: the corpus approval still counts once, the corpus hold still refuses, and a quoted approval beside an unquoted hold refuses here where base permitted it. - The four homelab-88/orch15 cases: `## No blockers.` over fifteen evidence lines raises zero findings, the no-`#` variant is clean, all four `Blockers: none.` claim forms are clean, and the attribution line above a verdict no longer swallows the verdict. - The fail-closed arm is intact and has its lawful exit: a blockless verdict-shaped comment refuses as `no-verdict-block` (a quoted hold does not rescue it), a placeholder `## Blockers` section refuses as `malformed-blockers`, and a later exact-head verdict from the same key lifts either. - Ordinary discussion never refuses: `## Approval notes`, `## Final approval checklist` with a disclaimer, `## Verdict grammar`, a fix-worker note, a post-merge record and a `## Review round 1 — pinned to head …` comment all permit beside a clean approval. - `docs/forgejo.md` states the rule as ruled, including the fail-closed paragraph, the accepted cost and the rewrite exit.
HOMELAB-2682: fix(forgejo): a mid-sentence severity word under ## Blockers raises a finding
All checks were successful
CI / pr-title (pull_request) Successful in 1s
CI / forgejo-ci (pull_request) Successful in 44s
CI / plane (pull_request) Successful in 1m3s
CI / pi-otel-telemetry (pull_request) Successful in 1m3s
CI / skill-args (pull_request) Successful in 41s
CI / todo (pull_request) Successful in 45s
tests / python (pull_request) Successful in 5s
CI / forgejo (pull_request) Successful in 1m43s
CI / ask-user-question (pull_request) Successful in 42s
CI / nats-intercom (pull_request) Successful in 19s
CI / mcp-bridge (pull_request) Successful in 25s
CI / redact (pull_request) Successful in 41s
CI / pi-friction (pull_request) Successful in 42s
CI / refocus (pull_request) Successful in 48s
CI / pi-swarm-suite (pull_request) Successful in 3m34s
90d926b89c
Ruling 2026-11-06 (tooling-hypervisor) item 2a, as amended: the mid-sentence
severity MARKER under `## Blockers` — N1 `(blocker)`, N2 `[blockers]`, N3
`severity: blocker` / `severity = blocker`, any spelling — made the line take the
token path, where every pattern wants the token at the line HEAD, so the section
arm was never consulted and the finding vanished while the deployed lock
(34fdf7f5, whose parenthetical token matched anywhere) refused the same comment:

    ## Blockers

    - evidence text (blocker) more text
    - repro: X fails (blocker) per run

The rule's own leg is that a line under `## Blockers` is a finding, so the
severity word — in the label slot (RISK-3, round 4) or in a marker anywhere else
on the line — hands the line to the section's content rules
(`isSectionDefectLine`) and never decides it. Emphasis is transparent (#103), so
`(**Blocker**)` is the same marker.

Deliberately NOT widened: the BARE word stays as today (`- no new blockers were
introduced at this head` is prose, as the deployed lock read it), and a marker
outside a `## Blockers` section keeps its own reading — an APPROVE with no
section, `### Findings`, `## Concerns`. A four-space-indented sub-bullet is
content, not documentation: only a real `>` quote and a real ``` / ~~~ fence are
inert, and the indented case was the same marker bug.

Differential over 49 rows at a570a5df / 34fdf7f5 / this branch before and after:
every direction change is permits→refuses and belongs to this one class; no row
moves refuses→permits, and no row outside a `## Blockers` section moves. The
ruled classes (`### Findings` defect line, unquoted verdict block alone,
non-hold quote/fence above a real verdict, quoted/fenced holds) are untouched.

Tests: new `tests/lock-midsentence-severity-2682.test.ts` is red at the previous
head (28 failed / 16 passed), red at a570a5df (29/15), 32/12 at the deployed drop
(the plain spellings already refuse there; the emphasis spellings and the ruled
classes do not), green here (44/44). Two assertions in the round-2 B1 test that
encoded "mid-sentence is not a label UNDER `## Blockers`" — the class this ruling
reverses — now assert the ruling's reading; the seat's own measurement (no
section) is unchanged.
HOMELAB-2682: docs(forgejo): mid-sentence severity markers under ## Blockers are findings
All checks were successful
CI / pr-title (pull_request) Successful in 0s
CI / forgejo-ci (pull_request) Successful in 44s
CI / pi-otel-telemetry (pull_request) Successful in 1m7s
CI / plane (pull_request) Successful in 1m20s
CI / skill-args (pull_request) Successful in 38s
CI / ask-user-question (pull_request) Successful in 42s
CI / mcp-bridge (pull_request) Successful in 17s
tests / python (pull_request) Successful in 5s
CI / todo (pull_request) Successful in 50s
CI / forgejo (pull_request) Successful in 1m36s
CI / nats-intercom (pull_request) Successful in 32s
CI / refocus (pull_request) Successful in 50s
CI / redact (pull_request) Successful in 44s
CI / pi-friction (pull_request) Successful in 48s
CI / pi-swarm-suite (pull_request) Successful in 3m51s
df0ab62d8a
The section-finding reader now raises a finding for a severity marker
anywhere on a line under a comment's exact `## Blockers` section, in any
spelling and emphasis-transparent. docs/forgejo.md still claimed such
markers are "never read MID-SENTENCE" and that an in-sentence
`severity: blocker` is vocabulary, which is only true outside a
blockers section. Correct only that region: inside a section the section
supplies the severity; outside it nothing mid-sentence is read.
Collaborator

Verdict of record — ld-reviewer — head df0ab62d8a: REQUEST_CHANGES
model: omniroute/deepseek-flash
session: 01a1b1c3-dab4-700b-89cf-89af9a03003d

Blockers

  • B1: high — under ## Blockers a line whose severity WORD is present in a MALFORMED marker still raises no finding: the mismatched bracket pair ((blocker], (blocker ], [blocker), [ blockers ), and the id-labelled form - B1: … (blocker] …) and the glued label BLOCKER<B1>: … were all REFUSED by the deployed lock 34fdf7f5 and all PERMIT at this head, while the identical line WITHOUT the severity word is a finding (the section's content rules count it); the marker reader requires a matching bracket pair, so the token's mere presence still diverts the line away from the section arm — the exact asymmetry the round-4 severity-slot fix and ruling 2a set out to end, and the doc sentence this head writes ("a severity marker ANYWHERE on the line is a finding … in any spelling") promises it is ended.

Concerns

  • C1: the marker sentences corrected in df0ab62 are right about every spelling they ENUMERATE and wrong about the word "any": the reader honours matched bracket pairs only. Fix the reader (when no token pattern matched, let a token-bearing line under a defect section fall through to the section's own content rules, which already exclude negations, zero-claims, documentation placeholders and non-blocker labels) and the sentence becomes true without a doc change.
  • C2: docs/forgejo.md's numbered "How a verdict is recognised" list now reads 1, 2, 3, 4, 5, 5, 6 — inserting the new items 3 and 4 renumbered the old 3 and 4 but left the old 5 ("The subject is the statement outside its parentheses") and the old 6 in place, so two items carry "5.". Rendering renumbers it; the source does not.

List

  • Exposure: git objects only. I did not read PR comments or reviews, the census, the Plane ticket, or anything under working-files/. I have seen earlier findings through the brief and through this PR's test-file names (expected for a fix review); I have not seen the other seat's verdict.
  • Method for the deployed baseline: git show 34fdf7f5:forgejo/landing.ts | sha256sum in the clone gives 58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731, matching the brief. That file, a570a5df (sha256 0a4b36ca…30a4a4) and this head (dd344479…771c1) were extracted side by side and imported under node --experimental-strip-types; every row below was driven through evaluateLandingLock / findOpenBlockers / extractVerdict as a synthetic stream, the same input to all three revisions.
  • Test tallies, this head's test files run against each revision's landing.ts (7 files, 209 tests): head 209 pass / 0 fail; base a570a5df 150 pass / 59 fail; deployed 34fdf7f5 112 pass / 97 fail. Per file (failures at deployed / base / head): finding-rule-2682 49/1/0 of 68; hold-under-approve-2682 7/6/0 of 13; quoted-hold-2682 13/11/0 of 16; verdict-arm-2682 13/12/0 of 30; lock-midsentence-severity-2682 12/29/0 of 44; lock-defects-2682 0/0/0 of 18; lock-negation-heading-2682 3/0/0 of 20.
  • Test-first evidence for the newest fix: in lock-midsentence-severity-2682 the 24 marker assertions (a1–a8, three each) plus the id-keyed, single-finding, 4-space-indented and nested-sub-bullet cases FAIL at base a570a5df (29 failures in that file) and pass at this head; 18 of the 24 already pass at deployed (the plain parenthetical and severity-label spellings the deployed reader matched anywhere), while a6 and a7 (emphasis made transparent) are new refusals the deployed reader never saw, exactly as the code comment states. I also drove the marker spellings through the three modules directly: every one of the 18 generated marker shapes that the head now counts moved permit→refuse relative to base, so the fix itself introduces ZERO refuses→permits rows; the only base→head permit rows in my whole corpus are the two round-7 quoted-hold rows the ruling names.
  • Widening absent: the STANCE_FIRST_TOKEN_RE pattern source is byte-identical at deployed, base and head (this head re-wrapped the assignment across two lines; the literal is unchanged), so the stance-token widening is not back.
  • Tightenings against the deployed baseline the sweep measured (reported, not concerns): emphasis spellings (**blocker**), severity: **blocker**, severity = **blocker**, (***blocker***); the label-slot token - B1: blocker — …; the documentation placeholder line; an unquoted hold after an approve opener; a 4-space-indented hold; a code-span hold.
  • Six ordered fixes, re-measured here: the prose-opener-plus-real-hold comment holds at the exact head (base permitted it); a prose opener with an incidental "approved" and no hold now states no stance; the fenced and blockquoted machine forms yield no verdict (base approved both); the blockquoted heading verdict yields no verdict; the label-slot severity word raises a finding; the homelab-88 and orch15 cases (quoted attribution above a real heading, quoted attribution above an approve-at-sha, the 15 evidence lines under a zero-claim heading, the no-heading body with a trailing zero claim, "Blockers: none." in all four shapes) all read as approvals with zero findings; and a grammar summary that enumerates hold shapes stays an approval.
  • CONTROL-labelled tests: 5 in these files, all 5 pass at base and at this head. Three of them fail at deployed 34fdf7f5 (the real unquoted section still refuses; the round-3 machine form holds when the block carries the stance; the same machine form unquoted is an approval of record) — recorded so the deployed column is not read as a base; they are base's controls.
  • The BLOCKER<B1>: row in the table is inherited from base (it arrived with a570a5df and is documented there as "not the exact form"), not introduced by this diff; I name it inside B1's class because it is the same defect shape (a token-bearing line under a section escaping the section's content rules), not as a separate regression.
  • Nothing wider smuggled in: the diff is 6 commits — the quoted/fenced leg, the same-head hold leg, the severity-marker leg and its doc sentence, plus four new test files and one corrected assertion in finding-rule-2682 (the mid-sentence lines under ## Blockers are now findings, and the prose-beside-a-verdict case moved under a neutral heading so it still raises nothing). I found no deleted assertion that weakens an existing guarantee and no change to the approval, dangerous-class, session, model or resolution arms.

Refuses at 34fdf7f5 -> permits at this head, every row:

shape class rows
real quote or real fence: quoted attribution, fenced log block, quoted ## Blockers template, quoted hold beside an APPROVE, quoted BLOCKER <id>: line, quoted marker line, headless quoted hold, headless fenced hold, quoted section heading with unquoted content, fenced section heading with unquoted content 1, ruled (quoted and fenced text counts for nothing, in either direction) 7
a ### Findings or ## Concerns defect line carrying a marker, outside ## Blockers 2, ruled (a non-blockers section supplies no severity) 52 (26 under ### Findings, 26 under ## Concerns)
an unquoted verdict block alone, including bold name plus head plus verdict: pass 3, ruled (a real verdict block is what an approval is) 0 of 512 sampled verdict-block shapes
a non-hold quote or fence above a real verdict, alone (the ordered homelab-88 documentation cases) 4, ruled 1
a mid-sentence severity marker in prose with NO ## Blockers section 5, ruled loosening recorded in the PR body (N4 260, N5 106, N6 112 = 478 rows there; 26 in my generated corpus, same family) 26
a line UNDER ## Blockers whose severity word sits in a malformed marker: mismatched bracket pair (blocker], (blocker ], [blocker), [ blockers ) including the id-labelled form, and the glued BLOCKER<B1>: label UNRULED 5 -> BLOCKER B1

Corpus behind the counts: 55 marker-shaped lines crossed with 4 contexts (under ## Blockers, no section, ### Findings, ## Concerns) = 220 streams, plus 12 hand-written verdict-and-hold streams, plus 512 verdict-block shapes (16 openers by 8 stance spellings by 4 pin forms). Under ## Blockers the only refuses->permits rows in that corpus are the five in the last table row; outside a blockers section every marker row is a ruled class-2 or class-5 row, and the verdict-block arm produced no refuses->permits row at all.

Verdict of record — ld-reviewer — head df0ab62d8a5415664b972f2b8d5f640ff51f37e0: REQUEST_CHANGES model: omniroute/deepseek-flash session: 01a1b1c3-dab4-700b-89cf-89af9a03003d ## Blockers - B1: high — under `## Blockers` a line whose severity WORD is present in a MALFORMED marker still raises no finding: the mismatched bracket pair (`(blocker]`, `(blocker ]`, `[blocker)`, `[ blockers )`, and the id-labelled form `- B1: … (blocker] …`) and the glued label `BLOCKER<B1>: …` were all REFUSED by the deployed lock 34fdf7f5 and all PERMIT at this head, while the identical line WITHOUT the severity word is a finding (the section's content rules count it); the marker reader requires a matching bracket pair, so the token's mere presence still diverts the line away from the section arm — the exact asymmetry the round-4 severity-slot fix and ruling 2a set out to end, and the doc sentence this head writes ("a severity marker ANYWHERE on the line is a finding … in any spelling") promises it is ended. ## Concerns - C1: the marker sentences corrected in df0ab62 are right about every spelling they ENUMERATE and wrong about the word "any": the reader honours matched bracket pairs only. Fix the reader (when no token pattern matched, let a token-bearing line under a defect section fall through to the section's own content rules, which already exclude negations, zero-claims, documentation placeholders and non-blocker labels) and the sentence becomes true without a doc change. - C2: docs/forgejo.md's numbered "How a verdict is recognised" list now reads 1, 2, 3, 4, 5, 5, 6 — inserting the new items 3 and 4 renumbered the old 3 and 4 but left the old 5 ("The subject is the statement outside its parentheses") and the old 6 in place, so two items carry "5.". Rendering renumbers it; the source does not. ## List - Exposure: git objects only. I did not read PR comments or reviews, the census, the Plane ticket, or anything under working-files/. I have seen earlier findings through the brief and through this PR's test-file names (expected for a fix review); I have not seen the other seat's verdict. - Method for the deployed baseline: `git show 34fdf7f5:forgejo/landing.ts | sha256sum` in the clone gives 58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731, matching the brief. That file, a570a5df (sha256 0a4b36ca…30a4a4) and this head (dd344479…771c1) were extracted side by side and imported under node --experimental-strip-types; every row below was driven through evaluateLandingLock / findOpenBlockers / extractVerdict as a synthetic stream, the same input to all three revisions. - Test tallies, this head's test files run against each revision's landing.ts (7 files, 209 tests): head 209 pass / 0 fail; base a570a5df 150 pass / 59 fail; deployed 34fdf7f5 112 pass / 97 fail. Per file (failures at deployed / base / head): finding-rule-2682 49/1/0 of 68; hold-under-approve-2682 7/6/0 of 13; quoted-hold-2682 13/11/0 of 16; verdict-arm-2682 13/12/0 of 30; lock-midsentence-severity-2682 12/29/0 of 44; lock-defects-2682 0/0/0 of 18; lock-negation-heading-2682 3/0/0 of 20. - Test-first evidence for the newest fix: in lock-midsentence-severity-2682 the 24 marker assertions (a1–a8, three each) plus the id-keyed, single-finding, 4-space-indented and nested-sub-bullet cases FAIL at base a570a5df (29 failures in that file) and pass at this head; 18 of the 24 already pass at deployed (the plain parenthetical and severity-label spellings the deployed reader matched anywhere), while a6 and a7 (emphasis made transparent) are new refusals the deployed reader never saw, exactly as the code comment states. I also drove the marker spellings through the three modules directly: every one of the 18 generated marker shapes that the head now counts moved permit→refuse relative to base, so the fix itself introduces ZERO refuses→permits rows; the only base→head permit rows in my whole corpus are the two round-7 quoted-hold rows the ruling names. - Widening absent: the STANCE_FIRST_TOKEN_RE pattern source is byte-identical at deployed, base and head (this head re-wrapped the assignment across two lines; the literal is unchanged), so the stance-token widening is not back. - Tightenings against the deployed baseline the sweep measured (reported, not concerns): emphasis spellings `(**blocker**)`, `severity: **blocker**`, `severity = **blocker**`, `(***blocker***)`; the label-slot token `- B1: blocker — …`; the documentation placeholder line; an unquoted hold after an approve opener; a 4-space-indented hold; a code-span hold. - Six ordered fixes, re-measured here: the prose-opener-plus-real-hold comment holds at the exact head (base permitted it); a prose opener with an incidental "approved" and no hold now states no stance; the fenced and blockquoted machine forms yield no verdict (base approved both); the blockquoted heading verdict yields no verdict; the label-slot severity word raises a finding; the homelab-88 and orch15 cases (quoted attribution above a real heading, quoted attribution above an approve-at-sha, the 15 evidence lines under a zero-claim heading, the no-heading body with a trailing zero claim, "Blockers: none." in all four shapes) all read as approvals with zero findings; and a grammar summary that enumerates hold shapes stays an approval. - CONTROL-labelled tests: 5 in these files, all 5 pass at base and at this head. Three of them fail at deployed 34fdf7f5 (the real unquoted section still refuses; the round-3 machine form holds when the block carries the stance; the same machine form unquoted is an approval of record) — recorded so the deployed column is not read as a base; they are base's controls. - The `BLOCKER<B1>:` row in the table is inherited from base (it arrived with a570a5df and is documented there as "not the exact form"), not introduced by this diff; I name it inside B1's class because it is the same defect shape (a token-bearing line under a section escaping the section's content rules), not as a separate regression. - Nothing wider smuggled in: the diff is 6 commits — the quoted/fenced leg, the same-head hold leg, the severity-marker leg and its doc sentence, plus four new test files and one corrected assertion in finding-rule-2682 (the mid-sentence lines under `## Blockers` are now findings, and the prose-beside-a-verdict case moved under a neutral heading so it still raises nothing). I found no deleted assertion that weakens an existing guarantee and no change to the approval, dangerous-class, session, model or resolution arms. Refuses at 34fdf7f5 -> permits at this head, every row: | shape | class | rows | | --- | --- | --- | | real quote or real fence: quoted attribution, fenced log block, quoted `## Blockers` template, quoted hold beside an APPROVE, quoted `BLOCKER <id>:` line, quoted marker line, headless quoted hold, headless fenced hold, quoted section heading with unquoted content, fenced section heading with unquoted content | 1, ruled (quoted and fenced text counts for nothing, in either direction) | 7 | | a `### Findings` or `## Concerns` defect line carrying a marker, outside `## Blockers` | 2, ruled (a non-blockers section supplies no severity) | 52 (26 under `### Findings`, 26 under `## Concerns`) | | an unquoted verdict block alone, including bold name plus head plus `verdict: pass` | 3, ruled (a real verdict block is what an approval is) | 0 of 512 sampled verdict-block shapes | | a non-hold quote or fence above a real verdict, alone (the ordered homelab-88 documentation cases) | 4, ruled | 1 | | a mid-sentence severity marker in prose with NO `## Blockers` section | 5, ruled loosening recorded in the PR body (N4 260, N5 106, N6 112 = 478 rows there; 26 in my generated corpus, same family) | 26 | | a line UNDER `## Blockers` whose severity word sits in a malformed marker: mismatched bracket pair `(blocker]`, `(blocker ]`, `[blocker)`, `[ blockers )` including the id-labelled form, and the glued `BLOCKER<B1>:` label | UNRULED | 5 -> BLOCKER B1 | Corpus behind the counts: 55 marker-shaped lines crossed with 4 contexts (under `## Blockers`, no section, `### Findings`, `## Concerns`) = 220 streams, plus 12 hand-written verdict-and-hold streams, plus 512 verdict-block shapes (16 openers by 8 stance spellings by 4 pin forms). Under `## Blockers` the only refuses->permits rows in that corpus are the five in the last table row; outside a blockers section every marker row is a ruled class-2 or class-5 row, and the verdict-block arm produced no refuses->permits row at all.
Collaborator

Verdict of record — ld-reviewer — head df0ab62d8a: APPROVE
model: omniroute/deepseek-flash
session: 01a1b1c3-dae7-700b-89cf-89b078d09e20

Blockers

None.

Concerns

  • One approve form is lost between base and this head: **Verdict summary** + verdict: pass + head: is an exact-head APPROVE at a570a5df and decides nothing here (measured, both line orders). It is disclosed and pinned in tests/landing-hold-under-approve-2682.test.ts as out of scope, in the safe direction, "a separate ticket". I agree it is not this branch's to fix — but it is a shape the fleet has posted, so it should have a ticket rather than only a test comment.
  • 86 of the 92 refuses→permits rows in the census below were introduced by the already-merged finding-rule change (a570a5df); this branch's own widening is exactly the 6 ordered documentation rows. Recorded so the census is not read as this branch's regression.

List

  • Exposure: I have seen earlier review findings through this brief and the PR's test-file names and commit subjects — expected for a fix review. Not seen: the other seat's verdict, PR discussion or comments, the census, the Plane ticket, or anything under working-files/.
  • Deployed-baseline method, git objects only: 34fdf7f5 is a commit in the clone and git show 34fdf7f5:forgejo/landing.ts | sha256sum = 58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731, matching the brief's 58a08127 prefix. I archived four trees with git archive (a570a5df base, 34fdf7f5 deployed, 6f18ab9 for the newest fix alone, df0ab62d head) and ran the same harness files unchanged against each, calling evaluateLandingLock, extractVerdict and findOpenBlockers on synthetic streams only — no PR, no network, no edits.
  • Rule text carried verbatim, as a statement of the rule and not as an instruction to this diff: "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER : line."
  • Ruled legs I treated as given, not as findings: quoted and fenced text counts for nothing in either direction; a hold must be a verdict or a line under ## Blockers; an indented 4-space line is a finding, not documentation.
  • Six ordered fixes, all still holding at this head. BLK-1: a prose opener cannot acquire a stance, and a real hold later in the same comment survives (prose opener + incidental approve + hold below → hold, exact head). BLK-2: a fenced or blockquoted machine template above a prose opener, and a pure quoted machine block, supply no stance and no pin — and the quoted heading spelling no longer approves either. Defect 3 (the severity-slot line): - <id>: blocker — … under a section is a finding again, restored rather than removed. CONCERN-2 and the homelab-88/orch15 documentation cases: a quote or fence ABOVE a real verdict is skipped so the verdict under it is still the statement (6 shapes), while a quoted hold alone still holds nothing.
  • Newest fix (6f18ab9 → head), measured directly, not from the tests: 60 permits→refuses rows and 0 refuses→permits rows. Under a real ## Blockers section every spelling raises a finding — (blocker), [blocker], severity: blocker, severity:blocker, severity = blocker, (**Blocker**), severity = **blocker**, severity: [blockers], a bare parenthetical, an id label whose severity word is emphasised, and the same shapes on a 2-space and on a 4-space indented sub-bullet. Still inert: a real quote, a real tilde or backtick fence, and every no-section marker line, which stays prose in all 7 spellings. A 4-space indented line that carries the marker DOES raise a finding when it sits under the section, and a 4-space line that is not a real quote is never documentation — both are the ruled leg, not an exception. Lines about the word rather than marked by it (- no new blockers were introduced at this head, This is the same class of blocker I raised on issue 207) stay prose in both directions, exactly as at the deployed lock.
  • Widening absent: STANCE_FIRST_TOKEN_RE's pattern literal is byte-identical to base (/^(?:approve[d]?|lgtm|request(?:ed|ing)?[ _-]?changes|changes?[ _-]requested)\b/i); only prettier re-wrapped the declaration onto two lines. The revert of the stance-token widening is intact.
  • No CONTROL-labelled test fails at base: 5/5 pass at a570a5df (2/5 at the deployed revision, 5/5 at head). The controls that pin behaviour introduced by the earlier finding-rule merge correctly fail at the older deployed revision, which is not a base failure.
  • Test-first evidence, the PR's own six test files run unchanged against each revision: base a570a5df 59 failed / 132 passed of 191; deployed 34fdf7f5 97 failed / 94 passed; head df0ab62d 191 passed / 0 failed. Per file at head (all pass): finding-rule 68, hold-under-approve 13, quoted-hold 16, verdict-arm 30, mid-sentence-severity 44, negation-heading 20. Full forgejo suite at head: 39 files, 1066 tests, all pass.
  • docs/forgejo.md matches the reader, including the just-corrected marker sentences: inside a section the section supplies the severity and a marker anywhere is a finding in any spelling, emphasis transparent, mid-sentence and on indented sub-bullets; outside a section nothing mid-sentence is read and the I checked whether the (blocker) tag applies sentence still reports nothing. That is the measured behaviour in both directions. The quoted-and-fenced paragraph and the new approve-form table row (a real unquoted hold below an approve opener) also match what I measured on all 8 approve forms.
  • Whole-diff check: docs/forgejo.md, forgejo/landing.ts and tests only; in landing.ts the touched regions are verdictStatementLines, the section-finding arm plus three helpers, readVerdictStance and extractVerdict, and exactly two new patterns — the marker pattern, which can only add findings, and the machine-hold pattern, which can only add holds. No other module touched, nothing widened beyond the ruled classes.

Refuses→permits census, 34fdf7f5 → head df0ab62d

Every row below was refused by the deployed reader and permits at this head. 401 cells at each of the three revisions (8 approve forms × 45 streams = 360, plus 26 approve-form and documentation cases, plus 15 section-content shapes), plus 12 marker spellings measured at this head. Rows outside these ruled classes: 0.

# Shape Class Rows Introduced by
1 a quoted > ## Blockers section, and a quoted marker line under a real section (1) quoted/fenced holds and finding lines 7 the merged finding rule (a570a5df), not this branch
2 a ### Findings defect line outside ## Blockers (2) findings defect line outside the section 6 the merged finding rule (a570a5df)
3 an unquoted verdict block alone: verdict: pass / verdict: approved + head:, and bold name + head + machine line (3) unquoted verdict block alone 3 the merged finding rule (a570a5df)
4 pair rows whose only deployed refusal is "no exact-head verdict" — the same machine approve form as row 3 (3) same class, measured through the pair grid 27 the merged finding rule (a570a5df)
5 a mid-sentence severity marker in prose with no ## Blockers section: parenthetical, bracketed, severity:/severity =, severity: [blockers], bullet-repro, tag prose, plus a 4-space indented marker with no section (5) N4–N6, the ruled loosening the PR body records (478 = 260/106/112 in that record) 43 the merged finding rule (a570a5df)
6 a non-hold quote or fence ABOVE a real verdict: quoted heading, quoted hold, fenced hold, quoted machine block, quoted CI readout, quoted section (4) the ordered homelab-88 / orch15 documentation cases 6 this branch (head df0ab62d)

Total 92 rows, 86 inherited from the merged finding rule and 6 from this branch. The newest fix contributes none: 6f18ab9 → head is 60 permits→refuses and 0 refuses→permits.

  • Self-check, measured rather than asserted: this comment body run through the same harness is one exact-head APPROVE from ld-reviewer with zero findings and no hold at a570a5df and at this head. At 34fdf7f5 the same body also approves, but the deployed reader raises two findings inside it — one on the row-5 table line, whose marker spellings have no section, and one on a prose line it reads as a marker — which is the ruled loosening in row 5 read from the other side, and one more reason the deployed reader is the one being replaced.
Verdict of record — ld-reviewer — head df0ab62d8a5415664b972f2b8d5f640ff51f37e0: APPROVE model: omniroute/deepseek-flash session: 01a1b1c3-dae7-700b-89cf-89b078d09e20 ## Blockers None. ## Concerns - One approve form is lost between base and this head: `**Verdict summary**` + `verdict: pass` + `head:` is an exact-head APPROVE at a570a5df and decides nothing here (measured, both line orders). It is disclosed and pinned in tests/landing-hold-under-approve-2682.test.ts as out of scope, in the safe direction, "a separate ticket". I agree it is not this branch's to fix — but it is a shape the fleet has posted, so it should have a ticket rather than only a test comment. - 86 of the 92 refuses→permits rows in the census below were introduced by the already-merged finding-rule change (a570a5df); this branch's own widening is exactly the 6 ordered documentation rows. Recorded so the census is not read as this branch's regression. ## List - Exposure: I have seen earlier review findings through this brief and the PR's test-file names and commit subjects — expected for a fix review. Not seen: the other seat's verdict, PR discussion or comments, the census, the Plane ticket, or anything under working-files/. - Deployed-baseline method, git objects only: 34fdf7f5 is a commit in the clone and `git show 34fdf7f5:forgejo/landing.ts | sha256sum` = 58a081275575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731, matching the brief's 58a08127 prefix. I archived four trees with `git archive` (a570a5df base, 34fdf7f5 deployed, 6f18ab9 for the newest fix alone, df0ab62d head) and ran the same harness files unchanged against each, calling evaluateLandingLock, extractVerdict and findOpenBlockers on synthetic streams only — no PR, no network, no edits. - Rule text carried verbatim, as a statement of the rule and not as an instruction to this diff: "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER <id>: line." - Ruled legs I treated as given, not as findings: quoted and fenced text counts for nothing in either direction; a hold must be a verdict or a line under ## Blockers; an indented 4-space line is a finding, not documentation. - Six ordered fixes, all still holding at this head. BLK-1: a prose opener cannot acquire a stance, and a real hold later in the same comment survives (prose opener + incidental approve + hold below → hold, exact head). BLK-2: a fenced or blockquoted machine template above a prose opener, and a pure quoted machine block, supply no stance and no pin — and the quoted heading spelling no longer approves either. Defect 3 (the severity-slot line): `- <id>: blocker — …` under a section is a finding again, restored rather than removed. CONCERN-2 and the homelab-88/orch15 documentation cases: a quote or fence ABOVE a real verdict is skipped so the verdict under it is still the statement (6 shapes), while a quoted hold alone still holds nothing. - Newest fix (6f18ab9 → head), measured directly, not from the tests: 60 permits→refuses rows and 0 refuses→permits rows. Under a real ## Blockers section every spelling raises a finding — `(blocker)`, `[blocker]`, `severity: blocker`, `severity:blocker`, `severity = blocker`, `(**Blocker**)`, `severity = **blocker**`, `severity: [blockers]`, a bare parenthetical, an id label whose severity word is emphasised, and the same shapes on a 2-space and on a 4-space indented sub-bullet. Still inert: a real quote, a real tilde or backtick fence, and every no-section marker line, which stays prose in all 7 spellings. A 4-space indented line that carries the marker DOES raise a finding when it sits under the section, and a 4-space line that is not a real quote is never documentation — both are the ruled leg, not an exception. Lines about the word rather than marked by it (`- no new blockers were introduced at this head`, `This is the same class of blocker I raised on issue 207`) stay prose in both directions, exactly as at the deployed lock. - Widening absent: STANCE_FIRST_TOKEN_RE's pattern literal is byte-identical to base (`/^(?:approve[d]?|lgtm|request(?:ed|ing)?[ _-]?changes|changes?[ _-]requested)\b/i`); only prettier re-wrapped the declaration onto two lines. The revert of the stance-token widening is intact. - No CONTROL-labelled test fails at base: 5/5 pass at a570a5df (2/5 at the deployed revision, 5/5 at head). The controls that pin behaviour introduced by the earlier finding-rule merge correctly fail at the older deployed revision, which is not a base failure. - Test-first evidence, the PR's own six test files run unchanged against each revision: base a570a5df 59 failed / 132 passed of 191; deployed 34fdf7f5 97 failed / 94 passed; head df0ab62d 191 passed / 0 failed. Per file at head (all pass): finding-rule 68, hold-under-approve 13, quoted-hold 16, verdict-arm 30, mid-sentence-severity 44, negation-heading 20. Full forgejo suite at head: 39 files, 1066 tests, all pass. - docs/forgejo.md matches the reader, including the just-corrected marker sentences: inside a section the section supplies the severity and a marker anywhere is a finding in any spelling, emphasis transparent, mid-sentence and on indented sub-bullets; outside a section nothing mid-sentence is read and the `I checked whether the (blocker) tag applies` sentence still reports nothing. That is the measured behaviour in both directions. The quoted-and-fenced paragraph and the new approve-form table row (a real unquoted hold below an approve opener) also match what I measured on all 8 approve forms. - Whole-diff check: docs/forgejo.md, forgejo/landing.ts and tests only; in landing.ts the touched regions are verdictStatementLines, the section-finding arm plus three helpers, readVerdictStance and extractVerdict, and exactly two new patterns — the marker pattern, which can only add findings, and the machine-hold pattern, which can only add holds. No other module touched, nothing widened beyond the ruled classes. ## Refuses→permits census, 34fdf7f5 → head df0ab62d Every row below was refused by the deployed reader and permits at this head. 401 cells at each of the three revisions (8 approve forms × 45 streams = 360, plus 26 approve-form and documentation cases, plus 15 section-content shapes), plus 12 marker spellings measured at this head. Rows outside these ruled classes: 0. | # | Shape | Class | Rows | Introduced by | |---|-------|-------|------|---------------| | 1 | a quoted `> ## Blockers` section, and a quoted marker line under a real section | (1) quoted/fenced holds and finding lines | 7 | the merged finding rule (a570a5df), not this branch | | 2 | a `### Findings` defect line outside `## Blockers` | (2) findings defect line outside the section | 6 | the merged finding rule (a570a5df) | | 3 | an unquoted verdict block alone: `verdict: pass` / `verdict: approved` + `head:`, and bold name + head + machine line | (3) unquoted verdict block alone | 3 | the merged finding rule (a570a5df) | | 4 | pair rows whose only deployed refusal is "no exact-head verdict" — the same machine approve form as row 3 | (3) same class, measured through the pair grid | 27 | the merged finding rule (a570a5df) | | 5 | a mid-sentence severity marker in prose with no `## Blockers` section: parenthetical, bracketed, `severity:`/`severity =`, `severity: [blockers]`, bullet-repro, tag prose, plus a 4-space indented marker with no section | (5) N4–N6, the ruled loosening the PR body records (478 = 260/106/112 in that record) | 43 | the merged finding rule (a570a5df) | | 6 | a non-hold quote or fence ABOVE a real verdict: quoted heading, quoted hold, fenced hold, quoted machine block, quoted CI readout, quoted section | (4) the ordered homelab-88 / orch15 documentation cases | 6 | this branch (head df0ab62d) | Total 92 rows, 86 inherited from the merged finding rule and 6 from this branch. The newest fix contributes none: 6f18ab9 → head is 60 permits→refuses and 0 refuses→permits. - Self-check, measured rather than asserted: this comment body run through the same harness is one exact-head APPROVE from ld-reviewer with zero findings and no hold at a570a5df and at this head. At 34fdf7f5 the same body also approves, but the deployed reader raises two findings inside it — one on the row-5 table line, whose marker spellings have no section, and one on a prose line it reads as a marker — which is the ruled loosening in row 5 read from the other side, and one more reason the deployed reader is the one being replaced.
HOMELAB-2682: fix(forgejo): a malformed marker under ## Blockers still raises a finding
All checks were successful
CI / pr-title (pull_request) Successful in 0s
CI / forgejo-ci (pull_request) Successful in 52s
CI / pi-otel-telemetry (pull_request) Successful in 57s
CI / skill-args (pull_request) Successful in 56s
CI / todo (pull_request) Successful in 56s
tests / python (pull_request) Successful in 5s
CI / plane (pull_request) Successful in 1m15s
CI / mcp-bridge (pull_request) Successful in 30s
CI / nats-intercom (pull_request) Successful in 31s
CI / ask-user-question (pull_request) Successful in 39s
CI / forgejo (pull_request) Successful in 1m33s
CI / pi-friction (pull_request) Successful in 41s
CI / redact (pull_request) Successful in 41s
CI / refocus (pull_request) Successful in 51s
CI / pi-swarm-suite (pull_request) Successful in 3m16s
ce0e7394f4
Collaborator

Verdict of record — ld-reviewer — head ce0e7394f4: APPROVE
model: omniroute/deepseek-flash
session: 01a1b1d8-c5ad-700b-89cf-89b69855b797

Blockers

None.

Concerns

  • C1 — documentation precision, not a defect in the reader. The new structural paragraph states the section rule as absolute: every non-empty line under the section is a finding unless it is exactly None., a real quote, or inside a real fence. The code has a third carve-out, pre-existing and trusted-author-only, applied AFTER the structural check: an id-less line whose severity token is immediately followed by a resolution word (a bare "blockers resolved") is skipped, not counted. Measured at all three revisions: that line raises no finding at base a570a5df, at 34fdf7f5 or at head, so nothing moved here, and docs/forgejo.md does describe the carve-out in its resolutions section. Two right paragraphs read jointly as an exception to an absolute sentence; wording follow-up, not a landing blocker.
  • C2 — boundary observation, pre-existing. A nested heading or a thematic break inside a ## Blockers section ends the section, so a finding written after it is not read. Measured at base, at 34fdf7f5 and at head: all three drop the later line, so the structural rule neither introduced nor widened it. A reviewer who separates two blockers with a horizontal rule or a sub-heading loses the second silently.
  • C3 — cost of the rule, ruled and pinned. Zero-claim and negation vocabulary under a section is now a finding, so a reviewer who writes "None found.", "Blockers: none." or "No blockers at this head." under ## Blockers refuses a merge that used to permit, until they re-post as None.. 13 of the 24 new refusals I measured are that class. It follows from the ruling (spelling cannot be trusted; one exception is named), it is pinned in tests, and docs/forgejo.md states it; reported as the operational cost rather than as a defect.

List

  • Exposure (BLIND SEAT 2, re-verify round after the structural fix). Seen: this brief's description of the earlier findings, the fixed rule text, and the PR's diff, docs and test-file names, all read from git objects. Not seen: PR comments or reviews, the landing census, the Plane ticket, anything under working-files/, and the other seat's verdict, which at the time of writing I had not read. Verdict written before posting.
  • 34fdf7f5 reconstructed from git, method stated: git show 34fdf7f5:forgejo/landing.ts piped to sha256sum yields 58a08127 5575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731 — the prefix the brief names — so the deployed baseline I measured is the commit object itself, not a copy or a re-implementation. 34fdf7f5 is an ancestor of the head.
  • FIXED RULE TEXT (verbatim): "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER : line."
  • Method. Three worktrees at the head commit, each holding the HEAD test suite with only forgejo/landing.ts swapped (base a570a5df 0a4b36ca, deployed 34fdf7f5 58a08127, head ce0e7394 fc0d317d), plus a recording wrapper that logs every evaluateLandingLock and findOpenBlockers call. Flips are computed on a full-input fingerprint (comment bodies + CI state + changed files + required contexts + head), never on bodies alone, because two tests sharing a body collided into false flips in my first pass. A directed 48-shape matrix over the ruled classes was then run at all three revisions, independent of the suite.
  • Test-first evidence, all three tallies. Base a570a5df running its own suite: 35 files, 963 tests, all green. Base reader against the HEAD suite: 90 failures across 11 files (section-structural 18, severity-word arm 31, verdict arm 15, quoted-hold arm 11, hold-under-approve 6, heading-context 3, finding-rule 2, and 1 each in tightenings, severity-none, defects, negation-heading). Deployed reader 34fdf7f5 against the HEAD suite: 115 failures across 11 files. Head: 40 files, 1105 tests, 0 failures; tsc --noEmit clean. Every one of the six ordered fixes therefore has assertions that fail at both earlier revisions and pass at the head, and 0 CONTROL-labelled tests fail at base (the head suite carries 29 control tests, none failing).
  • The structural section rule, one leg at a time, measured at base / 34fdf7f5 / head. Malformed markers under a real section — (blocker], (blocker ], [blocker), [ blockers ), the id-labelled "- B1: … (blocker]", the glued BLOCKER:, an indented sub-bullet — permit / refuse / refuse, and at head each raises the finding it names (an id where the line carries one, an id-less finding otherwise). A bare sentence with no marker under the section is a finding at all three. Negation vocabulary under the section ("None found.", "Nothing outstanding.", "0 remaining.", "No blocking findings.", "Resolved B1: …", a "nit:" label, a resolution note) permits / permits / refuses — the new findings. The bare None., - None., - None. and "none" stay zero at all three, and a determiner with content after it ("None found. F1 …", "None. The guard still prints …") stays a finding at all three. A real quote, a real fence and a grammar citation under the section raise no finding at head (the section then reads as empty, and the existing malformed-blockers refusal still refuses — the refuse direction). No-section prose with a mid-sentence severity word raises nothing at head. The structural check is the first statement of isBlockerFindingLine and its caller only skips documentation lines, so no spelling veto upstream of it can silence a section line.
  • ZERO refuses→permits structurally, confirmed by replay. Findings-arm audit over 939 shared inputs: 26 bodies where 34fdf7f5 raised a finding and the head raises none; I replayed all 26 as standalone comments at base, 34fdf7f5 and head, and head is byte-identical to base on 26 of 26 while 34fdf7f5 raised a finding on all 26. Of those 26, three sit under a real ## Blockers section and all three are quoted lines; 22 have no ## Blockers section at all (Findings headings, zero-claim headings such as "## No blockers.", mid-sentence prose, a bare parenthetical label, the glued form); one has a section holding None. with the dropped line in a later non-blockers heading. No finding was lost from a real, unquoted, unfenced line under a real ## Blockers section.
  • Widening absent. STANCE_FIRST_TOKEN_RE is byte-identical at base, at 34fdf7f5 and at head (only its line wrapping changed), checked on the extracted regex text rather than the formatting. The three new refusal paths added to the stance reader (a real unquoted hold anywhere, a hold naming the same head, a stance pinned by its own line) all move in the refuse direction: measured, a real REQUEST_CHANGES below an approve opener and a real hold alone both permit at base and at 34fdf7f5 and refuse at head.
  • Nothing wider smuggled: the whole diff is 13 files — forgejo/landing.ts, docs/forgejo.md and 11 test files; no workflow, manifest, package or CI change. The six pre-existing test files that were edited flip assertions with stated rationale (None found. and No defects found. now count; the resolution note now counts) and each flip is pinned by a sibling test that keeps the old shape's other leg (for example the same prose outside the section still counts nothing).
  • The two flagged consequences, checked and agreed. First: a resolution note under ## Blockers raises an id-less finding — reproduced (base permits, head refuses), pinned in landing-blocker-heading-context.test.ts, stated as the ruling's known follow-up; reported, not a defect. Second: dead spelling machinery — after the structural early return, the label-slot severity arm and the marker-anywhere arm can only be reached by a line the section rule already rejected (a heading, documentation, an empty line, a bare None.), so they are effectively unreachable and left for follow-up cleanup. Harmless, and I found no input where that tail alone creates a finding.
  • One shape worth naming for the reviewer who writes prose sections: the real fleet comment in tests/fixtures/fleet-verdict-corpus.json whose ## Blockers section holds eight lines of analysis now raises findings there. That comment is already a hold, so no merge changes; but it is the honest illustration of C3.

Refuses at 34fdf7f5 → permits at head

Rows are shape, named class, count. Measured on 423 distinct full-input fingerprints shared by both revisions (397 identical outcomes, 0 permits→refuses at lock level), and on the directed matrix.

shape measured named class rows
an unquoted machine verdict block alone (bare bold name + head + verdict: pass) — a valid approval the deployed reader could not read named (3) 1
the same block with a prose note naming a hold on an OLDER head named (3) with the older-head gate 1
a real exact-head APPROVE with a quoted template hold below it named (1) quoted text 1
a mid-sentence severity marker in prose with NO ## Blockers section named (5), the ruled loosening 3
a defect line under a ## Findings / ### Findings heading named (2) 1
TOTAL 7
any other class 0

No row outside the ruled classes. The findings arm contributes no refuses→permits row of its own: the 26 findings-arm drops are all base-identical, and none of them is a real section line.

Permits at 34fdf7f5 → refuses at head (tightenings, listed for completeness)

shape class rows
zero-claim / negation vocabulary under a real ## Blockers section ("None found.", "Blockers: none.", "No blockers at this head.", "No defects found.", "0 remaining.") ruled negation vocabulary, C3 13
a resolution note under a real ## Blockers section raising an id-less finding ruled consequence, pinned 2
a malformed, emphasized or unusual marker under a real section the structural rule 5
a severity word in the label slot under a real section ("- B1: high — …") the structural rule 2
a severity token followed by a bare empty statement under a real section the structural rule 1
TOTAL 24
Verdict of record — ld-reviewer — head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14: APPROVE model: omniroute/deepseek-flash session: 01a1b1d8-c5ad-700b-89cf-89b69855b797 ## Blockers None. ## Concerns - C1 — documentation precision, not a defect in the reader. The new structural paragraph states the section rule as absolute: every non-empty line under the section is a finding unless it is exactly None., a real quote, or inside a real fence. The code has a third carve-out, pre-existing and trusted-author-only, applied AFTER the structural check: an id-less line whose severity token is immediately followed by a resolution word (a bare "blockers resolved") is skipped, not counted. Measured at all three revisions: that line raises no finding at base a570a5df, at 34fdf7f5 or at head, so nothing moved here, and docs/forgejo.md does describe the carve-out in its resolutions section. Two right paragraphs read jointly as an exception to an absolute sentence; wording follow-up, not a landing blocker. - C2 — boundary observation, pre-existing. A nested heading or a thematic break inside a ## Blockers section ends the section, so a finding written after it is not read. Measured at base, at 34fdf7f5 and at head: all three drop the later line, so the structural rule neither introduced nor widened it. A reviewer who separates two blockers with a horizontal rule or a sub-heading loses the second silently. - C3 — cost of the rule, ruled and pinned. Zero-claim and negation vocabulary under a section is now a finding, so a reviewer who writes "None found.", "Blockers: none." or "No blockers at this head." under ## Blockers refuses a merge that used to permit, until they re-post as None.. 13 of the 24 new refusals I measured are that class. It follows from the ruling (spelling cannot be trusted; one exception is named), it is pinned in tests, and docs/forgejo.md states it; reported as the operational cost rather than as a defect. ## List - Exposure (BLIND SEAT 2, re-verify round after the structural fix). Seen: this brief's description of the earlier findings, the fixed rule text, and the PR's diff, docs and test-file names, all read from git objects. Not seen: PR comments or reviews, the landing census, the Plane ticket, anything under working-files/, and the other seat's verdict, which at the time of writing I had not read. Verdict written before posting. - 34fdf7f5 reconstructed from git, method stated: git show 34fdf7f5:forgejo/landing.ts piped to sha256sum yields 58a08127 5575740c7ccb9f280cc24854430e98a4268c6c8a29145b6299548731 — the prefix the brief names — so the deployed baseline I measured is the commit object itself, not a copy or a re-implementation. 34fdf7f5 is an ancestor of the head. - FIXED RULE TEXT (verbatim): "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER <id>: line." - Method. Three worktrees at the head commit, each holding the HEAD test suite with only forgejo/landing.ts swapped (base a570a5df 0a4b36ca, deployed 34fdf7f5 58a08127, head ce0e7394 fc0d317d), plus a recording wrapper that logs every evaluateLandingLock and findOpenBlockers call. Flips are computed on a full-input fingerprint (comment bodies + CI state + changed files + required contexts + head), never on bodies alone, because two tests sharing a body collided into false flips in my first pass. A directed 48-shape matrix over the ruled classes was then run at all three revisions, independent of the suite. - Test-first evidence, all three tallies. Base a570a5df running its own suite: 35 files, 963 tests, all green. Base reader against the HEAD suite: 90 failures across 11 files (section-structural 18, severity-word arm 31, verdict arm 15, quoted-hold arm 11, hold-under-approve 6, heading-context 3, finding-rule 2, and 1 each in tightenings, severity-none, defects, negation-heading). Deployed reader 34fdf7f5 against the HEAD suite: 115 failures across 11 files. Head: 40 files, 1105 tests, 0 failures; tsc --noEmit clean. Every one of the six ordered fixes therefore has assertions that fail at both earlier revisions and pass at the head, and 0 CONTROL-labelled tests fail at base (the head suite carries 29 control tests, none failing). - The structural section rule, one leg at a time, measured at base / 34fdf7f5 / head. Malformed markers under a real section — (blocker], (blocker ], [blocker), [ blockers ), the id-labelled "- B1: … (blocker]", the glued BLOCKER<B1>:, an indented sub-bullet — permit / refuse / refuse, and at head each raises the finding it names (an id where the line carries one, an id-less finding otherwise). A bare sentence with no marker under the section is a finding at all three. Negation vocabulary under the section ("None found.", "Nothing outstanding.", "0 remaining.", "No blocking findings.", "Resolved B1: …", a "nit:" label, a resolution note) permits / permits / refuses — the new findings. The bare None., - None., - **None.** and "none" stay zero at all three, and a determiner with content after it ("None found. F1 …", "None. The guard still prints …") stays a finding at all three. A real quote, a real fence and a grammar citation under the section raise no finding at head (the section then reads as empty, and the existing malformed-blockers refusal still refuses — the refuse direction). No-section prose with a mid-sentence severity word raises nothing at head. The structural check is the first statement of isBlockerFindingLine and its caller only skips documentation lines, so no spelling veto upstream of it can silence a section line. - ZERO refuses→permits structurally, confirmed by replay. Findings-arm audit over 939 shared inputs: 26 bodies where 34fdf7f5 raised a finding and the head raises none; I replayed all 26 as standalone comments at base, 34fdf7f5 and head, and head is byte-identical to base on 26 of 26 while 34fdf7f5 raised a finding on all 26. Of those 26, three sit under a real ## Blockers section and all three are quoted lines; 22 have no ## Blockers section at all (Findings headings, zero-claim headings such as "## No blockers.", mid-sentence prose, a bare parenthetical label, the glued form); one has a section holding None. with the dropped line in a later non-blockers heading. No finding was lost from a real, unquoted, unfenced line under a real ## Blockers section. - Widening absent. STANCE_FIRST_TOKEN_RE is byte-identical at base, at 34fdf7f5 and at head (only its line wrapping changed), checked on the extracted regex text rather than the formatting. The three new refusal paths added to the stance reader (a real unquoted hold anywhere, a hold naming the same head, a stance pinned by its own line) all move in the refuse direction: measured, a real REQUEST_CHANGES below an approve opener and a real hold alone both permit at base and at 34fdf7f5 and refuse at head. - Nothing wider smuggled: the whole diff is 13 files — forgejo/landing.ts, docs/forgejo.md and 11 test files; no workflow, manifest, package or CI change. The six pre-existing test files that were edited flip assertions with stated rationale (None found. and No defects found. now count; the resolution note now counts) and each flip is pinned by a sibling test that keeps the old shape's other leg (for example the same prose outside the section still counts nothing). - The two flagged consequences, checked and agreed. First: a resolution note under ## Blockers raises an id-less finding — reproduced (base permits, head refuses), pinned in landing-blocker-heading-context.test.ts, stated as the ruling's known follow-up; reported, not a defect. Second: dead spelling machinery — after the structural early return, the label-slot severity arm and the marker-anywhere arm can only be reached by a line the section rule already rejected (a heading, documentation, an empty line, a bare None.), so they are effectively unreachable and left for follow-up cleanup. Harmless, and I found no input where that tail alone creates a finding. - One shape worth naming for the reviewer who writes prose sections: the real fleet comment in tests/fixtures/fleet-verdict-corpus.json whose ## Blockers section holds eight lines of analysis now raises findings there. That comment is already a hold, so no merge changes; but it is the honest illustration of C3. ## Refuses at 34fdf7f5 → permits at head Rows are shape, named class, count. Measured on 423 distinct full-input fingerprints shared by both revisions (397 identical outcomes, 0 permits→refuses at lock level), and on the directed matrix. | shape measured | named class | rows | | --- | --- | --- | | an unquoted machine verdict block alone (bare bold name + head + verdict: pass) — a valid approval the deployed reader could not read | named (3) | 1 | | the same block with a prose note naming a hold on an OLDER head | named (3) with the older-head gate | 1 | | a real exact-head APPROVE with a quoted template hold below it | named (1) quoted text | 1 | | a mid-sentence severity marker in prose with NO ## Blockers section | named (5), the ruled loosening | 3 | | a defect line under a ## Findings / ### Findings heading | named (2) | 1 | | TOTAL | | 7 | | any other class | | 0 | No row outside the ruled classes. The findings arm contributes no refuses→permits row of its own: the 26 findings-arm drops are all base-identical, and none of them is a real section line. ## Permits at 34fdf7f5 → refuses at head (tightenings, listed for completeness) | shape | class | rows | | --- | --- | --- | | zero-claim / negation vocabulary under a real ## Blockers section ("None found.", "Blockers: none.", "No blockers at this head.", "No defects found.", "0 remaining.") | ruled negation vocabulary, C3 | 13 | | a resolution note under a real ## Blockers section raising an id-less finding | ruled consequence, pinned | 2 | | a malformed, emphasized or unusual marker under a real section | the structural rule | 5 | | a severity word in the label slot under a real section ("- B1: high — …") | the structural rule | 2 | | a severity token followed by a bare empty statement under a real section | the structural rule | 1 | | TOTAL | | 24 |
Collaborator

Verdict of record — ld-reviewer — head ce0e7394f4: APPROVE

model: omniroute/deepseek-flash
session: 01a1b1d8-c580-700b-89cf-89b428f560bf

Blockers

None.

Concerns

  1. docs/forgejo.md understates the zero determination. The new paragraph says the section's one exception is "the bare None."; the reader also zeroes - **None.**, none and none! (that exact set is listed in the function's own comment and is what isBareEmptyStatementText accepts). Measured at head: those three raise nothing while None found. raises one id-less finding. The reader side is right and is unchanged from base a570a5df; the incomplete half is the doc sentence — one clause, a follow-up, not a blocker.

  2. "Documentation counts nothing" is true of the findings arm, and only of it. A ## Blockers section whose only content is a real quote or a real fence produces zero findings, but the LOCK still refuses that comment through the malformed-blockers fail-closed arm (measured: a fenced defect line, a tilde-fenced defect line and a quoted grammar template under ## Blockers all give findings [] and lock false, where the deployed reader permitted the merge). This is byte-for-byte the base a570a5df behaviour, so nothing is smuggled, but a reviewer who quotes the template under their own ## Blockers heading is refused rather than ignored, and the doc reads as "inert". Naming it so it is not discovered as a surprise.

  3. The ruled resolution-note cost is real, and it cannot be closed in place. resolved B1 — filter added under ## Blockers closes B1 and at the same time raises its own id-less finding; that finding is only closed by a later comment carrying the canonical resolution sentence. It is pinned by the changed assertion in the blocker-heading-context suite and stated as a known consequence of the structural rule — recorded here, not blocked.

List

  • The fixed rule, carried verbatim: "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER : line." Its legs hold at head, measured: a real > quote and a real backtick or tilde fence count nothing in either direction, an INDENTED line is a finding, a hold must be a verdict or a line under ## Blockers, and everything else never parses.
  • Six ordered fixes re-verified at head by my own differential runs (base a570a5df / deployed 34fdf7f5 / head ce0e739 stays): (1) prose opener + incidental approve + a real hold at the head => exact-head hold, refused; (2) fenced, blockquoted and blockquoted-heading verdict templates supply no stance and no pin => "no exact-head verdict", refused (all three permitted at base); (3) the severity WORD in the label's slot now raises B1 where base and deployed raised nothing; (4) the documented-hold removal consequence (Concern 3); (5) the four homelab-88/orch15 cases hold: ## No blockers. over 15 evidence lines => zero findings and permits, the same body with no # and a trailing "No blockers." sentence => zero, Blockers: none. outside a section => zero, and a quoted attribution line above a heading verdict => verdict of record read, permits (that last one was refused at base and at deployed).
  • Structural section rule verified on its own terms: (blocker], (blocker ], [blocker), [ blockers ), the id-labelled malformed marker and the glued angle label each raise a finding; negation vocabulary under a section raises; None found. raises; bare None., - **None.** and none! stay zero; a real quote and both fence spellings stay inert; no-section prose stays nothing. The section check is the FIRST statement of isBlockerFindingLine, before every spelling veto, and it only ever ADDS: across 630 ## Blockers rows (five heading spellings) it tightened 162 and loosened ZERO.
  • Widening absent: STANCE_FIRST_TOKEN_RE is byte-identical to base a570a5df (the diff only re-wraps the same literal onto two lines); the only two regex literals new to the tree are the severity-MARKER matcher (findings arm, tightening) and the machine request-changes matcher (hold recognition, narrowing).
  • Whole diff read (13 files, +2469/-76). Nothing wider than the ruled rule: the one added export is unquotedRequestChangesPins (internal use only, no external caller), the second parameter of isSectionDefectLine is now unused, and two symbols went dead with the rewrite — SECTION_RESOLUTION_LEAD_RE and isNonBlockerLabelLine are defined and never referenced. npx tsc --noEmit is clean, so this is the flagged cleanup, not a break.
  • Test evidence measured myself, the eleven touched suites run against each revision: head — all eleven green, and the full suite is 40 files / 1105 tests / 0 failures, typecheck clean; base a570a5df — 239 passed, 90 failed of 329; deployed 34fdf7f5 — 195 passed, 66 failed of 261 collected, with one suite failing to IMPORT (68 tests never load there, which is itself a finding about the older tree, not this one). CONTROL-labelled failures at base: ZERO of the five CONTROL assertions — which is what a control must be.
  • Real corpus: the 79 comments in the four fixtures replayed (158 rows, alone and beside a clean exact-head approval) — ZERO rows change outcome versus base, and ZERO versus deployed, on either arm.
  • Accepted cost, named rather than buried: 26 of the rows below are permissions that neither revision granted (25 are quoted-or-fenced holds, 1 is a quoted attribution line above a real verdict). They are the round-7 ruling's stated price — a hold that exists only as a quote, in a comment that does not read as verdict-shaped, is ignored when others have approved.

Exposure

Reconstructed from git objects only. The deployed revision was not named by memory but by digest: git show 34fdf7f5:forgejo/landing.ts | sha256sum = 58a08127…, matching the named prefix; the same digest method gives base a570a5df = 0a4b36ca… and this head = fc0d317d…. Differentials were produced by three detached worktrees (one per revision) driving 1,997 identical probes — synthetic grids over the verdict arm, the findings arm and the section grid, plus every comment in the four fixture corpora — through evaluateLandingLock and findOpenBlockers. Seen before writing: this brief, and the PR's test-file names (expected for a fix review), plus earlier rounds' findings only as the brief restates them. Not seen: the other seat's verdict, any PR discussion or review comment, the census, the ticket, and anything under working-files/. Read-only on the PR object throughout: no edit, no commit, no push, and no formal review state.

Refusals -> permits, deployed 34fdf7f5 -> head ce0e739 (every row, by shape and class)

# Shape Class Rows
1 quoted or fenced hold beneath a non-verdict-shaped or prose opener (review notes / review round / approval notes, incl. an attributed quote), alone or beside a clean approval 1 28
2 quoted finding line with no section, under ### Findings, under ## Concerns, under ## No blockers. 1 10
3 mid-sentence severity marker with NO ## Blockers section: no section 32, ### Findings 32, ## Concerns 32, ## No blockers. 32 5 128
4 defect or report line under ### Findings: plain, flush-left, id-labelled, adjective severity, indented, class: label, evidence line, "must be fixed" prose 2 18
5 defect or report line under the zero-claim heading ## No blockers.: id-labelled, adjective severity, id-style label (counted under class 2 because the homelab-88/orch15 negation-heading ruling — fix 5, above — requires that heading to supply nothing; if class 2 is read as ### Findings only, these 6 rows are the gap and are still ruled by fix 5) 2 6
6 non-hold quote (a quoted attribution line) above a real verdict, standing alone 4 1
7 unquoted verdict block alone: the machine approval form with its head label and no other labels 3 1
Total 192

Zero rows are unclassified, and zero rows sit under any ## Blockers heading: 630 section rows measured, 162 tightened, 0 loosened. Of the 192, 166 also permitted at base a570a5df (they restore it); the 26 that did not are the accepted cost listed in ## List.

Verdict of record — ld-reviewer — head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14: APPROVE model: omniroute/deepseek-flash session: 01a1b1d8-c580-700b-89cf-89b428f560bf ## Blockers None. ## Concerns 1. **docs/forgejo.md understates the zero determination.** The new paragraph says the section's one exception is "the bare `None.`"; the reader also zeroes `- **None.**`, `none` and `none!` (that exact set is listed in the function's own comment and is what `isBareEmptyStatementText` accepts). Measured at head: those three raise nothing while `None found.` raises one id-less finding. The reader side is right and is unchanged from base a570a5df; the incomplete half is the doc sentence — one clause, a follow-up, not a blocker. 2. **"Documentation counts nothing" is true of the findings arm, and only of it.** A `## Blockers` section whose only content is a real quote or a real fence produces zero findings, but the LOCK still refuses that comment through the `malformed-blockers` fail-closed arm (measured: a fenced defect line, a tilde-fenced defect line and a quoted grammar template under `## Blockers` all give findings `[]` and lock false, where the deployed reader permitted the merge). This is byte-for-byte the base a570a5df behaviour, so nothing is smuggled, but a reviewer who quotes the template under their own `## Blockers` heading is refused rather than ignored, and the doc reads as "inert". Naming it so it is not discovered as a surprise. 3. **The ruled resolution-note cost is real, and it cannot be closed in place.** `resolved B1 — filter added` under `## Blockers` closes B1 and at the same time raises its own id-less finding; that finding is only closed by a later comment carrying the canonical resolution sentence. It is pinned by the changed assertion in the blocker-heading-context suite and stated as a known consequence of the structural rule — recorded here, not blocked. ## List - The fixed rule, carried verbatim: "A problem only blocks if it is a REQUEST_CHANGES verdict, a line under ## Blockers, or an exact BLOCKER <id>: line." Its legs hold at head, measured: a real `>` quote and a real backtick or tilde fence count nothing in either direction, an INDENTED line is a finding, a hold must be a verdict or a line under `## Blockers`, and everything else never parses. - Six ordered fixes re-verified at head by my own differential runs (base a570a5df / deployed 34fdf7f5 / head ce0e739 stays): (1) prose opener + incidental approve + a real hold at the head => exact-head hold, refused; (2) fenced, blockquoted and blockquoted-heading verdict templates supply no stance and no pin => "no exact-head verdict", refused (all three permitted at base); (3) the severity WORD in the label's slot now raises B1 where base and deployed raised nothing; (4) the documented-hold removal consequence (Concern 3); (5) the four homelab-88/orch15 cases hold: `## No blockers.` over 15 evidence lines => zero findings and permits, the same body with no `#` and a trailing "No blockers." sentence => zero, `Blockers: none.` outside a section => zero, and a quoted attribution line above a heading verdict => verdict of record read, permits (that last one was refused at base and at deployed). - Structural section rule verified on its own terms: `(blocker]`, `(blocker ]`, `[blocker)`, `[ blockers )`, the id-labelled malformed marker and the glued angle label each raise a finding; negation vocabulary under a section raises; `None found.` raises; bare `None.`, `- **None.**` and `none!` stay zero; a real quote and both fence spellings stay inert; no-section prose stays nothing. The section check is the FIRST statement of `isBlockerFindingLine`, before every spelling veto, and it only ever ADDS: across 630 `## Blockers` rows (five heading spellings) it tightened 162 and loosened ZERO. - Widening absent: `STANCE_FIRST_TOKEN_RE` is byte-identical to base a570a5df (the diff only re-wraps the same literal onto two lines); the only two regex literals new to the tree are the severity-MARKER matcher (findings arm, tightening) and the machine request-changes matcher (hold recognition, narrowing). - Whole diff read (13 files, +2469/-76). Nothing wider than the ruled rule: the one added export is `unquotedRequestChangesPins` (internal use only, no external caller), the second parameter of `isSectionDefectLine` is now unused, and two symbols went dead with the rewrite — `SECTION_RESOLUTION_LEAD_RE` and `isNonBlockerLabelLine` are defined and never referenced. `npx tsc --noEmit` is clean, so this is the flagged cleanup, not a break. - Test evidence measured myself, the eleven touched suites run against each revision: head — all eleven green, and the full suite is 40 files / 1105 tests / 0 failures, typecheck clean; base a570a5df — 239 passed, 90 failed of 329; deployed 34fdf7f5 — 195 passed, 66 failed of 261 collected, with one suite failing to IMPORT (68 tests never load there, which is itself a finding about the older tree, not this one). CONTROL-labelled failures at base: ZERO of the five CONTROL assertions — which is what a control must be. - Real corpus: the 79 comments in the four fixtures replayed (158 rows, alone and beside a clean exact-head approval) — ZERO rows change outcome versus base, and ZERO versus deployed, on either arm. - Accepted cost, named rather than buried: 26 of the rows below are permissions that neither revision granted (25 are quoted-or-fenced holds, 1 is a quoted attribution line above a real verdict). They are the round-7 ruling's stated price — a hold that exists only as a quote, in a comment that does not read as verdict-shaped, is ignored when others have approved. ## Exposure Reconstructed from git objects only. The deployed revision was not named by memory but by digest: `git show 34fdf7f5:forgejo/landing.ts | sha256sum` = 58a08127…, matching the named prefix; the same digest method gives base a570a5df = 0a4b36ca… and this head = fc0d317d…. Differentials were produced by three detached worktrees (one per revision) driving 1,997 identical probes — synthetic grids over the verdict arm, the findings arm and the section grid, plus every comment in the four fixture corpora — through `evaluateLandingLock` and `findOpenBlockers`. Seen before writing: this brief, and the PR's test-file names (expected for a fix review), plus earlier rounds' findings only as the brief restates them. Not seen: the other seat's verdict, any PR discussion or review comment, the census, the ticket, and anything under working-files/. Read-only on the PR object throughout: no edit, no commit, no push, and no formal review state. ## Refusals -> permits, deployed 34fdf7f5 -> head ce0e739 (every row, by shape and class) | # | Shape | Class | Rows | | - | ----- | ----- | ---- | | 1 | quoted or fenced hold beneath a non-verdict-shaped or prose opener (review notes / review round / approval notes, incl. an attributed quote), alone or beside a clean approval | 1 | 28 | | 2 | quoted finding line with no section, under `### Findings`, under `## Concerns`, under `## No blockers.` | 1 | 10 | | 3 | mid-sentence severity marker with NO `## Blockers` section: no section 32, `### Findings` 32, `## Concerns` 32, `## No blockers.` 32 | 5 | 128 | | 4 | defect or report line under `### Findings`: plain, flush-left, id-labelled, adjective severity, indented, `class:` label, evidence line, "must be fixed" prose | 2 | 18 | | 5 | defect or report line under the zero-claim heading `## No blockers.`: id-labelled, adjective severity, id-style label (counted under class 2 because the homelab-88/orch15 negation-heading ruling — fix 5, above — requires that heading to supply nothing; if class 2 is read as `### Findings` only, these 6 rows are the gap and are still ruled by fix 5) | 2 | 6 | | 6 | non-hold quote (a quoted attribution line) above a real verdict, standing alone | 4 | 1 | | 7 | unquoted verdict block alone: the machine approval form with its head label and no other labels | 3 | 1 | | | **Total** | | **192** | Zero rows are unclassified, and zero rows sit under any `## Blockers` heading: 630 section rows measured, 162 tightened, 0 loosened. Of the 192, 166 also permitted at base a570a5df (they restore it); the 26 that did not are the accepted cost listed in `## List`.
Collaborator

The blocker raised in review 22832 is resolved on head ce0e7394f4.
The blocker raised in review 22834 is resolved on head ce0e7394f4.
The blocker raised in review 22839 is resolved on head ce0e7394f4.
The blocker raised in review 22846 is resolved on head ce0e7394f4.
The blocker raised in review 22847 is resolved on head ce0e7394f4.
The blocker raised in review 22850 is resolved on head ce0e7394f4.

The blocker raised in review 22832 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14. The blocker raised in review 22834 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14. The blocker raised in review 22839 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14. The blocker raised in review 22846 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14. The blocker raised in review 22847 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14. The blocker raised in review 22850 is resolved on head ce0e7394f4fab3fe6b6f9fbfe778169b47802f14.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Homelab/pi-extensions!111
No description provided.