From 694b1d2841faf626fd3c0567153b3eefe50c594b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 15 Sep 2026 02:27:30 +0000 Subject: [PATCH] pm-dispatch: identity-bound rate-limit prescriptions, write merging, account-suspension recovery readings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second half of the shared-identity rate-limit card. - platform-readings.md quota block: the two rows that still told a seat to try the other channel on a rate limit are re-conditioned in place on the GET /user identity test (403 and transport failures stay per-side readings); five new rows record the account-suspension signal and the measured recovery (branches and commits survive, a destroyed PR holds its branch name, the local object store is the backup, a rebuilt PR self-reports). +5 under the standing one-file exception, recorded as a ruledRaises record in the ratchet. - SKILL.md 平台读数纪律: one rule line for merged writes (fewer and larger, no per-write slowing, no burst; write volume counts per identity), paid by folding the two maintainer-abort lines into one. - review-checklist.md: the reviewing seat's NOT MEASURED line for destroyed evidence, paid by folding the dead-code deletion pair into one line. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude --- .claude/skills/pm-dispatch/SKILL.md | 4 +- .../references/platform-readings.md | 9 +++- .../references/review-checklist.md | 4 +- scripts/pm/check-skill-line-ratchet.mjs | 50 ++++++++++++++++++- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 11b83eb951..57a91e88f7 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -172,8 +172,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - advisory 门禁红着进 main 是共享损伤,任何车道发现都立即止血并立单。 - main-red 的跳队例外与事故锚卡约定见 `references/landing-operations.md` B 节。 - dev 自己死了不等于维护者中止:子代理消失是正常死法,走死认领回收。 -- 维护者中止只在有显式信号时成立:原话,或宿主回报 stopped by the user。 -- ⛔ 不据推断立一道没有重启条件的门;判据是信号不是症状。 +- 维护者中止只认原话或宿主回报 stopped by the user,⛔ 不据推断立无重启条件的门。 - 立卡者不查重,只附 3–5 个查重词;分诊按词查自有列表,零命中须控制词背书。 - 共享基础设施修复入队前按症状复查 main,不按 issue 号。 - 真撞上重复,先比数值与作用域再决定关哪个。 @@ -183,6 +182,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 冲突立成 `needs-user-decision` 卡,该 PR 不挂 auto-merge 留异议窗口。 - 读序 git、payload、REST、MCP;REST 可达性逐会话探一次;通道对照见 `references/rest-channel.md`。 - 派发前读一次 `rate_limit`,余量装不下整批就减批,⛔ 不靠撞墙发现。 +- 写少而大:同卡同轮结论合成一条评论,⛔ 不放慢单笔、不攒着一次性发;写量按身份计。 ## 多仓协调 diff --git a/.claude/skills/pm-dispatch/references/platform-readings.md b/.claude/skills/pm-dispatch/references/platform-readings.md index 23d0f0f298..a7b7031754 100644 --- a/.claude/skills/pm-dispatch/references/platform-readings.md +++ b/.claude/skills/pm-dispatch/references/platform-readings.md @@ -120,10 +120,10 @@ - REST 写侧经出口代理必带 `Content-Type: application/json`,否则代理回 415 且一个字节都没写。 - 判别式:该 415 的 `documentation_url` 指 Claude Code 不指 GitHub ⇒ 代理拒,不是 GitHub;四端点实测。 - 两通道的信封在配额、权限、传输三样上都不同 ⇒ 任一侧的拒绝只是那一侧的读数。 -- 限流、403、传输失败都要试过另一侧才说得出我没手段。 +- 403 与传输失败要试过另一侧才说得出我没手段;限流先比身份,同 ID 的他侧不是手段。 - 读数:`POST /actions/runs/{id}/rerun-failed-jobs` REST 回 403 而 MCP 回 201。 - job 日志只有 MCP 取得回,REST 侧转 blob 存储 `http=000`;同分钟 MCP 限流而 REST core 满 15000。 -- ⇒ MCP 限流先探 REST 再定退避,⛔ 不据一侧限流把整个平台的写都停掉。 +- ⇒ MCP 限流先 `GET /user` 比 ID:同 ID 的 REST 满额不是退路,写排队到重置;异 ID 才是。 - MCP 的读限流与写限流彼此独立,两向各有实测 ⇒ 一侧被拒 ⛔ 不推另一侧也不可用。 - REST 档以本班 repo-scoped 探针绿为前提;403 会话改按降级梯读。 - 容器 curl 的 REST 通道令牌按会话定:installation(`claude[bot]`)或 user-to-server(用户),core 15,000/时。 @@ -158,6 +158,11 @@ - 中途撞限流的 dev 完不成强制查重,只能把发现交回 PM 代为归档,⛔ 不盲目开卡。 - 打满时待执行写排成有序清单挂进巡逻词,不靠记忆;恢复窗口按序连清。 - 重试对齐整点(REST core 整点重置)优于指数退避,⛔ 绝不忙轮询。 +- 停用报文 account was suspended 遍及 /rate_limit 与 git,不给理由;非会话门 403、非限流。 +- 账号停用销毁其名下 PR、卡与评论;分支与 commit 属仓库照留远端 ⇒ 代码从未真丢。 +- 被销毁的 PR 仍占分支名:API 答 404,同名开新 PR 仍被拒 ⇒ 同批 commit 推新分支名再开。 +- 本地对象库是最后备份:复核时 fetch 过的每条分支,其 head 在停用后仍在本地可推。 +- 重建 PR 正文自报四件:head 逐字节同、无 rebase/amend/squash、数字出自旧基底、CI 为准。 - 文档载明未实测:条件请求答 `304` 不计 core 池。 - 公开仓零配额读法两档,payload 档优先 —— 只有 body 精确。 - 网页档可达性逐会话逐 URL 形状分叉:一处容器 `/actions/**` 与 api. 回 403,另一处网页全 200。 diff --git a/.claude/skills/pm-dispatch/references/review-checklist.md b/.claude/skills/pm-dispatch/references/review-checklist.md index 605ab0a3aa..a170da565a 100644 --- a/.claude/skills/pm-dispatch/references/review-checklist.md +++ b/.claude/skills/pm-dispatch/references/review-checklist.md @@ -32,6 +32,7 @@ - 测试证据要有真实命令与通过输出,⛔ 不接受一句 tests pass。 - 测量类交付先看阳性对照:对照本身失败 ⇒ 该读数记 INCONCLUSIVE,⛔ 不入账。 +- 复核项证据已销毁(评论、卡或 PR 答 404)⇒ 记 NOT MEASURED 并写因,⛔ 不记通过或无旗。 - 引 entry `.d.ts` 逐字节相同的读数必须同块带阳性对照,它只判名字集。 - 对 barrel 已转发符号的形状恒无效:`export *` 与 `export type { X } from` 都不复述形状。 - 判据是同块点名声明该符号的模块那份移动了的产物,或具名探针;缺则记 INCONCLUSIVE。 @@ -72,6 +73,5 @@ - 但推翻过程必须写在 PR 正文并附 main 语料上的实测信噪比,否则按 REWORK 要证据。 - `+0/-0` 不是空文件的证明:NUL 字节让 git 当二进制渲染,还让文件对 grep 隐身。 - 先疑 NUL,以 blob 定论 `git show : | wc -l`,要求源侧写转义序列。 -- 以死代码或不可达为由的删除,PM 在 `origin/main` 上用带引号精确名自己核一次引用面。 -- 核过再 ACCEPT:这是断言不是 diff 里的事实,而这一查只花十秒。 +- 以死代码或不可达为由的删除,PM 先在 `origin/main` 用带引号精确名核引用面,再 ACCEPT。 - 卡的交付物含系统性 sweep 时,ACCEPT 评论把范围外产出成组列出并写明 sweep 判据。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index fa451dc8ca..393dc3b0da 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -905,7 +905,38 @@ export const CEILINGS = new Map([ // width 134 B), and the two neighbours the row joins offer 37 and 6 spare // bytes against its 115 bytes of content; 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', 454], + // Raised 454 → 459 by the FIFTEENTH 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. Spent at ONE + // line per deduplicated reading, each written in this file's voice, all five + // from one measured account-level incident and its measured recovery: the + // suspension signal is `account was suspended` on every endpoint including + // `/rate_limit` and on git, with no reason given — a third 403 shape beside + // the session gate and the rate limit (+1); a suspension destroys the + // account's PRs, cards and comments while every branch and commit stays on + // the remote, because those belong to the repository (+1); a destroyed PR + // still holds its branch name — the API answers 404 yet a new PR on the same + // branch is refused — so the same commits go up under a NEW branch name (+1); + // the local object store is the last backup — every branch a reviewer fetched + // to verify on the tree still has its head locally after the suspension, and + // it pushes (+1); and a rebuilt PR self-reports four things in its body: + // byte-identical head, no rebase/amend/squash, numbers from the old base, CI + // decides (+1) = +5 exactly. Candidates 5 / landed 5 / already present 0 / + // refused 0 — the family grep (suspended / 停用 / 销毁 / 幽灵 / 重推 / 重建 / + // 对象库 / 分支名) on `origin/main` hit only the Routine-rebuild and + // issue-transfer rows, none of which carries any of the five. + // + // TWO corrections are paid in place and buy nothing: the quota block's + // 「限流、403、传输失败都要试过另一侧才说得出我没手段」 row and its 「⇒ MCP 限流先探 + // REST 再定退避」 conclusion, which until this increment instructed the very + // same-identity channel switch that `rest-channel.md`'s identity-bound + // rate-limit rows forbid; both are re-conditioned in place, line-neutral, on + // the `GET /user` identity test, with the 403 and transport halves kept as + // the per-side readings they are. Nothing else was paid in place: the fourth + // increment MEASURED zero line-neutral folds among this file's adjacent rule + // pairs, and 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', 459], // 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 @@ -1560,6 +1591,23 @@ export const CROSS_FILE_MOVES = new Map([ date: '2026-09-14', delta: 1, }, + { + // The FIFTEENTH 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 +5 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-15', + delta: 5, + }, ], sources: [ ['.claude/skills/pm-dispatch/references/lanes/cli.md', 35],