Repository navigation
Commit fb6fb24
docs(pm-dispatch): director duty one puts to the maintainer only the landings no authorized account approved, one plain line each (#24259)
Fixes #24241
Clause-②: no
## What this changes
One file, `.claude/skills/pm-dispatch/references/lanes/director.md`,
section 〈职责一:契约复核记录事后审计与抽查(可选)〉: three lines inserted directly under the
enumeration bullet, where the charter already speaks of the audit.
Nothing else in the file moves.
```diff
- 召唤时枚举近期落地的受管 PR 及其 `## Contract review` 记录,查复核质量与漏网。
+- 呈维护者认定的只限无 `GOVERNED_APPROVERS` 账号 `APPROVED` review 的落地,受管路径与行数肢同。
+- 有者只记摘要台账不呈;所呈每行一句白话讲改了什么,读自 diff 或正文,⛔ 不只凭标题。
+- 出处:维护者 2026-10-18 令,原话载卡 24241 正文。
```
- **Rule 1 (card Scope 1).** The rows put to the maintainer for
recognition are limited to landings, governed path and size limb alike,
that carry no `APPROVED` review from an account in `GOVERNED_APPROVERS`.
The charter names the constant, never its account list, so the rule
follows the queue guard (SKILL.md: 「批准判定单源 = 队列守卫常量
`GOVERNED_APPROVERS`」). A landing that carries such a review is recorded
in the summary ledger and is not put to the maintainer.
- **Rule 2 (card Scope 2).** Each row put to the maintainer carries one
plain-words line on what the change did, read from the diff or the body,
never from the title alone.
- **Provenance (card Scope 3).** One line in the references' own `出处:`
convention (as `instrument-discipline.md` writes it): the maintainer's
order of 2026-10-18, quoted verbatim in this card's body. There is no
`#` before the number and no number inside an operative sentence (`pnpm
check:pm-skill-id-lint` reads this file). The card body is the filing
record. The card has no separate filing comment (its two comments are
the claim and the dispatch order), so the line cites the card.
- **Out of scope (card Scope 4).**
`scripts/pm/check-governed-merges.mjs` is untouched: no new column,
gate, flag or script. Its sweep prints `merged_by` only, so the seat
reads each candidate row's reviews through REST at summon time. The
charter does not spell that clause out because it would cost a fourth
line (see the line budget below).
## How the new rule would have changed summon 44's batch
Ledger block B on the director seat post (comment 6243622639) put five
bare rows to the maintainer. I read each row's reviews through REST in
this session on 2026-10-18:
| Row | Merged by | `APPROVED` by a `GOVERNED_APPROVERS` account | Under
the new rule |
|---|---|---|---|
| objectstack 24211 | `os-zhuang` | `os-zhuang`, 2026-10-17T21:21Z |
dropped: ledger only |
| objectstack 23825 (Version Packages) | `os-zhuang` | `os-zhuang`
twice, 2026-10-17T06:12Z and 07:00Z | dropped: ledger only |
| objectstack 23824 | `os-zhuang` | `os-zhuang`, 2026-10-16T13:39Z |
dropped: ledger only |
| objectstack 23906 | `os-zhuang` | `os-zhuang`, 2026-10-16T12:45Z |
dropped: ledger only |
| cloud 2921 | `hotlong` | none, on the seat's own reading (comment
6227733044: "no governed path, no review"). NOT MEASURED here: the cloud
repository answers 403 to this session | stays: the one row put to the
maintainer |
So four rows drop and one survives. The surviving row would carry one
plain line on what cloud 2921 did (+5,911/−270 over 23 files on the
seat's reading), read from its diff or body. This session cannot read
the cloud repository, so that line is the seat's to write at the next
summon.
A reading note for the seat's contract review, not a re-decision: cloud
2921 was merged by `hotlong`, which is itself an account in
`GOVERNED_APPROVERS`, with no review at all. Under the order as written
(an `APPROVED` review), a merge click is not an approval, so the row
stays. That matches the question the recognition answers under AGENTS.md
Prime Directive 14 ("a merger the maintainer does not recognise"):
`merged_by` names an account, not a principal.
## Line budget
- `director.md`: **66 → 69 lines**, ceiling **72 unchanged**. `pnpm
check:pm-skill-ratchet` prints "director.md is 69 lines (ceiling 72;
headroom 3)". The three new lines are 119, 117 and 59 bytes, inside the
ratchet's 120-byte line cap.
- **Why not net 0, as the order preferred:**
- The ratchet caps every line at 120 bytes, and the enumeration bullet
already spends 104 of them. Neither rule fits in its tail, so each rule
needs its own line and the provenance a third.
- The order makes nothing in 〈职责一〉 redundant, so there is no content to
delete in exchange.
- The order's fallback was to fold L36 into the bullet above it as a
lossless merge. That is a re-wrap bought for new content, which
SKILL.md's ratchet row forbids (「⛔ re-wrap 不得用作筹行,新增以删减付账」) and
`.claude/agents/os-dev.md` repeats. The order says those files win where
they conflict with it. (The two lines together are also over the
120-byte cap.)
- The ruling of record orders all three lines, and they fit the file's
existing headroom, so no ceiling moves and no raise is claimed.
## Verification (at HEAD `b20dbc82`)
Derived after the final commit with `node scripts/pm/dispatch-gates.mjs
--commands --repo objectstack-ai/objectstack`, with no paths. The change
set came from merge base `f5ef054a7`: 1 path, +3/−0. That gives 17
commands. I ran all 17 locally and captured each exit code before any
pipe:
| Command | Exit | Verdict line (excerpt) |
|---|---|---|
| `node scripts/check-closing-keyword-parity.mjs` | 0 | OK (3 parsers
agree on all 9 keywords …) |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | 40
assertions, 5 mutations … driven to red |
| `node scripts/check-comment-mask-corpus.mjs` | 0 | 9457 files, 0
disagree, 0 unparseable |
| `node scripts/pm/check-harness-current.mjs --self-test` | 0 | all 26
cases passed |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 | 22 record-scoped formula example(s) … judged clean |
| `pnpm check:agent-test-spelling` | 0 | 0 violations |
| `pnpm check:cross-package-test-inputs` | 0 | 31 package(s) read
outside themselves, all declared |
| `pnpm check:doc-authoring` | 0 | 53 published skill files clean … no
growth |
| `pnpm check:driver-memory-census` | 0 | every declaration is ledgered
|
| `pnpm check:gitlink-declared` | 0 | 0 gitlink(s) |
| `pnpm check:nul-bytes` | 0 | 12120 text file(s) … no raw ASCII control
bytes |
| `pnpm check:pm-governed-merges` | 0 | --self-test: 500 assertions |
| `pnpm check:pm-skill-id-lint` | 0 | 87 file(s) clean |
| `pnpm check:pm-skill-ratchet` | 0 | director.md is 69 lines (ceiling
72; headroom 3) |
| `pnpm check:refd-timer-probe` | 0 | 9451 source file(s) swept |
| `pnpm check:skill-frame-sync` | 0 | the one declared copy of the
decision frame is internally coherent |
| `pnpm check:watch-hint-literal` | 0 | 74 declaration(s) across 4
rostered name(s) |
- **Reconciliation.** `--ran` printed "17 derived famil(ies) accounted
for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit
code and none of them is 3)".
- **One refusal along the way.** `check:doc-formula-expressions` first
refused with exit 3 (PREREQUISITE NOT MET: `@objectstack/formula` and
`@objectstack/lint` were unbuilt in this fresh worktree). I built them
with `pnpm exec turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint --concurrency=2` under the verify lock
(VERDICT command-exit 0), and the re-run was green.
- **Run beyond the derivation, all exit 0.** `pnpm
check:pm-governed-prose`, `pnpm check:pm-settings-deny-roster` (its
roster lives under `.claude`) and `pnpm check:pm-prior-rulings` (its
header cites `director.md`).
- **Not owed here.** The diff touches no package, so there is no build
closure and no package test. It changes no tested behaviour, so there is
no ablation or reverse verification. `test:repo`, `pnpm lint` and the
type-check lanes run in CI.
## Acceptance notes
- AGENTS.md Prime Directive 14 says the post-merge audit "lists every
governed-surface merge with its approver and merger". Its sweep prints
`merged_by` only; `--pr` mode reads the approval only for the size lift.
This is an observation, not filed: the seat's REST read covers it, and
the card keeps the script as it is. Carrier: none.
- The header of `scripts/pm/check-prior-rulings.mjs` cites
`references/lanes/director.md:45` for the `git grep` prescription. That
line was already at L52 on `main` and is L55 after this PR. This is
comment drift, not filed. Carrier: none.
## 维护者速读(草稿)
**改了什么**:总监席章程「职责一」加了三行。以后请您认定的受管合并,只限没有任何授权账号(`GOVERNED_APPROVERS`)给过
`APPROVED` 的那些;已有授权账号批准的,只记进席位台账,不再呈给您。呈给您的每一行都附一句白话,说明这次改动具体做了什么,从 PR
的改动或正文读出,不只看标题。
**为什么改**:执行您的原话「以后只呈"没有任何授权账号批准"的受管合并,并且每行写一句改了什么。」上一场总监呈了 5 行光秃秃的 PR
编号,其中 4 行您的账号早已批准。按新规则那 5 行只剩 1 行(cloud 2921,没有任何 review),并附一句说明。
**风险与代价(含回滚)**:只改给 agent 读的规则文本,不动代码、门禁或脚本;文件 66→69 行,仍在 72
行上限内。代价:授权账号已批准的落地不再请您过目,只在台账可查。回滚:删掉这一个文件里新加的三行即可。
**席位意见**:
**你要做的**:无需操作。这是 Tier S(`.claude/**`)改动,席位做完契约复核后自行落地。cloud 2921 是
hotlong 合并、但没有 review,按您的原话仍会呈给您;如果您认为合并点击也算批准,告诉席位即可。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QBcLjVCmcWbZEk6qhYMib2)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent ef9557c commit fb6fb24
1 file changed
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
33 | 36 | | |
34 | 37 | | |
35 | 38 | | |
| |||
0 commit comments