Skip to content

Commit a539ba8

Browse files
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/seat-post-protocol.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
- 写侧刷新三时刻:派发、收班、暂停或交接前;时间戳恒取自 `scripts/pm/post-stamped.mjs`。
3030
- 帖与卡正文首行恒为署名 `LANE#N · ACCOUNT · SESSION`;缺即写工具拒发(`post-stamped.mjs` 头注)。
3131
- PR 正文末非空行署 `<!-- signed: LANE#N · ACCOUNT · SESSION -->`,整篇经 `dispatch.mjs` 的 `issue_patch`。
32+
- PR 正文不送页脚:中继 `issue_patch` 存 = 送、无追加(`platform-readings.md` 中继行)。
3233
- 刷新前回执敲门;`--body` 拦截:评论晚于末次戳 ⇒ `--ack-through=ID`;空座欠账无卡号 ⇒ 拒写。
3334
- 耐久状态只住正文或以 App 写入;正文守中继上限 60,000 字节,超大贴由半状态巡查浮出。
3435
- 协议升级迁移状态、或巡检发现正文不符时,当场改正文 + 审计评论。
@@ -60,7 +61,6 @@
6061
- `create_trigger` 开新会话的 Routine 拿不到 GitHub 工具、零产出;⛔ 不把它当座位 Routine 在跑。
6162
- 模型不能经 API 钉住,同样在 UI 钉;Routine 继承环境默认模型,环境默认变了它跟着变。
6263
- 创建后先手动 fire 一轮烟测,判据取 GitHub 上的产出:标签写入、审计评论、座位贴编辑。
63-
- ⛔ 不取会话看起来起来了;零产出即技术性失败。
6464
- 回滚 = `delete_trigger` + 清空座位登记 + 失败注记。
6565
- 档位按职责挑,⛔ 不按重要性挑;Routine 席的档位与 cron 是维护者在 UI 上的可调项。
6666
- 项目席巡查默认每小时(总监席无);存根记 `Patrol: TRIGGER_ID · CRON`、`Mailbox: PR #n`,放宽注由。

‎scripts/pm/fleet-write/dispatch.mjs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,9 @@
451451
* The read runs after the packer and BEFORE the dry-run exit, so a dry run refuses what the send would; it
452452
* needs the token and the proxy route the send needs, and the process re-execs for it the way the send does.
453453
*
454-
* `comment_edit` takes no trailer: a comment is a post, never a pull request body. The stored body is the
455-
* platform's, not this door's: an edit of a pull's body gets the bare footer block appended after the trailer
456-
* (`platform-readings.md`, the edit side), so send no footer of your own.
454+
* `comment_edit` takes no trailer: a comment is a post, never a pull request body. Send no footer of your own: the
455+
* read-back reads a pull's edited body `identical`, stored === sent, nothing appended (`platform-readings.md`, the
456+
* relay `issue_patch` line), and a footer after the trailer leaves a body the second rule above refuses.
457457
*
458458
* ## Exit codes — capture them BEFORE any pipe
459459
*

0 commit comments

Comments
 (0)