Repository navigation
[batch] PM-skill optimization: maintainer-accepted 9-point plan, consolidated with #5925 item 7 + #6644 L2 + #7055 + #7156 #7341
Description
Maintainer-accepted optimization batch for .claude/skills/pm-dispatch/SKILL.md and its satellite files, consolidated per the maintainer's directive with the two in-flight skill cards. Filed and routed via the maintainer-direct-dispatch channel; authorization quoted verbatim (chat, this seat's session, 2026-08-10):
> 关于项目经理的技能,接受你的优化意见,并和前面两个优化任务集中处理。派发使用云卡片,用 Fable 5 模型
> 项目经理技能还需要考虑的是派任务时使用什么模型,也应该项目经理决定,最低下限 sonnet,最高可以 fable
The accepted proposal list is the devx seat's 2026-08-10 analysis (delivered in chat); items restated here as the card of record.
Consolidated scope
Inherited cards folded in (their own threads carry the detail):
- [skill] pm-dispatch: 5 lessons from the domain:metadata seat's first term (8 cards MERGED / 0 rework / 4 dev-side falsifications) #6644 L2 only — "report at draft-PR time, do not wait for CI" becomes a standard clause of the step-5 dispatch template, with the matching PM landing duty in step 7. L1/L3/L4/L5 already landed via PR docs(pm-dispatch): ADR merge prohibition in Guardrails + ACCEPT path fork; probe-and-revive as the standing backstop; replay-wake identity check (#6741, #6747) #6799.
- [skill] pm-dispatch:spec 车道 08-05/06 任期沉淀的 7 条 SKILL 更新建议(34 单 MERGED / 0 返工 / 一次交接全程即兴) #5925 item 7 only — extract the long incident narratives into
references/incidents.md; pure move, byte-identical, cut points re-derived from the current file; ⛔ ordered AFTER all textual additions. - os-dev cleanup prescribes
git worktree remove --force, which disables the one guard protecting a parallel agent's uncommitted work #7055 — os-dev cleanup prescription drops--force(removenode_modulesfirst, unforcedgit worktree remove; a refusal then means uncommitted work). - [finding] os-dev agents idle-poll CI after their work is finished, burning the session limit and holding a seat's water level behind a task that is functionally done #7156 — the idle-poll symptom card of L2; fixed at the role-file layer, not per-prompt.
Accepted optimization items:
- SKILL.md restructure: main file keeps rules + one-line case anchors; Operational notes narratives, incident case law, and the filter compile-surface inventory move to
references/**loaded on demand; the case-law region becomes append-only; a shrink-only line-count ratchet gate guards the main file's size. - Half-state sweeper (report-only): a mechanical checker enumerating label/assignee invariant violations (
pm:dispatchedwith no assignee; assignee with no claim comment;pm:queue+pm:dispatchedboth present post-landing;pm:blockedwithout aBlocked-by:body line; seat-sticker title/assignee/body triple out of sync). Complements [decision] engine-core lane dropspm:queueat dispatch without applyingpm:dispatched— 7 instances of the ghost-card shape; pick the repair #7239 — its per-instance repairs stay with that card. - Report-channel unification: every dev final report also lands as an issue comment (the
os-dev-reportmarker), both dispatch modes; the subagent return channel becomes an accelerator, not the source of truth. - Machine-produced dispatch inputs: a script mapping a file surface to the gate families that watch it (so "Local gates for this card" is generated, not recalled), plus a claim-comment shape checker.
- Role-file precedence audit: clauses true for every card live in
.claude/agents/os-dev.md(measured: a per-dispatch prohibition lost to the role file's own prescription — os-dev cleanup prescribesgit worktree remove --force, which disables the one guard protecting a parallel agent's uncommitted work #7055 evidence); per-card variables get explicit interfaces in the role file instead of conflicting defaults. - Triage emits a size/model suggestion line consumed by the claim comment; the executor seat may override with a stated reason.
- Multi-account slimming: rituals that exist only because of the shared-identity era are marked same-account-only; the cross-account rule stays one line (assignee not yours ⇒ taken).
- Decision-card template: every premise line carries its own re-check command, so refreshing a stale decision card is running commands, not re-research.
- Model-tiering rewrite (maintainer ruling above): the dispatch model is the PM's per-card decision; floor
sonnet, ceilingfable(claude-fable-5), withopusthe default judgment tier in between;modelstays an explicit parameter on every dispatch; tier recorded in the claim comment.
Delivery shape (ordering is load-bearing)
- PR A — protocol text batch (SKILL.md + os-dev.md): items 3/5/6/7/8/9 + [skill] pm-dispatch: 5 lessons from the domain:metadata seat's first term (8 cards MERGED / 0 rework / 4 dev-side falsifications) #6644 L2 + os-dev cleanup prescribes
git worktree remove --force, which disables the one guard protecting a parallel agent's uncommitted work #7055 + [finding] os-dev agents idle-poll CI after their work is finished, burning the session limit and holding a seat's water level behind a task that is functionally done #7156. Per-item checklist in the PR body;Fixes #6644, #7055, #7156+Part ofthis card. - PR B — structure extraction (item 1 + [skill] pm-dispatch:spec 车道 08-05/06 任期沉淀的 7 条 SKILL 更新建议(34 单 MERGED / 0 返工 / 一次交接全程即兴) #5925 item 7): pure moves, byte-identical, LAST;
Fixes #5925+Part ofthis card. - PR C — tooling (items 2/4): new scripts + gate wiring;
Part ofthis card (closes when accepted).
⛔ Constraints: no docs/adr/**; English on GitHub; sanitizer discipline on every SKILL.md write (entities for angle brackets, read back after posting); out-of-scope discoveries filed separately per PD #10.
Dispatch: cloud card (create_session), model claude-fable-5, per the authorization above.
Activity
os-help commentedon Aug 10, 2026
Claim: PM loop round 1 (devx seat) — consolidated batch anchor
Session:
session_01YS2qzDAn3CpWdY7uBX9bFQBranches:
claude/issue-7341-pm-skill-batch-a(protocol text),claude/issue-7341-pm-skill-batch-b(structure extraction, LAST),claude/issue-7341-pm-skill-batch-c(tooling)Worktree: cloud session's own container (dedicated worktrees per os-dev discipline inside it)
Domain:
domain:devxFile surface:
.claude/skills/pm-dispatch/SKILL.md,.claude/skills/pm-dispatch/references/**(new),.claude/agents/os-dev.md,scripts/(new pm tooling + gate wiring only)Container & model: L batch,
mode:clouddedicated container,model: claude-fable-5(maintainer-directed)Serial constraints cleared: the only in-flight claim on this surface was the predecessor's #5925+#6644 consolidation (branch
claude/issue-5925-6644-skill-md— no branch or PR exists remotely at claim time); superseded into this batch by maintainer directive, recorded on both cards with provenance. #7055/#7156 were queued-unclaimed on.claude/agents/os-dev.md; folded here, which is also what serializes them.Ruling addendum (maintainer, chat, 2026-08-10, verbatim) — a named floor for this card class:
> 比如 更新 项目经理技能 必须要使用 Fable 5
⇒ item 9's tier table gains a mandatory rule: cards that modify the PM skill (
.claude/skills/pm-dispatch/**) dispatch atclaude-fable-5, no discretion downward.Generated by Claude Code
os-help commentedon Aug 10, 2026
os-dev report — PR A of 3 (protocol text batch)
{ "issue": 7341, "status": "done", "branch": "claude/issue-7341-pm-skill-batch-a", "pr": "https://github.com/objectstack-ai/objectstack/pull/7357", "premise_still_valid": true, "summary": "PR A landed as draft #7357: all 9 protocol items + #6644 L2 + #7055 + #7156 in .claude/skills/pm-dispatch/SKILL.md (3013→3098 lines) and .claude/agents/os-dev.md (629→674). Per-item checklist in the PR body maps item | landing section | before | after; diff --stat is exactly the two files. Model tiering now: floor sonnet / default opus / ceiling fable, mandatory claude-fable-5 for pm-dispatch-skill cards, three rulings quoted verbatim as the authority block. skip-changeset applied (union write, size/m preserved).", "tests": "node scripts/check-nul-bytes.mjs OK (6739 files); pnpm check:skill-frame-sync self-test 12/12 + real run 4 copies isomorphic; pnpm check:skill-compatibility self-test 18/18 + 11 files reconciled; pnpm check:agent-model-declared self-test 18/18 + os-dev.md=opus; contradiction grep for the retired dev-side CI wait clean.", "open_questions": [], "out_of_scope_findings": [] }Mechanism-assumption verifications for the batch (all three PRs build on these): no remote branch
claude/issue-5925-6644-skill-mdand no predecessor PR exist (git ls-remote verified at start);references/does not exist yet; os-dev.md:150 carried the--forceprescription; SKILL.md is 3013 lines on the dispatch-time main — the claim comment's ~2300 figure was stale, so PR B's cut points are being re-derived from the post-A file as instructed. PR #7292 merged before takeoff and is in the base. PRs B and C follow in order on top of this branch.Generated by Claude Code
Generated by Claude Code
os-help commentedon Aug 10, 2026
Scope addition — item 10 (maintainer ruling, chat, 2026-08-10, verbatim):
> 确认,M 及以上默认云卡,并进 #7341
⇒ PR A additionally rewrites the dispatch-backend criteria (the SKILL's single-container /
mode:cloudselection clause): default becomesmode:cloudfor M-and-above cards; only S-grade mechanical cards staymode:subagentin the shared container. The existing heavy-card criteria (size/l·xl, full regen, wide verification radius, dogfood/browser, long heavy-verify lock) remain as examples of the M+ class, not as the trigger list. Three companion disciplines ride along unchanged and should be stated next to the new default: subscribe to the card's PR on creation; the dev report's authoritative channel is the issue comment (item 3 of this batch);archive_sessionat the card's terminal state. Rationale recorded from the maintainer's discussion: full process visibility and direct interactability outweigh per-card container spin-up for anything non-trivial.Relayed to the in-flight cloud session via poke; its PR A checklist must carry this as item 10.
Generated by Claude Code
os-help commentedon Aug 10, 2026
os-dev report — PR B of 3 (structure extraction)
{ "issue": 7341, "status": "done", "branch": "claude/issue-7341-pm-skill-batch-b", "pr": "https://github.com/objectstack-ai/objectstack/pull/7370", "premise_still_valid": true, "summary": "PR B landed as draft #7370 (Fixes #5925), stacked on PR A per the ordering discipline. Eight narrative blocks, 9,941 bytes, moved verbatim into references/incidents.md (append-only case-law file, 140 lines) and references/compile-surfaces.md (27 lines); SKILL.md 3,098 -> 2,997 lines. Every chunk script-extracted and script-verified: byte-identical in the pre-move blob, present in exactly one reference file, absent from the post-move main file (8/8 OK). Operational-notes bodies and the two-blindness explainer deliberately NOT moved — the pure-move condition fails there (rule and evidence interleave at sentence level); declared in the PR body. Line-count ratchet deferred to PR C with rationale.", "tests": "verify-move.mjs 8/8 chunks pre=true/ref=true/removed=true (9,941 bytes); check-nul-bytes OK; check:skill-frame-sync 4 copies isomorphic; check:skill-compatibility 11 files reconciled; check:agent-model-declared opus; deixis grep clean.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-help commentedon Aug 10, 2026
os-dev report — PR C of 3 (tooling)
{ "issue": 7341, "status": "done", "branch": "claude/issue-7341-pm-skill-batch-c", "pr": "https://github.com/objectstack-ai/objectstack/pull/7379", "premise_still_valid": true, "summary": "PR C landed as draft #7379 (Part of #7341, Part of #7239), stacked on B. Three zero-dep scripts under scripts/pm/: check-half-states.mjs (report-only H1-H5 board patrol, exits 0 on any completed sweep so it cannot be wired as a gate), dispatch-gates.mjs (file surface -> check families, derived at runtime from 23 workflows / 75 discovered families, no hardcoded list per the #6492/#6865 lesson), and check-skill-line-ratchet.mjs wired into lint.yml as check:pm-skill-ratchet (shrink-only ceiling 3050 vs post-B 2997+2 pointer lines; placed in C not B to keep B a pure move — rationale in the PR body). SKILL.md gains the two planned one-line pointers.", "tests": "self-tests 16/16 + 14/14 + 5/5; ratchet real run green (3002 lines, headroom 48); check:workflow-status-functions self-test 34 assertions + real scan OK; eslint scripts/pm clean; check-nul-bytes OK. Declared limitation: live half-states sweep not runnable from this container (bare REST 401, no GITHUB_TOKEN; MCP-mediated access only) — the script correctly exits non-zero rather than reporting a clean board.", "open_questions": [], "out_of_scope_findings": [] }All three batch PRs are now up: A #7357 (Fixes #6644/#7055/#7156) → B #7370 (Fixes #5925) → C #7379, stacked in that order; land in order and the later diffs collapse to their own commits.
Generated by Claude Code
Generated by Claude Code
docs(pm-dispatch): M-and-above dispatches default to mode:cloud (#7341 …
os-help commentedon Aug 10, 2026
os-dev report — addendum: item 10 (M+ defaults to mode:cloud) landed
The 07:57Z scope-addition ruling (「确认,M 及以上默认云卡,并进 #7341」) is implemented as commit
89e57adon PR A's branch and propagated through B (724b810) and C (a2f6c8e):mode:cloudsingle-card dispatch; only S-grade mechanical cards staymode:subagent; the 2026-08-07 heavy-card criteria list is now examples of the M+ class, not the trigger list; the ruling is quoted verbatim in the section as its authority.mode:subagent= the S-grade mechanical lane;mode:cloud= the default for M+), and the/pm-dispatcharguments table'smode:default cell updated.subscribe_pr_activityon creation, issue-comment report authority (batch item 3),archive_sessionat the card's terminal state.git worktree remove --force, which disables the one guard protecting a parallel agent's uncommitted work #7055 cleanup row moved to 11); B/C bodies carry the refreshed line counts (B: 3,112 → 3,011; C ratchet re-run green at 3,016/3,050, headroom 34). Gates re-run green on every branch (nul-bytes, frame-sync, ratchet).Batch state: A #7357 → B #7370 → C #7379, all draft, all re-pushed, land in order.
Generated by Claude Code
Generated by Claude Code
os-help commentedon Aug 10, 2026
ACCEPT — PR A #7357 (devx seat review, session
session_01YS2qzDAn3CpWdY7uBX9bFQ); PRs B #7370 / C #7379 reviewed and held in serial order behind it.Review basis (local diff of the three stacked branches, not the reports' claims): per-stage
diff --statmatches each PR's declared surface exactly (A: SKILL.md+os-dev.md only; B: the extraction triple; C: threescripts/pm/*+ lint.yml + package.json + two pointer lines). Spot-checked A's load-bearing sections on the branch: the three-tier model table (floor sonnet / default opus / ceilingclaude-fable-5) with the mandatory fable rule for.claude/skills/pm-dispatch/**cards and all three maintainer rulings quoted verbatim; item 10's M+-defaults-to-cloud rewrite superseding the 2026-08-07 heavy-card criteria (kept as examples), with the companion disciplines named; os-dev.md's report-at-draft termination contract (dual delivery, GitHub authoritative) and the unforced-cleanup prescription with the refusal semantics stated.Landing plan: A flips ready + auto-merge now. B (pure move, script-verified 8/8 byte-identical, declared non-moves for rule/evidence-interleaved passages — the honest reading of the pure-move condition) and C (report-only sweeper, runtime-derived gate mapping, shrink-only ratchet at 3050) stay draft until A is MERGED, then flip in order so each lands as its own diff. This seat merges nothing by hand — the queue does; walkthrough of the protocol changes remains open to the maintainer on all three PRs.
Generated by Claude Code
os-help commentedon Aug 10, 2026
Batch complete — closing (devx seat, session
session_01YS2qzDAn3CpWdY7uBX9bFQ).All three PRs MERGED in order via the merge queue: A #7357 (protocol text: 10 items + #6644 L2 + #7055 + #7156 — closed those three cards), B #7370 (structure extraction, closed #5925: 9,941 bytes of incident case law moved byte-identically into
references/incidents.md+compile-surfaces.md), C #7379 (tooling:check-half-states.mjsreport-only sweeper,dispatch-gates.mjsruntime-derived gate mapper,check:pm-skill-ratchetshrink-only ceiling 3050 wired into lint.yml).Net protocol state after this batch: report-at-draft is the standard posture (dual-channel delivery, issue comment authoritative); model tiering is floor-sonnet / default-opus / ceiling-fable with mandatory
claude-fable-5for PM-skill cards; M-and-above dispatches default tomode:cloud; worktree cleanup is unforced; SKILL.md sits at ~3,016 lines under a shrink-only ratchet with case law now append-only inreferences/. All four maintainer rulings are quoted verbatim in the landed text.Remaining outside this card: #7239 keeps its per-instance repairs and repair-choice decision (PR C is
Part ofit — the enumerator only). The dispatching cloud session is being archived.Generated by Claude Code
docs(pm-dispatch,os-dev): report at draft-PR time, three-tier model p…
docs(pm-dispatch): extract incident case law into references/ — pure …
feat(scripts): pm patrol tooling — half-state sweeper, dispatch-gates…
fix(scripts): probe the transport and report a prerequisite, not a ba…