tooling(pm): H8, H19 and H37 quote the LANDED release act, both halves - #16010
tooling(pm): H8, H19 and H37 quote the LANDED release act, both halves#16010claude[bot] wants to merge 2 commits into
Conversation
`scripts/pm/check-half-states.mjs` presented a shorthand inside quotation brackets at four places. In this file's register those brackets signal a verbatim `.claude/skills/pm-dispatch/SKILL.md` quotation, and that phrase is in no SKILL.md: `git grep` outside this one script found zero hits, and a non-shallow `git log -S` over SKILL.md's whole history came back empty. It was the script's own coinage, wearing a promise the source could not answer. Worse than a spelling nit, because the coinage names only ONE half of the act that landed on 2026-09-05: 释放是显式动作:让卡离手者同笔清 assignee + `Release:` 行(会话/因/去向);下一任重新认领。 Clearing the assignee is half of it; the `Release:` line is the other half. A reader following those three remedy sentences exactly produced the shape the H47 row exists to report — the field cleared, no record of who let the card go. The sweeper's own remedy text prescribed a half-state. Re-pointed at the landed line, quoted verbatim from one new module constant (`RELEASE_ACT_RULE`, extracted from the existing transcriptions rather than retyped) so the spellings cannot drift apart again: - H8's full-delivery remedy (the merged-PR re-grade) - H19's release text, shared by the closed and the unresolved branch - H37's dispatched-residue remedy, the third sentence prescribing a release - the H24 header-inventory paragraph, which narrated the coinage's origin and now reads the rule instead of the history No predicate changes, no new rows, the four comment markers untouched. Self-test 2414 -> 2427 cases, all passing. The four pinned cases keep their assertions and re-point at the landed spelling; each re-pointed sentence gains a case that the rule line is quoted UNBROKEN, one that the second half is named, and one grep-negative that fails if the coinage returns. That negative needle is ASSEMBLED rather than spelled: a literal would be the single hit that defeats the whole-file grep measuring this repair, which now reads zero. Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox Co-authored-by: Claude <noreply@anthropic.com>
|
ACCEPT — lands #15899 as ruled. Pure code (one file under What the seat verified, at head
Open question answered: A for this PR; C filed as #16016 (a gate for bracketed pseudo-quotations that no SKILL.md line carries — the class, not the instance). The two tidiness items (inline release-rule spellings in H24/H47; drifted line numbers in two docblocks) are folded into #16003's flight on this file. Implemented-by: os-dev executor, flight #15899, branch Generated by Claude Code |
Fixes #15899
scripts/pm/check-half-states.mjspresented a shorthand inside quotation brackets at fourplaces. In this file's register those brackets signal a verbatim
.claude/skills/pm-dispatch/SKILL.mdquotation — and that phrase is in no SKILL.md. Twomeasurements, both cheap to repeat:
git grepfor it outside this one script: zero hits. SKILL.md andreferences/state-machine.mdcarry 同笔摘标, a label removal onpm:retriage— a differentact on a different field, deliberately left alone here.
git log -Sfor it over SKILL.md's whole history, non-shallow: empty. It was the script'sown coinage, wearing a promise the source could not answer.
Why this is not a spelling nit
The release act is ONE act with TWO halves:
Clearing the assignee is half of it; the
Release:line is the other half. The coinage namedonly the first, so a reader following those remedy sentences exactly produced the very shape the
H47 row exists to report — the field cleared, no
Release:line, an exit that left no record.The sweeper's own remedy text prescribed a half-state.
What changed — one file, no predicate changes
A new module constant
RELEASE_ACT_RULEcarries the landed line verbatim, kept unbroken on oneline so it stays greppable against its source. Its text was extracted from the transcriptions
already in the tree (the
RELEASE_COMMENT_MARKERdocblock andselfTest'sRELEASE_RULE_LINE)and asserted equal to SKILL.md's line during the edit, never retyped — a hand-retyped quotation is
how a verbatim quote stops being one. Three emitted sentences now quote that constant and name
both halves:
h8MergedPrStillDispatched)h19BlockOutlivedBlocker)h37FamilyMemberDrift)The fourth site is the H24 header-inventory paragraph, which narrated where the coinage came
from; it now reads the rule instead of the history.
No predicate changes, no new rows, and
CLAIM_COMMENT_MARKER/RELEASE_COMMENT_MARKER/ACCEPT_VERDICT_MARKER/MAINTAINER_BRIEF_MARKERare untouched. H24's own remedy and H47's twolegs already quoted the landed line and were not edited.
Verification — all at head
67bec961f4(the two that spelled the coinage), fifteen arrived; the other two of the four pinned cases keep
their names with re-pointed assertions. Each re-pointed sentence gained a case that the rule
line is quoted UNBROKEN, one that the second half is named, and one grep-negative that fails if
the coinage returns.
git grep -cfor the coinage over this file reading zero; a literal needle in a negative casewould be the single hit that defeats the check it protects. It now reads zero, and the
neighbouring
同笔摘标occurrences are untouched.scripts/invoked-as.mjs, with an unmutated control copy at the same path. Mutation confirmed ondisk by occurrence counts either side (coinage 1 / landed phrase 0 on the ablated copy; 0 / 1 on
the control). Control: 1 failure —
H43 register, environmental, a sibling-repo copy cannot seethe governed register. Ablated: 4 failures, i.e. the same environmental one plus exactly the
three H8 pins (
names the release act in the spelling that LANDED,quoting the rule line unbroken, and the grep-negative flipping togot true, want false). No rebuild leg applies —node loads this
.mjssource directly, there is nodist/in the resolution path. The treefile's blob hash was identical before and after (
3161d0b325…, equal to its HEAD blob).dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 32commands from the committed change set; all 32 ran, all exit 0, and
--ranreconciles:32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN. The 7 roster gates whose baseline sits underscripts/were also run green.check-governed-merges.mjs --teston this file list:NOT governed.pnpm lintthrough the shared verify lock:VERDICT command-exit 0. Not anarrowed run — the full farm.
check:dts-closureandcheck:published-readme-exportsboth exit 3PREREQUISITE NOT METhere (no packagedist/;they need a whole-repo build). Neither can be moved by a one-file
scripts/pm/diff, and CIbuilds before running them.
Known-red step, inherited and untouched
mainhas been red onLint & Repo Gatesatpnpm check:merge-driversince 17:05Z —Corepack resolving pnpm 12.3.4, which rejects the fixture's
pnpm -s. It is tracked as #15992 inthe devx lane and is not this branch's; nothing here works around it. For the record, that gate
passes locally on this branch under pnpm 10.31.0. Every other check is expected green.
skip-changeset:scripts/pm/**publishes nothing from any package.Generated by Claude Code