Skip to content

Commit 580fd4e

Browse files
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

File tree

‎.claude/skills/pm-dispatch/references/platform-readings.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@
242242
- `comments` 计数会多读:实测 1 而列表与 timeline 双 0 ⇒ 线程空否读那两条,⛔ 不读计数。
243243
- `comments` 与枚举不等是瞬态旗:计数收敛后记录已失而差值归零 ⇒ ⛔ 不作唯一防线。
244244
- 可指派性是仓+账号属性且会话中可变:`GET /repos/{o}/{r}/assignees/USER` 204/404,指派后回读。
245-
- MCP `issue_read` 的 body 实体转义是纯读侧伪影,撇号与引号与尖括号成数字实体,comments 原样。
246-
- 存储体是明文,先解码实体再写回往返安全;腐蚀 body 的恰是把转义读数原样回写。
245+
- MCP `issue_read` 的 body 撇号引号尖括号成数字实体(comments 原样):纯读侧伪影,解码后写回。
246+
- 代理侧 REST 读的 body 间歇把裸 `#N` 展开成 `owner/repo#N`:重写前折回本仓前缀或核长等原长。
247247
- 读侧并非一律可逆:行内反引号里的尖括号片段被 MCP 读路径整个丢弃,非转义,无从解码。
248248
- 该丢弃亦及标题:自首个 tag 形跨度截到尾,是切不是洞 ⇒ 凭标题的总体计数只是下界。
249249
- 写侧剥除是真实存储损耗,⛔ 两类不并成一条,写后回读必做;实体归属与 `&amp;` 类未实测。

‎.claude/skills/pm-dispatch/references/rest-channel.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
- ⛔ 查重必须含 closed:卡刚关闭时最易被重开,开域查重漏掉刚关闭的同题卡即重复派发。
2828
- 开域查重是要申报的例外,不是默认;状态与标签列卡仍 `state=open`,那是状态读不是查重。
2929
- ✓ 卡与 PR 元数据 `GET .../issues/{n}` · `GET .../pulls/{n}`,assignees、labels、body 齐全。
30-
- ✓ 整条评论线 `GET .../issues/{n}/comments?per_page=100`。
30+
- ✓ 整条评论线 `GET .../issues/{n}/comments?per_page=100`;裸 `#N` 展开见 `platform-readings.md` 配额段。
3131
- ✓ Timeline 事件 `GET .../issues/{n}/timeline`:cross-ref、`added_to_merge_queue`、ready_for_review。
3232
- ✓ PR diff `GET .../pulls/{n}` 带 Accept `application/vnd.github.diff`;文件清单 `.../pulls/{n}/files`。
3333
- ✓ 线程 `GET .../pulls/{n}/ccr/review_threads` 回 `{resolved,outdated,path,line,comment_ids}`,无线程 id。

0 commit comments

Comments
 (0)