fix(pm): repair two carriers still spelling the superseded references-tier boundary - #19379
Conversation
…-tier boundary Two carriers of the governed-tier rule still stated the 2026-09-13 boundary (Tier S / "fact layer" = only .claude/skills/pm-dispatch/references/**) that #19133 (2026-09-18, maintainer "同意改规则。" plus the amendment folding in .claude/settings.json and .claude/hooks/**) superseded: Tier S is now the whole .claude/** tree, per the GOVERNED_SURFACES register (id: claude-tree) and its self-test case skills-agents-and-the-fact-layer-are-Tier-S in scripts/pm/check-governed-merges.mjs, and per SKILL.md:625-626. Within the last hour this stale text caused two agents to misclassify a compliant PR. - .claude/skills/pm-dispatch/references/landing-operations.md:27-28 spelled the old boundary as current ("受管路径全在本技能 references/ 者事实层 … 其余为规则层"), which would tell a dev touching e.g. SKILL.md itself to leave the PR in draft awaiting a maintainer approval it does not need. Re-keyed to Tier S (.claude/** whole tree) / Tier H (everything else), same two-bullet shape, line count and byte ceiling unchanged (69/69). - scripts/pm/check-governed-queue-guard.mjs's "THIRD leg" header (~268-294) reproduced the same narrow 2026-09-13 boundary and concluded "Every other governed path is the rules layer and keeps the predicate above byte-for-byte" -- false since #19133, and self-contradicting the same file's own later "the landing TIER" section, which already records that REFERENCES_TIER_PREFIX "is gone". The quoted 2026-09-13 ruling is kept, untranslated, as the ruling that started this leg; a new paragraph marks it SUPERSEDED by #19133 and points at governedTierFor / the register / `check-governed-merges.mjs --test <paths>` instead of a prefix to remember. No behavior, constant, or self-test assertion changed. Tier verdict on this PR's final file list (check-governed-merges.mjs --test): GOVERNED -- Tier S (landing-operations.md hits the .claude/** register row; check-governed-queue-guard.mjs is not itself a registered surface). The card relation to the pre-existing tracking issue is stated once, in the pull request body, per this repo's own commit-trailer contract. Co-Authored-By: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone. Docs-only rules repair: no ③ Boundary flags
Implemented-by: VERDICT: FAIL Generated by Claude Code |
…line
Rework of the two one-line defects the at-tier contract review returned FAIL
on. Both are text; no behaviour, constant, register row, tier function or
self-test expected value moves.
- .claude/skills/pm-dispatch/references/landing-operations.md:27 named the
SURFACE ("Tier S(.claude/** 全树)者") and dropped the PR-level ALL
quantifier that its own predecessor ("受管路径全在 … 者"), this repair's
prescribed wording and the sibling contract-review.md:46 all carry. As
written, :27 and :28 partitioned governed SURFACES rather than pull
requests, so a mixed diff (.claude/** plus AGENTS.md, Tier H by the
register's ALL-not-ANY rule) matched both lines with no tiebreak on the
page. Restored to "受管路径全在 `.claude/**` 者 Tier S:…" — 93 B → 105 B
against the 120 B cap, line count 69/69 unchanged.
- scripts/pm/check-governed-queue-guard.mjs:4442-4443, the --self-test
SUCCESS line printed on every run, still stated the superseded #18020
references-tier population ("a governed diff whose governed paths all lie
under the one ruled prefix") while the battery at :3949-3950 asserts
the-old-references-boundary-is-GONE. Landed 2026-09-13 in #18036 and
untouched since, so the file's docblock repair left the one instance seats
actually read. The population is re-keyed to Tier S — the register's
.claude/** row, asked through governedTierFor — with the #18020 naming
kept as history, matching the docblock's own form. 296 cases unchanged.
Co-Authored-By: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone. No ③ Boundary flags
Implemented-by: VERDICT: FAIL Generated by Claude Code |
The re-keyed Tier S sentence printed on every --self-test run still named the skills seat as the actor a Tier S landing rests on. That is the pre-re-key actor: the Prime Directive, the surface register, this file's own printed verdicts and the dispatch skill all say the owning seat. One word inside the literal; no constant, register row, tier function or expected value moves, and the case count is unchanged. Claude-Session: https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2 Co-Authored-By: Claude <noreply@anthropic.com>
Part of #19146
Clause-②: no
Two carriers of the governed-tier rule still stated the 2026-09-13 boundary (Tier S / "fact layer" = only
.claude/skills/pm-dispatch/references/**) that #19133 (2026-09-18) superseded. #19133's ruling, verbatim and untranslated: maintainer 「同意改规则。」 on the skills seat's proposal, plus the amendment that folded.claude/settings.jsonand.claude/hooks/**in too: 「我觉得这些我也没必要确认」. Tier S is now the whole.claude/**tree.Current, correct source of truth (unchanged by this PR):
scripts/pm/check-governed-merges.mjsregister row{ id: 'claude-tree', prefix: '.claude/', glob: '.claude/**', tier: GOVERNED_TIER_S, … }, pinned by self-test caseskills-agents-and-the-fact-layer-are-Tier-S..claude/skills/pm-dispatch/SKILL.md:625-626: 「受管面两层:Tier H(规则层)=AGENTS.md+CLAUDE.md+docs/adr/**+docs/NORTH-STAR.md+发布skills/**。」「Tier S =.claude/**全树;Tier H 四件套等人批;Tier S 经席内达档复核 PASS 在案后 ready → 入队。」What was stale
.claude/skills/pm-dispatch/references/landing-operations.md:27-28Before:
After:
Line count and byte ceiling unchanged (69/69, both lines within the 120-byte cap —
check:pm-skill-ratchetverified).scripts/pm/check-governed-queue-guard.mjs, the "THIRD leg" header (~268-294)It reproduced the 2026-09-13 boundary and concluded: "Every other governed path is the rules layer and keeps the predicate above byte-for-byte" — false since #19133, and self-contradicting the same file's own later "the landing TIER" section, which already records that
REFERENCES_TIER_PREFIX"is gone".Fix: the quoted 2026-09-13 ruling is kept, untranslated, as the ruling that STARTED this leg (history is load-bearing — a reader who finds that text must see why it no longer governs). A new paragraph marks it SUPERSEDED by #19133 (cited with date, reusing this same file's own existing verbatim quote of the amendment for consistency) and points at
governedTierFor/ the register /node scripts/pm/check-governed-merges.mjs --test <paths>instead of a prefix to remember. The concluding sentence now reads "Every governed path outside Tier S is Tier H, the rules layer, and keeps the predicate above byte-for-byte."No behavior changed:
GOVERNED_SURFACES,governedTierFor,landingTierOf, every tier constant and every self-test assertion's expected value are untouched — only the two stale prose passages.Verification before editing
1047fe101), matches this PR's premise exactly.SKILL.md:625-626— all current and correct, confirmed unedited.Tier verdict on this PR's final file list
→
GOVERNED — Tier S, exit 3.landing-operations.mdhits the.claude/**register row;check-governed-queue-guard.mjsis not itself a registered surface (1 of 2 paths governed). Per Prime Directive #14, this PR lands on the owning seat's Tier S contract-tier review of record — no seat approves it, and no maintainer click is waited for.Gates run (exit code captured before any pipe)
node scripts/pm/check-governed-queue-guard.mjs --self-test— exit 0 (296 cases pass)node scripts/pm/check-governed-merges.mjs --self-test— exit 0 (435 assertions)pnpm check:pm-skill-ratchet— exit 0 (landing-operations.md 69/69, headroom 0, unchanged)pnpm check:pm-skill-id-lint— exit 0 (27 files clean)pnpm check:pm-governed-prose— exit 0 (names all 6 registered surfaces)pnpm check:nul-bytes— exit 0npx eslint scripts/pm/check-governed-queue-guard.mjs— exit 0node --check scripts/pm/check-governed-queue-guard.mjs— exit 0Changeset
skip-changeset— nopackages/*touched; neither.claude/skills/**norscripts/pm/**ships in any package'sfiles[](same as precedent PRs #19144 and #19021).On the card
This PR is filed as Part of #19146, not a new card: #19146 ("skills: re-key the three 事实层 = references/ spellings the Tier S ruling leaves false") was already open, filed by the seat that landed PR #19144, and its item 2 is exactly
landing-operations.md:27-28. Creating a new duplicate card would have contradicted this repo's own duplicate-avoidance practice, so none was created. #19146's other items —.claude/agents/os-dev.md:286-287,check-half-states.mjsH48 andcheck-half-states.mjsH43 — are not touched by this PR and remain open on that card; neither isSKILL.md:608's own事实层wording (added to #19146 by its own addendum comment). H43 is the newest of them: it had lived only in card comment 5750573385 and is enumerated on the card body as item 4 by this rework. It is left here deliberately — H43 is missing LOGIC in a non-governed instrument (a LAZYgovernedTierForload, because that row travels to sibling repos, plus onepnpm check:pm-half-statesself-test case), which is the same change class as H48 and rides with it in ONE half-states PR rather than under a docs-only Tier S record. The at-tier review of record (5751616940) ruled this PR NOT incomplete for leaving it there. This PR additionally fixesscripts/pm/check-governed-queue-guard.mjs's self-contradiction, which is not named in #19146 at all.Note on the dispatching brief
The brief that generated this PR stated "this repair has no card yet." That is not accurate: #19146 already existed (filed 2026-09-18, still open) covering part of this exact repair. Everything else in the brief — the ruling text, the register row, the self-test name,
SKILL.md:625-626, and both stale passages — verified exactly as stated on direct reading.Rework after the at-tier contract review (record
5751616940— FAIL)Head
fa628d0b36→71216fcff6, one commit on the same branch (⛔ no rebase, no amend, no force-push — the review record is anchored to this branch's history). Both defects are TEXT: ⛔ no tier constant, noGOVERNED_SURFACESrow, nogovernedTierFor, nolandingTierOfand no self-test expected value moved. Self-test case counts are unchanged at 296 / 435.1.
landing-operations.md:27— the PR-level ALL quantifier is restored.The line shipped as 「- Tier S(
.claude/**全树)者:…」, which names the SURFACE. Its own predecessor (「受管路径全在本技能references/者事实层」), this repair's prescribed wording on the card, and the siblingcontract-review.md:46(「受管路径全在 Tier S 面(.claude/**)者」) all carry the quantifier. Without it, lines 27 and 28 partition governed SURFACES rather than pull requests — so a mixed diff (a.claude/**path plusAGENTS.md, Tier H by the register's ALL-not-ANY rule) matched both lines with no tiebreak on the page.Re-measured here, not taken on trust: 93 B → 105 B against the 120 B cap, file 69/69 lines with headroom 0 (
check:pm-skill-ratchetexit 0 names the file at 69/ceiling 69).2.
check-governed-queue-guard.mjs:4442-4443— the--self-testSUCCESS line is re-keyed.The docblock repair in the first commit left the one instance seats actually read: the SUCCESS line printed on EVERY run (it is in the review's own capture) still stated the superseded #18020 population, while the battery at
:3949-3950asserts⛔ the-old-references-boundary-is-GONE. Landed 2026-09-13 in #18036 and untouched by #19144 — present at merge-base and at the reviewed head, reproduced here before the edit.History stays (the
#18020naming), exactly as the docblock keeps its quoted ruling; only the POPULATION is re-keyed. Proof it is gone from the PRINTED output, not merely from the source:--self-testat the new head printsthe one ruled prefix0 times and the re-keyed sentence once.Still stating the superseded boundary — reported, ⛔ deliberately not pulled in
The review lists these as live and OUT of this PR's scope, and this rework leaves them exactly as it found them:
.claude/agents/os-dev.md:286-287(this card's item 1) andSKILL.md:608's 「⛔ 无事实层例外」 (a card addendum, vocabulary only — the rule itself stays true). Naming-only uses of "the references tier" as this leg's NAME (queue-guard:268,:358,:442,:452,:646,:736, code comments:1420/:1546/:2261/:2470/:2560, andcheck-clause2-carriers.mjs:8635) are an optional tidy and were left alone: widening the diff of a docs-only record to sweep names is not what the FAIL asked for.Tier verdict on the FINAL file list
→
⛔ GOVERNED — Tier S(席内达档复核落地), exit 3; 1 of 2 paths on the register (.claude/**×1 —landing-operations.md;scripts/pm/check-governed-queue-guard.mjsis not a registered surface). File list unchanged from the reviewed head, so the tier is unchanged. Per Prime Directive #14 this lands on the at-tier review of record — ⛔ no seat approves it and no maintainer click is owed.Gates at the new head (exit code captured BEFORE any pipe)
The brief's minimum, plus every family
node scripts/pm/dispatch-gates.mjs --commandsderives for this change set — 38 commands, 37 at exit 0:check-governed-queue-guard.mjs --self-test— exit 0, 296 cases (unchanged)check-governed-merges.mjs --self-test— exit 0, 435 assertions (unchanged)check:pm-skill-ratchetexit 0 (69/69, headroom 0) ·check:pm-skill-id-lintexit 0 (27 clean) ·check:pm-governed-proseexit 0 (6/6 surfaces, 28 self-test cases) ·check:skill-frame-syncexit 0 ·check:nul-bytesexit 0 (9053 files, no raw control bytes)node --checkexit 0 ·npx eslint scripts/pm/check-governed-queue-guard.mjsexit 0 (1 file linted, 0 errors, 0 warnings, read from--format json)check:pm-dispatch-gates,check:pm-governed-merges,check:ratchet-remedy-authority,check:doc-authoring,check:cross-package-test-inputs,check-declaration-mirrors,check-scripts-symbol-anchors,check-self-test-wired,check-self-test-workflow-commands,check-comment-mask-corpusand the rest of the derived list — all exit 0pnpm --filter @objectstack/lint run check:doc-formula-expressionsexit 3, PREREQUISITE NOT MET (@objectstack/formulaand@objectstack/lintunbuilt in this worktree). Exit 3 is this repo's NOT-MEASURED code, ⛔ not a finding; the family's population is docs formula expressions, disjoint from this diff's two paths, and CI runs it against a built tree.dispatch-gates.mjsprints a STALE TREE warning: this branch is ≥55 commits behindorigin/mainand 15 files the derivation reads changed across that range. The gate list above is therefore derived from this branch's tree, which is what the review record is anchored to; ⛔ it was not refreshed by a rebase. CI on the merge group derives from the merged tree.check-clause2-carriers.mjs --pair 19379reads 2 (UNJUDGED) — measured, and it is the BRANCH NAMEReproduced at the new head:
PM_SWEEP_REPO=objectstack-ai/objectstack node scripts/pm/check-clause2-carriers.mjs --pair 19379→ exit 2, 「the card's NEWEST claim comment (5754245926) matches the claim marker but itsBranch:directive parses to ZERO branches」. The stored line 2 really isBranch: `claude/pm-superseded-references-tier`on a line of its own, so the printed remedy — "name the branch on aBranch:line of its OWN" — is already satisfied and cannot clear it.The cause is not the regex named in the dispatching brief.
BRANCH_TOKEN(check-clause2-carriers.mjs:3278) reads theImplemented-by:VALUE of a review record; it never sees a claim'sBranch:directive. That directive is read by the siblingcheck-half-states.mjs:5407claimedBranches, throughCLAIM_BRANCH_SHAPE(:5358):which REQUIRES a literal
issue-plus digits segment. Measured on the real stored comment body and two controls:claimedBranches()5754245926, as stored[]claude/issue-19146-superseded-references-tier["claude/issue-19146-superseded-references-tier"]Branch:claude/issue-abc-slug`` (no digits)[]Only the branch NAME differs across those rows, so the marker, the backticks, the line position and the directive shape are all fine.
claimGovernanceon that one-comment thread returnsgoverning: nullwithmalformed: { id: 5754245926 }— whichcardDeclarationturns intoclaim-branch-unparsed, i.e. exit 2.The narrow shape is DELIBERATE where it was written (
CLAIM_BRANCH_SHAPE's own docblock: aBranch:line naming some other shape "is deliberately left unmatched, which puts the card out of this row's scope entirely" — under-reporting beats manufacturing findings out of typos). The consequence in THIS reader is not out-of-scope, though: Prime Directive #14 makes--pairat 0 part of the Tier S landing predicate, so a Tier S PR on a branch without anissue-digits segment cannot satisfy it by any act of the claiming seat short of renaming the branch — which would strand this review record. ⛔ Not repaired here:check-clause2-carriers.mjsis ⛔ out of this PR's scope and the branch is ⛔ not renamed. Reported for the seat.🤖 Generated with Claude Code
https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2
Generated by Claude Code
Generated by Claude Code