Repository navigation
Commit 580fd4e
docs(pm-skill): record the intermittent REST-read reference expansion in platform-readings (#24744)
Fixes #24729
Clause-②: no
Records the intermittent REST-read reference expansion as one fact line
in `platform-readings.md`, and points `rest-channel.md` 读侧 at it. Tier S
(`.claude/**` only), opened as draft: ready and queue belong to the
owning seat after its contract-tier review. No gate, no script, no other
file (「新增门禁默认否」, triage 6282315049).
## What changed
`.claude/skills/pm-dispatch/references/platform-readings.md` lines
245–246, 460 → 460 lines (ceiling 460, headroom 0), `MAX_LINE_BYTES`
120:
```text
before
- MCP `issue_read` 的 body 实体转义是纯读侧伪影,撇号与引号与尖括号成数字实体,comments 原样。
- 存储体是明文,先解码实体再写回往返安全;腐蚀 body 的恰是把转义读数原样回写。
after
- MCP `issue_read` 的 body 撇号引号尖括号成数字实体(comments 原样):纯读侧伪影,解码后写回。
- 代理侧 REST 读的 body 间歇把裸 `#N` 展开成 `owner/repo#N`:重写前折回本仓前缀或核长等原长。
```
Bytes per line: 245 = 120 → 116, 246 = 109 → 120.
`.claude/skills/pm-dispatch/references/rest-channel.md` line 30 (〈读侧〉,
the comment-thread row), 82 → 82 lines (ceiling 82), 67 → 119 bytes:
```text
before
- ✓ 整条评论线 `GET .../issues/{n}/comments?per_page=100`。
after
- ✓ 整条评论线 `GET .../issues/{n}/comments?per_page=100`;裸 `#N` 展开见 `platform-readings.md` 配额段。
```
## Placement and payment
- The dispatch placed lines 245–250 under 〈读数陷阱〉. On `origin/main`
(`7e7e605de3`, unchanged for both files at `4a2ca57e74`) they sit under
〈API 配额〉: that section runs 92–259 and 〈读数陷阱〉 starts at 261. The line
follows the dispatch's intent (beside the MCP read-side artefact block,
its same-class sibling), and the pointer names the section it actually
lives in, 配额段, the same one `rest-channel.md` line 3 already names.
- The suggested two-line rewrite measured too small: the MCP fact (about
85 B), the REST fact (about 86 B) and a shared prescription (about 89 B)
do not fit in 240 B. So the MCP pair is compressed in place into one
line by deleting content: 「存储体是明文」 (implied by 纯读侧伪影), 「往返安全」, and 「腐蚀
body 的恰是把转义读数原样回写」 (the inverse of the kept prescription 「解码后写回」). The
freed line carries the REST fact together with its remedy, the one line
the card asks for. No line was joined without deleting content; no
CEILINGS row moved.
- The fact line carries 「间歇」 per the filer's second reading 6282030487,
verbatim: "So the expansion is intermittent on the read path, not a
switch that stays flipped. The remedy in 「What done looks like」 holds
either way: prove the fetched length against the raw length, or collapse
the own-repo prefix, before any body rewrite."
## Readings (this container, 2026-10-20, one read per question, no
polling)
- 03:39:01Z: the card body and its four comments over REST came back
with 0 expansions (the one full-form `#24729`,
in the dispatch comment, is authored that way).
- 03:39:09Z: `GET
/repos/objectstack-ai/objectstack/issues/comments/6279597228` answered
200 with a body of 5,667 characters (5,751 UTF-8 bytes) carrying 40
`objectstack-ai/objectstack#N` and 3 bare references. So the expansion
reproduced, nine seconds after unexpanded reads in the same container.
The three bare ones each sit right after an opening parenthesis
(`(#7144`, `(#2767`, `(#2066`), so the rewrite does not reach every bare
reference.
- 03:39:37Z: the same path with `Accept:
application/vnd.github.full+json` again carried 40 expansions in `body`.
`body_text` and `body_html` show 0, but they discriminate nothing: a
control read at 03:53:01Z of comment 6282735695, whose body carries an
authored full-form `#24729`, renders it as
`#24729` in `body_text` as well. The rendered fields are no raw channel.
- Length arithmetic on that body: 5,667 − 40 × 26 = 4,627 characters
(4,711 bytes), while the card states the raw as 4,673. A pure collapse
does not reproduce the card's raw figure here: either the card counted
in another unit, or a collapse is not byte-exact on this body. Not
decidable without a raw read. On the director post the card's numbers
add up exactly (17,699 − 117 × 26 = 14,657). The length leg is the one
that catches a collapse that does not restore.
Provenance: filer reading 6282030487, ledger block C 6281946060 on
#12708, triage 6282315049.
## Verification (local, at `e1f639ebf4`)
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 20 families from the merge base; all
20 ran with exit codes recorded, and `--ran` reconciled "20 derived, 20
run, 0 NOT-MEASURED (a DERIVED zero)".
- exit 0: `check-closing-keyword-parity` and its `--self-test`,
`check-comment-mask-corpus`, `check-governed-queue-guard --self-test`,
`check-harness-current --self-test`, `check:agent-test-spelling`,
`check:cross-package-test-inputs`, `check:doc-authoring`,
`check:driver-memory-census`, `check:gitlink-declared`,
`check:nul-bytes`, `check:pm-governed-merges`, `check:pm-half-states`,
`check:pm-skill-id-lint` (87 files clean), `check:pm-skill-ratchet`
(460/460 and 82/82, headroom 0), `check:refd-timer-probe`,
`check:required-contexts`, `check:skill-frame-sync`,
`check:watch-hint-literal`.
- `check:doc-formula-expressions` first exited 3 (PREREQUISITE NOT MET:
`@objectstack/formula` and `@objectstack/lint` unbuilt); after building
both under the verify lock it exited 0.
- Outside the derivation: `check:pm-settings-deny-roster` exit 0 (its
roster lives under `.claude`), `check-skills-token-ratchet` exit 0, a
control-byte scan of both files clean.
- No ablation (a docs-only diff) and no changeset (`.claude/**`,
`skip-changeset` sent with this create). CI check-runs are CI's; not
awaited here.
## Acceptance notes
- 〈读数陷阱〉 line 313 says 「raw REST 一字不差」 in its angle-bracket context.
With this fact in the table, that holds for the angle-bracket dimension
only. Not edited (outside the dispatched surface). Noted, not filed;
carrier: none.
- `fleet-write/dispatch.mjs` reads every sent body back from the seat
side and judges it byte-exact. While the expansion is active, a stored
body carrying bare references could read back longer than sent. That is
an inference from its header, not a reproduction. Noted, not filed;
carrier: none.
## 维护者速读(草稿)
- 改了什么:平台读数事实表加一条:容器里经代理的 REST 读回的正文,会间歇地把裸 `#N` 展开成
`owner/repo#N`;据这种读数重写正文之前,先把本仓前缀折回,或核对取回长度等于原长。原有 MCP
实体转义两行压成一行付账,两文件行数都不变;REST 通道对照表的评论线那一行加了指路。
-
为什么改:读回的正文可能已被代理改写了引用拼法。席位若拿它直接改写卡片正文,写入照常成功、回读也一致,卡片里的引用却全被静默改成长格式,没有任何报错。
- 风险与代价(含回滚):纯文档,两文件共改 3 行,不加门禁、不动行数上限。代价是 MCP
实体转义那条删去了两句解释(往返安全、腐蚀成因),处方本身保留。回滚即还原本 PR。
- 席位意见:
- 你要做的:无需操作;席位达档复核 PASS 后入队落地。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 9bc4dde commit 580fd4e
2 files changed
Lines changed: 3 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
242 | 242 | | |
243 | 243 | | |
244 | 244 | | |
245 | | - | |
246 | | - | |
| 245 | + | |
| 246 | + | |
247 | 247 | | |
248 | 248 | | |
249 | 249 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | | - | |
| 30 | + | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
| |||
0 commit comments