Repository navigation
skills(os-dev, pm-dispatch): every PR opens with a six-line 维护者速读; the seat's 席位核对 precedes pr_ready/enqueue; H69 patrols a summons that ran ahead of it - #26327
Conversation
… the seat's 席位核对 precedes pr_ready/enqueue; H69 patrols a summons that ran ahead of it os-dev.md: the PR body opens, after the Fixes line and the two declaration lines, with `## 维护者速读` on every PR — six fixed lines (改了什么/为什么改/ 风险与回滚/先看/两分钟验证/需要你做的), Chinese, business angle, no 席位意见 line — then the English sections in a fixed order (What changes/Tests/ Acceptance notes/Verification) with every log reading folded into a details/summary block. Paid in place: three lines retired to homes they already had (push-and-backoff → rule 1; merge-main-after-PR → AGENTS.md §10; the three safe spellings → the keyword rule above them and review-checklist 安全拼法). pm-dispatch SKILL.md: the seat's record (six lines + 席位意见, then `## 席位核对`) is on the PR for the current head before `pr_ready` on Tier H and before a Tier S PR is queued; the seat-side twin lines are rewritten in place, no new line. check-half-states.mjs: H69, report-only — a governed Tier H open PR with an approver requested and no `## 席位核对` newer than its head commit; one bounded commit read per PR that carries a record; a self-test battery pinning the older-than-head / newer-than-head pair. H48's hint and fixture follow the renamed dev heading. Claude-Session: https://claude.ai/code/session_01LqKsGyMNFwwnbF5FTAqyPn Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-26T21:32Z — PR #26327 for card #26155, independent contract review by a reviewer other than the implementer; every reading below is from REST, Served-tier: ① Derived judgmentsCheck-runs on the head, read three times. 2026-10-26T21:19Z: 52 runs, 33 success, 17 skipped, 2 in progress ( (a) The six lines land verbatim — right. os-dev.md 285–289 on the head: the block sits after the two declaration lines, on every PR (受管与否都带), heading (b) One home, both triggers — right as written, approximated against the card's slash phrase, and that is the only satisfiable form. SKILL.md ① (188) on the head: 「席位记录落 PR 先于 (c) Old wording gone, no recogniser keyed on it — right. My own re-grep on the head over (d) Three retirements are payments — right, every clause has a home on the head. Base 273 (push with (e) H69 is a correct, cheap, report-only sibling — right. Population = (f) Ratchet and id-lint — right, measured. (g) The PR body dogfoods the shape — right, and its 需要你做的 line is right, not a defect. Line 1 (h) Claim surface — right. Claim 6426324473 names os-dev.md, SKILL.md, landing-operations.md only as an alternative home (untouched, and the dev read its line 60 full at 115 B), and check-half-states.mjs; the PR's file list is exactly the three (+5/−5, +4/−4, +361/−11). No dev claim was posted and the assignee was not written; ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
维护者速读改了什么:每个 PR 正文都以这六行速读开头(受管与否都带),英文节序固定、门禁日志折进可展开块;席位在 席位核对ACCEPT ·
Generated by Claude Code |
Fixes #26155
Clause-②: no
Metadata-protocol: none
维护者速读
改了什么:每个 PR 正文现在都以这块六行速读开头(受管与否都带),其后英文节序固定、门禁日志折进可展开块;席位在你被请审之前先把自己的核对贴到当前 head;巡查多一行报告态 H69,点名「已请审、席位核对却没跟上 head」的 Tier H PR。
为什么改:你的原话「看一下现在的pr写的内容,我总感觉对我审核的人帮助不大,是否需要更新skills」→「立卡」;立卡实测 35 个 open PR 首节名不统一、中文只在 6 个受管草稿里、其中 4 个没有席位终稿。
风险与回滚:只改两份规则文本与一行报告态巡查,不改任何门禁判定、不动复核清单;出错时你看到的是 PR 正文形状不对或 H69 多报一行,不阻塞任何落地。回滚 = revert 本 PR 的一个 commit。
先看:
.claude/agents/os-dev.md(新五行是模板本体;退掉的三行去向见 Acceptance notes)→.claude/skills/pm-dispatch/SKILL.md(① 行:席位核对先于pr_ready/入队)→scripts/pm/check-half-states.mjs(风险 hunk =h69SeatRecordBehindHead里 head 日期与记录时间的比较)。两分钟验证:
node scripts/pm/check-half-states.mjs --self-test,预期末行含H69 seat record before governed review 66/40;pnpm check:pm-skill-ratchet,预期os-dev.md is 404 lines (ceiling 404; headroom 0)。需要你做的:确认或改这六个标签——这块就是模板本体,它的形状在本 PR 上由你定;落地由席位走 Tier S 契约复核,不需要你点合并。
What changes
.claude/agents/os-dev.md— 404 → 404 lines (ceiling 404). Lines 288–289 (the governed-only## 维护者速读(草稿)with 五段 including 席位意见) become five rule lines, now 285–289: the block on every PR right after the two declaration lines; the six labels verbatim and in order; the先看and两分钟验证sub-rules;需要你做的= exactly one action,无,席位落地on a non-governed PR; and the fixed English section order (What changes / Tests / Acceptance notes / Verification) with every log reading folded into a details/summary block. Three lines retired to pay for them, each to a home it already had:-u, back off on network failure, pre-push refuses card trailers) → rule 1 lines 30 and 32, and base line 285 (now 282: no card trailer on a commit);mainonly on a conflict, a main-red or a dequeue, then the scoped re-check) → AGENTS.md Multi-agent discipline §10, which states it verbatim;is not addressed here,out of scope:,remains open) → the keyword rule directly above it (base 282–283, now 280–281, 「让它们远离其它卡号」) and review-checklist.md:10 安全拼法 (卡号旁零动词)..claude/skills/pm-dispatch/SKILL.md— 319 → 319 lines (ceiling 319); four lines rewritten in place, no new line. ① (188): the seat's record is on the PR beforepr_ready(Tier H) and before enqueue (Tier S), pinned to the head — the single home of the Wanted-2 precondition;两层同欠is carried by naming both triggers,卡只留指针行by execution-duties.md:184 and the pointer spelling on 190. 192: the six labels. 193: the dev's block on every PR, no 席位意见 line. 194: the seat corrects the six lines and adds the 席位意见 line.scripts/pm/check-half-states.mjs— H69, report-only (35,243 → 35,593 lines). Population = H48's (governed, Tier H, open, drafts in) narrowed to a pending request from aGOVERNED_APPROVERSaccount; it fires when no comment whose line begins## 席位核对is newer than the head's committer date. It reuses the thread H48 buys and adds ONE commit read per PR that carries a record at all — a PR with no record is judged without that read, an unread head date is UNJUDGED, never clean. A sibling of H43, not a widening: H43 asks who was asked, H69 whether the record preceded the asking, and the two remedies differ. Coverage pairseatRecordCandidates/seatRecordJudged, summary clauseSeat records (H69), bandstate, a 66-case battery pinned at 40. H48's hint text and fixture follow the renamed dev heading: the body section is now## 维护者速读, the same heading as the comment marker, H48 still reads comments only, and a new case proves the fixture carries that heading so the pin is not vacuous.Not touched.
references/review-checklist.md(card ⛔ 3).references/landing-operations.md: its Tier S enqueue line — the order's candidate home — no longer exists onorigin/main(#26210 retired it), and the surviving line 60 sits at 115 bytes with no room for a fold, so the precondition has one home. No open PR body was rewritten. AGENTS.md untouched.Tests
node scripts/pm/check-half-states.mjs --self-testonb04d9371: exit 0 —✓ check-half-states self-test: 5030 cases pass. Batteries: … H69 seat record before governed review 66/40. The pair the card pins isH69: approver requested, record OLDER than the head -> findingandH69: approver requested, record NEWER than the head -> clean, with the controls beside them: no record needs no head read; an unread head date is UNJUDGED; a non-approver or assign-only request does not fire; Tier S stands down; a new push after a fresh record re-opens the state; H43/H48 adjacency.Acceptance notes
fleet-write/execute.mjsrequestsGOVERNED_APPROVERSatpr_createAND atpr_readyon a Tier H hit (its battery name at execute.mjs:1046; AGENTS.md Prime Directive 14 calls the draft-time request a summons). So the precondition cannot bind the create-time request; SKILL.md ① bindspr_readyand enqueue, and H69 reads the pending request as the summons it is — a fresh Tier H draft fires until the seat's record lands on its head, which is the measured shape (4 of 6 governed drafts on the filing day).GET /pulls, read 2026-10-26T20:25Z); platform-readings.md records the write-side sanitizer deleting unknown tag shapes and says nothing about this element. This PR's own## Verificationis the measurement: if the folds below render, the rule line stands; if they were stripped, the seat has the reading and the fold needs a different spelling.速读|五段|席位意见|Acceptance notes|维护者速读|席位核对over.claude/**andscripts/pm/*.mjs): none is keyed on(草稿)or五段.MAINTAINER_BRIEF_MARKER(H48) reads comments only and is unchanged;fleet-roster.mjsreads## 席位核对plus ACCEPT, unchanged;check-governed-merges.mjs,check-governed-queue-guard.mjsanddispatch-gates.mjssay "a final 维护者速读" in prose, still true;post-stamped.mjs's席位意见opener belongs to the decision-analysis frame, unrelated;references/decision-analysis.md:13keeps its one-line governed-draft summary — the seat's decision-box line, not the PR brief..claude/**→ Tier S: this PR stays draft; the seat's independentCONTRACT_REVIEW_TIERreview and the queue are the landing. The dev did not ready, arm or enqueue it.skip-changesetridespr_create's labels:.claude/**andscripts/pm/**publish nothing.os-dev.md:292token-count clause (「姊妹门禁定义 token 计数后同报 token」) names a gate that does not exist; noted as a candidate for the next compression, not retired here.Verification
Required gates — all green on b04d937, exit codes captured before any pipe
node scripts/pm/check-half-states.mjs --self-test✓ check-half-states self-test: 5030 cases pass. Batteries: … H69 seat record before governed review 66/40.pnpm check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 404 lines (ceiling 404; headroom 0).·.claude/skills/pm-dispatch/SKILL.md is 319 lines (ceiling 319; headroom 0).pnpm check:pm-skill-id-lint✓ check-skill-id-lint: 104 file(s) clean (pattern /#[0-9]{3,}/g).pnpm check:skill-frame-sync✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherentpnpm check:skill-frame-freshness✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).Derived families — `dispatch-gates --commands --repo objectstack-ai/objectstack` on b04d937: 52 commands, 51 exit 0 on the first pass, the one exit 3 reran green after a build
Derivation header:
gate list derived from the tree of 'objectstack-ai/objectstack' at commit b04d9371. Runner: each command viabash -c, exit code captured before any pipe.node scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/check-declaration-mirrors.mjsnode scripts/check-declaration-mirrors.mjs --self-testnode scripts/check-issue-citations.mjsnode scripts/check-scripts-symbol-anchors.mjsnode scripts/check-scripts-symbol-anchors.mjs --self-testnode scripts/check-self-test-wired.mjsnode scripts/check-self-test-wired.mjs --self-testnode scripts/check-self-test-workflow-commands.mjsnode scripts/check-self-test-workflow-commands.mjs --self-testnode scripts/check-whole-set-label-write.mjsnode scripts/check-whole-set-label-write.mjs --self-testnode scripts/ci/scheduled-full-run.mjs --self-testnode scripts/pm/bare-root-worklist.mjs --self-testnode scripts/pm/board-snapshot.mjs --self-testnode scripts/pm/check-governed-queue-guard.mjs --self-testnode scripts/pm/check-harness-current.mjs --self-testnode scripts/pm/sweep-closed-cards.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:agent-model-declaredpnpm check:agent-test-spellingpnpm check:bash32-floorpnpm check:cli-command-idspnpm check:closing-target-claimpnpm check:commit-card-trailerspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:entry-guardpnpm check:gitlink-declaredpnpm check:issue-citationspnpm check:nul-bytespnpm check:parse-guardpnpm check:partof-closing-keywordpnpm check:pm-dispatch-gatespnpm check:pm-expected-skipspnpm check:pm-governed-mergespnpm check:pm-governed-prosepnpm check:pm-half-statespnpm check:pm-post-stampedpnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:pnpm-filter-targetspnpm check:pnpm-flag-spellingspnpm check:ratchet-remedy-authoritypnpm check:refd-timer-probepnpm check:single-claim-pathspnpm check:skill-frame-syncpnpm check:watch-hint-literalpnpm --filter @objectstack/lint run check:doc-formula-expressionsexit 3 on the first pass = the gate's own PREREQUISITE refusal (@objectstack/formulaand@objectstack/lintunbuilt; "Nothing was measured"). Rerun afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock: exit 0.--ranreconciliation: ✓ dispatch-gates --ran: 52 derived famil(ies) accounted for — 52 run, 0 NOT-MEASURED (a DERIVED zero — all 52 recorded an exit code and none of them is 3).The derivation before the runs was clean; the
--ranreconciliation run printed a STALE TREE warning: the branch base isf00cbe36andorigin/mainhad moved 5 commits by then; the two files the tool names as stale are thescripts/sdui-manifest.sources/core.jsonandreact.jsonhash sentinels forui/packages/coreandui/packages/react, which no changed path touches, and the derived set was 52 commands both times.mainis not merged before the PR opens (AGENTS.md: mergemainonly on a conflict, a main-red or a dequeue).Hook self-tests and the local-only freshness gate (outside the derivation, run on b04d937)
bash .claude/hooks/guard-main-checkout-bash.selftest.shbash .claude/hooks/guard-main-checkout.selftest.shbash .claude/hooks/guard-process-kill.selftest.shbash .claude/hooks/guard-shared-stash.selftest.shbash .claude/hooks/guard-tree-enum.selftest.shbash .claude/hooks/session-start-fleet.selftest.shpnpm check:skill-frame-freshnessLine budget — bytes of every touched rule line (cap 120)
os-dev.md 404 → 404 lines; SKILL.md 319 → 319 lines; check-half-states.mjs 35,243 → 35,593 lines (no ceiling).