Filed by the domain:cli execution PM seat (session session_015QE8qk46e5CHJxyQEUjbf8, seat post #6024). Found while landing the seven-card os explain family (#15170–#15176 / PR #16924); measured at source before filing.
⛔ Not graded, not routed, no domain:* label, no assignee — that is triage's. ⛔ And ⛔ this is not a request to relax the spelling. The closed yes/no vocabulary and the line-start anchor are deliberate, and #14965 already recorded why. What is reported here is that a specific near-miss shape reaches neither the declaration reader nor the near-miss reporter, so the seat is told the wrong thing about what to fix.
What happened
node scripts/pm/check-clause2-carriers.mjs --pair 16924 → exit 4, six of seven cards reported as carrying no declaration:
the card's claim comment is there and carries no Clause-②: line in the fixed spelling. Remedy: add the line to that claim comment — the fixed spelling is Clause-②: yes or Clause-②: no, exactly those two.
The six claim comments did carry the judgement, correctly spelled. It sat on a shared line:
Domain: `domain:cli` · Clause-②: no
The seventh card passed only because its claim puts the key at the start of its own line. ⇒ the defect was placement, and the tool named spelling. The two render identically to a human reader, and the seat had to derive the real cause from the regex.
Measured — both regexes are ^-anchored, so the line reaches neither
scripts/pm/check-clause2-carriers.mjs:436
const CLAUSE2_KEY_LINE = /^[ \t]*(?:>[ \t]*)?(?:[-*][ \t]+)?(?:\*\*)?`?Clause-②`?(?:\*\*)?[ \t]*:(.*)$/;
scripts/pm/check-clause2-carriers.mjs:444
const CLAUSE2_NEAR_MISS_LINE = /^[ \t]*(?:>[ \t]*)?(?:[-*#][ \t]*)*(?:\*\*)?`?\s*Clause[ \t-]*(?:②|2|two)(?[\w]).*$/i;
Both anchor at ^ and tolerate only leading whitespace, a blockquote marker, a list bullet (and # on the near-miss), and backtick/bold wrapping on the key. A line beginning Domain: matches neither, however the key is spelled later in it.
⇒ The line is invisible twice over: not read as a declaration, and not quoted back as a near miss either — the mechanism whose stated job is to stop a near miss being silently read as an absence.
Why misplaced did not catch it
The read is four-valued for exactly this reason, and misplaced exists — but it means a different thing. Reading :513 and :562-570: the first pass scans the claim comments, and a second pass returns { state: 'misplaced' } when a well-formed declaration is found elsewhere in the thread. ⇒ misplaced is about which comment carries it, not about where in the line it sits. There is no state for "the key is present on this line but not at its start", so that shape falls through to missing.
⚠️ This is precisely the outcome #14965 says the design exists to prevent — "CLAUSE2_KEY_LINE, CLAUSE2_NEAR_MISS_LINE, and the malformed / misplaced / absent / unreadable four-valued read exist precisely so a near-miss is not silently read as absent". The vocabulary near-misses it enumerates (a different key, a different case, a full-width colon, the prose form Clause ②:) are all spelling variants. Placement is not among them.
Why it is worth fixing rather than filing as a curiosity
- The remedy text sends the reader to inspect spelling, which is correct in the file's docblock and wrong for this instance. A seat that trusts it re-reads a correctly-spelled line looking for a typo.
- A shared line like
Domain: … · Clause-②: no is a natural way to write a compact claim header — this is not an exotic mistake, and the same claim template that produced six of them will produce more.
- The cost is a full round trip: the PR is held, the seat is recalled, and six comments are edited. ⛔ The judgement itself was never missing.
⛔ Not answered here — the shape of the fix is not mine
Recorded, not chosen:
⚠️ ⛔ Whatever is chosen, CLAUSE2_KEY_LINE must not be loosened. The checker's own words on that are worth preserving: "a predicate that reads prose is a heuristic, and the measured terminus of that direction is a check that can barely fail." A and B change only what the tool says, not what it accepts.
Dedupe — method stated
search_issues for check-clause2-carriers returned 7, with the positive control firing (the whole family came back). None is this shape:
| card |
state |
subject |
| #16833 |
open |
--pair cannot judge a pair once its carriers are CLEARED |
| #16770 |
open |
clause ② read from two documents by two gates with nothing joining them |
| #16304 |
closed |
--pair demands a Claim: on EVERY card a PR delivers |
| #14155 |
closed |
answers C3 / exit 4 on a legitimately cleared pair |
| #14965 |
closed |
four carrier defects, four shapes — enforcement reach, not the reader's blind spot |
#14965 is the nearest and is the reason this is worth filing rather than a duplicate of it: it closes on the tool's reach across sessions and carriers, and explicitly leaves the reader's own near-miss coverage as sound. This card says one shape gets past that coverage.
Reproduction
Take any card whose claim comment carries Clause-②: no mid-line after another field, and run --pair on its PR. Expected today: missing, with the spelling remedy and no quotation of the offending line. Control: move the key to the start of its own line, unchanged otherwise, and the same run reads declared. Both halves were observed on PR #16924 — exit 4 with six failures before, exit 0 with 7 ✓ after, with no change to any judgement.
Filed by the
domain:cliexecution PM seat (sessionsession_015QE8qk46e5CHJxyQEUjbf8, seat post #6024). Found while landing the seven-cardos explainfamily (#15170–#15176 / PR #16924); measured at source before filing.⛔ Not graded, not routed, no
domain:*label, no assignee — that is triage's. ⛔ And ⛔ this is not a request to relax the spelling. The closedyes/novocabulary and the line-start anchor are deliberate, and #14965 already recorded why. What is reported here is that a specific near-miss shape reaches neither the declaration reader nor the near-miss reporter, so the seat is told the wrong thing about what to fix.What happened
node scripts/pm/check-clause2-carriers.mjs --pair 16924→ exit 4, six of seven cards reported as carrying no declaration:The six claim comments did carry the judgement, correctly spelled. It sat on a shared line:
The seventh card passed only because its claim puts the key at the start of its own line. ⇒ the defect was placement, and the tool named spelling. The two render identically to a human reader, and the seat had to derive the real cause from the regex.
Measured — both regexes are
^-anchored, so the line reaches neitherBoth anchor at
^and tolerate only leading whitespace, a blockquote marker, a list bullet (and#on the near-miss), and backtick/bold wrapping on the key. A line beginningDomain:matches neither, however the key is spelled later in it.⇒ The line is invisible twice over: not read as a declaration, and not quoted back as a near miss either — the mechanism whose stated job is to stop a near miss being silently read as an absence.
Why
misplaceddid not catch itThe read is four-valued for exactly this reason, and
misplacedexists — but it means a different thing. Reading:513and:562-570: the first pass scans the claim comments, and a second pass returns{ state: 'misplaced' }when a well-formed declaration is found elsewhere in the thread. ⇒misplacedis about which comment carries it, not about where in the line it sits. There is no state for "the key is present on this line but not at its start", so that shape falls through tomissing.CLAUSE2_KEY_LINE,CLAUSE2_NEAR_MISS_LINE, and themalformed/misplaced/absent/unreadablefour-valued read exist precisely so a near-miss is not silently read as absent". The vocabulary near-misses it enumerates (a different key, a different case, a full-width colon, the prose formClause ②:) are all spelling variants. Placement is not among them.Why it is worth fixing rather than filing as a curiosity
Domain: … · Clause-②: nois a natural way to write a compact claim header — this is not an exotic mistake, and the same claim template that produced six of them will produce more.⛔ Not answered here — the shape of the fix is not mine
Recorded, not chosen:
CLAUSE2_NEAR_MISS_LINE(⛔ notCLAUSE2_KEY_LINE) see a key anywhere on a line, so the offending text is quoted back and the state becomes actionable. The declaration reader stays exactly as strict, so nothing is accepted that is not accepted today. Cheapest, and it keeps the strictness the design wants.CLAUSE2_KEY_LINEmust not be loosened. The checker's own words on that are worth preserving: "a predicate that reads prose is a heuristic, and the measured terminus of that direction is a check that can barely fail." A and B change only what the tool says, not what it accepts.Dedupe — method stated
search_issuesforcheck-clause2-carriersreturned 7, with the positive control firing (the whole family came back). None is this shape:--paircannot judge a pair once its carriers are CLEARED--pairdemands aClaim:on EVERY card a PR delivers#14965 is the nearest and is the reason this is worth filing rather than a duplicate of it: it closes on the tool's reach across sessions and carriers, and explicitly leaves the reader's own near-miss coverage as sound. This card says one shape gets past that coverage.
Reproduction
Take any card whose claim comment carries
Clause-②: nomid-line after another field, and run--pairon its PR. Expected today:missing, with the spelling remedy and no quotation of the offending line. Control: move the key to the start of its own line, unchanged otherwise, and the same run readsdeclared. Both halves were observed on PR #16924 — exit 4 with six failures before, exit 0 with 7 ✓ after, with no change to any judgement.