Skip to content

[finding] CLAIM_COMMENT_MARKER needs a colon, so 24 of 54 live pm:dispatched claims are invisible — H2 reports them as claimless and H20/H27 cannot see them at all #12090

Description

@os-zhuang

Finding — recording only, unassigned and unlabelled (domain:* and grading are triage's). Measured 2026-08-25 by the skills seat, session session_01RMTpSRF5CjMmQBFfPtPCwJ, while implementing the patrol-predicates pack (PR #12088). ⛔ Deliberately not folded into that PR — see "Why this was not fixed in place" below.

Measured

scripts/pm/check-half-states.mjs:

exportconstCLAIM_COMMENT_MARKER=/^\s*>?\s*Claim(?:ed)?\s*[::]/mi;

The character class after the word accepts only a colon (ASCII or fullwidth). A large minority of live claim comments use an em dash instead:

Claim — skills seat \session_01RMTpSRF5CjMmQBFfPtPCwJ`. Folded dispatch, patrol-predicates pack …Claim — domain:cli lane execution seat, session 019siH5jDmk5hrayvfyojUqR, round R36.`

Swept over all 54 open pm:dispatched cards (each card's full first comment page, 2026-08-25):

claim spellingcards
colon form — the marker matches27
em-dash form only — the marker is blind24
neither form present3

Re-check:

node --input-type=module -e "
import {CLAIM_COMMENT_MARKER} from './scripts/pm/check-half-states.mjs';
console.log(CLAIM_COMMENT_MARKER.test('Claim — skills seat \`session_x\`.')); // false
console.log(CLAIM_COMMENT_MARKER.test('Claim: skills seat \`session_x\`.')); // true
"

What it costs, in both directions

The marker has three consumers and the blindness hits them differently:

  • H2 (h2AssigneeNoClaimComment) — false POSITIVES. Its predicate is "assigned + pm-tracked + no comment matches the marker". All 24 of those cards are assigned and pm:dispatched, so H2 reports each as "assignee set but no claim comment on the thread" — against cards carrying a complete, well-formed claim. That is ~44% of the dispatched population reported wrongly, and it is the expensive direction: the row tells a reader to go fix something that is already correct.
  • H20 / H27 (via governingClaim) — false NEGATIVES. Both gate on the same marker before reading Branch:. A card claimed with an em dash never yields a governing claim, so it buys no ref probe and can never produce an H20 "no remote ref" or H27 "dead claim" row — the two rows that exist to catch an abandoned dispatch. Those 24 cards are outside dispatch-liveness entirely.
  • H33 (new, PR pm(patrol): seat-idle and blind-claim predicates, and make UNJUDGED survive the body trim #12088) inherits the blindness and under-reports. That one is deliberate and documented in its header.

⚠️ The two directions together are why this is worth its own card rather than a wording tweak: the same one-character gap makes one row shout about healthy cards and three rows go quiet about unhealthy ones.

Note the live anchor (#9857, sweep 2026-08-25T02:08Z) renders zero H2 rows — but that run trimmed 199 rows to fit the body limit, so the anchor is not evidence either way here. The count above is measured directly against the API, not read off the report.

Shape of the fix — ⛔ not decided here

The obvious move is widening the character class to accept the dash forms ([::—–-]). Two things triage should weigh before that is treated as obvious:

  1. H2's strictness is load-bearing and was paid for (finding: the H2 half-state predicate cannot read the claim block SKILL.md tells every seat to write #7488). The marker deliberately requires the line to begin with the word so that prose like 「the next seat should claim: only after the ruling lands」 is not read as a claim. A hyphen in the class widens the accepted set further than an em dash alone does — Claim - and Claim- would both match — and whether that reaches real prose needs the same census discipline the current rule got.
  2. The write side is the alternative. If Claim: is the canonical spelling, the 24 cards are malformed claims and the fix is to make seats write the colon — in which case H2's rows are correct and the defect is upstream. The measurement cannot settle which: both spellings are produced by current seats in volume, and neither is written down anywhere as canonical that this filer could find.

⚠️ Whichever way it goes, the fix should land as one change to the shared marker, not per predicate — a file that disagrees with itself about what a claim is would be worse than the present gap.

Why this was not fixed in place

PR #12088's bounded in-place exemption was considered and declined: this is a different defect class from that PR's cards (claim-parsing coverage vs. new predicates and unjudged-row loudness), and the correct shape is not pinned by existing evidence — item 2 above is a genuine open question about which side is wrong. Fixing it would also flip the rendered verdict on 24 live cards across three predicates, which wants its own review and its own before/after measurement.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions