Skip to content

docs(pm-dispatch): sweep of 7 measured SKILL corrections — os-regen list drift, the unlock sweep's three duties, verification blindness, the auto-merge signature - #6720

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-5925-skill-md-sweep
Aug 8, 2026
Merged

docs(pm-dispatch): sweep of 7 measured SKILL corrections — os-regen list drift, the unlock sweep's three duties, verification blindness, the auto-merge signature#6720
os-project-manager merged 1 commit into
mainfrom
claude/issue-5925-skill-md-sweep

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #6492
Fixes #6490
Fixes #6465
Fixes #6371
Fixes #6218
Fixes #6207
Part of #6644

One sweep, one file (.claude/skills/pm-dispatch/SKILL.md), seven member cards. These could not land in parallel — they all edit the same sections — and the anchor card's own body argued for exactly this shape on 2026-08-06 (「四单合并实施或严格串行」).

Per-item checklist

Walk this against the diff; every row corresponds to a hunk, and git diff --stat is 1 file, +166 / -27 with nothing outside these rows.

card lands in what was wrong / missing what it now says
#6492 「入队与落地 A」 + rule 2「shared contract surfaces have one owner」 Three disagreeing readings of one list: prose said 8, the fenced copy listed 9, .gitattributes routes 10. The copy also omitted packages/spec/authorable-defaults/**, and a positional reference (「最后那条是 #5107 加的」) pointed at the wrong entry once the list drifted. The embedded copy is deleted. The section now carries only the retrieval command (grep os-regen .gitattributes) named as the sole authority, plus a paragraph recording the 8/9/10 drift as the reason a second copy is not allowed. The .counts.md distinction is kept but addressed by path, not by position. The second site (rule 2) drops its 「那八条」 and points at the same command.
#6490 + #6465 + #6644 L4 step 3, two new adjacent paragraphs Three separate gaps that are one read: the queue view cannot see which cards block others; "the blocker closed" was being read as "the card is still true"; and a PM's "this ruling narrows the card" judgment was entering dispatch as a premise. One passage builds the Blocked-by: reverse index and spends it three ways: (a) selection priority gains unlock fan-out ≥ 2 between priority:p0 and the target: board, with the #5702 / #6428 worked example and an explicit "ordering, not exemption" + "do not invent a pm:blocking label" caveat; (b) an unblocked card's file face is re-verified at the merged ref, with #6413/#6385's 15-minute-stale line anchors as the specimen; (c) the PM's narrowing judgment ships as a "PM assumption, falsifiable" block, with #6190/#6478 as the measured refutation.
#6371 + #6218 step 5 prompt template (3 new bullets) + one narrative paragraph + step 7 review checklist Two ways a verification run measures nothing, both absent from the file. Prompt template: build the dependency closure first ('pkg^...'), consumption-radius scans use the prefix '...pkg', and cross-package type changes owe a reverse-verification. The narrative names them as one family with asymmetric tells — timing (#6371: false-red burns time, false-green reads as a swept radius and proves nothing; #5962/#6210/#6203 in one day, #6212 as the positive sample) and direction (#6218: #6210's "25 packages green" via the suffix, then CI red on @objectstack/dogfood). Step 7 gains the reviewer's counterpart: on any "N packages green", ask which direction and whether the closure was built.
#6207 Operational notes, new note 21 The enable_pr_auto_merge degradation on already-clean PRs had no reader — every new PM session re-derived it. Note 21 carries the empty-field signature, the disable→enable prescription, the three measured cases (#6034 ~1 h silent stall, #6092, #6197), and the blocked-state control group (#6086/#6067/#6107) so the note is not misread as "the tool is broken".
#6207 (consequence) Operational notes section header Adding note 21 made an already-false count worse: the header read 「十三条」 over 20 notes. Header is now count-free and says why, citing #6492 as the same disease. This is the one row not requested by a card — it is the "an addition must not leave a sentence it falsified standing" rule applied to my own edit.
#6644 L1 step 5 prompt template + step 7 review checklist + step 7 ACCEPT Both the dev template and the review checklist hardcoded Fixes, so a half-landing PR would silently close a card sitting in the maintainer's decision inbox — which only filters open issues. The template tells the dev to switch to Part of when only half landed; the checklist asks whether merging should close the card; ACCEPT gains "verify the first line before flipping ready", with PR #6600's caught-at-review Fixes as the specimen.
#6644 L3 seat-sticker protocol + handover checklist step 4 Hot-file ordering is a standing fact, but batch independence is recomputed per round, so it died at every handoff. A named 「热文件串行队」 section (file → ordered cards → which region each claim covers), with protocol.ts carrying five cards in one term as the evidence, and the section added to the handover ledger so it survives the seat change.
#6644 L5 step 7 ACCEPT Step 7 only verified that out-of-scope findings exist; at sweep volume they arrive as unrelated cards over an hour. When a card's deliverable includes a systematic sweep, the ACCEPT comment lists its products as one block and names the sweep criterion, so triage grades the batch consistently (#3682's 3 findings + 1 transfer + 1 escalation as the measured volume).

Dropped member, with evidence

#5925 (the anchor) is not in the Fixes list — its premise has expired. Its items 1-6 were implemented and merged by PR #6029 ("Part of #5925(第 1-6 条)", merged 2026-08-06T23:55:44Z), which is why the file grew from the 1571 lines the card cites to 2297. Verified in the current file, all six present:

  • item 1 handover checklist — seat-sticker protocol, 「交接收尾清单」 seven steps
  • item 2 whole-body-replace — 「座位贴协议」 (the architecture changed to one sticker per seat, so the trap is now structurally gone) plus the residual-race discipline
  • item 3 three API traps — Operational notes 13 (list_issues OR, labels whole-set) and note 3 (REST core exhausts, resets on the hour)
  • item 4 priority:p0 — step 3, 「P0 插队」
  • item 5 standby posture — Stop conditions, 「待命姿态」
  • item 6 PM-tooling-PR exception — Guardrails and step 7 ACCEPT

Its only surviving item is item 7 (extracting case narratives into references/incidents.md), which its own card marks 「⛔ 不与前 6 条同 PR」 and which the maintainer approved as a separate pure-move PR. So it is deliberately excluded here, and #5925 must stay open. Closing it via this PR would have discarded item 7 — which is, precisely, the failure mode #6644 L1 (in this same diff) exists to prevent.

Escalated, not written in

#6644 lesson 2 — "report at draft-PR time, do not wait for CI" — is NOT in this diff. It is a behavioural change to the dispatch contract, not a documentation correction, and it contradicts two things currently in force: this file's own step 7 line (「os-dev 定义侧已要求『PR 开出后等 CI 收敛再交报告』,本条是它在复核侧的对账」) and the standing os-dev agent definition. Writing it in would leave two files instructing devs in opposite directions and would silently drop the review-side reconciliation that caught #5584's red merge. That is a maintainer ruling with a real trade-off (up to 2 h of idle dev time per the cli seat's #6024, against the CI-convergence guarantee), so it is raised in the dispatch report rather than guessed at here. This is why the card is Part of, not Fixes.

Verification

Docs-only, .claude/ internal agent tooling — publishes nothing, so skip-changeset rather than a changeset.

Gates enumerated from .github/workflows/lint.yml and run individually (the skill-frame family reads this exact file):

  • check:nul-bytes — OK, 6239 tracked text files, no raw ASCII control bytes
  • check:doc-authoring — OK, 365 files clean
  • check:role-word — OK, 44 baselined files, no new occurrences
  • check:skill-frame-sync — OK, 4 isomorphic copies across 3 files, 40 markdown files scanned
  • check:skill-frame-freshness — OK, frame current with origin/main
  • check:skill-compatibility — OK, 11 SKILL.md files reconciled against 77 workspace packages

Sanitizer-hostile shapes: this file documents the traps it contains, so the additions were scanned explicitly. Control-byte scan (grep -naP over the 0x00-0x1f / 0x7f class) is clean, fence count is balanced at 14 before and after, and the "left-angle-bracket + letter" occurrence count is 60 before and 60 after — zero introduced. The single such sequence inside my hunks is the pre-existing target: placeholder (angle-bracketed "major") on a line I rewrote around — spelled without the brackets here so this body survives its own sanitizer.


Generated by Claude Code

…ist drift, unlock-sweep triple duty, verification blindness, auto-merge signature, metadata seat's term

Fixes #6492
Fixes #6490
Fixes #6465
Fixes #6371
Fixes #6218
Fixes #6207
Part of #6644

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F8q5J1MQyocgtNspb15fSn
@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 8, 2026 1:33pm

Request Review

@github-actions github-actions Bot added the size/m label Aug 8, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 8, 2026 13:33
@os-project-manager os-project-manager added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/m labels Aug 8, 2026 — with Claude
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Aug 8, 2026
@os-project-manager
os-project-manager added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 64d764e Aug 8, 2026
26 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-5925-skill-md-sweep branch August 8, 2026 14:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment