Skip to content

docs(pm-dispatch): point the PR-body door's three pointers at it without restating the no-footer rule - #31079

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-smbdef
Nov 7, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-smbdef

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

Fixes #31071

Clause-②: no
Metadata-protocol: none

dispatch-gates --tier reads a MANDATORY model tier for .claude/skills/pm-dispatch/SKILL.md (clause ① of the model-tiering ruling); it is waived by the standing order of the maintainer in this project (2026-11-03), and this card ran on the project's default model. The dispatching seat runs the contract review.

维护者速读

What changes

Each pointer keeps pointing at the door; only its own copy of the rule goes.

File · line main head
.claude/skills/pm-dispatch/references/rest-channel.md L17 …(`seat-post-protocol.md` 正文行,不送页脚)。 …(`seat-post-protocol.md` 正文行)。
.claude/skills/pm-dispatch/references/platform-readings.md L290 - ⇒ 该正文改走 `seat-post-protocol.md` 的 PR 正文行,不送页脚。 - ⇒ 该正文改走 `seat-post-protocol.md` 的 PR 正文行。
.claude/skills/pm-dispatch/SKILL.md L313 (Metadata-protocol: row of the claim template) …through the PR-body line of `references/seat-post-protocol.md`, with no footer (`references/platform-readings.md`)) …through the PR-body line of `references/seat-post-protocol.md`)

The rule's home, unchanged: seat-post-protocol.md L32 - PR 正文不送页脚:中继 `issue_patch` 存 = 送、无追加(`platform-readings.md` 中继行)。, under the door line L31. L32 also carries the platform-readings.md pointer that SKILL.md L313 dropped, so no reader loses the path to the reading.

Tests

None: the diff deletes restated instruction text, 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) Touched line bytes (main → head)
references/rest-channel.md 82 → 82 82 7,739 → 7,726 L17 118 → 105
references/platform-readings.md 458 → 458 458 47,039 → 47,026 L290 78 → 65
SKILL.md 319 → 319 319 32,229 → 32,177 L313 750 → 698

Net lines 0 per file; no ceiling or pin moves. SKILL.md L313 sits inside the claim template's ```text fence (L302–L319); the ratchet's own classifyLine reads it as class fence, exempt from the 120 B cap, before and after. The other two touched lines are prose under 120 B on both sides. Bytes measured without the newline.

Sweep (closes the chain #31050 → #31059 → #31071)

Before editing, on origin/main 3f61e4f: git grep -nE "PR 正文行|PR-body line|正文行|不送页脚|no footer" -- .claude, plus a wider 页脚|footer pass and every seat-post-protocol pointer.

  • Copies of the rule found: exactly the three lines above. Fixed here.
  • .claude/agents/os-dev.md L66 points at seat-post-protocol.md without spelling the rule. Left.
  • platform-readings.md L332–353 and L402–407 (including L335, L339, L405) are measurement readings, not pointers. Left.
  • The other 正文行 hits (os-dev.md L276–277, SKILL.md L92 and L109, dispatch-runbook.md L163, state-machine.md L27, triage-duties.md L24) mean a body line in general, not the PR-body door. Left.
  • os-dev.md L397 and L405 are the attribution-footer clause homed in AGENTS.md (不循环重贴页脚), a different rule. Left.
  • Other seat-post-protocol pointers (lanes/director.md L83, seat-lifecycle.md L23 and L63) point at other sections and spell no footer rule. Left.
  • pm-dispatch has no evals/ directory.

After this PR, git grep -nE "不送页脚|no footer" -- .claude finds only the home (seat-post-protocol.md L32) and the readings (platform-readings.md L335, L339, L405).

Verification

Local gates on 2125972: 22 derived, 22 run with exit 0, 0 NOT MEASURED (`dispatch-gates --ran`)
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 22 commands (17 pnpm, 5 direct node) for the 3 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 22 exited 0 on the first run.
  • They include check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-governed-merges, check:pm-governed-prose, check:doc-authoring, check:skill-frame-sync, check-comment-mask-corpus.mjs and the self-test of check-harness-current.mjs.
  • --ran printed: 22 derived famil(ies) accounted for — 22 run, 0 NOT-MEASURED (a DERIVED zero — all 22 recorded an exit code and none of them is 3).
  • Also run, outside the derived list: pnpm check:pm-settings-deny-roster (exit 0), the one artifact-roster family whose roster sits under .claude.
  • node scripts/pm/check-governed-merges.mjs --branch claude/project-thread-smbdef: GOVERNED, Tier S (席内达档复核落地): .claude/** ×3; 6 changed lines (+3 / −3), under 3000.
  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0 before every push.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (No schema touched.)
  • 2. Every name I added uses the casing for its kind. (No names added.)
  • 3. No formatter ran. (Markdown only.)
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. Nothing publishes (.claude/** only), so the PR takes skip-changeset. Both declaration lines are filled in above.
  • 6. packages/spec not touched; nothing to regenerate.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English. (The 维护者速读 section is Chinese, per the lane template.)
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J8VVAnKJn5WEgnj43PxAB8

…out restating the no-footer rule

The no-footer rule for PR bodies lives on seat-post-protocol.md's PR-body
line. rest-channel.md, platform-readings.md and the SKILL.md claim template's
Metadata-protocol row each carried their own copy beside the pointer; drop the
copies so the rule has one home. Line counts unchanged.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAnKJn5WEgnj43PxAB8
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 7, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Nov 7, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract-review-claim: session_01J8VVAj7CvjkGXvgXzd6RZ7 · head 2125972 · 2026-11-07T03:03Z

The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent. No review seat (lanes/review.md) is seated.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 212597240863bf5bfd56de64d6263a8458197286
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/platform-readings.md, .claude/skills/pm-dispatch/references/rest-channel.md + .claude/skills/pm-dispatch/references/seat-post-protocol.md, .claude/agents/os-dev.md, AGENTS.md, scripts/pm/check-skill-line-ratchet.mjs, scripts/pm/check-governed-merges.mjs

Read: card #31071 (body, triage, claim), PR #31079 (body, file list, net diff origin/main...refs/seat3/pr-31079: 3 files, +3 / −3, merge base 3f61e4f8; main has moved one commit since, touching none of the cited paths), the head's check-runs, and the cited files at origin/main and the head. Nothing built, run or re-run.

① Derived judgments

Each line still reaches the door. The door on main and at the head (unchanged by this PR): seat-post-protocol.md L31 「PR 正文末非空行署 …,整篇经 dispatch.mjs 的 issue_patch」, with L32 directly under it: 「PR 正文不送页脚:中继 issue_patch 存 = 送、无追加(platform-readings.md 中继行)」.

  • rest-channel.md L17 now reads 「…与 PR 正文单笔 issue_patch(seat-post-protocol.md 正文行)」. Its context is the PR-body issue_patch, so 「正文行」 can only mean the PR-body lines L31–32, the only lines in that file naming issue_patch on a PR body. L32 is 「不送页脚」. Reaches the rule.
  • platform-readings.md L290 now reads 「⇒ 该正文改走 seat-post-protocol.md 的 PR 正文行」, under L289 (the seat edits the body to re-trigger pr-automation.yml). Same landing: L31, then L32. The ⇒ still says what it said before: the flake-reason edit goes through the door, not through raw REST PATCH (which appends a footer, L337).
  • SKILL.md L313 (the Metadata-protocol: row) now ends …through the PR-body line of references/seat-post-protocol.md). That is L31, then L32. Parentheses balance: the row's single (the kind of change … opened before and still closes once at the end.

Nothing unique is lost. What the PR drops from each line: 「,不送页脚」 (rest-channel L17), 「,不送页脚」 (platform-readings L290), and , with no footer (references/platform-readings.md) (SKILL.md L313). The rule is on L32 word for word. The only other content dropped is SKILL.md's file-level pointer to platform-readings.md. L32 carries a narrower pointer to the same file (「platform-readings.md 中继行」 = L343 「中继 issue_patch 不在此列…」). L343 sits inside the 「写侧 · PR 正文」 reading block (L332–353), and it reads as the exception to the list just above it, so a reader on L343 has the footer cells L332–342 in view. The reading stays reachable from the door.

The chain is closed. At the head, git grep over .claude/** and AGENTS.md:

  • 不送页脚|no footer finds only the home (seat-post-protocol.md L32) and three platform-readings cells: L335 (「改侧不送页脚」), L339 (「该格处方是不送页脚」) and L405 (the PATCH on a real issue body). These are measured per-cell readings and the evidence L32 cites. They are not pointers to the door, and the triage did not ask for them to be swept. Not copies.
  • seat-post-protocol pointers: os-dev.md L66 (「席位经 seat-post-protocol.md 代写」) points without spelling the rule. lanes/director.md L83 and seat-lifecycle.md L23 and L63 point at other sections. Plus the three edited lines. None spells the rule.
  • 页脚|footer, other hits: os-dev.md L397–405 and AGENTS.md L427–443 are the attribution-footer rule (the two footer forms, 「不循环重贴页脚」, "Send the footer you want stored … never re-send a body that already carries an appended footer"). That is a different rule, homed in AGENTS.md. platform-readings L332–353 and L402–407 are readings.
  • 正文行 hits outside the door's pointers (os-dev.md L276–277, SKILL.md L92 and L109, dispatch-runbook.md L163, state-machine.md L27, triage-duties.md L24) mean body lines in general.
  • PR 正文|PR body across .claude/**: none of the other hits points at the door or spells a no-footer rule for body edits.

The door is now the rule's only home, and none of the copies the triage asked to sweep is left. Every factual claim in the PR body's "What changes", "Sweep" and "Line budget" sections matches what I read.

No false statement, no lost unique fact: no must-fix here.

② Semver level

skip-changeset is right: the diff is .claude/** only and publishes nothing. Clause-②: no is right: there is no published schema, protocol or capability surface in the diff. Metadata-protocol: none is right: nothing a metadata author can write changes. The PR body carries both declaration lines at line start, and Check Changeset concluded success on this head.

③ Boundary flags

  • Claim surface: rest-channel L17, platform-readings L290, SKILL.md L313. The diff touches exactly those three lines (one hunk per file, −1 / +1 each). No other line and no other file is touched, so it stays inside the claim.
  • Tier: every path is under .claude/ in objectstack. check-governed-merges.mjs GOVERNED_SURFACES row claude-tree (.claude/**, tier: GOVERNED_TIER_S, tierRepos: ['objectstack']) applies to all three paths, and no Tier H row is hit. The ALL-not-ANY rule therefore gives Tier S (席内达档复核落地). Diff size is 6 changed lines, far under HUMAN_MERGE_LINE_THRESHOLD 3000. This matches the PR body's reading. Governed Surface Queue Guard concluded success on this head.
  • Check-runs on 2125972, read at 2026-11-07T03:06Z: 43 runs. 14 success, 22 skipped, 0 failure. 7 in_progress: Type Check · source gates, Type Check · consumer gates, Lint · repo & tooling gates, Lint · docs & code guards, Lint · PM dispatch-gates, Lint · ESLint, Lint · CI, release & engine gates. Not waited on.

④ Design judgment

  • One home per rule: holds. The edit-side no-footer rule for PR bodies now lives once, on seat-post-protocol.md L32, under its door. Its three pointers point and no longer restate it. The attribution-footer rule stays homed in AGENTS.md (mirrored by os-dev's create-side forms), which is a different rule. The cell prescriptions in platform-readings are the measured evidence the home cites. There is no eval prompt to check against: .claude/skills/pm-dispatch has no evals/.
  • Line budget (ratchet at origin/main, unchanged by this PR):
    • CEILINGS: SKILL.md 319, platform-readings 458, rest-channel 82. The head has 319 / 458 / 82 lines, the same as main. Net 0 per file, headroom 0, no row moved.
    • MAX_LINE_BYTES = 120. rest-channel L17 goes from 118 to 105 B and platform-readings L290 from 78 to 65 B. Both are prose under the cap before and after.
    • SKILL.md L313 goes from 750 to 698 B and is fence-exempt as classifyLine reads it. Front matter is L1–L14. The file's only isFence lines (/^\s*(```|~~~)/) are L302 (```text) and L319 (```). So advanceState carries fence: true from L303 to L318, and classifyLine returns 'fence' for L313 before any byte or quote test. That holds before and after the edit.
    • No table row is touched, so the MAX_TABLE_ROW_BYTES pins are unaffected.
  • The change holds against the code it cites. The door text it relies on is on main and unchanged.

Must-fix: none. Should-fix: none.

Implemented-by: claude/project-thread-smbdef
Reviewed-by: session_01J8VVAj7CvjkGXvgXzd6RZ7

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7

维护者速读

席位核对 — ACCEPT · domain:skills#3 · head 212597240863bf5bfd56de64d6263a8458197286

  1. 形态: draft → main,Fixes #31071;skip-changeset,Clause-②: no,Metadata-protocol: none;作者 objectstack-fleet[bot];3 个文件各 1 行,恰为认领面。
  2. 前提实测: 席位、线程、复核三方各自 grep .claude/** 与 AGENTS.md:改后「不送页脚」只剩家 L32 与读数格 L335/L339/L405;os-dev.md L66 只指不复述;归属页脚规则(AGENTS.md、os-dev.md L397–405)是另一条规则。链已扫清。
  3. 门禁(钉 head 21259724): dev 派生门禁 22 条全部 exit 0;check-runs 45 条全部完成,23 success、22 skip、0 failure。check-governed-merges --pr 31079:Tier S(.claude/** ×3),6 行。复核:全量 PASS(6701448602),无 must-fix、无 should-fix。
  4. 接受的偏差: 无。
  5. 范围外去向: 无。
  6. 落地条款: Tier S。本席翻 ready 并开 auto-merge;红或踢出照 landing-operations.md 在本落地窗口处置。

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 7, 2026 03:10
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 7, 2026
Merged via the queue into main with commit cb8f520 Nov 7, 2026
46 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-smbdef branch November 7, 2026 03:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pm-dispatch: three pointers still spell the no-footer rule that seat-post-protocol L32 now carries

1 participant