HOMELAB-2682: fix(forgejo): '**Blockers**: none.' negates like the plain form #103
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "plane/HOMELAB-2682-bold-negation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The refusal (gits-hypervisor, verbatim)
The seat wrote the same empty statement the fleet already negates, in the bolded prose every reviewer writes. Leg 4 read the markup as prose, so a clean approval became one open, id-less finding — and an id-less finding can never be closed, so the PR was unlandable for a typographic reason (same class as the wrapped denial in HOMELAB-2586 and the predicate in HOMELAB-2595).
Cause:
isNegatedtestedBLOCKER_NEGATED_PATTERNSagainst the raw line. The empty-statement arm iswhich needs
[:=]immediately afterblockers?(modulo whitespace). In**Blockers**: none.the next character is*, so the pattern never fires, while^[\s>*\-•]*(?:\*\*|__)?…blockers?\bstill recognises the line as a finding shape. Emphasis is markup, not punctuation, and it is now treated as such.Failing-test confirmation (unit streams only, no real PR)
Measured against
mainate9b02a3(includes the merged #99/#100/#102), withtests/landing-bold-negation.test.ts: 14 failed / 19 passed.**Blockers**: none.**Blockers:** none.**blockers**: none**Blocker**: none.**Blockers**: N/A.**Blockers**: 0 open.**Blockers: none.***Blockers*: none.**Blockers**: none__Blockers__: none.\bafterBlockersfails before__)_Blockers_: none._was never a finding lead)**No blockers**/**Zero blockers**Blockers: none.(plain control)The fix
One helper, one call site.
withoutEmphasisremoves*,**,***,_,__,___where they adorn a word, beforeBLOCKER_NEGATED_PATTERNSrun, so the emphasized line is the plain line and every existing pattern reads both identically. Nothing was added to what counts as a negation:snake_case,REQUEST_CHANGES) are kept verbatim;plainText) —`Blockers: none`is a quoted shape and reading it as a negation would be a widening, not an emphasis fix;**became the very boundaryWRAPPED_NEGATION_HEAD_RElooks for), so a bolded wrap head stays out of scope here;BLOCKER_FINDING_PATTERNS, the section grammar, the documentation guards) is untouched.Near-miss guards (must stay findings — pinned)
**Blockers**: one — the auth check is open**Blockers**: none worth mentioning**Blockers**: none worth mentioning — the auth check is open**Blockers**: none, and the auth check is still open**Blocker**: none of the callers pass ctx**Blocker B1**: tenant scoping is missing**Blockers** — none.:/=vocabulary), so emphasis must not invent a negationSuite
npm run typecheckclean,npm test→ 29 files / 774 tests passednpm run test:deployed→ 29/29 files loaded and passed, 774/774 teststests/landing-bold-negation.test.ts→ 33 tests (13 variants, 10 parity pairs, 7 near-miss guards, 3evaluateLandingLockend-to-end including the GITS #204 approval shape and the same approval carrying a real bolded finding)Out of scope (recorded, not implemented)
gits-hypervisor also asked what stops an orchestrator from dictating parser-shaped lines to a seat. That is an enforcement-design question (a verdict line a seat composes itself vs. one it is handed), belongs to the homelab-cb / Aaron design session, and is out of scope for this PR — this PR only makes the parser read the prose a seat writes.
Verdict of record — ld-reviewer — head
d3d0be66e4: APPROVEmodel: deepseek-flash
session: sess-2682-seat2-ds-7ac4b5
Blockers
None.
Concerns
__Blocker B1__: tenant scoping is missingand_Blocker B1_: ...shapes score zero findings at origin/main AND at this head, because the finding lead class has no underscore. A bolded narrative id has the mirror problem:**Blocker 1**'s vacuity is gonescores a finding at both heads. Unchanged by this PR, so not a regression; named so "emphasis is transparent" is not read as covering the finding side.emptyStatementstable (__Blockers__: none.,_Blockers_: none.) score zero findings on origin/main too, so they pin existing behaviour rather than the fix. The PR body's table already says as much — recorded, not disputed.What I ran (unit streams only, no real PR)
findOpenBlockersfrom BOTH trees (origin/maine9b02a3and this head, same installed tree): 60 adversarial lines x both trees, plus a 201-pair emphasis sweep over 25 plain base lines (label-bold, label+sep-bold, dunder, italic, triple-asterisk, whole-line bold/italic). Every empty statement in the PR table reproduces; every same-body change is an empty statement becoming a negation; the near-miss guards hold on this head:none worth mentioning,none open on this head,none; auth still open,none, and the auth check is still open,one — auth,Blocker B1: ..., andBlockers — none.all stay findings.citesFinding, the canonical id-less resolution matcher,isWrappedNegationand the wrapped-head path are untouched; a bolded wrap head still does not negate (same at both heads), which is the declared boundary.tsc --noEmitclean;vitest run29 files / 774 tests passed;npm run test:deployed29/29 files loaded and passed, 774/774 tests, pinned tree 1.3.34; the new suite is 33 tests. CI ond3d0be6is green (run #310, forgejo + all packages).Verdict of record — ld-reviewer — head
d3d0be66e4: APPROVEmodel: deepseek-flash
session: 01a1ae0a-3a07-757a-b84d-2797f124ea77
Seat 1 of 2 (gate tooling, DeepSeek), independent of the parallel seat. Everything below is my own reading of the diff at this exact head, the whole of
forgejo/landing.tsaround the change, the new suite, and my own probes run against the head's own exports in a clean detached worktree. The builder's report and the PR description were not used as evidence; where I quote their numbers below, it is because I reproduced them.Head and CI first
d3d0be66e4d3fce6a581e1b95053cda8260292aa, branchplane/HOMELAB-2682-bold-negation, basemainate9b02a3.forgejojob that runs this package's own suite; run #311 (python) success.forgejo/landing.ts(+45/−1) andforgejo/tests/landing-bold-negation.test.ts(new, 174 lines). Nothing else.1. The normalization cannot reach the finding-positive patterns — verified structurally
The production change is one helper and one call site.
withoutEmphasisis invoked at exactly one place: the first line ofisNegated, and only as the argument toBLOCKER_NEGATED_PATTERNS. Every predicate that makes a line a finding still reads the raw line:BLOCKER_FINDING_PATTERNS,BLOCKER_NUMBERED_RE,isSectionOnlyHeadingand the section grammar,isBlockerDocumentation,labelId/findingId, the resolution grammars, andisWrappedNegation'sprevLine(which stays verbatim on purpose, HOMELAB-2595).That is visible in the diff itself, not just in the comments: the only removed line in the entire PR is the old
BLOCKER_NEGATED_PATTERNS.some((re) => re.test(line))statement. The pattern array is byte-identical, and every finding pattern is untouched. So the fix cannot change what counts as a finding except through the negation decision it feeds.Probed at the head (my own cases,
findOpenBlockers, one finding expected):**Blocker 1**: the check is open→ 1**Blocker 1**: the check is open at d3d0be6→ 1**Blocker B1** — tenant scoping is missing→ 1**Blockers**: one — the auth check is open→ 1**Blockers**: 0 open — but the guard is missing→ 1**Blockers: none.** still the tenant filter is missing→ 1**Blockers**: none of these are covered→ 1**Blockers**: N/A — the guard only prints→ 1severity =prefix, bolded) → 1Each of these returns the same count at base
e9b02a3, so the PR moved none of them.2. The near-miss guards exist and bite, and the confirmed failures negate
The guards are not prose in a comment; they are the existing ends of the negation vocabulary, and emphasis stripping preserves them because the stripped line still has content after the zero word:
**Blockers**: one — the auth check is open→ finding (content after the label)**Blockers**: none worth mentioning→ finding (the empty-statement arm requires end-of-line after the zero word)**Blockers**: none, and the auth check is still open→ finding**Blocker**: none of the callers pass ctx→ finding (a finding whose text starts with "no", not a count of zero)**Blockers** — none.→ finding, and its plain formBlockers — none.is a finding too, so emphasis invented nothingThe confirmed failing variants now negate. I ran the 13 rows of the PR's first table plus 7 of my own as one probe set: all 20 read as an empty statement at this head, and 16 of them read as a finding at
e9b02a3(**Blockers**: none.,**Blockers:** none.,**blockers**: none,**Blocker**: none.,**Blockers**: N/A.,**Blockers**: 0 open.,**Blockers: none.**,*Blockers*: none.,***Blockers***: none.,**Blockers**: none,- **Blockers**: none.,**Blockers**: **none**.,**Blockers** : none.,**Blockers**: None, plus**Blockers**: no blockers.and### **Blockers**: none.). The four that were already 0 at base are the ones the PR's table says were already 0.The failing-test-first claim reproduces exactly and independently: I copied the committed test file into a clean detached worktree at
e9b02a3and ran it — 14 failed / 19 passed, includingexpected [ '**Blockers**: none.' ] to deeply equal []from the end-to-end case. On this head the same file is 33/33.3. No widening — the vocabulary is exactly the old one modulo emphasis, and I measured both directions
The stated property is that an emphasized line must read exactly like its plain form. I swept it: 20 plain blocker-grammar corpus lines (taken from the package's own cases), each word wrapped in
**…**, then each word wrapped in__…__, and the finding count compared to the plain reading.e9b02a3: 20 differ — for exampleBlockers: none.0 vs**Blockers:** none.1,Blockers count: 00 vs**Blockers** count: 01,Blockers: 00 vsBlockers: **0**1.So bolding is now transparent and nothing else is: no plain form changed, and no negation vocabulary was added (the pattern array is unchanged in the diff). The narrowness the comments claim also holds when probed:
`Blockers: none.`quoted in backticks is still a finding, and**Blockers**:none.still reads as a finding, because backticks are not stripped.4. The enforcement question is untouched — confirmed, and correctly out of scope
The diff touches exactly two files,
forgejo/landing.tsand the new test. There is no change toverdict.ts, the verdict CLI, any prompt, any attribution path, or any check on how a seat obtains the lines it posts. Nothing in the diff attempts to answer what stops an orchestrator from dictating parser-shaped lines to a seat, which matches the PR's recorded scope and leaves that design question where it belongs.5. Suites and CI
npx tsc --noEmitclean;npx vitest run→ 29 files / 774 tests passed.npm run test:deployed→ 29/29 test files loaded and passed, 774/774 tests, on the pinned tree (typebox1.3.34). No file silently failed to load, which is what that runner exists to catch.forgejojob is this same suite), #311 success.Class — dangerous, and my approval is one leg of the panel
The lock's own policy lists
forgejo/**as an oversight path ("the landing gate itself is an oversight path: a change to it changes what every autonomous merge is allowed to do"), so this diff is dangerous class. I confirmed it with the head's own evaluator: with my verdict as the only review in the input,evaluateLandingLockrefuses withdangerous-class change with an incomplete review panel. That is the correct reading of my own comment — it counts as one exact-head approval and asks for the panel, it does not wave itself through. The panel needs two approvals from two independent sessions with declared models, at least one of them premium; my seat declaresdeepseek-flash, so the premium leg is the parallel seat's and nothing in this comment substitutes for it.Blockers
None.
Concerns
_.__Blocker__ 1: the check is openreports 0 at this head and 0 at base: the finding-side arms require a word boundary afterblockers?, and_is a word character, so the line never becomes a finding in the first place. So emphasis removal can make a found line negate, but it cannot make a missing line found. The direction is fail-open, it is pre-existing, and the PR's own table discloses the__Blockers__:rows — nothing here makes it worse. Owner: whoever next touches the finding-side grammar, if__becomes a shape this fleet writes.**5. Blocker** — the retry loop spins(a number inside the bold run) and(**blocker**) tenant scoping is missingreport 0, because the numbered and bracketed arms cannot read emphasis before the digits or the parenthesis. Worth knowing before anyone reads "emphasis is transparent" as covering every emphasized shape.snake_case, and identifiers likeBLOCKER_NEGATED_PATTERNS) and backticks not stripped. I probed both and they hold at this head, but a later simplification to a naive strip-every-asterisk-and-underscore would keep the whole suite green while silently widening the negation. Owner: the next touch oflanding.ts; oneit()per decision closes it.. **No**followed byblocker found …negates nothing. That is fail-closed and unchanged from base.Boundaries
This is gate tooling, so I record what I did and did not do. Read-only review: no file edited, no commit, no push, no merge, no comment edited or deleted. The reviewer credential came from OpenBao
kv/ld/forgejo-reviewer, minted through thesa-operatorrole into a 0700 directory as 0600 files, andGET /userwith it answeredld-reviewer(id 47) immediately before this comment was written; the operator's account token was not used and no secret was printed. Approval is of this exact head only — a fix push or a rebase moves it.Addendum to my verdict at head
d3d0be6— the approval above standsMeasured after I posted it, prompted by seat 2's C1: my section 3 said "no plain form changed", and that is too strong for one shape. A single trailing delimiter on a line carrying no emphasis at all is stripped by
withoutEmphasis(its neighbour rule strips a run when either side is not alphanumeric), so seven shapes flip from finding to empty statement betweene9b02a3and this head:Blockers: none.*,Blockers: none._,Blockers: none *,Blockers: none. *,Blockers: none.*,Blockers: N/A*,Blockers: 0 open*. Seat 2's C1 is correct and reproduces exactly on my own differential harness — seven for seven, same direction.What I did check in that direction, at both heads: nothing substantive is swallowed.
Blocker: the guard prints twice*,Blocker 1: the check is open*,Blockers: none of the callers pass ctx*,Blockers: none worth mentioning*andBlockers: one — the auth check is open*are findings here and at base. The flip reaches only the empty-statement reading of a line that already states none, so it is a widening in the benign direction and it swallows no real defect.Corrected reading of section 3: bolding is transparent at this head (zero bolded variant differs from its plain reading across a 20-line, every-word sweep) and no negation pattern was added — but the strip is slightly wider than "emphasis only", in the empty-statement direction. My approval stands on that narrower basis, and the seven shapes above are the whole of the deviation I could find.
If whoever next touches this file wants the edge closed, it is one line: make the neighbour test require both sides alphanumeric, or a balanced pair, instead of either side. That keeps the emphasis fix (a word-adorning run has at least one non-alphanumeric neighbour by construction) and drops the stray-delimiter flip.
Honesty about my own process: my first sweep varied whole words (
**word**,__word__) and therefore could not see a single-sided stray delimiter; seat 2's sweep did. The lesson is that "bolding is transparent" and "no plain form changed" are different claims, and I asserted the second from evidence for the first.No file edited, no merge attempted; this addendum approves nothing new and withdraws nothing.