Skip to content

docs(pm-dispatch): a triage direction landing in an adjudicated area quotes the governing line - #18256

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17497-grading-quotes-the-governing-line
Sep 15, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-17497-grading-quotes-the-governing-line

Conversation

@claude

@claude claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Fixes #17497

One rule line in 〈分诊座位职责〉 of .claude/skills/pm-dispatch/SKILL.md: a triage grading whose direction lands inside an adjudicated area (an ADR, a ruled card, a not-re-adjudicable rule) pastes the governing line — the Prior rulings read: line that check-prior-rulings.mjs prints — or names no target. Triage keeps writing directions (「写方向」 is charter text); the line binds the direction's evidence, never removes the direction.

Governed surface (.claude/**, rules layer): draft, no reviewer requested, no ready flip — the skills seat hangs the four-piece and the maintainer lands it. REGION claim :306–:415 only; PR #18242 holds :172–:185 and PR #18250 holds :645–:646 on the same file and neither range is touched here (the seat merges origin/main at landing).

The added line (SKILL.md :339 on the head, 120 bytes)

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

Vocabulary is the corpus's own: 「已裁卡」 (SKILL.md 〈家族派发〉), 「不可重裁」 (〈派发词三分区〉), 「落点」 = the named fix target (〈分诊座位职责〉's pm:queue definition). The tool is cited by file name and the paste line by its literal prefix — no issue or PR number (check:pm-skill-id-lint green).

Placement (P2, chosen by reading the section's order): directly under the line that mandates the direction — 「裁定写方向、给六态之一」 (:338 on the head, :339 on origin/main). That is where 「写方向」 actually lives on this tree: references/lanes/triage.md is 7 lines and its :7 is the half-state rule, so the grading's citation of 「写方向」 at triage.md :7 is stale as a location while its substance holds. The English audit comment line (Triage: lands in …; rationale: …, :364 on the head) was the alternative; it names the artifact the direction is written into, but the obligation reads best beside the mandate it qualifies, and 「方向」 is anchored by the preceding line there.

P1 confirmed by a live run (node scripts/pm/check-prior-rulings.mjs --card 17497, exit 0) — the tool printed exactly the shape the line cites:

Prior rulings read: triage,gradings,named,target,governing,itself,rejects,grading,quotes,line,adjudication,routes → 61 hits; ADR-0129 D4, ADR-0067 D3, ADR-0076 D11, ADR-0006 D2, ADR-0020 D2, ADR-0021 D1

formatPasteLine (check-prior-rulings.mjs) prints Prior rulings read: TERMS → N hits; ADR-xxxx Dn|none and the whole-line form Prior rulings read: unresolved when the search did not run; check-half-states.mjs H62 reads the same key (PRIOR_RULINGS_KEY), and references/decision-analysis.md already binds that line for decision cards.

Payment (P3, measured) — one adjacent pair inside the region rewritten tighter

Before (origin/main :311 + :312, 89 B + 50 B):

- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:` 形式。
- 判定本轮有活之后才加载其余工具。

After (head :311, 116 B):

- fire 开局只按名加载互斥检查所需工具,`ToolSearch` 用 `select:`;判定本轮有活才加载其余。

Nothing operative is lost: every instruction token survives — fire 开局, 只按名加载, 互斥检查所需工具, ToolSearch, select:, 判定本轮有活, the ordering 才加载其余 — and the three dropped words are filler (「形式」 names the code span it follows; 「之后才」 → 「才」 keeps the only-after ordering; 「其余工具」 → 「其余」 in a line whose subject is tool loading). The PM's measured pairs (:312+:314, :363+:364, :397+:398) all rewrite past 120 B; this is the pair that fits. Not a re-wrap (no line-joining bought the budget), no rule deleted, ceiling untouched.

Reverse verification (on head c96b507d)

  • git diff origin/main -- .claude/skills/pm-dispatch/SKILL.md: two hunks, @@ -308,8 +308,7 @@ (the fold) and @@ -337,6 +336,7 @@ (the insert) — both inside :306–:415; no other line moves.
  • wc -l = 812 (ceiling 812, headroom 0 — the ratchet's own line: .claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)).
  • sed -n '734,755p' | md5sum = 3327d02c56f8a0eca88569dad2270f32 (frame block byte-identical).
  • an awk length scan for lines longer than 120 bytes over :306–:415 prints nothing; touched lines measure 116 B (fold) and 120 B (new).
  • Positive anchors: grep -c 'Prior rulings read:' = 1; the removed :312 text = 0 hits; the fold text = 1 hit.

Gates (derived, run in the foreground, exits captured before any pipe, reconciled with --ran)

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; change set derived off merge base cb648cb1) → 16 commands; --ran verdict: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all 16 recorded an exit code and none of them is 3), exit 0.

command exit
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0
node scripts/check-comment-mask-corpus.mjs 0
node scripts/pm/check-governed-queue-guard.mjs --self-test 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions first run exit 3 PREREQUISITE NOT MET (unbuilt @objectstack/formula / @objectstack/lint) — built both under os-verify-lock.sh (VERDICT command-exit 0), re-ran: 0
pnpm check:agent-test-spelling 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:nul-bytes 0
pnpm check:pm-governed-merges 0
pnpm check:pm-governed-prose 0 (2 instruction surface(s) name all 5 registered governed surfaces)
pnpm check:pm-skill-id-lint 0 (27 file(s) clean)
pnpm check:pm-skill-ratchet 0 (812/812)
pnpm check:refd-timer-probe 0
pnpm check:skill-frame-sync 0 (the one declared copy of the decision frame is internally coherent)
pnpm check:watch-hint-literal 0

Extra, outside the roster: node scripts/check-skill-frame-freshness.mjs --self-test exit 0 and --no-fetch exit 0 (the decision frame in this tree is current with refs/remotes/origin/main). The roster did not derive check:pm-dispatch-gates, so no detached run was owed. Full repo-level scans (pnpm lint) belong to CI.

skip-changeset: .claude/** is published by no package's files[] (fast track) — nothing released moves.

Acceptance notes

  • noted, not filed: the grading's location citation for 「写方向」 (lanes/triage.md :7) is stale — that file's :7 is the half-state rule and the charter text lives at SKILL.md :339 on origin/main; the ruling's substance is unaffected. 承接者: the skills seat, at landing of this PR.
  • noted, not filed: the dispatch names a gate check:pm-skill-frame-sync; the script's real name is check:skill-frame-sync (scripts/check-skill-frame-sync.mjs), and it ran green. 承接者: the dispatching PM seat, via this report.
  • noted, not filed: the ratchet header's reading 「of the file's 601 adjacent bullet pairs ZERO merge under the 120-byte cap」 was a pure-join measurement on an earlier tree; on this tree one pair folds at 116 B as a tighter rewrite. Not a contradiction of that reading and not a defect. 承接者:无.

维护者速读(草稿)

改了什么:分诊座位职责里加一行:分诊的方向若落在 ADR、已裁卡或不可重裁规则内,须贴 check-prior-rulings.mjs 印出的 Prior rulings read: 行,否则不点落点。为了不突破 812 行上限,把开局工具加载的两行合成一行(116 字节),每条指令原样保留。

为什么改:两次分诊给出的落点恰是治理文本已经拒绝的拼写或形状(一次是字段 schema 拒收的扁平拼写,一次是标记为不可重裁的通则),都在执行席的围栏才被拦下,其中一次派发令已写出。分诊的推理没错,错在落点没有引治理行,所以看不见。决策卡那边已有同一行的约束,这次把它也绑到分诊评级上。

风险与代价(含回滚):一行规则、一次同义压缩,不动上限、不删规则、不改工具。风险是新行 120 字节写得紧,读者需要认得 check-prior-rulings.mjs 这个工具(它已在仓内、有自检)。回滚 = revert 本 PR 一次提交。

席位意见:(留空,席位定稿成评论)

你要做的:确认这条规则的措辞与落位(放在「裁定写方向」那一行之下);同意即批准本 PR,由席位落地。


Generated by Claude Code

…quotes the governing line

One rule line in 〈分诊座位职责〉: a grading whose direction lands in an ADR, a ruled
card or a not-re-adjudicable rule pastes the `Prior rulings read:` line that
`check-prior-rulings.mjs` prints, or names no target. Paid inside the region by
folding the two tool-loading lines (:311/:312) into one 116 B line; count stays 812.

Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 15, 2026
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 15, 2026
@claude

claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: c96b507db288c20bf270c66c6137dc6fa7e79576

Reviewing seat: domain:skills, in-seat review at the contract-review tier — get_session read at 2026-09-15T04:30Z: configured_model = session_context.model = last_served_model, the constant's tier, no fallback notice this round. Card #17497, claim 5674587337, report 5674736229; Clause-②: no on the claim and in the PR body.

① Derived judgments

  • Accept set / public surface: none moves — .claude/skills/pm-dispatch/SKILL.md (+2/−2) against merge-base cb648cb1; nothing published; skip-changeset on the PR (read back with documentation, size/xs).
  • Region: two hunks, @@ -308,8 +308,7 @@ (the payment) and @@ -337,6 +336,7 @@ (the insert), both inside the claimed REGION :306–:415; :172–:185 (PR pm-dispatch: reconcile the quota rows with the identity-bound rate limit; merged-write rule; account-suspension recovery readings #18242) and :645–:646 (PR docs(agents): the contract-review carrier is the seat's to hang; --pair PR-NUMBER is the only spelling #18250) byte-identical to origin/main on the head, seat-diffed. The added line (:339 on the head, 120 B) reads 「方向落在 ADR/已裁卡/不可重裁规则:贴 check-prior-rulings.mjsPrior rulings read: 行,或不点。」 directly under the mandate 「裁定写方向、给六态之一」 — the direction stays, its evidence is bound, exactly the grading's ruling; the tool is cited by file name and the paste line by its literal prefix (P1 measured by a live run: --card 17497 printed that shape, exit 0).
  • Payment: origin/main :311 (89 B) + :312 (50 B) rewritten as one 116 B line — every operative token kept (fire 开局 · 只按名加载互斥检查所需工具 · ToolSearch · select: · 判定本轮有活 · the only-after order 才加载其余); the three dropped words are filler (形式 / 之后 / 工具), seat-read against the before text. No rule deleted, ceiling untouched.
  • Ratchets on the head, seat-run in a detached worktree at c96b507: 812/812 ✓ (check-skill-line-ratchet), check:pm-skill-id-lint clean ✓, check-skill-frame-sync ✓, check-governed-prose ✓, frame block :734–:755 md5 3327d02c56f8a0eca88569dad2270f32 unchanged ✓; awk length over :306–:415 prints no line over 120 B ✓; check-clause2-carriers --pair 18256 exit 0 on this head.
  • Gates 16 / 16 / 0 / 0 per the report with exits captured by redirect (doc-formula-expressions after its prerequisite build under the verify lock); check:pm-dispatch-gates not derived for this diff.

② Semver level

Not applicable — nothing published moves; skip-changeset measured (.claude/** is on the fast path).

③ Boundary flags

open_questions: none. Three declared deviations, each answered: (1) the dispatch spelled the frame-sync gate check:pm-skill-frame-sync; the real script is check:skill-frame-sync and it ran green — the seat's spelling error, recorded; (2) the commit carries the model-free trailer pair, correct; (3) branched from cb648cb1 after origin/main advanced — no SKILL.md or check-prior-rulings.mjs change in between, line numbers unchanged. Premise correction the dev made and the seat owns publicly: the grading 5624180621 located 「写方向」 at references/lanes/triage.md :7, but that 7-line file's :7 is the half-state rule; the charter text lives at SKILL.md :339 on origin/main (:338 on the head) — location only, substance unaffected. Governed (rules layer) ⇒ four-piece: needs-user-decision on the PR, 速读终稿 below, reviews requested; ⛔ not flipped ready by the seat before an authorized approval. Serial: PR #18242 and PR #18250 are disjoint regions of the same file; the last of the three to land merges origin/main first. Out of scope, recorded: the ratchet header's 「601 adjacent bullet pairs ZERO merge under the 120-byte cap」 was a pure-join reading — a tighter rewrite can still fit, as here; no card.

Implemented-by: claude/issue-17497-grading-quotes-the-governing-line
Reviewed-by: session_01HZfg2AwVX191qCizp88gQr

VERDICT: PASS


Generated by Claude Code

@claude

claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

改了什么:SKILL.md〈分诊座位职责〉加一行(:339,120 字节):分诊定级的「方向」若落在 ADR、已裁卡或不可重裁规则里,必须贴上 check-prior-rulings.mjs 打印的 Prior rulings read: 那一行,否则就不点具体落点。为保持 812 行天花板,把同一节相邻两行(fire 开局只按名加载工具 / 判定有活才加载其余)合成一行 116 字节,每个操作性词都在。

为什么改:两次分诊(#16867#17425)方向对、落点错——落点正是治理文本明文拒收的拼法或形状,直到执行席重读 ADR 才发现,其中一次派发令都已写出。原因不是前提过时,而是没有任何一行要求定级引用它所针对的裁决行。工具与粘贴行早就存在(决策卡已被要求贴它),这一行把同一义务绑到定级的方向上。

风险与代价(含回滚):纯规则文本,不碰发布包、不改 CI、行数不变;分诊仍可写方向(「写方向」是章程),只是多贴一行证据。回滚 = revert 一个 PR。一处纠正:原定级把「写方向」出处写成 lanes/triage.md :7,实际在 SKILL.md 本节,dev 已在 PR 正文当众更正,结论不受影响。

席位意见:建议批准。本席在 head 上亲核:两处改动都在认领区域 :306–:415 内、其他两个在飞 PR 的区域字节不变;新行 120 字节、付费行 116 字节且语义无损;棘轮 812/812、frame 块 md5 不变、id-lint / frame-sync / governed-prose 绿;--pair 0。CI 在 head 上跑中(Lint & Repo Gates),绿后才由本席按裁决 C 落地;与 PR #18242#18250 同文件不同区域,最后落地者先合 main。

你要做的(一个动作):approve 本 PR。approve 后本席翻 ready + 入队。


Generated by Claude Code

@claude

claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor Author

Ruling-C landing provenance — skills seat, session session_01HZfg2AwVX191qCizp88gQr, 2026-09-15T06:14Z. Authorized approval: os-zhuang's APPROVED review 5206139389 at 2026-09-15T06:08Z on head c96b507db288c20bf270c66c6137dc6fa7e79576, the same head the review of record 5674761187 (## Contract review PASS) names and the ACCEPT 5674761572 on #17497 cites; not dismissed. The approver also flipped the PR ready (2026-09-15T06:08Z) and enqueued it (added_to_merge_queue 2026-09-15T06:08Z, actor os-zhuang; its queue ref had not yet appeared at 2026-09-15T06:13Z, the entry being behind PRs #18242, #18244 and #18250 — the event is the reading, the ref is re-read at the landing confirmation), so the seat's remaining acts under ruling C are the readings and the label: check-clause2-carriers --pair 18256 exit 0 re-read at 2026-09-15T06:13Z with the C6-RECORD note naming that record; on that head Lint & Repo Gates and TypeScript Type Check both success and every other check is success or skipped (35 runs: 19 success, 16 skipped); mergeable_state clean, no main commit touching SKILL.md since the merge-base, so no branch update was made (the queue builds the merge); needs-user-decision cleared through label-write.mjs and read back. Serial note: PRs #18242 (:172–:185) and #18250 (:645–:646) share SKILL.md in disjoint regions and sit ahead in the same queue; the ratchet stays 812/812 through all three. MERGED is confirmed later by two readings (the queue ref gone + git log origin/main carrying (#18256) with one parent), then #17497's residue is stripped and #18218 (SKILL.md :622) is unblocked on the SKILL.md chain.


Generated by Claude Code

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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] Two triage gradings named a target the governing ADR itself rejects — the grading quotes no line of the adjudication it routes against

2 participants