Skip to content

Commit 80b2da2

Browse files
docs(pm-skill): platform-readings diet — delete the readings a scripts/pm tool now holds (tool first, text second) (#22684)
Fixes #22452 Clause-②: no W1 of the skills-lane diet program; the program anchor #22060 remains open for its later work items. Tool first, text second: every reading in `.claude/skills/pm-dispatch/references/platform-readings.md` that a `scripts/pm` tool now holds is deleted whole, each one named below with the tool and the self-test case that pins it. Nothing else in the file moves, no other reference file is edited, and no tool's judgement changes. The file's `CEILINGS` row in `scripts/pm/check-skill-line-ratchet.mjs` is lowered to the landed count. ## The table: reading, the tool that holds it, action Line numbers are the file at `origin/main` `243dd3c62`. | reading (first words, base line) | held by: tool, self-test battery and case | action | |---|---|---| | L91 「落地相邻的写侧一则:GitHub 标签描述上限 100 字符…」 | `scripts/pm/check-label-desc-cap.mjs` (`pnpm check:pm-label-desc-cap`, required in `lint.yml`): battery `check-label-desc-cap self-test`, cases `exactly 100 characters passes` and `101 characters fails` | deleted | | L104 「官方指引:变更类请求间停 ~1 秒,mutation 按 5 倍计…」 | `scripts/pm/write-pace.mjs` rule ① (`DEFAULT_MIN_GAP_MS` 3 s, above the ~1 s the text prescribed) and rule ⑤: batteries `rule ①: the remainder is slept, and the pause is said out loud` and `rule ⑤: batch mode — the gap rises for an announced batch, and the estimate is printed` | deleted | | L105 「批量重分诊这类把写挤在同一秒的扫动…」 | `scripts/pm/write-pace.mjs` rules ① and ④: batteries `rule ①: the remainder is slept, and the pause is said out loud` and `rule ④: the lease — one write in flight, fleet-wide, measured on real processes` | deleted | | L107 「`write-pace` 把一次 dispatch 记作那一笔写(40/时不变)…」 | `scripts/pm/write-pace.mjs` battery `rule ②: the 41st is REFUSED, with a prescription`; `scripts/pm/fleet-write/dispatch.mjs` battery `the wiring: the POST is paced and on the roster, the reads are not, the token never reaches the log`; `scripts/pm/close-cards.mjs` battery `the relay pack: ONE card, ONE dispatch — comment → labels_remove → issue_patch — ONE write on the throttle` (the text's 「每步一次 dispatch」 was already stale against it) | deleted | | L122 「判别式:该 415 的 `documentation_url` 指 Claude Code 不指 GitHub…」 | `scripts/pm/write-pace.mjs` `isProxyRefusal`: battery `rule ③: what writes a stop marker, how long it lasts, what it refuses`, case `⭐ the egress PROXY's 403 is recognised by its body (measured shape): the message naming the proxy, or a documentation_url that is not GitHub's`; `scripts/pm/label-write.mjs` battery `the classifier: a 404 that is success, and a 403 that must not fall back`, case `⭐ a 403 whose body is the egress PROXY's (measured shape) is the ROUTE — prerequisite — ⛔ never a rate limit, whatever the header says` | deleted | | L232 「摘标签也没有加法端点:`finding` 定级这类只能整组写…」 | `scripts/pm/label-write.mjs` removes by directed `DELETE /issues/{n}/labels/{name}`: battery `the arithmetic: union, difference, and the two idempotent no-ops`, case `…one directed DELETE per removal actually present`; battery `the classifier: a 404 that is success, and a 403 that must not fall back`, case `a 404 on a DIRECTED DELETE is the label already being gone`; relay `scripts/pm/fleet-write/execute.mjs` battery `the idempotent removal: a 404 on a directed label DELETE is success` (the text's claim was stale against both) | deleted | | L359 「平台在尾部 `---` 前后正反两向归一空行:比对正文只按首个差异偏移…」 | `scripts/pm/post-stamped.mjs` exact-bytes classifier: battery `the re-anchored footer: a newline the platform MOVED is not a byte lost`, case `⛔ …so "equal length" is NOT the test and never became one`; battery `the collapsed blank: the footer block's own separator is not a content byte`; every relay body op is read back through that classifier (`scripts/pm/fleet-write/dispatch.mjs` battery `the verdict: post-stamped's own classifier, imported — …`) | deleted | | L360 「送全块即触发该归一 ⇒ `post-stamped` 的 `body` 档把这点空白判 `mutated`…」 | `scripts/pm/post-stamped.mjs` battery `the collapsed blank: the footer block's own separator is not a content byte`, cases `…and it LANDED: exit 0, ⛔ not the 4 this exact shape answered on every one of them` and `…named by its OWN word, ⛔ never the re-anchor's, which says nothing was lost` (the tool no longer judges this `mutated`; the text was stale) | deleted | | L419 「内联双引号 JSON 建卡:标题反引号标识符被 shell 以 root 展开…」 | `scripts/pm/issue-create.mjs` battery `the arguments: files not argv for prose, exactly one title source, a repo shape`, case `⛔ a --title carrying a backtick or a dollar sign is refused — the shell already had its turn` | deleted | Nine bullets, each deleted whole; no fragment of a bullet was cut and nothing was re-wrapped. ## The rule, stated once Head line 3 is replaced in place (one line for one line, 118 bytes, under the ratchet's 120-byte line rule): 「见 reading-discipline.md;工具先行、文本其次:读数先落工具或自测行,工具守不住的才留本表。」 `git grep -n '工具先行'` over `.claude/`, `AGENTS.md` and `CLAUDE.md` answers 1 hit, this line; `tool first` and `text second` answer 0. ## Line budget | surface | before (`243dd3c62`) | after (`e74ef6211`) | |---|---|---| | `platform-readings.md` | 469 lines, 48,048 bytes | 460 lines, 47,068 bytes | | whole `references/` tree (31 files, `lanes/` included) | 2,301 lines | 2,292 lines | | its `CEILINGS` row | 469 | 460 (headroom 0) | The file's `MAX_TABLE_ROW_BYTES` pin stays 0 (it carries no table row). ## Zero checks `git grep -n -F PHRASE -- .claude/skills/pm-dispatch/` at `e74ef6211`, one distinctive phrase per deleted reading: | phrase | hits | |---|---| | 「标签描述上限 100 字符」 | 0 | | 「mutation 按 5 倍计」 | 0 | | 「批量重分诊这类把写挤在同一秒」 | 0 | | 「把一次 dispatch 记作那一笔写」 | 0 | | 「指 Claude Code 不指 GitHub」 | 0 | | 「摘标签也没有加法端点」 | 0 | | 「前后正反两向归一空行」 | 0 | | 「净零字节良性告警」 | 0 | | 「标题反引号标识符被 shell 以 root 展开」 | 0 | | positive control, a kept reading: 「上限 90 s / 5 min 不动」 | 1 | ## Gates, all run at `e74ef6211` after the final commit - `pnpm check:pm-skill-ratchet` exit 0: `✓ check-skill-line-ratchet self-test: 157 cases pass.`, `… platform-readings.md is 460 lines (ceiling 460; headroom 0).`, `cross-file move into … platform-readings.md: +2 (314→460, less 144 lines of ordinary ruled raise) against a net source decrease of 20`. - `pnpm check:pm-skill-id-lint` exit 0: `✓ check-skill-id-lint: 34 file(s) clean`. - `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (no paths, change set from the merge base) derived 39 families; all 39 ran with exit 0, and `--ran` answers `39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN`. `check:doc-formula-expressions` first answered PREREQUISITE NOT MET (exit 3, `@objectstack/formula` and `@objectstack/lint` unbuilt), then exit 0 after building those two. `pnpm check:pm-dispatch-gates` (fast tier) exit 0: `1825 cases pass; 6 slow section(s) deferred`. - Outside the derived set, run because they read the edited ratchet or were named in the dispatch: `pnpm check:pm-governed-prose`, `pnpm check:merged-result`, `node scripts/check-published-list-mirrors.mjs`, `node scripts/check-skills-token-ratchet.mjs`, all exit 0. ## Acceptance notes - The dispatch expected the stamp contract, relative comment ids, the AND-label listing, the title byte cap, the ONE-OF guard, the four-step label write, the no-run UNCONFIRMED rule and the H rows in this file. Measured at `243dd3c62`, none of them is stated here, except the MCP list-union reading (L269 to L275), which is an MCP channel measurement and stays. So the diet is nine lines, not a section rewrite. - Kept on purpose, with the reason each stays (doubt keeps a reading): - L106, the relay timings: the `fleet-write/dispatch.mjs` header says neither ceiling is a measured start latency yet, so this file holds the only record of the probe. - L228 to L230, the MCP `issue_write` whole-set hazards: the `label-write.mjs` header cites them as its measured basis. - L231, the 403-session additive reading: `label-write.mjs` sends a proxy-shaped 403 to PREREQUISITE with no fallback, so it does not hold the reading as written. - L340 to L358, the PR-body footer cells: `AGENTS.md` points here, and `PR_CREATE_FOOTER_TAIL` in `fleet-write/dispatch.mjs` cites the fourth shape. - L361, the report parse rule: H52 parses the balanced object, which is not the last-right-brace rule the text states. - L363 to L367, the clause-② and `Claim:` marker readings: no self-test pins the tolerated prefixes, and `post-stamped.mjs` passes a bolded claim line unjudged. - L412 to L418, the issue footer and PATCH cells: the `post-stamped.mjs` header cites them as the governed fact table. - L420, the heredoc expansion: the hazard happens while writing the file, before any tool reads it. - L429 and L430, the shallow `check-governed-merges` refusal: the tool holds the refusal, but L430 is an instruction no tool holds. - Latent ratchet trap for the next diet: the `CROSS_FILE_MOVES` entry for this file records 144 lines of ordinary ruled raises above its `was` of 314. Any ceiling of 457 or less reds `crossFileMoveVerdict` as an over-claim until a `ruledRaises` record is retired. Measured with the exported function on the live map: 460 and 458 green, 457 and 440 red. This PR lowers by 9 and stays clear. A deeper diet must retire records in the same edit, and that is a change to `CROSS_FILE_MOVES`, not to a `CEILINGS` row. - Drift noticed, not filed (prose only, no reader acts on it): the `post-stamped.mjs` header cites this file as `:410` and `:411`, but those readings sat at L414 and L415 before this PR and sit at L406 and L407 after it. L429 prescribes `git fetch --shallow-since=`, while `check-governed-merges` prints `fetch --unshallow` and `git-history.mjs` records that `--shallow-since` can shorten history. `rest-channel.md` keeps its own request-body prescription (never inline double-quoted strings), which is related to the deleted L419 but is not the same reading. Carrier: none. ## 维护者速读(草稿) - **改了什么**:PM 技能的平台读数表删掉 9 条已由 `scripts/pm` 工具自动把关的条目(写入节流、中继计数、代理拒绝判别、按名摘标签、页脚回读、标签描述长度、标题反引号),并在表头写明「工具先行、文本其次」;该文件行数上限 469 → 460。 - **为什么改**:这张表每个席位每次运行都要整读;工具已经拦住的事再写一遍只是重复花阅读成本,且其中 4 条已与工具实际行为不符,留着反而误导。 - **风险与代价(含回滚)**:只删文字、不改任何工具判定;每条删除都对应一个具名自测用例。回滚 = 还原本 PR 这一个提交(两文件)。 - **席位意见**: - **你要做的**:扫一眼上方「The table」的 9 行,对哪条删除有异议就在本 PR 评论点名行号;无异议则不必动手,本 PR 属 Tier S,由技能席位达档复核后经队列落地。 --- _Generated by [Claude Code](https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent d973c34 commit 80b2da2

2 files changed

Lines changed: 4 additions & 11 deletions

File tree

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

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 平台读数事实表
22

3-
见 reading-discipline.md;本表是 GitHub API 与工具行为的读数事实,操作时查阅。
3+
见 reading-discipline.md;工具先行、文本其次:读数先落工具或自测行,工具守不住的才留本表。
44

55
## 队列成员资格与 auto-merge
66

@@ -88,7 +88,6 @@
8888
- `mergeable_state` 未落定时挂上的是经典 auto-merge、不入队,落定后再挂才入队。
8989
- `behind` 的 PR 照常入队:落后于 main 不是入队否决,⛔ 不为它先发 `pr_update_branch`。
9090
- `check_suite.completed` 会命名过期 head,check-run 也只属最后一次 push ⇒ 用前先重读当前 head。
91-
- 落地相邻的写侧一则:GitHub 标签描述上限 100 字符,超长写回 422,133 字的原文即不可存。
9291

9392
## API 配额
9493

@@ -101,10 +100,7 @@
101100
- perPage 按预期 population 取,⛔ 不按习惯取 100:点数 ≈ 请求节点数除以 100。
102101
- 只要 `totalCount` 的健康指标取 perPage=1;只要最近 N 张就取 N。
103102
- 小时池之外还有分钟级二级限流:GraphQL 端点 2,000 点/分、并发 ≤100。
104-
- 官方指引:变更类请求间停 ~1 秒,mutation 按 5 倍计;批量写因此 ~1 秒一发。
105-
- 批量重分诊这类把写挤在同一秒的扫动,会在小时池仍绿时撞上分钟墙。
106103
- 中继读数:dispatch 后 5 s 建 run、17 s 起 job、22 s 评论落地、墙钟 31 s;上限 90 s / 5 min 不动。
107-
- `write-pace` 把一次 dispatch 记作那一笔写(40/时不变);`close-cards` 每步一次 dispatch。
108104
- REST 可达性是会话属性(GitHub App 会话门),⛔ 不是端点或席位类型的属性。
109105
- 开轮探一次、按班存档;探针必须是一条真 repo-scoped 读。
110106
- 门关着时 repo-scoped 路径整类回 403 `GitHub access is not enabled for this session`。
@@ -119,7 +115,6 @@
119115
- 调用方自带的 `Authorization` 头被代理覆盖;`HTTPS_PROXY` 端口打死也不切断网络。
120116
- ⇒ 容器内得出的 token 作用域结论 ⛔ 不迁移到出口未经代理的会话。
121117
- REST 写侧经出口代理必带 `Content-Type: application/json`,否则代理回 415 且一个字节都没写。
122-
- 判别式:该 415 的 `documentation_url` 指 Claude Code 不指 GitHub ⇒ 代理拒,不是 GitHub;四端点实测。
123118
- 两通道的信封在配额、权限、传输三样上都不同 ⇒ 任一侧的拒绝只是那一侧的读数。
124119
- 403 与传输失败要试过另一侧才说得出我没手段;限流先比身份,同 ID 的他侧不是手段。
125120
- 读数:`POST /actions/runs/{id}/rerun-failed-jobs` REST 回 403 而 MCP 回 201。
@@ -229,7 +224,6 @@
229224
- 隔轮旧读数是无效快照,按其回写静默剥别的标签;真追加走 REST `POST /issues/{n}/labels`。
230225
- `issue_write` 还清空每个未传字段(assignees 在内)⇒ 单字段更新必须把现值带齐重写。
231226
- 追加端点同样先过探针:403 会话没有真追加通道,只能整组替换。
232-
- 摘标签也没有加法端点:`finding` 定级这类只能整组写,carve-out 保留;写后照纪律回读。
233227
- PR 标签走 issue 形通道的三条读腿全盲、两条静默,PR 原生端点见腿 ④。
234228
- 腿 ①:`issue_read get_labels` 传 PR 号回 Could not resolve to an Issue。
235229
- REST 的 PR 也是 issue 惯例在此方法不成立;响亮失败即路由信号,改走腿 ③。
@@ -356,8 +350,6 @@
356350
- 调用不带 `body` 参数则页脚状态不动:`draft` 或 `title` 单字段更新既不删也不合成。
357351
- 正文把 harness 两行块叠在页脚之上,存回是三条署名块;单块形态才复现成一条。
358352
- ⇒ 形态随动作与送出体尾部变,改侧还随通道变;⛔ 不由任一条推其余,写后必回读。
359-
- 平台在尾部 `---` 前后正反两向归一空行:比对正文只按首个差异偏移,⛔ 不按长度。
360-
- 送全块即触发该归一 ⇒ `post-stamped` 的 `body` 档把这点空白判 `mutated`,净零字节良性告警。
361353
- 评论创建两通道都追加 58 字节 ⇒ 严格解析 `os-dev-report` 必须停在最后一个右花括号。
362354
- 评论 `PATCH` 重送含尾部页脚块的存储体是幂等的:逐字节一条页脚,与创建的追加相反。
363355
- PR 正文的 `Check Changeset` 门读 clause-② 声明宽容:其失败文案自述 `- `、`> `、`**` 前缀照读。
@@ -416,7 +408,6 @@
416408
- 无横线的裸页脚不算页脚:它被保留而整块另追加,总数二 ⇒ 恒一条只对上行两输入成立。
417409
- 该格两空:MCP 送裸页脚、`title`/`labels` 单字段 `issue_write` 是否动页脚,均未实测。
418410
- issue `PATCH` 同体带 `labels` 与 `type` 回 500 且零写入;拆两次写各 200,已带 type 的卡未实测。
419-
- 内联双引号 JSON 建卡:标题反引号标识符被 shell 以 root 展开,正文完好 —— 内容被执行。
420411
- heredoc 定界符不加引号会展开正文里每个反引号 ⇒ 请求体永不过会展开的 shell 上下文。
421412
- `cmd | tail; echo $?` 读到的是 `tail` 的状态 ⇒ 退出码在任何管道之前捕获。
422413
- CI job 的失败 step 不必与 job 名一致 ⇒ ⛔ 不由 job 名推原因,先读 step 名再下结论。

‎scripts/pm/check-skill-line-ratchet.mjs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1107,7 +1107,9 @@ export const CEILINGS = new Map([
11071107
// contrast on the trailing newline or on session-id length.
11081108
// Nothing else was paid in place: re-wrap funding is refused per the
11091109
// 2026-08-17 rule in any case. Landed count, headroom 0, same convention.
1110-
['.claude/skills/pm-dispatch/references/platform-readings.md', 469],
1110+
// Lowered 469 → 460 by the tool-first diet: nine readings a `scripts/pm` tool
1111+
// now holds were deleted whole (lowering is always legitimate). Landed count.
1112+
['.claude/skills/pm-dispatch/references/platform-readings.md', 460],
11111113
// Per-operation REST/GraphQL/git channel mapping — which fleet operation has
11121114
// a REST twin (each row executed in a real session, provenance date carried
11131115
// per row), the handful that are GraphQL-only, and the queue-routing

0 commit comments

Comments
 (0)