Skip to content

tooling(pm): add H44, a report-only patrol row for a reading with no time it was taken - #15577

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-14929-timestamped-reading-patrol-row
Sep 4, 2026
Merged

tooling(pm): add H44, a report-only patrol row for a reading with no time it was taken#15577
os-steve merged 1 commit into
mainfrom
claude/issue-14929-timestamped-reading-patrol-row

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

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 — a Claim:-marked comment, an ACCEPT/REJECT/REWORK verdict, a round-open marker (R+118 open), or any comment on a pm:seat post — contains a reading-shaped fragment in a paragraph that carries no HH:MM[:SS]Z timestamp. 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 across scripts/ 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 assigned os-steve carries a claim authored by claude[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

shape fires on
count a number bound to a card/PR noun — 92 open cards, 4 PRs
tally a check-run score — 18 of 19 checks green
position a queue or page position — page 747
tree a tip: a 7–40 char hex token carrying both a letter and a digit
tableCount a table row whose last cell is a bare, optionally bolded integer

Declared negatives, each pinned as a case:

  • a paragraph carrying a timestamp — including a full ISO stamp. ⚠️ The optional seconds field is a deliberate widening of the \d{2}:\d{2}Z the card's remedy names: 2026-09-03T10:37:51Z is 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.
  • a reading inside a fenced block (both fence spellings). Fenced lines are blanked, not deleted, so a fence can never weld a stamped paragraph onto an unstamped one and clean it by accident — pinned.
  • a ref NAME is not a tree reading. Measured, not stipulated: a first flight with origin/main in 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 form Premise 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.
  • a hex-shaped English word (defaced, effaced) — excluded by the digit requirement; a long bare number (a comment id) — excluded by the letter requirement.
  • inline code naming a file path, and a bare issue reference — neither is a count.
  • ordinary prose stating a count, however long. This is the negative that replaces "a non-seat author is clean", in the form the evidence supports.
  • no length floor. A short artefact with no reading is clean because it states no reading, not because it is short — and the converse (Claim: 12 open cards.) fires, so length decides nothing. Pinned in both directions.
  • lower-case prose is not a verdict; verdict words are matched uppercase only.

REST cost per run

Base: zero. The corpus is the comment threads commentCache already 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). h32NeedsSeatComments fetches a seat post only when its lane parses as a domain:* 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. h44NeedsSeatComments is 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.

⚠️ Declared residual, stated on every run in the summary clause: a verdict posted on a pull request is not read at all. Every listing feeding commentCache filters !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:

Untimestamped readings (H44): 1980 comment(s) across 362 thread(s) ALREADY in hand were read
for the five artefact shapes, and the seat leg widened the fetch to 10 of 10 HELD seat post(s)

H44 #6015 a seat-post section (comment `5207238007`) states a tree tip with NO time it was taken …
H44 #7623 a seat-post section (comment `5305367220`) states a count of cards or PRs with NO time …

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:

comment result
the card's worked example — the R+118 open marker on the triage seat post fires, a round-open marker, first fragment page 747
an ACCEPT verdict carrying an unstamped sha fires, a tree tip, fragment fe35dc0f
this PR's own claim comment, which wrote 20:58Z beside its reading clean

That last row is the control that matters: a well-formed claim does not fire.

Gate verdicts

  • pnpm check:pm-half-states through the shared lock — ✓ check-half-states self-test: 2172 cases pass. (2106 before this change; +66 cases), wrapper VERDICT 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 after git fetch and identical. 26 green. The 27th, node scripts/check-partof-closing-keyword.mjs, prints NOT WIRED — neither PR_BODY nor PR_NUMBER is set … This is a wiring or usage failure, NOT a verdict; its pnpm check:partof-closing-keyword form, which supplies the context, is green.
  • Also run beyond the derived set: 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-exports needs a built workspace and was not measured here; this change touches no package.
  • check:nul-bytes green, plus a direct control-byte scan of the diff.

🤖 Generated with Claude Code

https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox


Generated by Claude Code

…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
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added the size/m label Sep 4, 2026
@os-steve
os-steve marked this pull request as ready for review September 4, 2026 22:17
@os-steve
os-steve enabled auto-merge September 4, 2026 22:17
@os-steve
os-steve added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit ca46f8f Sep 4, 2026
37 checks passed
@os-steve
os-steve deleted the claude/issue-14929-timestamped-reading-patrol-row branch September 4, 2026 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants