docs(pm): re-key H64 rationale to the account-bound token class - #18444
Conversation
H64's header docblock and its runtime message sourced the write identity to the CHANNEL, quoting a sentence that no longer exists in rest-channel.md, and explained the exposure half with "the token class is handed to a session at start rather than chosen at write time". The landed fact is the opposite: the class follows the Claude Code ACCOUNT, is read back from each write, and can flip between two writes of one session with no seat act behind it. Prose only. What H64 flags, how it flags it, and every predicate are untouched; the three self-test cases that pinned the retired strings move with them and the case count is unchanged at 4270. Claude-Session: https://claude.ai/code/session_01HPfcjvF23QBoBj7P47DDxs Co-authored-by: Claude <noreply@anthropic.com>
…4-rationale-account-bound-class
Contract reviewServed-tier: Skills seat, ① Derived judgments
② Semver levelNone owed: nothing publishes; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
Landing provenance — skills seat, Generated by Claude Code |
Fixes #18393
H64's rationale sourced the write identity to the CHANNEL and quoted 「REST 按会话为
claude[bot]或用户,MCP 恒用户」 from.claude/skills/pm-dispatch/references/rest-channel.md. That sentence no longer exists there:git grep '按会话为' origin/main -- .claude/skills/pm-dispatch/references/returns nothing, and the control word按账号hitsrest-channel.md:54(「actor 记令牌类,按账号非会话、逐写回读;见配额段,MCP 恒用户」). The landed fact is.claude/skills/pm-dispatch/references/platform-readings.md配额段: 「类按 Claude Code 账号定,⛔ 不按会话定:一会话内两次写之间可无席位动作地翻转。」The re-key points at that section rather than restating it, and keeps the half of the rationale that is still correct — attribution on this board is the
session_id the TEXT carries (.claude/skills/pm-dispatch/SKILL.md).Prose only. ⛔ No predicate, population, threshold, cap, pin instant or remedy of H64 moved. The diff is the H64 header docblock, two runtime message strings, and the three self-test cases that pinned the retired text.
What changed, string by string
1. Header docblock — the sourcing
Before:
After:
2. Header docblock — what the author field records
Before:
// it says WHICH, and the author field records only the token that session was/// handed.After:
// it says WHICH, and the author field records only the token class behind that/// write.3. Header docblock — the 2026-09-15 measurement narrative
Before:
// The first two are both REST-proxy writes and differ only in the TOKEN CLASS/// the session was handed.After:
// The first two are both REST-proxy writes and differ only in the TOKEN CLASS/// behind them.The measurement itself is untouched; only the clause that attributed the class to the session moved. The two rows it names differ by ACCOUNT, which is what the landed fact says decides the class.
4. Header docblock — why the exposure half names no remedy
Before:
After:
The conclusion is unchanged and still true — this half files NO row because no reader can perform a repair — but the reason is now the landed one rather than the retired one.
5. Runtime message — the author clause
Before:
'TOKEN that session was handed and not the seat that wrote'After:
'TOKEN CLASS that write was made with and not the seat that wrote'6. Runtime message — the sourcing carried into the finding sentence
Before:
After:
7. Exposure clause — why it names no remedy
Before:
After:
Self-test
Three cases pinned the retired strings and move with them; every other case is byte-identical.
H64 author: …TOKEN that session was handed and not the seat that wroteTOKEN CLASS that write was made with and not the seat that wroteH64 exposure: …and says why no remedy exists …handed to a session at start rather than chosen at write timefollows the Claude Code ACCOUNT and flips between writes with no seat act behind itH64 row: …both halves of it`.claude/skills/pm-dispatch/references/rest-channel.md``.claude/skills/pm-dispatch/references/platform-readings.md`Case count 4270 before, 4270 after — one-for-one replacements, nothing added and nothing dropped.
Gates
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) derived 40 families for this change set of one path. All 40 were run in the foreground with exit codes captured before any pipe, and reconciled:All 40 exited 0, including
pnpm check:pm-half-states,pnpm check:pm-dispatch-gates,pnpm check:nul-bytes,pnpm check:pm-governed-prosewhere derived, andpnpm check:commit-card-trailers(which the pre-push hook also ran: "2 commit message(s) on this push carry no card relation and no model identifier in the trailer pair").The whole union was then re-run on the final head
9b5e6488(after theorigin/mainmerge below) and reconciled again from that head:40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN, every family carrying a captured exit code of 0, andpnpm check:pm-half-statesstill reporting4270 cases pass.Derivation was re-run after merging
origin/mainb9598e9c(which itself movedscripts/pm/dispatch-gates.mjs): the family list is identical — 40 derived, none added, none dropped — and the change set is still the one path.Control-character self-scan beyond the gate, on the edited file: a
grep -naPover the C0 control range plus DEL (NUL through backspace, vertical tab, form feed, SO through US, and 7F), written with each bound spelled as an escape rather than a raw byte, returns nothing.Changeset
skip-changeset.scripts/pm/**is on AGENTS.md's fast track — it publishes nothing from any released package, and Post-Task Checklist step 3 states the arm in as many words: that label "is for a diff that publishes nothing from any released package". No packagefiles[]shipsscripts/pm/.Acceptance notes
perl -0777oversession was handed|handed to a session|token that session|TOKEN CLASS the session) found three more, all inside the H64 region and all wrapping across a line break, which is why a line-oriented grep missed them: the header's "the author field records only the token that session was / handed", the measurement narrative's "differ only in the TOKEN CLASS / the session was handed", and the runtime author clause's "TOKEN that session was handed". They carry the same retired mechanism as the four named ones, in the same function and the same docblock, so re-keying four and leaving three would have left the row teaching the retired fact from the same paragraph. All seven moved together. After the change the sweep returns empty andgrep -c "按会话为|handed to a session|session was handed|follows the CHANNEL"is 0.rest-channel.mdis no longer cited anywhere in this file. Both citations were the retired sentence's, and the re-key points atplatform-readings.md配额段 as the dispatch's route asked.rest-channel.md:54still carries the account-bound actor line, so a future re-key has a second source available if one is ever wanted. Noted, not filed — it is an observation about sourcing style, not a defect; the carrier is whoever next edits H64's sourcing.Generated by Claude Code
Generated by Claude Code