Skip to content

feat(pm): the Prior rulings read: line covers the card’s own thread — tool corpus half and charter :339 in one batch - #19021

Merged
os-elon-musk merged 2 commits into
mainfrom
claude/issue-18993-prior-rulings-card-thread
Sep 19, 2026
Merged

os-elon-musk merged 2 commits into
mainfrom
claude/issue-18993-prior-rulings-card-thread

Conversation

@os-elon-musk

Copy link
Copy Markdown
Collaborator

Fixes #18993
Clause-②: no

scripts/pm/check-prior-rulings.mjs answered the Prior rulings read: line out of three tree corpora (docs/adr/**, AGENTS.md, packages/spec/src/**) while SKILL.md:339 required it to cover 「已裁卡」 — a card's own thread, where the cheapest ruling lives, was in no corpus. Measured consequence on #17518: a director-seat ruling (5651572469, 2026-09-13) was followed by a retriage that re-presented the card as unruled, a second maintainer ruling with a different prescription (5716259259, 2026-09-17), and a dispatch round that ended with zero diff. This PR makes the card's own thread a corpus half of the tool and rewrites the charter line in the same batch, so the requirement and the tool never diverge again.

What changed

scripts/pm/check-prior-rulings.mjs (report-only, no write path, unchanged exit register)

  • Every --card run now reads the card's comment thread over the board route the file already uses (its own proxy re-exec guard, taken once, never on --self-test), one paged GET …/issues/{n}/comments?per_page=100&page=P walked by page number to a short page, bounded at MAX_THREAD_PAGES (50), reconciled against the card's comments field.
  • A ruling comment is recognised by the shape of its first content line, three measured shapes: the charter's Ruling: batch #n item k … (ruling-line), the pre-charter ## Ruling recorded — … heading (ruling-recorded, the shape 5651572469 is written in), and Ruling addendum … (ruling-addendum). Every hit prints its id, author, timestamp and shape.
  • Two measured near-misses are pinned OUT and listed uncounted (**Ruling C landing step** — …, ## Ruling A's patch is falsified …).
  • The paste line gains a thread: clause with three spellings kept apart: thread: 2 ruling(s) (id, id); thread: none (read, no ruling); thread: not read (no --card) (a --terms-only run). A thread that could not be read is the WHOLE line unresolved, exit 3, exactly as an unreadable corpus — never none.
  • The report prints the read's cost (pages, bytes, ms) and, when a ruling stands, the 〈升级与决策〉③ warning; with two or more rulings it says to read every one and to return a disagreement to the director seat.
  • Self-test: 99 → 144 cases (the three shapes, the near-misses, first-content-line anchoring, the fixture thread with two rulings oldest-first, none / not read / unresolved, and an offline paged board: two pages, one page, a 403, no token, the page bound, a network failure, a malformed page; plus a structural pin that no Link header is followed). check-half-states.mjs's source-text pin on the line's writer (H62) still holds: 4963 cases pass.

.claude/skills/pm-dispatch/SKILL.md :339 — rewritten in place, net 0, 120 bytes → 120 bytes, 812 / 812 lines before and after:

before: - 方向落在 ADR/已裁卡/不可重裁规则:贴 check-prior-rulings.mjs的Prior rulings read: 行,或不点。
after: - 方向在 ADR/本卡裁决/不可重裁规则:贴 check-prior-rulings.mjs的Prior rulings read: 行,或不点。

The three places a direction may already be ruled now read exactly as the tool's line covers them: an ADR, a ruling on this card, a non-re-rulable rule.

.claude/skills/pm-dispatch/references/decision-analysis.md :45 — the human-facing statement of the same line shape (the tool's formatPasteLine docblock names it as the twin), rewritten in place, 113 → 120 bytes, 50 / 50 lines:

before: - 四棱后一行:`Prior rulings read: TERMS → N hits; ADR-xxxx Dn|none`;未搜成整行写 unresolved。
after:  - 四棱后:`Prior rulings read: TERMS → N hits; ADR Dn|none; thread: K|none`;未搜成整行写 unresolved。

(The file spells the placeholders in angle brackets; they are written as capitals here because the platform mutates angle-bracket fragments in a body.)

This file was not in the dispatch's named surface; it is included because it states the line's shape and would otherwise be the next 「a requirement and a tool that cannot answer it」 pair. No open PR touches it (file lists of the 14 skills-lane PRs read 2026-09-18T11:3xZ).

Hypotheses measured

  1. Ruling shape is stable; author is not. Census over 1,100 comments (REST, reads only): 2026-09-11T06Z–09-13T21Z (600): ## Ruling recorded — … 22 (os-tesla 19, claude[bot] 3), Ruling: … 4 (os-tesla 2, claude[bot] 2); 2026-09-18T04Z–11Z (500): Ruling: … 26 (hotlong 26), Ruling addendum 2 (hotlong). The charter line (director.md: 「裁决评论首行固定一条:Ruling: batch #N item K · letter X · maintainer 「VERBATIM」 UTC」 — placeholders capitalised here, the file spells them in angle brackets) landed 32a3214 2026-09-13T11:27Z; the heading shape is the same seat's earlier spelling. The fallback the dispatch named — 「every comment by a GOVERNED_APPROVERS login」 — is falsified: it would have missed every 2026-09-13 ruling, 5651572469 included. A quoted 「同意」/「agreed」 predicate hits 63 of 500 recent comments (claims, ledgers, dev reports) and names nothing.
  2. Cost, the tool's own meter (node fetch on the re-exec'd route, pages serial, 2026-09-18T11:3xZ):
thread comments pages bytes thread read whole run rulings / near-misses
#17518 (the incident) 17 1 141,623 347–369 ms 2,353 ms (before: 2,001 ms) 2 / 0
#12708 (director seat post) 372 4 2,212,674 1,984 ms 3,669 ms 0 / 0
#6015 (longest thread on the board) 962 10 7,365,556 4,431 ms 6,254 ms 0 / 0

curl on the same pages reads ~10% more bytes (156,874 on #17518): GitHub pretty-prints for a curl/* User-Agent and minifies for any other, measured directly; the tool reports what its own route pays. The fixed cost per dedupe on the incident card is one page and about a third of a second.

  1. The line, before / after, on --card 17518 through the proxy (exit 0 both):
before: Prior rulings read: spec,assembledpackagebodyschema,declares,callable,custom,branches,inert-json,artifact,hold,schema,embedding,loses (+1 more) → 117 hits; ADR-0087 D4, ADR-0130 D4, ADR-0029 D6, ADR-0039 D7, ADR-0056 D5, ADR-0076 D3, ADR-0076 D9, ADR-0087 D1, ADR-0087 D3, ADR-0087 D7
after:  Prior rulings read: spec,assembledpackagebodyschema,declares,callable,custom,branches,inert-json,artifact,hold,schema,embedding,loses (+1 more) → 117 hits; ADR-0087 D4, ADR-0130 D4, ADR-0029 D6, ADR-0039 D7, ADR-0056 D5, ADR-0076 D3, ADR-0076 D9, ADR-0087 D1, ADR-0087 D3, ADR-0087 D7; thread: 2 ruling(s) (5651572469, 5716259259)

and the report's thread block:

the card's own comment thread (ruling comments, by first-line shape): 2 ruling(s) of 17 comment(s) — read in 1 page(s), 141,623 bytes, 347 ms
    5651572469  os-tesla  2026-09-13T06:10:22Z  [ruling-recorded]  Ruling recorded — B: `packages/spec` declares the inert-JSON artifact stage; the read A…
    5716259259  hotlong  2026-09-17T14:41:18Z  [ruling-line]  Ruling: batch #149 item 1 · letter B (artifact-stage JSON-only variants of `FlowFunctio…
  1. --terms single,posture,tenant (no card): exit 0, line ends ; thread: not read (no --card).

Gates

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack from the worktree (three-dot change set: the three files above): 40 families, every one run, exit codes captured redirect-then-$?, reconciled with --ran (40 derived, 40 run after the one PREREQUISITE NOT MET was cleared by its declared build: check:doc-formula-expressions exited 3 for an unbuilt @objectstack/formula; built under the verify lock, re-run, exit 0). check:pm-dispatch-gates exceeds the foreground cap and ran detached (tail --pid): 779 s, 1849 cases pass, exit 0. Also: node scripts/pm/check-prior-rulings.mjs --self-test 144 pass; check:pm-skill-ratchet ✓ (812 / 812, 50 / 50, widest rows unchanged); check:pm-skill-id-lint ✓ 27 files clean; check:nul-bytes ✓; check-governed-merges.mjs --test over the three paths: GOVERNED (2 of 3 on the register — expected, .claude/**); eslint on the edited script: 1 file, 0 errors, 0 warnings (--no-inline-config, the root flat config's **/*.mjs block; no type-aware rules, so the diff moves no untouched file's verdict). Readings taken at cba931995, the branch head. The same derivation from a throwaway worktree at origin/main 64de4c5 (five commits past this branch's base, four of them touching family-defining files) yields the identical 40 families — none new, none gone. This branch is deliberately not merged with main here: the incoming range carries four merge=os-regen artifacts whose driver debt would hold the push on a PR that touches no spec file; the seat's update-branch is the right instrument if a refresh is wanted before landing.

No published package moves (scripts/pm/** and .claude/** ship in no files[]): skip-changeset.

Acceptance notes

维护者速读(草稿)

改了什么:查重工具 check-prior-rulings.mjs 多读一处 —— 被查那张卡自己评论线上的裁决评论;贴进卡面的那一行 Prior rulings read: 多出一段 thread: …,写明本卡已有几条裁决、评论 id 是哪几条;读不到线程时整行仍写 unresolved,绝不写成「没有」。章程 SKILL.md:339 与 decision-analysis.md:45 各原位改一行,行数不变,同一批落地。

为什么改:#17518 上四天内出现两条互相矛盾的维护者裁决,一整轮派发白跑 —— 原因是重新分诊的席位没看到卡上四天前的那条裁决,而工具即使跑了也查不到:卡的评论线不在它任何语料里。这次把「已裁卡」这半边做成机械面,并把章程那句话改成工具真能答的范围。

风险与代价(含回滚):每次查重固定多一次线程读取 —— 事故卡 1 页、约 0.35 秒;全板最长线程(962 条评论)10 页、约 4.4 秒,已实测。识别靠裁决评论首行的固定写法(三种实测形态),不靠作者身份;写法漂移会以「近似项」在报告里显形而不是静默漏掉。回滚 = revert 本 PR 三个文件,无发布物、无数据迁移。

席位意见:(留空)

你要做的:确认三种裁决写法的识别边界可接受;若同意,按受管面流程合并。


Generated by Claude Code

… half

The `Prior rulings read:` line answered for three tree corpora (docs/adr,
AGENTS.md, packages/spec/src) and not for the cheapest ruling there is: the
one already written on the card being checked. Measured on one card, a
director-seat ruling was followed four days later by a retriage that moved
the card back into the decision box without citing it, the maintainer ruled
again with a different prescription, and a dispatch round ended with zero
diff between the two. Run on that card, this file could not have said so.

So the card's own thread is the fourth corpus. A ruling comment is
recognised by the SHAPE of its first content line — the charter's
`Ruling: batch #n item k …`, the pre-charter `## Ruling recorded — …`
heading, and a director `Ruling addendum` — measured over 1,100 comments in
two windows of the live board; not by author (the director seat wrote as
three logins in five days) and not by a quoted 「同意」 (63 of 500 recent
comments carry one). Two measured near-misses are pinned OUT and listed
uncounted. The line gains a `thread:` clause that spells `none` (read, no
ruling), `not read (no --card)` (a --terms-only run) and the whole-line
`unresolved` (a thread that could not be read, exit 3) apart.

The read is one paged GET walked by page number to a short page, bounded,
with pages, bytes and wall time measured and printed: the incident card is
one page and ~0.35 s; the longest thread on the board (962 comments) is
ten pages and ~4.4 s. Every `--card` run rides the file's existing proxy
re-exec. The self-test gains the thread fixtures (shapes, near-misses, an
offline paged board with a refusal, a bound and a network failure): 99 → 144
cases.

Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
Co-authored-by: Claude <noreply@anthropic.com>
…n rulings

SKILL.md :339 required a direction found on an already-ruled card to be
answered by a tool whose corpora held no card thread; the requirement and
the tool now change in one batch. :339 is rewritten in place (net 0, 120
bytes): the three places a direction may already be ruled are `ADR/本卡裁决/
不可重裁规则`, which is exactly what the tool's line now covers.
decision-analysis.md :45 states the same line shape for a human and gains
the `thread:` clause, also in place at the byte cap; both files stay at
their ceilings (812 / 812, 50 / 50).

Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
Co-authored-by: Claude <noreply@anthropic.com>
@os-elon-musk os-elon-musk added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 18, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 18, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: cba9319955

① Derived judgments

② Semver level

  • skip-changeset is correct (scripts/pm/** and .claude/**, nothing published moves). Clause-②: no on the claim (5729187152) and in the body; --pair 19021 at 2026-09-18T11:58Z: exit 0, both carriers agree, no widening tell.

③ Boundary flags

Implemented-by: claude/issue-18993-prior-rulings-card-thread
Reviewed-by: session_01BTeBejoPUvRHN8WdAJC6oF

VERDICT: PASS


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)· skills 席 · 2026-09-18T12:03Z

这个 PR 做什么:PM 循环在呈报决策卡前要机械查一遍「有没有已经裁过的」。查重工具 check-prior-rulings.mjs 以前只读三份树上的语料(ADR、AGENTS.md、spec 源码),读不到卡自己线程上的维护者裁决 —— #17518 因此被当作未裁重新呈报,您裁了两次、互相矛盾,一整轮派发零 diff 收场。现在工具每次 --card N 都把卡的评论线程当第四份语料读一遍,按裁决评论的首行形状识别(总监席的三种写法都认,两种「以 Ruling 开头但不是裁决」的写法明确排除),粘贴行多一段 thread: k ruling(s) (评论 id);读不到线程整行写 unresolved,⛔ 不会假装线程是空的。章程 SKILL.md :339 与 decision-analysis.md :45 同批改成对应的字,各一行、净 0。

代价,实测:每次查重多一次分页读线程 —— 事故卡 #17518 是 1 页、0.35 秒;板上最长的线程(962 条评论)10 页、4.4 秒。

验收:复核记录 5729706403(PASS)、ACCEPT 5729706770;自测 99 → 144;派生门禁 40 / 40 绿;在 head 上实跑 #17518 读出三条裁决(含 hotlong 今天 11:42Z 新裁的一条),最早的在前。

请您做的一件事:受管文本(.claude/**)⇒ 需要您或 os-zhuang 的 APPROVE;批了之后席位落地,或您顺手 ready + squash 合并。没有要问的字。


Generated by Claude Code

@os-elon-musk
os-elon-musk marked this pull request as ready for review September 18, 2026 23:50
@os-elon-musk
os-elon-musk added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 8cfa07a Sep 19, 2026
44 checks passed
@os-elon-musk
os-elon-musk deleted the claude/issue-18993-prior-rulings-card-thread branch September 19, 2026 00:15
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 28, 2026
…-tier boundary (objectstack-ai#19379)

Part of objectstack-ai#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 objectstack-ai#19133 (2026-09-18)
superseded. objectstack-ai#19133's ruling, verbatim and untranslated: maintainer
「同意改规则。」 on the skills seat's proposal, plus the amendment that folded
`.claude/settings.json` and `.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.mjs` register row `{ id:
'claude-tree', prefix: '.claude/', glob: '.claude/**', tier:
GOVERNED_TIER_S, … }`, pinned by self-test case
`skills-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-28`**

Before:
```
- 受管路径全在本技能 `references/` 者事实层:席内达档复核过落地前检三条即转正式入队。
- 其余为规则层:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。
```

After:
```
- Tier S(`.claude/**` 全树)者:席内达档复核过落地前检三条即转正式入队。
- Tier H(其余受管面)者:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。
```

Line count and byte ceiling unchanged (69/69, both lines within the
120-byte cap — `check:pm-skill-ratchet` verified).

**`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 objectstack-ai#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 objectstack-ai#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

- Read objectstack-ai#19133 on GitHub directly (the tracking card/comments):
maintainer ruling 「同意改规则。」 plus the amendment 「我觉得这些我也没必要确认」, landed by
PR objectstack-ai#19144 (merged `1047fe101`), matches this PR's premise exactly.
- Read the register row, its self-test case, and `SKILL.md:625-626` —
all current and correct, confirmed unedited.
- Read both stale passages in full context before editing.

## Tier verdict on this PR's final file list

```
node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/landing-operations.md scripts/pm/check-governed-queue-guard.mjs
```
→ `GOVERNED — Tier S`, exit 3. `landing-operations.md` hits the
`.claude/**` register row; `check-governed-queue-guard.mjs` is not
itself a registered surface (1 of 2 paths governed). Per Prime Directive
objectstack-ai#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 0
- `npx eslint scripts/pm/check-governed-queue-guard.mjs` — exit 0
- `node --check scripts/pm/check-governed-queue-guard.mjs` — exit 0

## Changeset

`skip-changeset` — no `packages/*` touched; neither `.claude/skills/**`
nor `scripts/pm/**` ships in any package's `files[]` (same as precedent
PRs objectstack-ai#19144 and objectstack-ai#19021).

## On the card

This PR is filed as **Part of objectstack-ai#19146**, not a new card: objectstack-ai#19146 ("skills:
re-key the three 事实层 = references/ spellings the Tier S ruling leaves
false") was already open, filed by the seat that landed PR objectstack-ai#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. objectstack-ai#19146's other items
— `.claude/agents/os-dev.md:286-287`, `check-half-states.mjs` H48 and
`check-half-states.mjs` H43 — are **not** touched by this PR and remain
open on that card; neither is `SKILL.md:608`'s own `事实层` wording (added
to objectstack-ai#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 LAZY `governedTierFor`
load, because that row travels to sibling repos, plus one `pnpm
check:pm-half-states` self-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
fixes `scripts/pm/check-governed-queue-guard.mjs`'s self-contradiction,
which is not named in objectstack-ai#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: objectstack-ai#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, no
`GOVERNED_SURFACES` row, no `governedTierFor`, no `landingTierOf` and 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 sibling
`contract-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 plus
`AGENTS.md`, Tier H by the register's ALL-not-ANY rule) matched both
lines with no tiebreak on the page.

```diff
-- Tier S(`.claude/**` 全树)者:席内达档复核过落地前检三条即转正式入队。
+- 受管路径全在 `.claude/**` 者 Tier S:席内达档复核过落地前检三条即转正式入队。
```

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-ratchet` exit 0
names the file at 69/ceiling 69).

**2. `check-governed-queue-guard.mjs:4442-4443` — the `--self-test`
SUCCESS 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 objectstack-ai#18020 population,
while the battery at `:3949-3950` asserts `⛔
the-old-references-boundary-is-GONE`. Landed 2026-09-13 in objectstack-ai#18036 and
untouched by objectstack-ai#19144 — present at merge-base and at the reviewed head,
reproduced here before the edit.

```diff
-      'the boundary a label reader cannot cross — and the objectstack-ai#18020 references TIER: a governed diff whose governed ' +
-      'paths all lie under the one ruled prefix lands on the skills seat\'s review of record instead of an ' +
+      'the boundary a label reader cannot cross — and the objectstack-ai#18020 references TIER, re-keyed to Tier S by objectstack-ai#19133: a ' +
+      'governed diff whose governed paths are ALL Tier S — the register\'s `.claude/**` row, asked through ' +
+      '`governedTierFor`, never a prefix repeated here — lands on the skills seat\'s review of record instead of an ' +
```

History stays (the `objectstack-ai#18020` naming), 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-test` at the new
head prints `the one ruled prefix` 0 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) and
`SKILL.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`, and
`check-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

```
node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/landing-operations.md scripts/pm/check-governed-queue-guard.mjs
```

→ `⛔ GOVERNED — Tier S(席内达档复核落地)`, exit 3; 1 of 2 paths on the register
(`.claude/**` ×1 — `landing-operations.md`;
`scripts/pm/check-governed-queue-guard.mjs` is not a registered
surface). File list unchanged from the reviewed head, so the tier is
unchanged. Per Prime Directive objectstack-ai#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 --commands` derives 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-ratchet` exit 0 (69/69, headroom 0) ·
`check:pm-skill-id-lint` exit 0 (27 clean) · `check:pm-governed-prose`
exit 0 (6/6 surfaces, 28 self-test cases) · `check:skill-frame-sync`
exit 0 · `check:nul-bytes` exit 0 (9053 files, no raw control bytes)
- `node --check` exit 0 · `npx eslint
scripts/pm/check-governed-queue-guard.mjs` exit 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-corpus` and the
rest of the derived list — all exit 0
- ⊘ NOT MEASURED — `pnpm --filter @objectstack/lint run
check:doc-formula-expressions` exit 3, PREREQUISITE NOT MET
(`@objectstack/formula` and `@objectstack/lint` unbuilt 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.mjs` prints a STALE TREE warning: this branch is ≥55
commits behind `origin/main` and 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 19379` reads 2 (UNJUDGED) —
measured, and it is the BRANCH NAME

Reproduced 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
its `Branch:` directive parses to ZERO branches」. The stored line 2
really is `` Branch: `claude/pm-superseded-references-tier` `` on a line
of its own, so the printed remedy — "name the branch on a `Branch:` 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 the
`Implemented-by:` VALUE of a review record; it never sees a claim's
`Branch:` directive. That directive is read by the sibling
`check-half-states.mjs:5407` `claimedBranches`, through
`CLAIM_BRANCH_SHAPE` (`:5358`):

```
/claude\/issue-\d+-[A-Za-z0-9][A-Za-z0-9._-]*/g
```

which REQUIRES a literal `issue-` plus digits segment. Measured on the
real stored comment body and two controls:

| input | `claimedBranches()` |
| --- | --- |
| the live comment `5754245926`, as stored | `[]` |
| the same comment, branch swapped to
`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.
`claimGovernance` on that one-comment thread returns `governing: null`
with `malformed: { id: 5754245926 }` — which `cardDeclaration` turns
into `claim-branch-unparsed`, i.e. exit 2.

The narrow shape is DELIBERATE where it was written
(`CLAIM_BRANCH_SHAPE`'s own docblock: a `Branch:` 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 objectstack-ai#14 makes `--pair` at 0 part of the Tier S landing
predicate, so a Tier S PR on a branch without an `issue-`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.mjs` is ⛔ out of this PR's scope and the branch
is ⛔ not renamed. Reported for the seat.

---

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2

---
_Generated by [Claude
Code](https://claude.ai/code/session_01AmH9bKvGoLjiY86Q4Z3og2)_

---
_Generated by [Claude Code](https://claude.ai/code)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants