Skip to content

pm-dispatch: SKILL.md wave-2 family — two-tier triage inventory, decision re-read, subagent tier fuse, git-history guard index - #11091

Merged
os-zhuang merged 4 commits into
mainfrom
claude/issue-10190-skillmd-wave2-family
Aug 22, 2026
Merged

pm-dispatch: SKILL.md wave-2 family — two-tier triage inventory, decision re-read, subagent tier fuse, git-history guard index#11091
os-zhuang merged 4 commits into
mainfrom
claude/issue-10190-skillmd-wave2-family

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #10190
Fixes #10544
Fixes #10523
Fixes #10508

Maintainer-authorized family fold (recorded on the chain-head claim, live PM chat 2026-08-22): four graded cards, one commit per member, one shared branch. Governed surfaces throughout (.claude/skills/**, AGENTS.md) — draft PR, human merge only; never queue/arm/ready.

Members (one commit each, in order)

  1. Two-tier triage inventory (c2d962af) — SKILL.md gains the principle in the 分诊座位职责 section: hourly rounds read since windows anchored to the previous round-close brief's timestamp from the seat post (the mutex guard's existing reading — no new state; label writes refresh updated_at; anchoring on the brief covers a skipped-fire backlog); one daily fire runs the four-repo full reconciliation and clusters the already-daily duties; the tier is picked by fire-time-of-day, never a counter; the brief states which tier ran. The since-equivalent readings, cost targets and daily-duty clustering land in references/dispatch-runbook.md (new section 分诊两级盘点细则 with the maintainer's 2026-08-20 verbatim quote).
  2. Decision re-read (ad9c80fe) — the pre-brief protocol (候选与批次) gains the decision re-read, symmetrical to the claim protocol's race re-read: read the card's comments to the last page before writing a brief; quote any maintainer ruling verbatim into the brief's ruling partition as binding, or state none exists. Lead 1 of the card only; leads 2–3 (greppable marker, body-carried ruling) are noted adjacencies, not implemented.
  3. Subagent tier fuse (9857ead3) — the needs:contract-review chain now states: a mode:subagent get_session reading measures the dispatching session (the two fields agreeing is one source quoted twice), so the downgrade fuse is valid only for seat sessions; clause-② subagent dispatches always keep needs:contract-review, and the dispatched-at-the-floor review skip is seat-session-only. Composes with the 2026-08-21 self-review relaxation (that path is a seat session reading its own row) — no conflict measured.
  4. git-history guard index (9e58b7d8) — AGENTS.md (Multi-agent working discipline) gains the windowed-history rule using the card's drafted wording (answer or REFUSE; shallow clones answer windowed git log/rev-list at exit 0 with no warning; historyHorizon() is the read-only predicate), and the pm-dispatch 机械守卫索引 gains the scripts/pm/git-history.mjs row, ratchet-paid. Both placements landed (the SKILL.md row was affordable).

Ratchet ledger (all three files at their ceilings before AND after; verified at 9e58b7d8)

file before after ceiling
.claude/skills/pm-dispatch/SKILL.md 682 682 682
.claude/skills/pm-dispatch/references/dispatch-runbook.md 243 243 243
AGENTS.md 961 961 961

One dispatch mechanism assumption was falsified and is reported here: the runbook is not unratcheted — it carries its own 243-line ceiling at zero headroom, so member 1's runbook section is paid in-file too. Additions are paid by content deletions, never bare re-wrap: trimmed redundancy/incident-narrative in the runbook (读数成本三则 intro, 落卡细则 measured-narrative per its own 行文纪律, 活性巡查 tail, roster/SendMessage duplication with the main file, 紧急卡 restatement of a rule the main file owns, subagent-checkout incident detail), in SKILL.md (objectos onboarding history, dispatch-gates clause duplicated by the runbook's 清单取数补遗, one stale-premise rationale clause), and in AGENTS.md (merged-language incident narrative, duplicated-branch incident sentence, stash/registry incident detail — case law lives in git history per the ratchet's own header). Per-commit ratchet stays ≤ ceiling at every step (682 → 680 → 681 → 682).

Gates (final tree 9e58b7d8, derived by node scripts/pm/dispatch-gates.mjs on the actual change set; exits captured before any pipe)

  • check:pm-skill-ratchet — ✓ all 20 files within ceilings (verdict lines: "682 lines (ceiling 682; headroom 0)", "243 (243; 0)", "961 (961; 0)")
  • check:pm-skill-id-lint — ✓ "17 file(s) clean (pattern /#[0-9]{3,}/g)"
  • check:skill-frame-sync — ✓ "binding sentence present in all 4; 4 count mention(s) agree"; check:skill-frame-freshness — ✓ "frame itself is unchanged"
  • check:pm-governed-prose — ✓ "2 instruction surface(s) name all 5 registered governed surfaces"
  • check:pm-governed-merges — ✓ self-test 119 assertions
  • check:doc-authoring — ✓ "389 files clean"; check:docs-audit-scope — ✓; check:required-contexts — ✓
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions — ✓ (after building the lint dependency closure; first run failed only on unbuilt @objectstack/formula dist)
  • check:nul-bytes — ✓ "no raw ASCII control bytes" (6414 files)

Instruction-file-only diff, releases nothing → skip-changeset (label applied and read back after PR creation).

Generated by Claude Code


Generated by Claude Code

claude added 4 commits August 22, 2026 16:29
…one daily full four-repo reconciliation fire

The triage round's four-repo FULL open-issue inventory becomes a daily
reconciliation backstop; hourly fires run on since windows anchored to the
previous round-close brief's timestamp (read from the seat post — the same
reading the round-open mutex already takes). The daily tier is picked by
fire-time-of-day, never a counter, and the brief states which tier ran.
SKILL.md carries the principle; the since-equivalent readings, cost targets
and daily-duty clustering live in references/dispatch-runbook.md. Both
ratcheted files stay at their ceilings (682/682, 243/243), additions paid
by in-file trims.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e
…the race re-read

Before writing a dispatch brief, read the card's comments to the last page
and quote any maintainer ruling verbatim into the brief's ruling partition
as binding — or state that none exists. The race re-read answers 'is this
card taken?'; it cannot answer 'has this been ruled?' (a ruling comment
carries no session ID, and a ruled card put back in the queue is label-
identical to a never-ruled one), and a brief written without it re-opens a
closed fork and drops the ruling's own dispatch constraints. Nets -2 lines
on the ratcheted SKILL.md (680/682 after this commit).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e
…nt get_session reading measures the dispatching session

State plainly in the contract-review chain that a mode:subagent get_session
reading reports the DISPATCHING session's model (the two fields agreeing is
one source quoted twice, not corroboration), so a subagent cannot attest
the tier it actually ran at. Clause-② subagent dispatches therefore always
keep needs:contract-review, and the dispatched-at-the-floor review skip is
seat-session-only. SKILL.md at 681/682 after this commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e
… row in the dispatch skill, windowed-history rule in AGENTS.md

The prescribed shallow-history remedy was named in no instruction file, so
a seat asking a windowed churn question had no way to find it: a shallow
clone answers windowed git log/rev-list at exit 0 with no warning. AGENTS.md
gains the rule (answer, or REFUSE; historyHorizon() is the read-only
predicate), the pm-dispatch 机械守卫索引 gains the ratchet-paid row. Both
files stay at their ceilings (961/961, 682/682), additions paid by in-file
content trims.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MsbKEG4LtERSLaDrbehM3e
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation labels Aug 22, 2026
@os-zhuang os-zhuang added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed documentation Improvements or additions to documentation labels Aug 22, 2026 — with Claude
@os-zhuang os-zhuang self-assigned this Aug 22, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 22, 2026 16:57
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 22, 2026
Merged via the queue into main with commit 24043c2 Aug 22, 2026
30 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10190-skillmd-wave2-family branch August 22, 2026 17:07
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 32586272156 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Console Pin Gate — 失败步骤: Build the Console SPA at the pinned objectui SHA

    ✗ Build failed in 5.95s
    

↳ 失败原因 是判读的关键:超时Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

跨 PR 相同签名(24h,按失败测试文件聚合):

  • ⚠️ 本次没有可用的聚合签名(日志里没有能解析出测试文件名的 FAIL 行)—— 这不是「没有同签名的其他 PR」,是这一轮没测到。跨 PR 聚合本次不可用,请手工比对其他 PR 的同类评论。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 78 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment