From a86c2f90e47f444365c23cb881dc19910253b412 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 07:49:33 +0000 Subject: [PATCH 1/4] docs(pm-dispatch): state the PATCH-side footer append as one rule; add the transient comments-count row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit platform-readings.md, two independent facts, one line each: - The `PATCH /pulls` cell becomes a RULE ("恒追加…与尾部无关") with its two measured inputs as evidence, instead of two rows of inputs that never said the append is unconditional. Evidence for the new input: a sent tail that IS the `---` + footer block is appended to anyway, reproduced on a second send, so the create-side criterion 「尾部已是该块则一字不追加」 does not carry. - A rider row beside the `comments` over-read row: the count/enumeration discrepancy is a TRANSIENT flag, so it cannot be the only defence. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude --- .claude/skills/pm-dispatch/references/platform-readings.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index 2b5af1e11b2..c3d2224dd60 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -247,6 +247,7 @@ - `list_issues` 永不返回 assignees:`fields` 枚举无此成员,不传也没有。 - 已认领卡与空闲卡响应逐字节相同,清单只是候选名单 ⇒ 认领前必须过完整 `issue_read`。 - `comments` 计数会多读:实测 1 而列表与 timeline 双 0 ⇒ 线程空否读那两条,⛔ 不读计数。 +- `comments` 与枚举不等是瞬态旗:计数收敛后记录已失而差值归零 ⇒ ⛔ 不作唯一防线。 - 可指派性是仓+账号属性且会话中可变:`GET /repos/{o}/{r}/assignees/USER` 204/404,指派后回读。 - MCP `issue_read` 的 body 实体转义是纯读侧伪影,撇号与引号与尖括号成数字实体,comments 原样。 - 存储体是明文,先解码实体再写回往返安全;腐蚀 body 的恰是把转义读数原样回写。 @@ -342,7 +343,8 @@ - ⇒ 失效既依拼写又依载体:评论里验过页脚对 PR 正文什么都没证明。 - ⇒ PR 正文页脚不带前置横线,且写后回读正文 —— 那是唯一检测手段;评论两形皆可。 - MCP `update_pull_request` 包装器删掉 PR 正文的页脚块;该通道锁 1 已拒,读作历史。 -- 裸 REST `PATCH /pulls` 追加一个裸页脚并保留既有 session-URL 页脚,差恰 58 字节。 +- 改侧 · 裸 REST `PATCH /pulls` 恒追加一条裸页脚并保留既有页脚,差恰 58 字节,与尾部无关。 +- 尾部已是 `---` 加页脚块也照追加,重送复现 ⇒ 建侧的不追加判据 ⛔ 不外推到改侧。 - 同路送无页脚正文存回恰一条(平台裸形)⇒ 该格处方是不送页脚,⛔ 不是不重送正文。 - 页脚两拼写:裸版与 session-URL 版都要剥,漏剥的卡在正文中段,而 58 字节差照常。 - ⇒ 代价是归属:裸形无 session id,按此剥净的 PR 正文不载明哪个会话写的;另置见 AGENTS.md。 From 460eb663aceea124cc807a7cf176e6668f395edb Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 07:56:09 +0000 Subject: [PATCH 2/4] docs(pm-dispatch): state the create-side signature cell on its measured controlled contrast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The contrast the map itself asked for 「⛔ 无受控对照(同通道只差该块两送)⇒ 是拟合不是定论」 was taken on this PR's own body, on the create side, bare REST POST /pulls, draft: sent 11689 bytes, tail = one blank line + the session-URL signature line, NO rule line above it, no trailing newline -> 1 signature line stored 11780 bytes -> 2 signature lines sent is a strict PREFIX of stored; appended suffix exactly 91 bytes: newline newline "---" newline + the same session-URL signature line => the append FIRED on the rule-less tail. The fourth form's trigger 「送出体尾部不是 `---` 加页脚块时,追加一条同形页脚」 is confirmed on a controlled contrast (same channel, same action, the two sends differing ONLY in that block), and the old prescription 「PR 正文页脚不带前置横线」 is wrong for the create action: following it is what triggers the append. Rows, all inside the 120-byte cap: - prescription row, rewritten in place, 115 -> 111 B, pre-registered verbatim in the PR body before the read-back: 「⇒ 处方按动作分裂:建侧送全块(横线加页脚),改侧不送页脚;⛔ 无一形两动作通吃。」 - the 拟合 caveat row, rewritten in place, 107 -> 109 B, pre-registered verbatim: 「受控对照已补齐:同通道同动作只差该块两送,尾部为无横线页脚时照追加成两条。」 - NEW row naming the residual, 104 B, 1 line: 「⛔ 该对照只在裸 REST 建侧成立,MCP 建侧同一输入未测 ⇒ ⛔ 不外推到该通道。」 TWO declared divergences from the PR body's pre-registration, both named rather than quietly taken: 1. The pre-registered residual row read 「⇒ 判据确认是送出体尾部;⛔ 未控:MCP 建侧该输入、 评论侧与改侧其余输入。」 It is NOT landed, for two reasons: its first clause restates the neighbouring row's own conclusion 「判据是送出体尾部」 (a 拒收 by the exception's 一事一行 condition), and its second clause is FALSE — the comment surface's rule-less input is measured (AGENTS.md's issue-comment paragraph: 「a bare footer with NO rule line above it is not recognised and the whole block lands under it, leaving two」) and the patch cell's other input is the engine seat's leg 3. The landed row names the one cell that really is uncontrolled. 2. One in-place correction was NOT pre-registered because the measurement produced it: the append-size row said 「恰 90 字节」 and this send measured 91, so the constant is replaced by 「字节数非常量,实测 90 与 91」 (82 -> 117 B, buys no line). ⛔ No cause is asserted for the 1-byte spread: one reading each, no controlled contrast on the trailing newline or on session-id length. Dedupe accounting for this commit: candidates 3 / landed 1 / already present 0 / refused 1 (the restatement above). The two rewrites buy no line. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude --- .claude/skills/pm-dispatch/references/platform-readings.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index c3d2224dd60..7a71a4c7d11 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -341,7 +341,7 @@ - 写侧 · PR 正文:尾部横线与其后的署名页脚一并被吃,而写调用照报成功。 - 去掉横线只写页脚则原样存活;评论不受影响,两种拼法都活。 - ⇒ 失效既依拼写又依载体:评论里验过页脚对 PR 正文什么都没证明。 -- ⇒ PR 正文页脚不带前置横线,且写后回读正文 —— 那是唯一检测手段;评论两形皆可。 +- ⇒ 处方按动作分裂:建侧送全块(横线加页脚),改侧不送页脚;⛔ 无一形两动作通吃。 - MCP `update_pull_request` 包装器删掉 PR 正文的页脚块;该通道锁 1 已拒,读作历史。 - 改侧 · 裸 REST `PATCH /pulls` 恒追加一条裸页脚并保留既有页脚,差恰 58 字节,与尾部无关。 - 尾部已是 `---` 加页脚块也照追加,重送复现 ⇒ 建侧的不追加判据 ⛔ 不外推到改侧。 @@ -349,9 +349,10 @@ - 页脚两拼写:裸版与 session-URL 版都要剥,漏剥的卡在正文中段,而 58 字节差照常。 - ⇒ 代价是归属:裸形无 session id,按此剥净的 PR 正文不载明哪个会话写的;另置见 AGENTS.md。 - 第四形:建 PR 两通道同判 —— 送出体尾部不是 `---` 加页脚块时,追加一条同形页脚。 -- 该追加带前置横线、恰 90 字节,送出体是存储体的严格前缀。 +- 该追加是横线加一条同形页脚,送出体是存储体的严格前缀;字节数非常量,实测 90 与 91。 - 尾部已是该块则一字不追加,两通道各实测两向 ⇒ 建侧通道不是变量,判据是送出体尾部。 -- ⛔ 无受控对照(同通道只差该块两送)⇒ 是拟合不是定论,⛔ 不外推到别的动作。 +- 受控对照已补齐:同通道同动作只差该块两送,尾部为无横线页脚时照追加成两条。 +- ⛔ 该对照只在裸 REST 建侧成立,MCP 建侧同一输入未测 ⇒ ⛔ 不外推到该通道。 - 调用不带 `body` 参数则页脚状态不动:`draft` 或 `title` 单字段更新既不删也不合成。 - 正文把 harness 两行块叠在页脚之上,存回是三条署名块;单块形态才复现成一条。 - ⇒ 形态随动作与送出体尾部变,改侧还随通道变;⛔ 不由任一条推其余,写后必回读。 From 9c15e9153c8b6978beb5525e4f019c081537aa51 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 07:58:19 +0000 Subject: [PATCH 3/4] chore(pm): raise the platform-readings ceiling to the landed count (eighteenth increment) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 466 → 469 under the STANDING one-file exception in pm-dispatch SKILL.md, verbatim and untranslated: 「唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决。」「条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、 一事一行、不计重排。」 Recorded as the EIGHTEENTH `ruledRaises` record on the cross-file-move declaration, delta 3, dated 2026-09-18, quoting that ruling in the shape the seventeen existing records use. `was` does not move (314); the move's own arithmetic is unchanged at +11 against a net source decrease of 20, with 141 → 144 lines of ordinary ruled raise subtracted first. The line-by-line accounting and the candidate / landed / already-present / refused counts are written beside the ceiling entry as this file's convention requires: candidates 5 / landed 3 / already present 1 / refused 1. Verdicts, exit codes captured by redirect-then-status: BEFORE (rows landed, ceiling still 466) node scripts/pm/check-skill-line-ratchet.mjs --self-test exit 0 "✓ check-skill-line-ratchet self-test: 157 cases pass." node scripts/pm/check-skill-line-ratchet.mjs exit 1 "✗ ... platform-readings.md is 469 lines; the ratchet ceiling is 466." AFTER (this commit) --self-test exit 0 "157 cases pass." gate exit 0 "✓ ... platform-readings.md is 469 lines (ceiling 469; headroom 0)." "✓ ... cross-file move ...: +11 (314→469, less 144 lines of ordinary ruled raise) against a net source decrease of 20 ..." The red BEFORE leg is the reverse verification: it proves the ratchet really reads the three rows this PR adds, so the green AFTER leg is a measurement rather than a cached pass. The script was restored from `HEAD` and its blob hash compared before the AFTER run, so neither leg ran against a half-mutated tree. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude --- scripts/pm/check-skill-line-ratchet.mjs | 57 ++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index ccd21fa35c8..2337a7ff506 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -1011,7 +1011,45 @@ export const CEILINGS = new Map([ // contended it is, the detached prescription unchanged. // Nothing else was paid in place: re-wrap funding is refused per the // 2026-08-17 rule in any case. Landed count, headroom 0, same convention. - ['.claude/skills/pm-dispatch/references/platform-readings.md', 466], + // Raised 466 → 469 by the EIGHTEENTH readings increment, again under the + // STANDING one-file exception quoted above rather than a fresh decision card, + // and again recorded as a `ruledRaises` record citing it. Its carrier card + // named a MEASURABLE unknown — the missing half of a controlled contrast this + // map itself declares absent — and the probe was the raising PR's own body: + // composed to end in the signature line with NO rule line above it, sent once + // through a bare `POST /pulls`, then read back (11,689 bytes sent and one + // signature line, 11,780 stored and two, the send a strict PREFIX of the + // store). Spent at ONE line per deduplicated reading: on the PATCH channel the + // append is UNCONDITIONAL, so a sent tail that IS the rule-plus-signature + // block — the very shape the create side leaves alone — is appended to + // anyway, reproduced on a second send, and the create-side criterion does not + // carry to it (+1); a thread's count-versus-enumeration discrepancy is a + // TRANSIENT flag, because the count converges on the enumeration and after it + // converges the records are gone and the difference is zero, so that + // discriminant cannot be the only defence (+1); and the controlled contrast + // now holds only on the bare-REST create channel, the MCP create channel's + // same input being unmeasured, so the conclusion is not carried there (+1) = + // +3 exactly. Candidates 5 / landed 3 / already present 1 / refused 1 — the + // already-present one is that channel's operational cost, carried by + // 「⇒ 该格处方是不送页脚」 and by the attribution row beside it; the refusal is a + // residual row whose first clause restated its neighbour's own conclusion + // 「判据是送出体尾部」 and whose second clause named the comment surface and + // the patch cell's other input as uncontrolled when both are in fact measured. + // Absence was measured per row with a lit control: `收敛` reads 0 in this file + // against `计数` at 9, `瞬态` hits only the `unstable` and PR-files rows, and + // `updated_at` reads 0. + // + // THREE corrections are paid in place and buy nothing — a rewrite is not a + // raise. The prescription row 「PR 正文页脚不带前置横线」, whose spelling is + // precisely what TRIGGERS the create-side append, is split per action. The + // PATCH row is re-stated as a RULE instead of one of two rows of inputs. And + // the append-size row's 「恰 90 字节」 becomes 「字节数非常量,实测 90 与 91」: + // this increment's send measured 91 on a body with no trailing newline, and + // ⛔ no cause is asserted for the spread — one reading each, and no controlled + // contrast on the trailing newline or on session-id length. + // Nothing else was paid in place: re-wrap funding is refused per the + // 2026-08-17 rule in any case. Landed count, headroom 0, same convention. + ['.claude/skills/pm-dispatch/references/platform-readings.md', 469], // Per-operation REST/GraphQL/git channel mapping — which fleet operation has // a REST twin (each row executed in a real session, provenance date carried // per row), the handful that are GraphQL-only, and the queue-routing @@ -1736,6 +1774,23 @@ export const CROSS_FILE_MOVES = new Map([ date: '2026-09-15', delta: 1, }, + { + // The EIGHTEENTH increment, under the same STANDING exception — the + // same words again, for the same reason: a record that quotes no + // ruling is RED and each record stands alone. The +3 is accounted for + // line by line beside this entry's ceiling above; the exception's + // conditions (per-item verification and the candidate / landed / + // already-present / refused counts) are carried by the raising PR's + // body and the seat's ACCEPT. + ruling: + 'the standing one-file exception for' + + ' `.claude/skills/pm-dispatch/references/platform-readings.md` — pm-dispatch' + + ' SKILL.md, verbatim and untranslated: 「唯一例外:`platform-readings.md`' + + ' 增量抬上限到落地行数,免决策卡,记 `ruledRaises` 引常设裁决。条件:席位验收评论' + + '逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排」', + date: '2026-09-18', + delta: 3, + }, ], sources: [ ['.claude/skills/pm-dispatch/references/lanes/cli.md', 35], From 3eaab20afb271d1e2965d8b0369148b738cefc20 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 18 Sep 2026 08:17:06 +0000 Subject: [PATCH 4/4] docs(pm-dispatch): name the create-side appended signature's spelling instead of implying it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The append-size row previously carried 「恰 90 字节」, from which a reader could work backwards to the spelling (90 minus the separator leaves the session-URL form's length, not the bare form's). This round's measurement made that constant false — 91 bytes on a body with no trailing newline — so replacing it with 「字节数非常量(90/91)」 would have deleted the only thing that identified the appended spelling. So the row NAMES it: 「该追加是横线加一条 session-URL 形页脚,送出体是存储体的严格前缀; 字节数非常量(90/91)。」 (117 B, in place, buys no line — the line count is unchanged at 469 and the ceiling record is untouched.) The ceiling's accounting comment is corrected to match, since it quotes this row. ⛔ Still no cause asserted for the 90/91 spread: one reading each, and no controlled contrast on the trailing newline or on session-id length. Re-run on this head, exit codes captured by redirect-then-status: check:pm-skill-ratchet exit 0 "... platform-readings.md is 469 lines (ceiling 469; headroom 0)." check:pm-skill-id-lint exit 0 check:nul-bytes exit 0 check:skill-frame-sync exit 0 grep -naP over both touched files for control characters: no match (exit 1). Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude --- .../skills/pm-dispatch/references/platform-readings.md | 2 +- scripts/pm/check-skill-line-ratchet.mjs | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index 7a71a4c7d11..b60ca41820b 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -349,7 +349,7 @@ - 页脚两拼写:裸版与 session-URL 版都要剥,漏剥的卡在正文中段,而 58 字节差照常。 - ⇒ 代价是归属:裸形无 session id,按此剥净的 PR 正文不载明哪个会话写的;另置见 AGENTS.md。 - 第四形:建 PR 两通道同判 —— 送出体尾部不是 `---` 加页脚块时,追加一条同形页脚。 -- 该追加是横线加一条同形页脚,送出体是存储体的严格前缀;字节数非常量,实测 90 与 91。 +- 该追加是横线加一条 session-URL 形页脚,送出体是存储体的严格前缀;字节数非常量(90/91)。 - 尾部已是该块则一字不追加,两通道各实测两向 ⇒ 建侧通道不是变量,判据是送出体尾部。 - 受控对照已补齐:同通道同动作只差该块两送,尾部为无横线页脚时照追加成两条。 - ⛔ 该对照只在裸 REST 建侧成立,MCP 建侧同一输入未测 ⇒ ⛔ 不外推到该通道。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 2337a7ff506..d79bbd0e5ff 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -1043,9 +1043,11 @@ export const CEILINGS = new Map([ // raise. The prescription row 「PR 正文页脚不带前置横线」, whose spelling is // precisely what TRIGGERS the create-side append, is split per action. The // PATCH row is re-stated as a RULE instead of one of two rows of inputs. And - // the append-size row's 「恰 90 字节」 becomes 「字节数非常量,实测 90 与 91」: - // this increment's send measured 91 on a body with no trailing newline, and - // ⛔ no cause is asserted for the spread — one reading each, and no controlled + // the append-size row's 「恰 90 字节」 becomes 「字节数非常量(90/91)」: + // this increment's send measured 91 bytes on a body with no trailing newline, + // the appended line being the session-URL spelling, which the row now NAMES + // instead of leaving it to be inferred from a constant that is not one. ⛔ No + // cause is asserted for the spread — one reading each, and no controlled // contrast on the trailing newline or on session-id length. // Nothing else was paid in place: re-wrap funding is refused per the // 2026-08-17 rule in any case. Landed count, headroom 0, same convention.