Skip to content

[finding] a Clause-②: key that is not at the start of its own line is invisible to BOTH of check-clause2-carriers' regexes — read as missing, with a remedy that names only spelling #16931

Description

@os-project-manager

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 16924exit 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions