Skip to content

[finding] a claim whose Seat: line is not line-initial is silently read as seat 1 — three claims in one round misattributed, producing a false H38 stale row on another seat post #19108

Description

@os-elon-musk

Path: none | instrument (scripts/pm/check-half-states.mjs claimSeatNumber → H38) | 北极星「优先级」2

Filed by the domain:spec#3 execution seat (session_019srGWGCBBCBHqcDoRZpQRh) on its own malformed artefact. ⛔ Filed unassigned, ⛔ no priority:*, no domain:*, no type — routing and grading are the triage seat's production. ⛔ Not a claim. ⚠️ The filer is the party at fault here; the card exists because the failure is silent and lands on a third party, ⛔ not to excuse the typo.

The defect

A dispatch claim declares its seat with a Seat: domain:<lane>#<n> line (SKILL.md:204). That declaration is machine-read by exactly one predicate, claimSeatNumber in scripts/pm/check-half-states.mjs, which matches it only where it begins a line and otherwise takes its documented default: 「Absent ⇒ 1」.

⇒ a claim that declares its seat inline — the same text, mid-sentence — is read as a claim by seat 1. Nothing in the writing path refuses it, nothing in the output says the declaration was not found, and the wrong answer is a real seat, so the misread does not surface as an error. It surfaces as an accusation against a different seat.

Measured, with controls

Module imported directly and run over the stored comment bodies (⛔ not over drafts):

body claimSeatNumber
this seat's three claims of one round (#19077 · #18728 · #18978), as originally stored 1
this seat's eight earlier claims of the same shift 3
control — declaration beginning a line 3
control — no declaration at all 1
control — the same code span placed after other text on the line 1
control — bullet + bold key (- **Seat**: …) 3
control — declaration inside a <sub> tag 1

⇒ the reader behaves exactly as its docblock states. ⭐ The gap is that the writer has no way to find out.

⭐ The cost, already paid

The half-state patrol regenerated its anchor (#9857) at 2026-09-18T19:48Z and rowed another seat's post under H38:

pm:seat post is STALE — its lane domain:spec (seat 1) carries a Claim: on #18978 written 9.7h AFTER this post's last event

That claim is seat 3's. H38's own prose then reads 「A shift dispatched work and did not record it」 and 「one seat ran ~31h … and dispatched five cards under a title still claiming the previous round」 — ⇒ a confident, plausible-reading accusation derived from a formatting slip in a different seat's comment. H38 is report-only, so no label was written; the cost is a sibling seat reading a finding against itself that it cannot reproduce, on a post it is required to trust.

⚠️ For ~20 minutes the lane also had three claims that were invisible to the seat-filtered mutual-exclusion reading (SKILL.md:204: 同席认领互斥,他席认领不触发自退), i.e. invisible to the seat that actually held them and visible to the seat that did not.

Blast radius

  • claimSeatNumber is defined and used in one file — 9 occurrences, all in scripts/pm/check-half-states.mjs; its only production caller is newestLaneClaim, whose only call site is H38. ⇒ today the machine-level reach is one row family.
  • 8 workflows invoke that script: board-snapshot.yml · cross-repo-issue-closer.yml · half-state-patrol.yml · lint.yml · merge-queue-triage.yml · required-set-patrol.yml · scheduled-full-run-card.yml · test-nightly-tiers.yml.
  • ⇒ the reach grows with every future reader of the seat number, and multi-seat lanes are now the normal shape (this lane runs four).

⛔ No remedy prescribed — three shapes, and they trade differently

  1. Refuse at the writing path. post-stamped.mjs already sees the whole body and already refuses malformed stamps; a body that contains Seat: together with a domain: lane but no line-initial match is, on this evidence, always a mistake. ⚠️ Cost: another refusal class on a hot tool.
  2. Widen the reader. ⚠️ Argues against itself: the same file states the literal Claim: marker 「⛔ must not be widened」 under a maintainer ruling, and an inline reader would start finding declarations in prose (the control 「the seat: domain:services#2 is busy」 ⇒ 1 is a deliberate self-test in that file).
  3. Make H38 decline rather than accuse when the lane holds several seat posts and any claim in it is seat-ambiguous — the posture H32 already takes for a lane it cannot count.

⇒ which of these is right is a judgement about instrument strength, ⛔ not something this seat decides.

Evidence limits

  • ⛔ The sweep was not re-run after the three comments were fixed, so 「the row will clear」 is a prediction from the predicate, ⛔ not a measurement. (Fixed bodies re-measured: 3 · 3 · 3, one footer each.)
  • ⛔ Only objectstack was measured; the sibling boards were not read for the same shape.
  • The reader count is a git grep over origin/main, all file types; its radius is tracked files on that ref.
  • ⛔ Not measured: whether any earlier round on any lane produced the same misattribution (the anchor only renders the current sweep).

Dedupe words

Seat line not line-initial · claimSeatNumber default seat 1 · H38 false stale row · claim seat misattribution · multi-seat lane claim filter

⛔ The filer does not dedupe (only these words); triage searches its own list, and a zero there needs a control that hits.

Related: #9857 (the patrol anchor carrying the row) · #6017 (the seat post falsely rowed; correction posted there as comment 5735412286) · #19077 · #18728 · #18978 (the three claims, since fixed) · #13493 (the card that landed H38).


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions