Repository navigation
Commit c018f41
docs(pm-skills): the strip prescription costs the session id — name it on the write-side footer cell (#18837)
Fixes #18622
`Clause-②: no`
Written by session `session_01Gqi43smmqjJ5sUrhfoPeKu` on branch
`claude/issue-18622-edit-footer-provenance` — the session id is stated
here, in prose, because this card is about exactly the reason that is
necessary.
This is a re-derivation against the tip plus **one row**, paid in place.
The cell has grown a lot since the card was filed at 09:27Z (PR #18689,
#18713, #18741, #18775, #18808 all landed on this file today), and most
of what the card asked for is already carried.
## The carried-map — six readings against `origin/main` `ad1f94e8ec`
The bands re-derived on this head: the write-side footer cell is
:340–:359, the issue-body cell :409–:414.
| # | reading | verdict | carried by |
|:--|:--|:--|:--|
| a | `POST /pulls` stores the author's session-URL footer verbatim |
**CARRIED** | :350 「尾部已是该块则一字不追加,两通道各实测两向 ⇒ 建侧通道不是变量,判据是送出体尾部。」 read
with :348 「第四形:建 PR 两通道同判 —— 送出体尾部不是 `---` 加页脚块时,追加一条同形页脚。」 — 「同形」 is
what makes the stored block the author's, the session-URL spelling
included |
| b | `PATCH /pulls` appends the BARE form | **CARRIED** | :345 「裸 REST
`PATCH /pulls` 追加一个裸页脚并保留既有 session-URL 页脚,差恰 58 字节。」 and :346
「同路送无页脚正文存回恰一条(平台裸形)⇒ 该格处方是不送页脚,⛔ 不是不重送正文。」 |
| b′ | ⇒ so an edited body silently loses which session wrote it |
**RESIDUAL** — and, as the card states it, *falsified* on this tip |
nothing. See below |
| c | ⇒ durable attribution on an edited body lives in body PROSE, not
in the footer | **CARRIED — in the rule layer, by design** | `AGENTS.md`
:433 「Durable attribution lives in body prose or a comment.」 and
`.claude/agents/os-dev.md` :403 「耐久归属写进正文散文或评论,⛔ 不循环重贴页脚;完整读数住 AGENTS.md
同条。」 Nothing in :340–:359 / :409–:414 carries it, and nothing should |
| d | an issue-body `PATCH` synthesises one bare block on a block-less
body and re-anchors a bare-block tail to one | **CARRIED** | :412 「issue
正文 `PATCH` 识别按整块:送全块或不送页脚都存回恰一条,已有页脚归一末尾不复制。」 — both arms in one row;
with :411 for the create-side +58 and :413 for the rule-less
counter-case (total two) |
| e | a `PATCH` appends a bare block under a session-URL tail |
**CARRIED** | :345, verbatim above — the bare one is appended, the
session-URL one is kept, difference exactly 58 bytes |
| f | `POST /pulls` stores a session-URL tail byte-exact | **CARRIED** |
:350 for the 「一字不追加」 half. The trailing-newline trim reported beside it
in PR #18786 (10841 sent / 10840 stored) is :356 「平台在尾部 `---`
前后正反两向归一空行:比对正文只按首个差异偏移,⛔ 不按长度。」 — which is precisely why the file
already refuses to let length be the verdict;
`trailing-newline-stripped` is a declared clean class in
`scripts/pm/post-stamped.mjs` |
### Why (c) is not written into the fact table
The card itself says 「这不是新规则」, and the ratchet's own maintainer ruling
for `references/` reads: *「one rule per ≤120-byte line, no rule already
stated in SKILL.md」*. `AGENTS.md` :433 already states the prescription,
and `.claude/agents/os-dev.md` :403 explicitly routes the full reading
to it — 「完整读数住 AGENTS.md 同条」. Writing 「耐久归属写正文散文」 into the fact table
would be a third copy of a rule that this corpus has deliberately given
exactly one home, the same content-ownership call the 2026-09-01 ruling
made for the red-window rule (「红窗规则由 `platform-readings.md` 配额段独家持有」).
So the new row **points** at `AGENTS.md` instead of restating it.
### Why (b′) is the residual, and why the card's own wording needed
correcting
The card reads 「一次正文编辑会静默丢掉「是哪个会话写的」」 — unconditionally. On this tip
that is **false as stated**, and :345 is what falsifies it: an
un-stripped `PATCH /pulls` **keeps** the existing session-URL block and
adds a bare one, +58 bytes — attribution intact, merely duplicated. The
loss happens on exactly one path: the one the cell itself prescribes at
:346–:347 (send no footer, strip *both* spellings). Then the stored
body's only attribution block is the platform's bare form, which carries
no session id.
A reader can get this wrong in both directions today: from :345 alone,
"my session-URL footer is preserved, attribution is safe"; from the card
alone, "any edit loses it". The residual sentence is the price tag on
the cell's own prescription, and nothing in the cell states it.
## The one row, and what paid for it
**Added**, at :348, immediately after the two rows whose prescription it
prices (118 bytes):
```
- ⇒ 代价是归属:裸形无 session id,按此剥净的 PR 正文不载明哪个会话写的;另置见 AGENTS.md。
```
**Retired**, the old :353 (114 bytes):
```
- 删页脚那条读数是唯一不合此判据的观察,通道已拒 ⇒ 活通道无反例,写后仍必回读。
```
Where its content survives, all of it inside the same cell:
| clause of the retired row | survives at |
|:--|:--|
| 「删页脚那条读数」 + 「通道已拒」 | :344 「MCP `update_pull_request` 包装器删掉 PR
正文的页脚块;该通道锁 1 已拒,读作历史。」 |
| 「活通道无反例」 | the same :344 — 「读作历史」 is what makes the single deleting
observation a dead-channel one |
| 「写后仍必回读」 | :355 「⇒ 形态随动作与送出体尾部变,改侧还随通道变;⛔ 不由任一条推其余,写后必回读。」 and :343 「⇒
PR 正文页脚不带前置横线,且写后回读正文 —— 那是唯一检测手段;评论两形皆可。」 |
⛔ No re-wrap was used as currency; ⛔ no ceiling was raised; net line
change is **zero**. Nothing outside the write-side footer cell was
touched — `git diff --stat` is `1 insertion(+), 1 deletion(-)`.
## Reserved bands — verified by content, md5 before and after
| band | content | md5 before | md5 after |
|:--|:--|:--|:--|
| :10–:12 | #18469 PR-A (timeline `added_to_merge_queue` rows) |
`4b1a925b6f6004ebd8bf05ea4f477d24` | `4b1a925b6f6004ebd8bf05ea4f477d24`
|
| :29 | PR #18775's zero-legacy-status row |
`9a1ac5fab8b1c0351d95472397eb1614` | `9a1ac5fab8b1c0351d95472397eb1614`
|
| :209–:215 | PR #18666's band — its one hunk on this file, confirmed
from `/pulls/18666/files` (1/1, context :209–:215, changed line :212) |
`88505120d3f807422999b1e17e9e1266` | `88505120d3f807422999b1e17e9e1266`
|
| :432 | the `[Self-Approval]` row | `ed771ed2703b2ee5bcb02f29eddf4844`
| `ed771ed2703b2ee5bcb02f29eddf4844` |
All four byte-identical. Line numbers are unmoved too: the insert lands
at :348 and the retirement at the old :353, so every line from :354 on
keeps its number.
## The ratchet
```
before: .claude/skills/pm-dispatch/references/platform-readings.md is 466 lines (ceiling 466; headroom 0)
after : ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 466 lines (ceiling 466; headroom 0)
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0)
node scripts/pm/check-skill-line-ratchet.mjs :: exit 0
```
## Derived gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` from the worktree, no hand-fed path list.
Change set: 1 path,
`.claude/skills/pm-dispatch/references/platform-readings.md`, three-dot
against merge base `ad1f94e8e`. Every exit code captured
redirect-then-`$?`.
```
0 node scripts/check-closing-keyword-parity.mjs
0 node scripts/check-closing-keyword-parity.mjs --self-test
0 node scripts/check-comment-mask-corpus.mjs
0 node scripts/pm/check-governed-queue-guard.mjs --self-test
0 node scripts/pm/check-harness-current.mjs --self-test
0 pnpm --filter @objectstack/lint run check:doc-formula-expressions (SECOND run — see below)
0 pnpm check:agent-test-spelling
0 pnpm check:doc-authoring
0 pnpm check:driver-memory-census
0 pnpm check:nul-bytes
0 pnpm check:pm-governed-merges
0 pnpm check:pm-half-states
0 pnpm check:pm-skill-id-lint
0 pnpm check:pm-skill-ratchet
0 pnpm check:refd-timer-probe
0 pnpm check:required-contexts
0 pnpm check:skill-frame-sync
0 pnpm check:watch-hint-literal
```
`check:doc-formula-expressions` answered **exit 3 PREREQUISITE NOT MET**
on its first run — 「the workspace package `@objectstack/formula` is not
built」, with `@objectstack/lint` unbuilt as a second unmet prerequisite.
Built under the shared verify lock (`bash scripts/pm/os-verify-lock.sh
-c "NODE_OPTIONS=--max-old-space-size=4096 pnpm
--workspace-concurrency=2 --filter '@objectstack/lint...' --filter
'@objectstack/formula...' build"`, `VERDICT command-exit 0 · held the
lock 152s · waited 0s`) and re-run: **the 0 above is that second run.**
Reconciliation, `--ran` with a code recorded per family:
```
✓ dispatch-gates --ran: 18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED
(a DERIVED zero — all 18 recorded an exit code and none of them is 3).
```
One family was run beyond the derived union, because the derivation
marked its roster ⛔ *「roster under .claude, which one of your paths is
in」* and said the silence is not evidence in either direction:
```
0 pnpm check:pm-settings-deny-roster
```
Repo-wide, at the final commit `deaa1d0fd7`:
```
0 pnpm lint (node --stack-size=4000 eslint . --no-inline-config)
```
Byte discipline: `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` over the
edited file returns no hits (exit 1), beyond `check:nul-bytes` above.
## Out of scope, noted here and reported to the seat
**To file (class a, a fact-table row a merged PR falsified).** :357
reads 「送全块即触发该归一 ⇒ `post-stamped` 的 `body` 档把这点空白判 `mutated`,净零字节良性告警。」
PR #18786 (#18693) landed at `94b3f37be3`, on this head: the body-mode
trailing-rule re-anchor is now its own declared clean class
`footer-re-anchored`, exit 0, printing `read-back: clean`, and
`body_mutated` is false. So that row is wrong on both the class word and
「告警」. It is a different reading in a different part of the cell, it
needs a fresh measurement rather than a mechanical rewrite, and this
card's dispatch bounds the diff to the residual — so it is reported, not
fixed here. Dedupe words: `post-stamped body mutated` ·
`footer-re-anchored` · `platform-readings 357` · `classifyReadBack
class` · 「净零字节良性告警」.
**Noted, not filed.** #18686's create-side tension (:343's 「PR
正文页脚不带前置横线」 against :348's fourth form) was read and deliberately left
alone — it is the next card on this cell and its controlled comparison
was not run here. Successor: card #18686, already open and queued behind
this one.
## Verification method note
This PR body was created with a tail of blank line + rule + the
session-URL footer block, which is :350's measured no-append shape on
the create side and `AGENTS.md`'s prescribed form — `AGENTS.md` wins
over :343 where the two differ, per its own precedence line. The body
was read back after the write.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 2326eab commit c018f41
1 file changed
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
345 | 345 | | |
346 | 346 | | |
347 | 347 | | |
| 348 | + | |
348 | 349 | | |
349 | 350 | | |
350 | 351 | | |
351 | 352 | | |
352 | 353 | | |
353 | | - | |
354 | 354 | | |
355 | 355 | | |
356 | 356 | | |
| |||
0 commit comments