Skip to content

docs(pm-dispatch): Director seat owns the authoritative governed-merge audit window (fourth duty) - #12713

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-12709-governed-audit-director
Aug 27, 2026
Merged

docs(pm-dispatch): Director seat owns the authoritative governed-merge audit window (fourth duty)#12713
os-zhuang merged 1 commit into
mainfrom
claude/issue-12709-governed-audit-director

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixes#12709

Governed protocol change — this PR touches .claude/** and stays DRAFT for the maintainer's hand-merge (Prime Directive 14, 「人工合并即人工审核」). Executes the maintainer's 2026-08-27 ruling from live PM chat, verbatim and untranslated:

「governed 合并审计,目前流程是怎样?是不是也应该都汇报给项目总监。是否建议新增加一个label ?」

「合并审计归总监那件事,同意你的建议」

The accepted recommendation: keep the three-layer regime and split the after-the-fact sweep 检测双层、处置单席 — lane seats keep the per-round sweep as near-zero-cost early warning; the Director seat owns the authoritative consolidated window and the recognize/rollback disposition. No new label (enumeration is tree-derived from local git, zero API, cannot drift — a label would be a second corruptible index); no cron (the human-invoked summon cadence is the audit cadence).

The two changes

  1. SKILL.md 轮次报告 clause — one-sentence amendment. The governed 合并审计清单 line keeps the lane-round duty verbatim (early warning, its own previous-round --since window, ⛔ 不凭记忆汇总 unchanged) and now names the authoritative consolidated window and the recognize/rollback disposition as the Director seat's, with a pointer to references/lanes/director.md. No mechanics copied.
  2. references/lanes/director.md gains 职责四 (governed 合并审计), structured like the other three duty sections: each summon runs the sweep --since-ref-anchored at the previous audit's recorded tips (the anchor line lives in the Director seat post's 说明 section; the script prints the exact next-round flags itself and stores nothing); the list folds into the adjudication batch, one line per entry, recognize y/n; an unrecognized entry = seat violation, filed as a needs-user-decision card in the same stroke under the after-the-fact-audit regime (maintainer 2026-08-18 「同意。」); new tips re-recorded after each run. INCOMPLETE (exit 2) is reported as INCOMPLETE, never as clean; attribution channels that 403 in-container are completed via MCP per entry. ⛔ No new label; ⛔ no cron.

Consistency edits inside the same two-file surface (the three-duty phrasing is now four everywhere it appears): the SKILL.md invocation-table director row (三职与章程 → 四职与章程), the SKILL.md Director-seat paragraph (the 四职 enumeration now names governed 合并审计; 停放四职), and director.md's 档位 bullet (四职停放). The 授权与形态 召唤 bullet's parked-carrier list now names 审计窗口, so the seat-level no-cron / parked-is-designed-safe clause covers the fourth duty by construction.

Non-goals honored

  • The --test pre-arm predicate, the queue guard, and the human-merge-as-review-record regime are untouched.
  • The lane seats' round-report audit line is NOT removed; only the authoritative window and disposition centralize.
  • scripts/pm/check-governed-merges.mjs untouched — protocol text only. No new labels, no new title words, no script changes.

Zero-headroom ratchet: net 0 per file, cut ledger

Ratchet verdict lines (pnpm check:pm-skill-ratchet, run at 4c8ac62, exit 0):

check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md: widest table row is 765 bytes (pin 765; headroom 0).
check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 1005 lines (ceiling 1005; headroom 0).
check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/director.md: widest table row is 0 bytes (pin 0; headroom 0).
check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/director.md is 75 lines (ceiling 75; headroom 0).

SKILL.md (adds: pointer sentence +1 line, fourth-duty enumeration +2 net bytes; paid by cuts in the Director-seat paragraph, net 0 at 1005/1005):

  • Cut "(Project Director)" — surviving home: director.md title line (席位章程:项目总监(Project Director)).
  • Cut 「召唤间隔载体停放是设计安全态」 — surviving home: director.md 授权与形态 召唤 bullet (停放是设计安全态, now audit-inclusive).
  • Cut 「按职责标签跨车道跨仓」 — surviving home: director.md 双射 bullet.
  • Cut 「机械接手经派发 dev(与分诊席同款 carve-out)」 — surviving home: director.md 双射 bullet (机械接手经派发 dev;与分诊席同款).

director.md (adds: 职责四 = header + six content lines + two blanks = +9; paid by nine same-file cuts, net 0 at 75/75):

  1. 授权源: the ruling's two lead-in sentences (「所以是否应该搞一个决裁的项目经理,也要更新他的skills」「比如叫项目总监?」) dropped; the bullet itself declared only the third sentence the seat's duty definition, and that sentence is kept byte-identical. Surviving home: git history (this file's previous revision) and the seat-founding card. This is the one cut that removes verbatim ruling text — flagged for your eye.
  2. 召唤 bullet: meta-phrase 「延迟权衡明写」 dropped; parked list extended to 审计窗口 (part of this change).
  3. 重锚 bullet tail compressed to 「流程未变,2026-08-26 定流程、2026-08-27 升格定归属」 — both dates and the relation kept in line.
  4. 双射 bullet: the explicit label triple dropped — surviving homes: 职责一/二/三 each name their own label; 「按既有接手协议执行」 dropped — surviving home: the takeover-protocol clauses in SKILL.md.
  5. 收尾 sub-bullet: the landing-chain parenthetical (落地前检 → ready → auto-merge/入队) dropped — surviving home: references/contract-review.md 清标即落地 chain, already pointed to by 职责一.
  6. 决策收件箱: the one-line-reply format parenthetical (「1A 2B …」;「X, 但…」= 附带条件随执行落地) dropped — surviving home: references/decision-analysis.md (verbatim, line 14), already pointed to by 基本原则.
  7. 职责三 ledger bullet: the examples list (Settings/Routines UI 操作、手点、凭据一类) and (发现即停放) dropped; the definition 「决定已做、只剩一次 GitHub 之外人工动作的态」 kept — surviving home: references/state-machine.md awaiting section (各席只入态).
  8. 出口执行 bullet: 「无机器出口,by construction」and the executor-seat supersession note dropped — surviving home: references/state-machine.md awaiting-出口 clause, which carries the invariant and the 2026-08-27 attribution verbatim; the bullet now points there.
  9. 决裁半边 ledger entry: the 2026-08-26 quote replaced by a pointer — surviving home: the SKILL.md Director-seat paragraph carries the same quote verbatim (「skills 和决裁的问题,还是由skills席统一人工处理,我会要求你处理某个仓的skills和决裁。」).

Gates (run in the worktree at 4c8ac62; every exit captured before any pipe)

  • pnpm check:pm-skill-ratchet — exit 0 (self-test exit 0); verdict lines quoted above.
  • pnpm check:pm-skill-id-lint — exit 0: "check-skill-id-lint: 23 file(s) clean".
  • pnpm check:skill-frame-sync — exit 0: "4 copies of the decision frame are structurally isomorphic across 3 files"; the decision frame itself untouched.
  • pnpm check:skill-frame-freshness — exit 0: "the frame itself is unchanged".
  • pnpm check:pm-governed-prose — exit 0: "2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others."
  • Derived union — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, derivation stderr pinned to "the tree of 'objectstack-ai/objectstack' at commit 4c8ac62". All nine matched families run:
    • pnpm check:agent-test-spelling — exit 0.
    • pnpm check:doc-authoring — exit 0: "391 files clean — no bare metadata literals" / "48 published skill files clean".
    • pnpm --filter @objectstack/lint run check:doc-formula-expressions — exit 0 after building the dependency closure (@objectstack/formula, @objectstack/lint): "22 record-scoped formula example(s) across 424 files / 1450 TS blocks judged clean".
    • pnpm check:pm-governed-merges — exit 0: "check-governed-merges --self-test: 204 assertions".
    • check-governed-queue-guard — CI-only in this container: NOT MEASURED locally; CI runs it on this PR.
  • pnpm check:nul-bytes — exit 0: "scanned 7055 text file(s) … no raw ASCII control bytes".
  • No changeset: protocol-text-only PR under .claude/skip-changeset label applied (this repo's real mechanism; nothing publishes).

Acceptance replay (a Director summon under the new text)

The fourth duty describes current practice, already live: the first consolidated run executed 2026-08-27 about 13:00Z — 7 governed merges enumerated across the 2 checked-out repos, all attributed via MCP, presented inside the summon's adjudication batch, and the anchor tips recorded on the Director seat post's 说明 section. A summon replayed under this text does exactly that: one --since-ref-anchored sweep from those recorded tips (the script itself prints the next-round flags; it stores nothing), the list folds into the batch one line per entry for recognize y/n, an unrecognized entry files as needs-user-decision in the same stroke, and the new tips are re-recorded on the seat post. The lane round report is unchanged except the pointer sentence.

Generated by Claude Code


Generated by Claude Code

…window on the Director seat
Charter change ruled by the maintainer 2026-08-27 (「合并审计归总监那件事,同意你的建议」):
lane seats keep the per-round sweep as early warning; the Director seat gains 职责四 — the
authoritative consolidated audit, --since-ref-anchored at the previous audit's recorded tips,
folded into the adjudication batch with per-entry recognition, unrecognized entries filed as
needs-user-decision in the same stroke, tips re-recorded after each run. INCOMPLETE (exit 2)
reports as INCOMPLETE; in-container 403 attribution completes via MCP per entry. No new label,
no cron. Both files stay at their zero-headroom ratchet ceilings (net 0 per file); the cut
ledger with each cut's surviving home is in the PR body.
@os-litantos-litant added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 27, 2026 — with Claude
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 27, 2026
@os-litant
os-litant marked this pull request as ready for review August 27, 2026 14:23
@os-litant
os-litant enabled auto-merge August 27, 2026 14:23
@os-litant
os-litant added this pull request to the merge queueAug 27, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 27, 2026
@os-litant
os-litant added this pull request to the merge queueAug 27, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Governed-merge audit: detection stays every-seat, the authoritative window and disposition move to the Director seat (no new label)

3 participants

@os-litant@os-zhuang@claude