feat(pm): the half-state patrol reads the tier a triage round artefact names - #18311
Conversation
…t names `.claude/skills/pm-dispatch/SKILL.md` 〈分诊座位职责〉 closes the two-tier rule with a forcing function — 「选层按 fire 时刻,⛔ 不用计数器;简报写明本轮跑的层」 — and nothing read it, so the clause was satisfied by silence. H65 is one report-only row: a triage round artefact (round-open marker, round close, stand-down brief) that carries no `Tier: hourly|daily` line at the start of a line is a half-state. It judges the NAMING only, never which tier was right — the selector stays the seat's and is pinned in the runbook. The row buys ONE comment page per triage seat post, the newest, located from the carrier's own `comments` count: the shared comment cache holds a thread's FIRST page and GitHub serves comments oldest-first, so on the 816-comment seat post that window is 2026-08-06..08-10 and both artefacts this row was written for sit five weeks outside it. The page is judged in place and never cached, so H44's, H56's and H64's corpus is unchanged. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
…eholder The row's sentence is rendered into a pinned issue body by the patrol workflow, and GitHub mutates body bytes around angle-bracket-shaped fragments — a remedy whose own example is eaten teaches nothing. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
Contract reviewServed-tier: Reviewing seat: ① Derived judgments
② Semver levelNot applicable — nothing published moves; ③ Boundary flags
Implemented-by: VERDICT: PASS Edit by the reviewing seat: the first posting read 「open_questions: none」 — the seat's extract of the report had skipped that key; the two questions the report carries are answered above. Nothing else changed. Generated by Claude Code |
|
Landing provenance — skills seat, session Generated by Claude Code |
Fixes #18302
.claude/skills/pm-dispatch/SKILL.md〈分诊座位职责〉 closes the triage seat's two-tier rule with a forcing function — 「选层按 fire 时刻,⛔ 不用计数器;简报写明本轮跑的层」 — and the filing card measured that nothing read the last clause (0 hits outside the two declaring files, with two lit controls on the patrol itself). Thedomain:skillsseat ruled the direction ENFORCE.What this adds
One report-only H-row,
H65, inscripts/pm/check-half-states.mjs, plus 83 self-test cases. A triage round artefact that carries noTier:line is a half-state: the two-tier rule is satisfied by silence.pm:seatpost whose title begins[PM seat] triage. The execution seats have no two-tier rule, so they are out of scope by construction. ⛔ Deliberately not gated onseatIsHeld: that predicate excludes a🟢 Routineholder by name, and the triage seat runs as a Routine whenever no session has taken it over — inheriting H44's seat gate would silence this row exactly when the seat is on its schedule.**Round-open marker** …,分诊轮收尾 …,# 🔻 收班简报 …), judged on the comment's headline (its first non-empty line), plus H44'sR+N openspelling reused by reference. H44 itself is untouched.Tier:followed byhourlyordaily, everything after the tier word free text. Another word, a decorated**Tier:**, a blockquoted> Tier:or aTier:mid-paragraph are all findings: the spelling is closed on purpose (让正确形态成为唯一拼写).state(H44's and H56's), five coverage counters on the enumerated forwarding contract, one summary clause.The dispatch said to read "whatever window the patrol already uses for seat-post comments". Measured before writing a line, that window cannot carry this row:
commentRowsForfetches?per_page=100with nopage, and GitHub serves issue comments oldest-first. On the triage seat post (816 comments at the reading) that page is2026-08-06T16:01:10Z→2026-08-10T17:29:28Z.2026-09-15— five weeks outside it. The page holds ~81 August round-closes instead.So the row buys one page: the newest, at page
ceil(comments / 100)computed from the carrier's own count. One request per triage seat post per run (one such post on this board), no time constant to defend, nosincewindow that can truncate the newest rows away. ⛔ The page is judged in place and never written tocommentCache, so H44's, H56's and H64's corpus is unchanged —prCommentCacheis the same refusal one row over. Residuals (an artefact older than that page; an unread page as UNJUDGED rather than clean) are declared in the row header and on every run in the summary clause.The one design choice the seat left open — and why no reference file is touched
Should the
Tier:spelling also be pinned in the runbook's brief template? Four axes:references/dispatch-runbook.md〈分诊席读数成本三则〉 (four-section template, verbatim first-line marker). The H-row's remedy reaches the seat only after a violation, through the patrol anchor. Both channels are partial and neither substitutes for the other.盘点层: 每日,Tier: 全量), which is the (c)-shaped recurring remedy the skill ranks last.All four say add the line. It is not added, because the ratchet has zero headroom, and the dispatch says stop on breach:
The only currency for a line is deleting content, and deleting a runbook rule is a protocol change outside this card. So: no reference file is touched, the remedy text is the spelling's only home for now, and the choice is the seat's to make — pay a line, or take the ceiling raise to the maintainer with a ruling.
Reverse verification
Predicate against the real artefacts (bodies fetched through the REST proxy) — every one a half-state named, and every one clean once a tier line is added at line start:
Ablation, from the committed state, both legs with on-disk and hash proof (blob
38864b3f== HEAD blob before each leg;git diff HEADempty after each):nullreason: 'absent'occurrences 1 → 0, injected marker 1, blob38864b3f→b044520b38864b3f→076713f3Tier: full,Tier: 全量,Tier: Daily, the echoed word)Live patrol, run the normal way (report-only, exit 0) against the live board:
All 9 artefacts in the live window are tier-less,
5681229485and5682407231among them — one row per carrier naming the newest, which is H44's and H56's convention. They ARE the finding; no dated floor is applied (the file's only floor is H22's env-gated, default-unsetPM_SWEEP_CLOSED_FLOOR, a per-install adaptation rather than an idiom for new rows).Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 41 commands from the change set; all were run and reconciled with--ran. Self-test 4,113 → 4,196 cases (+83), ESLint clean on the file,node scripts/check-self-test-wired.mjsgreen, control-byte scan empty.Acceptance notes
Noted, not filed — the seat decides:
H44_ROUND_OPEN_MARKERdoes not match the current marker spelling either (measured against all four bodies). H44 has therefore been reporting on August artefacts only. Not repaired here: widening H44 changes what an existing row reports, which this card forbids. Dedupe words:H44 seat leg first page·commentRowsFor oldest-first·round-open marker spelling·untimestamped reading triage.direction=desc/sort=createdare silently ignored by the per-issue comments endpoint (measured); onlysinceandpagemove that window. Recorded so the next author does not re-measure it.Generated by Claude Code