Repository navigation
Commit a539ba8
docs(pm): give the PR-body door its no-footer rule and the relay header its measured reason (#31070)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67x5iMSPe1iADWtxYk1oUUzqp)_
Fixes #31059
Clause-②: no
Metadata-protocol: none
`dispatch-gates --tier` reads no path-derived model mandate for these
two paths ("the tier stays the PM's per-card judgment call"). This card
ran on the project's default model; had a MANDATORY model tier been
read, it would be waived by the maintainer's standing order in this
project (2026-11-03). The dispatching seat runs the contract review.
## 维护者速读
- 改了什么:`seat-post-protocol.md` 的 PR 正文门行之后加一行「不送页脚」并指向
`platform-readings.md` 中继行;`dispatch.mjs` 头注把「改 PR
正文会被追加裸页脚」这一过时理由改为中继读回 `identical` 与尾署名规则。
- 为什么改:#31058 已记下中继 `issue_patch` 存 = 送、无追加;头注理由与之相抵,而 PR 正文门行本身没写不送页脚。
- 风险与回滚:只改内部 agent 规程文字与一段脚本注释,不发包(`skip-changeset`),两文件行数不变;回滚即 revert。
- 先看:`seat-post-protocol.md` L31–32(门行与新行);`dispatch.mjs` L454–456(头注)。
- 两分钟验证:`node scripts/pm/check-skill-line-ratchet.mjs`,预期退出
0,`seat-post-protocol.md` 88 行(上限 88)、每行 ≤120 B。
- 需要你做的:无,席位落地。
## What changes
**Item 1, `scripts/pm/fleet-write/dispatch.mjs` header L454–456 (comment
only, no code).** The comment said an edit of a pull's body "gets the
bare footer block appended after the trailer (`platform-readings.md`,
the edit side), so send no footer of your own". The advice stays; the
reason now states what the code does:
- The relay's read-back judges each body it sent with post-stamped's
`classifyReadBack` (`judgeStoredBody`), and the class `identical` is
`stored === sent` (`declaredNormalisation`,
`scripts/pm/post-stamped.mjs` L2843). A body with a footer appended
would read `footer-appended`, not `identical`. `platform-readings.md`
L343 (added by PR #31058) records that the relay `issue_patch` reads a
PR body back `identical`, nothing appended.
- A footer sent after the trailer becomes the body's last non-empty
line. `readPrBodyTrailer` reads the trailer off that line only, so such
a body carries neither the signature line nor the trailer, and the
header's second rule refuses it as usage (2).
The comment now reads (3 lines, as on `main`):
```text
`comment_edit` takes no trailer: a comment is a post, never a pull request body. Send no footer of your own: the
read-back reads a pull's edited body `identical`, stored === sent, nothing appended (`platform-readings.md`, the
relay `issue_patch` line), and a footer after the trailer leaves a body the second rule above refuses.
```
**Item 2, `.claude/skills/pm-dispatch/references/seat-post-protocol.md`
L31.** L31 stays byte-identical (120 B, at the cap). The no-footer rule
goes on a new adjoining line, L32 (103 B):
`- PR 正文不送页脚:中继 issue_patch 存 = 送、无追加(platform-readings.md 中继行)。`
The 120 B cap and the file's 88-line ceiling are unchanged.
### Deleted restatement (deletion only; each fact's surviving home)
The added line is paid for by deleting one whole line in the same file,
〈座位 Routine 创建〉 L63 on `main` (67 B):
`- ⛔ 不取会话看起来起来了;零产出即技术性失败。`
| Fact in the deleted line | Surviving home (same file, same section) |
|---|---|
| Don't judge the smoke test by the session looking up | L62 on `main`
(now L63): `创建后先手动 fire 一轮烟测,判据取 GitHub 上的产出:标签写入、审计评论、座位贴编辑。` — the
criterion is GitHub output, which the deleted half only restated in the
negative |
| Zero output means the Routine failed | L60 on `main` (now L61):
`create_trigger 开新会话的 Routine 拿不到 GitHub 工具、零产出;⛔ 不把它当座位 Routine 在跑。`
and L64 on `main` (now L64): `回滚 = delete_trigger + 清空座位登记 + 失败注记。` |
PR #31058's body said the file had no restatement to pay with. This is
the one I found on a full read; the seat's contract review judges
whether it holds. No script or test pins the deleted text (`grep` for
看起来起来 and 技术性失败 across `.claude`, `scripts`, `docs` and AGENTS.md finds
only this line).
## Tests
None: the diff is instruction text and one comment, with no runtime
behaviour to test. The gates below are the checks.
## Acceptance notes
### Line budget (`scripts/pm/check-skill-line-ratchet.mjs`, exit 0)
| File | Lines (main → head) | Ceiling | Bytes (main → head) |
|---|---|---|---|
| `references/seat-post-protocol.md` | 88 → 88 | 88 | 7,156 → 7,192 |
| `scripts/pm/fleet-write/dispatch.mjs` (code, not ratcheted) | 3,810 →
3,810 | — | 329,438 → 329,483 |
Every touched line: `seat-post-protocol.md` L31 120 B (unchanged), new
L32 103 B, deleted `main` L63 67 B. `dispatch.mjs` L454 106 → 115 B,
L455 110 → 115 B, L456 74 → 105 B. The ratchet prints
`seat-post-protocol.md is 88 lines (ceiling 88; headroom 0)`.
### Sweep
`pm-dispatch` has no `evals/` directory. The old reason ("appended after
the trailer") appears nowhere else in `.claude`, `scripts`, `docs` or
AGENTS.md; the `dispatch.mjs` self-test case "the platform's footer
block appended lands" tests the classifier's `footer-appended` class and
makes no claim about the relay, so it stays.
## Verification
<details><summary>Local gates on 443b28c: 46 derived, 46 run with exit
0, 0 NOT MEASURED (`dispatch-gates --ran`)</summary>
- `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 46 commands (32 pnpm, 14 direct
node) for the 2 changed paths. Each ran under a 900 s timeout with
`NODE_OPTIONS=--max-old-space-size=8192`, its exit code captured before
any pipe, after building `@objectstack/formula`, `@objectstack/lint` and
`@objectstack/objectql`. All 46 exited 0 on the first run.
- They include `check:pm-skill-ratchet`, `check:pm-skill-id-lint`,
`check:pm-governed-merges`, `check:pm-fleet-write-dispatch`,
`check:pm-post-stamped`, `check:doc-authoring`,
`check:skill-frame-sync`, `check:scripts-symbol-anchors`,
`check-comment-mask-corpus.mjs` and the self-test of
`check-harness-current.mjs`.
- `--ran` printed: `46 derived famil(ies) accounted for — 46 run, 0
NOT-MEASURED (a DERIVED zero — all 46 recorded an exit code and none of
them is 3)`.
</details>
- `node scripts/pm/check-governed-merges.mjs --branch
claude/project-thread-a9cfrb`: GOVERNED, Tier S (席内达档复核落地): `.claude/**`
×1; `scripts/pm/fleet-write/dispatch.mjs` is not on the register; 8
changed lines (+4 / −4), under 3000.
- `node scripts/check-commit-card-trailers.mjs --range
origin/main..HEAD`: exit 0 before every push.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(No schema touched.)
- [x] 2. Every name I added uses the casing for its kind. (No names
added.)
- [x] 3. No formatter ran. (Markdown and one comment; no lintable source
changed.)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. Nothing publishes (`.claude/**` and a `scripts/pm/**` comment),
so the PR takes `skip-changeset`. Both declaration lines are filled in
above.
- [x] 6. `packages/spec` not touched; nothing to regenerate.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English. (The 维护者速读 section is
Chinese, per the lane template.)
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J8VVAnnUAET63Ji7fAEG6v
Co-authored-by: Claude <noreply@anthropic.com>1 parent e0b8c2c commit a539ba8
2 files changed
Lines changed: 4 additions & 4 deletions
File tree
- .claude/skills/pm-dispatch/references
- scripts/pm/fleet-write
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
63 | | - | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
451 | 451 | | |
452 | 452 | | |
453 | 453 | | |
454 | | - | |
455 | | - | |
456 | | - | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
457 | 457 | | |
458 | 458 | | |
459 | 459 | | |
| |||
0 commit comments