tooling(pm): add H44, a report-only patrol row for a reading with no time it was taken - #15577
Merged
Merged
Conversation
…time it was taken The 2026-09-02 ruling in `.claude/skills/pm-dispatch/SKILL.md` makes a board, tree or queue reading written into a claim, a dispatch brief, a verdict, a round report or a seat-post section carry the UTC time it was taken, and declares an unstamped reading MALFORMED rather than terse — a reader treats it as untaken. Nothing read that rule: a grep across `scripts/` and `.github/` returned zero files, and its first live test failed 2h37m after it landed. H44 reads it. Report-only, no gate, no exit code. The predicate is structural — a claim / ACCEPT-REJECT-REWORK verdict / round-open marker / seat-post section carrying a reading-shaped fragment with no `HH:MM[:SS]Z` in the same paragraph — and carries no roster: there is none in this repo, and an author test is ill-posed where one account is both a seat and the maintainer. `h44NeedsSeatComments` is a sibling of H32's seat gate, wider by exactly the lane test, because H32's exclusion is argued from a lane inventory this row does not need. H32's own population is untouched. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-steve
marked this pull request as ready for review
September 4, 2026 22:17
os-steve
enabled auto-merge
September 4, 2026 22:17
os-steve
deleted the
claude/issue-14929-timestamped-reading-patrol-row
branch
September 4, 2026 22:41
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #14929
The row
H44 — a report-only patrol row in
scripts/pm/check-half-states.mjs. It fires when a comment that is one of the protocol's five reading-bearing artefacts — aClaim:-marked comment, anACCEPT/REJECT/REWORKverdict, a round-open marker (R+118 open), or any comment on apm:seatpost — contains a reading-shaped fragment in a paragraph that carries noHH:MM[:SS]Ztimestamp. It reports the carrier, the comment id, and the first offending fragment. Report-only: no exit code, no label, no gate.The rule is already on
main(.claude/skills/pm-dispatch/SKILL.md:164, maintainer ruling 2026-09-02). ⛔ This PR does not touch it. The card's measurement is that nothing read it: a grep acrossscripts/and.github/returned zero files, and the rule's first live test failed 2h37m after it landed.The predicate carries no roster, and that was measured rather than chosen
The first draft was "a comment authored by a seat account". There is no seat roster in this repo — the only frozen account list is
GOVERNED_APPROVERS, which is the approver set. The seat-post sticker login this file already parses does not match comment authorship (a card assignedos-stevecarries a claim authored byclaude[bot]). And one account is simultaneously a seat and the maintainer's own login, as H43's own header states — so an author test cannot separate a seat's reading from the maintainer's prose. It is not unavailable, it is ill-posed.So the row recognises the artefact, exactly as
CLAIM_COMMENT_MARKER, H33, H34 and H37 already do. That is also what the rule says: it is scoped to five artefacts and says nothing about who typed them.The fragment grammar, and every declared negative
count92 open cards,4 PRstally18 of 19 checks greenpositionpage 747treetableCountDeclared negatives, each pinned as a case:
\d{2}:\d{2}Zthe card's remedy names:2026-09-03T10:37:51Zis that rule obeyed with more precision, and the narrow form would have fired on the most careful readings on the board. It admits strictly more paragraphs as clean, so it cannot manufacture a finding.origin/mainin the grammar fired on 17 of 51 carriers, and every one was the claim protocol's own worktree recipe (git worktree add … origin/main) or a heading of the formPremise re-check on origin/main. A ref name asserts no tree state; the rule reads 「树读数另带 ref 或 tip」, making ref-or-tip a supplement to a reading rather than the thing that makes one. Only a tip is read.defaced,effaced) — excluded by the digit requirement; a long bare number (a comment id) — excluded by the letter requirement.Claim: 12 open cards.) fires, so length decides nothing. Pinned in both directions.REST cost per run
Base: zero. The corpus is the comment threads
commentCachealready holds when this pass runs — it is placed last of the comment readers, on H37's and H38's placement argument.One leg is bought: +6 requests per run (4 runs/day).
h32NeedsSeatCommentsfetches a seat post only when its lane parses as adomain:*label on this board — 4 of 13 open seat posts, and the 9 it skips include the triage seat (carrier of this card's worked example) and the skills seat.h44NeedsSeatCommentsis a sibling gate, wider by exactly the lane test. ⛔ H32's own population and lane gate are untouched: its exclusion is argued from a lane inventory it cannot count, which is a real argument for H32 and not this row's to overturn. H38 inherited the same gate for the same reason and takes this widening under its own card.commentCachefilters!i.pull_request, so PR comment pages are not in hand — 0 of 30 open PRs, +30 requests per run to cover. Deliberately not bought here; the clause says the counts are a LOWER BOUND.Live run
Against this repository, after the narrowing:
50 carriers: 29 claims, 11 verdicts, 10 seat-post sections. The seat leg reached 10 of 10 held seat posts, against H32's 4 — so #6015 and #7623, both dark before, are now read.
Three comments driven through the predicate directly, as the positive/negative pair:
R+118 openmarker on the triage seat posta round-open marker, first fragmentpage 747ACCEPTverdict carrying an unstamped shaa tree tip, fragmentfe35dc0f20:58Zbeside its readingThat last row is the control that matters: a well-formed claim does not fire.
Gate verdicts
pnpm check:pm-half-statesthrough the shared lock —✓ check-half-states self-test: 2172 cases pass.(2106 before this change; +66 cases), wrapperVERDICT command-exit 0.node scripts/pm/check-governed-merges.mjs --test scripts/pm/check-half-states.mjs— exit 0,✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands— 27 commands, re-derived aftergit fetchand identical. 26 green. The 27th,node scripts/check-partof-closing-keyword.mjs, printsNOT WIRED — neither PR_BODY nor PR_NUMBER is set … This is a wiring or usage failure, NOT a verdict; itspnpm check:partof-closing-keywordform, which supplies the context, is green.check:pm-clause2-carriers,ci-failure --self-test, and 5 of the artifact-roster gates whose roster sits under a directory this change is in — all green.check:published-readme-exportsneeds a built workspace and was not measured here; this change touches no package.check:nul-bytesgreen, plus a direct control-byte scan of the diff.🤖 Generated with Claude Code
https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Generated by Claude Code