Skip to content

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

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-1r3slx
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-1r3slx

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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:

  • old 273 (push with -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);
  • old 275 (after the PR opens, merge main only on a conflict, a main-red or a dequeue, then the scoped re-check) → AGENTS.md Multi-agent discipline §10, which states it verbatim;
  • old 284 (the three safe spellings beside a card number: 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 before pr_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 a GOVERNED_APPROVERS account; 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 pair seatRecordCandidates/seatRecordJudged, summary clause Seat records (H69), band state, 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 on origin/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-test on b04d9371: exit 0 — ✓ check-half-states self-test: 5030 cases pass. Batteries: … H69 seat record before governed review 66/40. The pair the card pins is H69: approver requested, record OLDER than the head -> finding and H69: 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.
  • No ablation: the diff changes rule text and a patrol script, not a tested runtime behaviour (os-dev.md: 配置、脚本、workflow、文档 ⛔ 不消融).

Acceptance notes

  • Premise — relay request timing (measured; it shapes the wording). fleet-write/execute.mjs requests GOVERNED_APPROVERS at pr_create AND at pr_ready on 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 ① binds pr_ready and 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).
  • Premise — the details/summary fold (unmeasured until this PR). 0 of 28 open and 0 of 100 recently closed PR bodies carried a details tag (REST 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 ## Verification is 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.
  • Ruling A on docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 (comment 6386217274) answers 404 — NOT MEASURED, evidence destroyed. The card's quotation of it (「规范核心与事故史分家」) and the surviving ruling 6407900763 on that card point the same way, and nothing here depends on it.
  • Recognisers re-grepped before and after (速读|五段|席位意见|Acceptance notes|维护者速读|席位核对 over .claude/** and scripts/pm/*.mjs): none is keyed on (草稿) or 五段. MAINTAINER_BRIEF_MARKER (H48) reads comments only and is unchanged; fleet-roster.mjs reads ## 席位核对 plus ACCEPT, unchanged; check-governed-merges.mjs, check-governed-queue-guard.mjs and dispatch-gates.mjs say "a final 维护者速读" in prose, still true; post-stamped.mjs's 席位意见 opener belongs to the decision-analysis frame, unrelated; references/decision-analysis.md:13 keeps its one-line governed-draft summary — the seat's decision-box line, not the PR brief.
  • Tier. The only governed paths are .claude/** → Tier S: this PR stays draft; the seat's independent CONTRACT_REVIEW_TIER review and the queue are the landing. The dev did not ready, arm or enqueue it. skip-changeset rides pr_create's labels: .claude/** and scripts/pm/** publish nothing.
  • Out of scope, not filed: none. The os-dev.md:292 token-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
command exit verdict line
node scripts/pm/check-half-states.mjs --self-test 0 ✓ check-half-states self-test: 5030 cases pass. Batteries: … H69 seat record before governed review 66/40.
pnpm check:pm-skill-ratchet 0 ✓ 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 0 ✓ check-skill-id-lint: 104 file(s) clean (pattern /#[0-9]{3,}/g).
pnpm check:skill-frame-sync 0 ✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent
pnpm check:skill-frame-freshness 0 ✓ 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 via bash -c, exit code captured before any pipe.

command exit wall
node scripts/check-ci-filter-parity.mjs 0 0s
node scripts/check-closing-keyword-parity.mjs 0 3s
node scripts/check-closing-keyword-parity.mjs --self-test 0 5s
node scripts/check-comment-mask-corpus.mjs 0 185s
node scripts/check-declaration-mirrors.mjs 0 0s
node scripts/check-declaration-mirrors.mjs --self-test 0 0s
node scripts/check-issue-citations.mjs 0 1s
node scripts/check-scripts-symbol-anchors.mjs 0 4s
node scripts/check-scripts-symbol-anchors.mjs --self-test 0 4s
node scripts/check-self-test-wired.mjs 0 2s
node scripts/check-self-test-wired.mjs --self-test 0 5s
node scripts/check-self-test-workflow-commands.mjs 0 121s
node scripts/check-self-test-workflow-commands.mjs --self-test 0 4s
node scripts/check-whole-set-label-write.mjs 0 2s
node scripts/check-whole-set-label-write.mjs --self-test 0 0s
node scripts/ci/scheduled-full-run.mjs --self-test 0 1s
node scripts/pm/bare-root-worklist.mjs --self-test 0 32s
node scripts/pm/board-snapshot.mjs --self-test 0 0s
node scripts/pm/check-governed-queue-guard.mjs --self-test 0 0s
node scripts/pm/check-harness-current.mjs --self-test 0 8s
node scripts/pm/sweep-closed-cards.mjs --self-test 0 0s
pnpm --filter @objectstack/lint run check:doc-formula-expressions 3 2s
pnpm check:agent-model-declared 0 1s
pnpm check:agent-test-spelling 0 3s
pnpm check:bash32-floor 0 2s
pnpm check:cli-command-ids 0 18s
pnpm check:closing-target-claim 0 1s
pnpm check:commit-card-trailers 0 1s
pnpm check:cross-package-test-inputs 0 35s
pnpm check:doc-authoring 0 7s
pnpm check:driver-memory-census 0 5s
pnpm check:entry-guard 0 40s
pnpm check:gitlink-declared 0 2s
pnpm check:issue-citations 0 7s
pnpm check:nul-bytes 0 5s
pnpm check:parse-guard 0 3s
pnpm check:partof-closing-keyword 0 1s
pnpm check:pm-dispatch-gates 0 413s
pnpm check:pm-expected-skips 0 6s
pnpm check:pm-governed-merges 0 10s
pnpm check:pm-governed-prose 0 1s
pnpm check:pm-half-states 0 3s
pnpm check:pm-post-stamped 0 1s
pnpm check:pm-skill-id-lint 0 1s
pnpm check:pm-skill-ratchet 0 1s
pnpm check:pnpm-filter-targets 0 3s
pnpm check:pnpm-flag-spellings 0 5s
pnpm check:ratchet-remedy-authority 0 4s
pnpm check:refd-timer-probe 0 24s
pnpm check:single-claim-paths 0 1s
pnpm check:skill-frame-sync 0 1s
pnpm check:watch-hint-literal 0 6s

pnpm --filter @objectstack/lint run check:doc-formula-expressions exit 3 on the first pass = the gate's own PREREQUISITE refusal (@objectstack/formula and @objectstack/lint unbuilt; "Nothing was measured"). Rerun after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint under the verify lock: exit 0.

--ran reconciliation: ✓ 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 --ran reconciliation run printed a STALE TREE warning: the branch base is f00cbe36 and origin/main had moved 5 commits by then; the two files the tool names as stale are the scripts/sdui-manifest.sources/core.json and react.json hash sentinels for ui/packages/core and ui/packages/react, which no changed path touches, and the derived set was 52 commands both times. main is not merged before the PR opens (AGENTS.md: merge main only on a conflict, a main-red or a dequeue).

Hook self-tests and the local-only freshness gate (outside the derivation, run on b04d937)
command exit wall
bash .claude/hooks/guard-main-checkout-bash.selftest.sh 0 7s
bash .claude/hooks/guard-main-checkout.selftest.sh 0 5s
bash .claude/hooks/guard-process-kill.selftest.sh 0 1s
bash .claude/hooks/guard-shared-stash.selftest.sh 0 2s
bash .claude/hooks/guard-tree-enum.selftest.sh 0 1s
bash .claude/hooks/session-start-fleet.selftest.sh 0 1s
pnpm check:skill-frame-freshness 0 3s
Line budget — bytes of every touched rule line (cap 120)
file:line before after
os-dev.md:273 (retired) 115 B —
os-dev.md:275 (retired) 87 B —
os-dev.md:284 (retired) 84 B —
os-dev.md:288 → 285 114 B 108 B
os-dev.md:289 → 286 118 B 98 B
os-dev.md (new) 287 — 115 B
os-dev.md (new) 288 — 95 B
os-dev.md (new) 289 — 114 B
SKILL.md:188 116 B 114 B
SKILL.md:192 116 B 104 B
SKILL.md:193 111 B 107 B
SKILL.md:194 115 B 118 B

os-dev.md 404 → 404 lines; SKILL.md 319 → 319 lines; check-half-states.mjs 35,243 → 35,593 lines (no ceiling).

… 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>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Reviewed 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, git show on origin/main and on the head, and the diff as GitHub serves it (sha256 identical to the seat's scratch copy).

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b04d9371e652eb85455246d21027559c51ddebe0
Local-runs: none
Scope: .claude/agents/os-dev.md, .claude/skills/pm-dispatch/SKILL.md, scripts/pm/check-half-states.mjs + AGENTS.md (Multi-agent discipline §10, Prime Directive 14), .claude/skills/pm-dispatch/references/review-checklist.md, references/execution-duties.md, references/landing-operations.md, references/contract-review.md, scripts/pm/fleet-write/execute.mjs, scripts/pm/check-governed-queue-guard.mjs (GOVERNED_APPROVERS), scripts/pm/fleet-roster.mjs, scripts/pm/record-recognisers.mjs, scripts/pm/post-stamped.mjs, scripts/pm/check-governed-merges.mjs, scripts/pm/dispatch-gates.mjs, scripts/pm/check-skill-line-ratchet.mjs, scripts/pm/check-skill-id-lint.mjs, .github/workflows/half-state-patrol.yml

① Derived judgments

Check-runs on the head, read three times. 2026-10-26T21:19Z: 52 runs, 33 success, 17 skipped, 2 in progress (Live half-state sweep, Test Core (1/8); Lint · PM dispatch-gates had already completed success). 2026-10-26T21:25Z: 53 runs, 36 success, 17 skipped, 0 in progress (the 53rd is the Test Core aggregate). 2026-10-26T21:29Z: unchanged, 36/17/0, no failure, no neutral. Lint & Repo Gates success, Check Changeset success, Governed Surface Queue Guard success, Live half-state sweep success (workflow run 40402120390, job 121850401505, every step success; on a pull_request event the sweep runs --dry-run and skips the anchor write, so whether H69 fired on a live PR is in the job log only, which the jobs endpoint does not carry — not read). The workflow's own header says findings never fail the run, so a green sweep proves the row runs live, not that the board is clean.

(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 ## 维护者速读 with no 草稿, Chinese business language, no 席位意见 line (285); the six labels in the card's order 改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的 (286); 先看 at most 3 files by risk naming the risky hunk, 两分钟验证 = one command or one click with the expected sight (287); 需要你做的 = exactly one action, 「无,席位落地」 on a non-governed PR, 席位定稿成评论 (288); English order What changes/Tests/Acceptance notes/Verification with log readings folded per sub-topic into details/summary (289). Nothing contradicting survives: a tree-wide grep of the head for 「维护者速读(草稿)」「五段固定」「席位意见留空」「风险与代价」「你要做的」 returns zero lines in any path. 「两层同欠」 is subsumed by 受管与否都带. SKILL.md 192/193/194 carry the seat-side twin consistently: six labels, the dev writes the block on every PR without 席位意见, the seat corrects the six lines and ADDS the 席位意见 line, pins the record, 维护者只读评论. Two small, accepted gaps: the card's per-label placeholder hints (the three sub-questions under 风险与回滚, the source under 为什么改) are not carried — the labels are, the hints are guidance and the file is at ceiling 404/404; and SKILL.md 192 dropped 「(一个动作)」, which os-dev.md 288 carries as 恰一个动作 and the seat corrects the six lines against.

(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 先于 pr_ready/入队且钉 head:速读六行+席位意见,其下 ## 席位核对」 — both triggers (pr_ready for Tier H, 入队 for Tier S), pinned to the head, the 席位意见 named. No surviving line describes the old order: SKILL.md ③ (198) states the relay's request at pr_create/pr_ready as a fact, not an order; landing-operations.md 49–51 run ACCEPT then pr_ready; 60 runs the governed check before ready/enqueue; contract-review.md 37 makes the PASS record the pre-landing check; execution-duties.md 184 is the ACCEPT comment itself. The dev's deviation is confirmed by reading execute.mjs on origin/main (header 187–202, batteries named at 1046 and 1361, cases at 1400 and 1414): a Tier H hit requests every uncovered GOVERNED_APPROVERS account after pr_create AND after pr_ready, and AGENTS.md Prime Directive 14 calls the draft-time request 「a summons, no barrier」. So the card's 「before the relay pr_ready / request to GOVERNED_APPROVERS」 cannot bind the create-time request — the dev's relay call fires it before any seat has read the PR, and a rule a seat cannot obey is a wrong rule. The text supports exactly the reading the dev took: ① binds pr_ready and enqueue; the create-time request is the summons the record must answer; H69 patrols the gap, which is the card's own Mechanism sentence word for word (a Tier H PR with reviewers requested and no 席位核对 newer than its head). Wanted 2 is therefore MET for the two triggers it names and APPROXIMATED for the create-time request, declared in deviations and in the PR's Acceptance notes. One honest note for the seat: on Tier H the ordinary flow already has pr_ready after ACCEPT (SKILL.md 197, landing-operations 51), so the rule's teeth are the patrol row and the seat's promptness, not the sentence. Dropped from the old 188: 「一条」 (the template already says ONE comment) and 「卡只留指针行」 (execution-duties.md 184 and SKILL.md 190) — nothing lost.

(c) Old wording gone, no recogniser keyed on it — right. My own re-grep on the head over .claude/** and scripts/pm/*.mjs, then over the whole tree: zero hits for all five retired spellings. The hits in the seat's pre-grep that survive are all prose or a different artefact: check-governed-merges.mjs 221/1920, check-governed-queue-guard.mjs 385/2075 and dispatch-gates.mjs 12174 say 「a final 维护者速读」 in help text (still true, parse nothing); post-stamped.mjs 2340 reads 席位意见 as a decision-frame opener (the card's heading, unrelated); decision-analysis.md 13 is the seat's decision-box one-liner; filing-gate.md 15 is the card-side brief on decision cards; director.md 57 and execution-duties.md 180 use 草稿 for draft PRs. Recognisers that read the heading: MAINTAINER_BRIEF_MARKER (comments only, prefix match, unchanged) and the new SEAT_RECORD_MARKER. H48's hint and fixture changed heading only, and the new case proves the fixture still carries the comment marker's heading so the body-is-not-the-brief case is not vacuous. Out of this PR's scope but worth the seat's eye: fleet-roster.mjs 225 hasLandingVerdict requires the heading line to be exactly ## 席位核对 with nothing after it, while the seat's live spelling on #26311 is ## 席位核对 — ACCEPT · … — that pre-existing recogniser does not read the seat's own record; H69's prefix marker does. Two recognisers for one artefact now disagree.

(d) Three retirements are payments — right, every clause has a home on the head. Base 273 (push with -u, back off on network failure, pre-push refuses card trailers) → os-dev.md 30 (git push -u origin before any edit), 32 (只有网络错误才退避重试), 282 (commit ⛔ 不带卡片 trailer). Base 275 (merge main only on conflict, main-red or dequeue, then the §10 re-check) → AGENTS.md 581–582 verbatim: 「After the PR is open, merge main only on a GitHub-reported conflict, a main-caused CI red or a queue removal, then only the scoped re-checks」. Base 284 (three safe spellings beside a card number) → os-dev.md 280–281 (the keyword list and 让它们远离其它卡号) and review-checklist.md 10 「安全拼法 = 卡号旁零动词」 — the examples are gone, the rule they illustrated is stated more strictly.

(e) H69 is a correct, cheap, report-only sibling — right. Population = h48SpeaksAbout (governed non-empty, governedLandsOnRecord false so Tier S is out, not merged, not closed, drafts in) narrowed to requested_reviewers ∩ GOVERNED_APPROVERS non-empty — the request field alone, not H43's union, with the reasons written in. Predicate: no comment whose line begins ## 席位核对 with created_at newer than the head's commit.committer.date; a record at the same instant is not newer. Four states: unread or unreadable thread → UNJUDGED; read thread, no record → fires with no head read; record and unread head → UNJUDGED; record and head → judged. The commit read is bought only when h69NeedsHeadRead is true (thread read AND a record exists), cached by sha so two PRs sharing a head pay once; seatRecordJudged counts only a judged PR. Band state, summary clause 「Seat records (H69)」 rendered every run and NOT MEASURED when the register is unloadable, registry coverage pinned both ways, both count keys on SWEEP_COUNT_KEYS. Battery: 66 b(BATTERY69, …) cases counted on the head, declared floor 40; the file's convention is 「pin just under the count」 (six batteries say so), so 40 is a soft pin — 26 cases could vanish without the floor noticing; not a defect, noted. Clock: the committer date is the card's own words (「newer than its head commit」) and H23's reason (amend, rebase and merge all move it; the author date does not; the PR's updated_at moves on every comment and label). One blind spot the seat should know: a force-push to a pre-existing older commit keeps an older committer date and reads CLEAN though the head changed; the record names the sha in prose but the row does not read it. Recogniser vs the seat's real heading: SEAT_RECORD_MARKER is line-anchored, allows an optional leading blockquote mark, then the literal ## 席位核对, with the m flag and no g; comment 6426788546 on #26311 opens ## 席位核对 — ACCEPT · on line 1, so it matches by prefix; the ## Contract review comment 6426695557 on the same PR does not. Report-only: H69 pushes into findings exactly as H48 does, no exit path changes in the diff, and half-state-patrol.yml's header says a completed sweep exits 0 whatever it found. Live probe #26311 by the row's own predicate: head 8cd23c77 committer date 2026-10-26T20:01Z; both requested reviewers (hotlong, os-zhuang) are the two GOVERNED_APPROVERS; the seat's record was created 2026-10-26T20:39Z, later than the head — CLEAN now. Between PR create 2026-10-26T20:12Z and that record it would have read as a FINDING (the contract-review comment at 2026-10-26T20:34Z is not a ## 席位核对 line). Both readings are what the card asked the row to say.

(f) Ratchet and id-lint — right, measured. git show b04d9371:PATH | wc -l: os-dev.md 404 (ceiling 404), SKILL.md 319 (ceiling 319), check-half-states.mjs 35,593 (no ceiling). Touched lines by wc -c: os-dev.md 285–289 = 108/98/115/95/114 B; SKILL.md 188/192/193/194 = 114/104/107/118 B — max 118 under MAX_LINE_BYTES 120, matching the dev's table byte for byte. No # followed by three or more digits in any added .claude/** line (ID_PATTERN /#[0-9]{3,}/g). Lint & Repo Gates success on the head is the gate verdict.

(g) The PR body dogfoods the shape — right, and its 需要你做的 line is right, not a defect. Line 1 Fixes #26155, then Clause-②: no and Metadata-protocol: none line-initial, then ## 维护者速读 with the six labels in order, then ## What changes, ## Tests, ## Acceptance notes, ## Verification with four details/summary folds (4 open, 4 close, 4 summary tags in the stored body; 14,862 bytes, no footer). 为什么改 quotes the maintainer's verbatim words. The 需要你做的 line asks the maintainer to confirm or amend the six labels and says the seat lands it: on a Tier S PR the rule says 「无,席位落地」, but the card body itself says 「the maintainer rules the template's shape on the PR」 and the triage grade repeats it — a ruling IS asked on this PR by the card's own text, so the one action is the right one here. Landing: Tier S lands on this record (AGENTS.md Prime Directive 14; the card's own 「lands on a contract-review record」), and no rule text makes the maintainer's word a precondition of the queue. My reading for the seat: land on the record; leave the 需要你做的 ask open on the PR and name it in the 席位核对 as pending; if the maintainer amends the labels, that is a one-line follow-up PR on the same two files. Card Acceptance bullet 3 (「the maintainer's word on the template's shape quoted in the PR's own brief」) is met today only as the maintainer's originating words, not as a ruling on the six labels — the seat should say so rather than claim it.

(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; Branch: claude/project-thread-1r3slx on the claim matches the head ref. Report keys: the os-dev.md JSON template on the head (362–381) defines neither files_changed nor deviations, line_budget, rules_retired; the report carries the latter three as extra keys and no files_changed, which line 385 permits (「报告模板是工具,不是真相」). Note for the seat: os-dev.md prose names deviations at lines 59, 138 and 308 while the JSON template omits it — a pre-existing template gap.

② Semver level

skip-changeset is right: the diff touches .claude/** and scripts/pm/** only, the root package is private and no workspace package publishes either path; Check Changeset success on the head. Clause-②: no and Metadata-protocol: none are line-initial on the PR body (lines 2–3), matching the card.

③ Boundary flags

  • Relay pr_create appended no footer — verified: the stored body ends with the last fold's closing tag, 14,862 bytes, equal to what the report says was sent. 收班简报 note (platform-readings.md: the footer reading applies to the harness's own PR creation, not the relay).
  • details/summary survives the write-side sanitizer — verified: 4/4/4 tags stored. 收班简报 note; platform-readings.md's sanitizer section should gain the measurement.
  • os-dev.md 292 names a sibling token-count gate — verified absent: scripts/pm holds check-skill-line-ratchet.mjs only (fleet-token.mjs is the auth token helper). 收班简报 note; a candidate line for the next compression.
  • STALE TREE counts the sdui sentinels — verified: DERIVATION_SURFACE is ['.github/workflows', '.github/actions', 'package.json', 'scripts'], so scripts/sdui-manifest.sources/*.json regenerated on any ui landing makes a pm-only tree read stale. Card-worthy (class c, named producer dispatch-gates.mjs).
  • docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 ruling comment 6386217274 — verified HTTP 404. 收班简报 note; nothing here depends on it.
  • fleet-roster.mjs 225 vs the seat's ## 席位核对 — ACCEPT · … heading (see (c)) — card-worthy: two recognisers now read one artefact differently.
  • Base: the PR's base.sha is 61ba04f6 (the tip of origin/main at read time); the report's f00cbe36 is the head's parent and the merge-base, an ancestor of 61ba04f6, 5 commits behind; mergeable: true. Consistent, no action. Branch claude/project-thread-1r3slx is the measured platform exception named on the claim.

Implemented-by: claude/project-thread-1r3slx
Reviewed-by: session_01LqKsGyMNFwwnbF5FTAqyPn (independent contract-review subagent)

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么:每个 PR 正文都以这六行速读开头(受管与否都带),英文节序固定、门禁日志折进可展开块;席位在 pr_ready/入队之前先把自己的核对贴到当前 head;巡查多一行报告态 H69,点名「已请审、席位核对却没跟上 head」的 Tier H PR。
为什么改:你的原话「看一下现在的pr写的内容,我总感觉对我审核的人帮助不大,是否需要更新skills」→「立卡」;立卡实测 35 个 open PR 首节名不统一、中文只在 6 个受管草稿里、其中 4 个没有席位终稿。
风险与回滚:只改两份规则文本与一行报告态巡查,不改任何门禁判定、不动复核清单;出错时你看到的是 PR 正文形状不对或 H69 多报一行,不阻塞任何落地。回滚 = revert 本 PR 的一个 commit。
先看:.claude/agents/os-dev.md(285–289 是模板本体;退掉的三行各有去处,复核员逐条核过)→ .claude/skills/pm-dispatch/SKILL.md(① 行:席位核对先于 pr_ready/入队且钉 head)→ scripts/pm/check-half-states.mjs(风险 hunk = h69SeatRecordBehindHead 里 head 提交日期与记录时间的比较)。
两分钟验证:打开 PR #26311,看席位评论 6426788546 的时间(20:39Z)晚于 head 8cd23c77 的提交时间(20:01Z)——这就是 H69 判「干净」的全部依据;CI 的 Live half-state sweep 在本 head 上绿。
需要你做的:确认或改这六个标签(改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的)。模板形状由你定;本 PR 按 Tier S 凭契约复核记录落地,不等这句——你若改标签,后续一行 PR 改同两份文件。
席位意见:同意落地。复核员的一句提醒我照录:卡的验收第三条「维护者对模板形状的话引进 PR 速读」今天只以你立卡时的原话满足,还不是对六个标签的裁决;这条等你一句话。Tier H 上 dev 开 PR 那一刻中继就已请审(pr_create 即传唤),规则只能约束 pr_ready/入队,传唤之后由 H69 巡查席位是否及时——这是卡原文的机制句,不是放宽。

席位核对

ACCEPT · domain:skills#2 · session_01LqKsGyMNFwwnbF5FTAqyPn · 2026-10-26T21:34Z — seat review of record for #26155 on head b04d9371, against GitHub, not the report's own account. Governed .claude/** PR, Tier S (check-governed-merges --pr 26327: .claude/** ×2, no Tier H path, 390 changed lines): the record that unlocks landing is the independent ## Contract review at comment 6427853793 (Served-tier: CONTRACT_REVIEW_TIER, head b04d9371, VERDICT: PASS, drafted by a reviewer other than the implementer — the in-session os-dev subagent). This seat adds the landing read, not a second contract read. This comment is itself the first record in the shape the PR introduces: the six lines above corrected against the seat's own diff read, the 席位意见 line added, then this section.

  1. Shape. Draft, base main, mergeable: true (clean); body line 1 Fixes #26155, no closing keyword beside any other card; Clause-②: no, Metadata-protocol: none line-initial; ## 维护者速读 with the six labels in order, then What changes / Tests / Acceptance notes / Verification with four details/summary folds. Files: .claude/agents/os-dev.md (+5/−5: base 288–289 respelled as 285–289, three lines retired to pay), .claude/skills/pm-dispatch/SKILL.md (+4/−4: 188/192/193/194 in place), scripts/pm/check-half-states.mjs (+361/−11: H69 and its battery) — exactly the claim's surface (claim 6426324473). Labels documentation, size/m, skip-changeset — right, .claude/** and scripts/pm/** publish nothing. Branch claude/project-thread-1r3slx (the measured platform exception), named by the claim.
  2. Record, measured. The reviewer read the six labels and every sub-rule of the card's Wanted 1 against os-dev.md 285–289 and the SKILL.md twin and found all said and nothing contradicting (tree-wide grep for the five retired spellings: zero); read execute.mjs and found the relay requests GOVERNED_APPROVERS at pr_create as well as pr_ready, so the card's precondition can bind only pr_ready/enqueue and H69 patrols the create-time summons — Wanted 2 met for its two named triggers, approximated for the create-time request, declared by the dev; traced each of the three retired lines to its home (os-dev.md 30/32/282; AGENTS.md 581–582 verbatim; os-dev.md 280–281 + review-checklist.md:10), no clause lost; walked H69's population, four states, one cached commit read, band and count keys, and tested its marker by reading against the seat's real heading on ci(governed-surface-guard): the pull_request leg checks out commits and trees only and installs the toolchain on demand #26311 (prefix match; CLEAN now, a FINDING between 20:12Z and 20:39Z — both readings as the card asked); measured 404/404 and 319/319 with every touched line ≤118 bytes. The seat re-read the diff and reads the same.
  3. Gates, pinned to head b04d9371. 53 check-runs, 36 success and 17 skipped, none red or pending (reviewer's third read 2026-10-26T21:29Z; the seat read the same after). Among them Lint & Repo Gates (ratchet 404/404, 319/319; id-lint), TypeScript Type Check, Test Core, Governed Surface Queue Guard, Lint · PM dispatch-gates, Live half-state sweep (run 40402120390, every step success; --dry-run on pull_request, so it proves H69 runs live, not where it fired), Check Changeset, Check PR Size, and all claim/close guards.
  4. Accepted deviations. (a) The card's fenced block could not land as a fence (both files at ceiling); it landed as five rule lines carrying the six labels verbatim — the card's labels are the contract, the fence was its illustration. (b) The card's per-label placeholder hints are not carried (ceiling); SKILL.md 192 dropped 「(一个动作)」, which os-dev.md 288 carries as 恰一个动作. (c) Wanted 2's create-time request is unbindable (see 2); the rule binds pr_ready/enqueue and H69 reads the summons. (d) landing-operations.md untouched: the order's candidate home (line 60) was full at 115 B; SKILL.md ① is the single home. (e) H69's battery floor is 40 under 66 cases — the file's "pin just under the count" convention makes it a soft pin; noted, not a defect. (f) The os-dev-report carries no files_changed (the os-dev.md JSON template defines neither it nor deviations; prose names deviations at 59/138/308 — a pre-existing template gap, outside this diff).
  5. Carrier. Filed by the seat from the report's and the reviewer's findings: the STALE TREE reading in dispatch-gates.mjs counts scripts/sdui-manifest.sources/*.json as derivation inputs (a pm-only tree reads stale on every ui landing), and fleet-roster.mjs:225 hasLandingVerdict requires a bare ## 席位核对 heading while the seat's live records and H69's marker read a prefix — the two cards are named in the pointer on the card. 收班简报, not filed: relay pr_create appends no footer and details/summary survives the body sanitizer (both measured on this PR; platform-readings.md should carry them); os-dev.md 292 names a sibling token-count gate that does not exist; the deviations template gap in 4(f); docs: narrative cost — 42.5% of source lines are comments, workflows 58.6%, AGENTS.md is 103 KB with three stale claims, ROADMAP.md still says v3.3.2 and 80 Storybook stories #25919 ruling comment 6386217274 answers 404; H69's clock is the committer date, so a force-push to a pre-existing older commit reads CLEAN (the record names the sha in prose, the row does not read it).
  6. Landing. Tier S with a PASS record on the current head and every check green ⇒ the owning seat readies it and arms auto-merge through the relay (pr_ready, then automerge_enable), on the maintainer's standing word in the seat thread (2026-10-26: 「你按照 pm-dispatch 技能审核的pr都可以落地」), follows it to MERGED, and confirms on both the queue branch and origin/main. The 需要你做的 line above stays open for the maintainer's word on the six labels; an amendment is a one-line follow-up PR on the same two files.

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

Projects

None yet

2 participants