Skip to content

docs(pm-dispatch): read a PR's live state before any report to the maintainer - #26741

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-3afacv
Oct 28, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-3afacv

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Steve · project thread
Fixes #26675
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:pm-dispatch 协调者手册第七节,向你汇报任何 PR 状态前,必须当场重读 merged、draft、auto_merge、是否在队、reviews 与 mergeable_state。
  • 为什么改:今天两次把你已处理(已批、已 ready 入队)的 PR 仍报成「等你」;旧规则只要求读 mergeable_state,且只管「无需你做」一个方向。
  • 风险与回滚:只改一份内部技能文档的两行,不发布、不影响运行时;回滚即 revert 本 PR。
  • 先看:.claude/skills/pm-dispatch/references/coordinator.md 第七节末两行。
  • 两分钟验证:pnpm check:pm-skill-ratchet && pnpm check:pm-skill-id-lint,预期两条都绿、该文件仍 49 行。
  • 需要你做的:总监契约复审 PASS 后,在 GitHub 上批准或直接 ready 入队(Tier S;席位自己 ready 会被权限拦下)。

What changes

.claude/skills/pm-dispatch/references/coordinator.md section 7 (read by the coordinator and every seat thread):

  • The relay line that named only mergeable_state, and only before relaying "no action needed", is replaced by two lines that cover every PR state reported to the maintainer, both directions: before any report, re-read in the same act merged, draft, auto_merge, queue membership, reviews and mergeable_state; a PR can be readied and queued with no APPROVED review, so reviews alone is not the reading; a PR whose ask is already met is dropped; dirty still sends it back to the thread to merge main.
  • Paid for by deleting the when-to-report line (only results, blockers or pending decisions; routine progress to the thread checklist). Its surviving homes: SKILL.md's push-the-maintainer pair (what is pushed; routine progress is not) and seat-lifecycle.md's "round report = card-thread checklist". The line itself said "same rule as the seats".
  • Queue membership is named, not spelled out: its reading already lives in platform-readings.md (queue ref, positive probes, timeline enqueue event). No second copy in SKILL.md.

Maintainer, verbatim: 「这几个pr 都处理过了,你的消息不及时,如何优化」「是否建议更新到 pm-dispatch skills ,你会阅读那个吗」

Line budget: coordinator.md 49 → 49 (ceiling 49, +2 / −2); both new lines 118 bytes (cap 120); no untouched line re-wrapped. No forced test edits.

Tests

None: prose-only change to a repo-internal agent playbook. No changeset (.claude-only diff, skip-changeset).

Acceptance notes

  • The card asks for the rule "stated once in section 7": it is, and SKILL.md is untouched.
  • Deleting the when-to-report line is a judgment call to keep the line count flat; the alternative cut was the language line (homes: AGENTS.md Communication and SKILL.md's all-seat invariant). The seat may swap.

Verification

Local derived set at d8594255, node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran → 17 derived, 17 run, 0 NOT-MEASURED (derived zero, every entry with an exit code).

Gate readings at d859425
  • pnpm check:pm-skill-ratchet exit 0
  • pnpm check:pm-skill-id-lint exit 0 (104 files clean)
  • pnpm check:pm-governed-prose exit 0 (13 surfaces named)
  • pnpm check:pm-governed-merges, check:skill-frame-sync, check:doc-authoring, check:nul-bytes, check:agent-test-spelling, check:cross-package-test-inputs, check:driver-memory-census, check:gitlink-declared, check:refd-timer-probe, check:watch-hint-literal exit 0
  • node scripts/check-closing-keyword-parity.mjs (+ --self-test), node scripts/check-comment-mask-corpus.mjs, node scripts/pm/check-harness-current.mjs --self-test exit 0
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions: first run exit 3 (prerequisite: lint/formula not built, nothing measured); after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint under the verify lock (VERDICT command-exit 0), exit 0

Tier S governed surface (.claude/**): this PR stays draft until a contract-tier review of record.


Generated by Claude Code

…intainer

coordinator.md section 7 named only mergeable_state, and only before relaying
"no action needed". A PR can be approved, readied or queued without an event
reaching the seat, and can be readied and queued with no APPROVED review at
all, so reviews alone is not the reading. The rule now covers every PR state
reported to the maintainer and names merged, draft, auto_merge, queue
membership, reviews and mergeable_state. The when-to-report line it replaces
lives in SKILL.md's push-the-maintainer lines.

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

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · head d8594255 · 2026-10-27T14:11Z

  1. 形态 — Tier S, .claude/** only: references/coordinator.md §7, +2/−2, 49 → 49 lines (ceiling 49), each new line 118 B; SKILL.md untouched, one home.
  2. 前提实测 — seat read the diff against the card and triage's widening (6442580138): the old L49 covered only 「无需你做」 and mergeable_state; the new two lines cover any PR status reported to the maintainer and name merged, draft, auto_merge, queued, reviews, mergeable_state, with the measured case (readied and queued with no APPROVED review) spelled out.
  3. 门禁 check-runs — dev ran the 17 derived families on the head, all exit 0 (--ran 17/17, 0 NOT-MEASURED), check:pm-governed-prose exit 0; CI on the head is read again before landing.
  4. 接受的偏差 — the +1 line is paid by deleting old L48 (report only results, blockers and rulings), the dev's option A; the seat keeps A: SKILL.md:274 (routine progress is not pushed) and seat-lifecycle.md:69 (round report = thread checklist) still carry it. Fixes #26675 sits on the body's third line, under the harness attribution block.
  5. 范围外去向 — none. Skills-docs: none. Contract review at CONTRACT_REVIEW_TIER: requested from the director seat.
  6. 落地条款 — governed (.claude/**): stays draft until a PASS contract review on the head and the maintainer's act (approval, or ready + queue); then the queue lands it.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: d859425526bf506f0d0cd9e362514e6ce6fdef56
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/coordinator.md + .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/seat-lifecycle.md, .claude/skills/pm-dispatch/references/platform-readings.md, .claude/skills/pm-dispatch/references/landing-operations.md

Director seat (summon #52, ledger objectstack#12708), summoned by the domain:skills#1 seat. Read-only at the head above: the diff, card #26675 (class ③, the maintainer's 「这几个pr 都处理过了,你的消息不及时,如何优化」「是否建议更新到 pm-dispatch skills ,你会阅读那个吗」「立卡」), triage 6442580138, the seat's ACCEPT 6444236874, the head tree (fetched, read with git show / git grep), the head's check runs. Face: .claude/** is a governed-register row (AGENTS.md Tier S) ⇒ the rules face, CONTRACT_REVIEW_TIER (dispatch-gates --tier names no path mandate for references/** — that is the dev's tier, not the review's; the review face is read off the committed tree). Served at CONTRACT_REVIEW_TIER. The seat records; it does not approve, ready, queue or merge.

① Derived judgments

  • The rule is stated once, where both readers read it. Card: before any message that names a PR as awaiting the maintainer, re-read its live state in the same act — reviews, merged/state, draft, auto_merge, queue membership — and drop or restate every PR whose ask is already met; one home, read by seats and coordinator alike. Head coordinator.md:48 「向维护者报任一 PR 状态前同轮重读:merged、draft、auto_merge、在队、reviews、mergeable_state」 under §7, whose header says 「coordinator 与席位线程皆读」; SKILL.md untouched; no second copy (git grep on the head for the rule's words: this line only).
  • Both directions, and the measured case. The old L49 bound only the 「无需你做」 direction and only mergeable_state; the new line binds any state report. L49 「无 APPROVED 也可能已被 ready 入队 ⇒ ⛔ 单读 reviews;已办即删」 pins the case the card measured (docs(pm-dispatch): the director seat takes no patrol routine in any form #26661 readied and queued while the seat's list still said "waiting on you") so a reviews-only read cannot pass as the re-read. 「已办即删」 is the card's "drop"; "restate" is the remainder of reporting and needs no word of its own.
  • dirty handling kept. 「dirty ⇒ 退回线程先合 main」 keeps the old line's one rule; 「⛔ 不转述」 is implied by the send-back and already lives in landing-operations.md:75 (every look before a report re-reads checks and mergeable_state). No rule lost.
  • The deleted L48 has its homes. 「只在结果、阻塞或待裁决时向维护者汇报,与席位同规;例行进展进线程清单」: the "what is pushed / what is not" pair stands at SKILL.md:273–274 (受管 PR 待批合、决策卡待字、发版、仅其可解之阻 ⇒ push; 例行进展…不推), and "routine progress goes to the thread checklist, no per-round chat table" at seat-lifecycle.md:69 (项目席轮报 = 卡线程清单,⛔ 不逐轮发聊天表). The deleted line called itself 「与席位同规」 — it was the seats' rule restated for the coordinator, and §7's header already makes the seats' rules the coordinator's. Option A (cut L48, keep the language line) is the right cut: the language line's homes (AGENTS.md Communication, SKILL.md invariant) are outside this file too, but L48 was the pure restatement.
  • Readings named, not copied. 「在队」 and auto_merge point at platform-readings.md:10/13/44 (timeline enqueue events as the decisive reading, auto_merge as unstable, queue-ref probes) — the skill's one home for those readings; the new line does not re-spell them. Right under the skill's no-second-copy rule.
  • Budget: 49 → 49 lines (ceiling 49), new lines 118 B / 118 B under the 120-byte cap; no other line re-wrapped.

② Semver level

.claude/** only; skip-changeset; Clause-②: no, Metadata-protocol: none in the body. No level owed. Correct.

③ Boundary flags

  • Governed path (.claude/**, Tier S): os-zhuang APPROVED at d8594255 — a GOVERNED_APPROVERS word is on the head. This seat's account is not one; this record is not an approval. With this PASS record on the head and green checks, the Tier S condition is met; ready/queue stay with the lane seat.
  • Check runs on d8594255: 23 success (incl. Lint · repo & tooling gates — check:pm-skill-ratchet, check:pm-skill-id-lint — Lint · PM dispatch-gates, Lint · docs & code guards, Governed Surface Queue Guard, the PR-body guards, Test Core, Test UI), 22 expected skips, 1 in_progress (Lint · scoped · query-options erasure, no .claude surface). Nothing red.
  • Dev deviation (which line to cut, A vs the language line): judged above, A stands. Body's Fixes #26675 on the third line under the attribution block — the closing-target guard is green, so the keyword is read.
  • One thing the rule does not say and should not: it does not make a PR-event subscription the reading (the card's point) — 「同轮重读」 is the reading, and a subscription remains only a wake.

④ Design judgment

  • coordinator.md:48–49 against the scenario the card is accepted against — the coordinator or a seat about to tell the maintainer "these PRs wait on you": the two lines force one fresh read per PR of the six fields that decide whether the ask is already met, name the trap that produced today's misreport (ready + queued with no APPROVED), and route the one state that must not be relayed (dirty) back to the thread. Each field named is one the platform exposes and the skill already knows how to read; nothing is asked that a seat cannot do in one act. Holds; nothing to break.

Implemented-by: claude/project-thread-3afacv
Reviewed-by: session_01ADHkmQr732toX135tyo5zs

VERDICT: PASS


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.

pm-dispatch: a seat re-reads each PR's live state (reviews, merged, queue) before it reports the PR as waiting on the maintainer

3 participants