Skip to content

skills(pm-dispatch): a rate-limit refusal binds to the identity, not the client; destroyed evidence reads NOT MEASURED - #17860

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17374-rate-limit-identity
Sep 12, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-17374-rate-limit-identity

Conversation

@claude

@claude claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Part of #17374 — first half only (expectations 1, 4 and the record for 5). The second half (expectation 2, the write-throttling 口径; expectation 3, the F3 recovery steps; and the reconciliation of platform-readings.md :95–:125) is deferred until PR #17803 and PR #17855 land; #17374 remains open after this merges.

Governed surface (.claude/**): draft PR at the human terminal. No changeset — dispatch-gates.mjs derives 17 gate families for the diff and none is a publish family; nothing in any package files[] moves.

What changed (head 58885bc0b, base 7f625364b)

Two files, both at their ratchet ceilings, both paid in place by deletion — line counts unchanged (82/82, 403/403), every edited line ≤120 B, ⛔ no ceiling raise, ⛔ no re-wrap, ⛔ no cross-file move.

1. references/rest-channel.md 〈通道边界〉 — the identity-bound rate-limit rule (expectation 1)

Added after the /rate_limit credential-shape line (:11), where a seat already reads 「先跑一条 repo-scoped 探针再选通道」:

- 限流拒绝绑定被拒身份(报文 user ID):同身份各写通道一并耗尽,⛔ 换通道续写与重试同罪。
- 他侧只在身份不同时是退路:凭据 `GET /user` ≠ 被拒 user ID 才换;席内 PM 与 dev 同一身份。

This is the operative form of the card's F1 sentence 「一次限流信号绑定在身份上;⛔ 在同一身份的另一条通道上继续写,与重试同罪」, with the one legitimate fallback stated as a check the seat performs before switching: the refusal names a user ID; the other side is a different reading only if its credential answers a different user ID on GET /user. Within one seat the PM and its dev subagents are one identity, so a dev's refusal is the seat's refusal.

Consistency with the standing facts in platform-readings.md (read-only here): :95–:97 (quota is per account, one identity holds only inside a seat, ⛔ no cross-seat pool inferred from a refusal's user ID) — the rule binds to the identity named in the refusal and nothing wider; :122 (a refusal is that side's reading) — the identity comparison is how a seat tells whether the other side is another reading or the same one. The 限流 clause of :123 「限流、403、传输失败都要试过另一侧才说得出我没手段」 is the reconciliation the claim assigns to the second half; it is not touched here.

Paid by (deleted, with where the content survives):

  • :12 「按班矩阵与降级梯住 platform-readings.md,⛔ 不在本表复述。」 — a pointer restated at :3 (「见 platform-readings.md 配额段」) and :67 (「本表只指路,⛔ 不在两处各存一份」); the 降级梯 lives in the quota section :3 already points to.
  • :43 「GraphQL 池为 0 的同一分钟里开得出 draft PR ⇒ 交付不必等重置。」 — the capability survives at the ✓ row directly above it (:42, POST .../pullsdraft=true); the prescription half 「交付不必等重置」 is the unconditional form of the act the new rule conditions on identity (same identity ⇒ the same act as a retry), so it cannot stand beside the rule. Its conditional replacement is the new line 2.

2. .claude/agents/os-dev.md — destroyed evidence reads NOT MEASURED (expectation 4)

Added directly after :174 「两类跑了却没测到,都读作 NOT MEASURED,不读作绿也不读作红。」, the home of the NOT MEASURED family (:96, :100, :174, :344 on main); the report-contract section defines open_questions as a field but carries no verdict-reading rules, so the family home is the tighter fit:

- 证据已销毁(评论、卡或 PR 答 404)的复核项记 NOT MEASURED 并写因,⛔ 不记通过或「无旗」。

Paid by: :172 「引用门禁结果时点名它自己印的判定行,永不引裸 $?:判定行由门禁写,$? 由你的管道写。」 — restated at :166 「门禁结果的读法:退出码在任何管道之前捕获,报告里引门禁自己印的判定行。」 and at 资源纪律 1 「结论读它印的 VERDICT command-exit 行,⛔ 不读裸 $?」; the trailing clause was rationale.

3. Expectation 5 — already met on main, nothing built

The half-state patrol's H40 「Dangling references」 row on anchor #9857 (scripts/pm/check-half-states.mjs) lists every open card/PR whose # reference answers 404. Read on the anchor's current sweep body: 363 of 400 attempted resolutions answered over 6365 distinct references; 37 do not resolve; ⛔ only HTTP 404 is read as unresolvable; every count a lower bound. A destroyed card is therefore detected by patrol, not by someone noticing.

Acceptance reading

  • Criterion 1 (「客户端 A 报限流、客户端 B 有额度」): the text now answers. Same identity (the refusal's user ID equals what B's credential answers on GET /user) ⇒ 「停」 — B's full quota is not a fallback. Different identity ⇒ verify the two user IDs differ, then switch. The seat does not infer; it compares two numbers.
  • Criterion 2 (normal-quota writes untouched): both new lines fire only on a refusal; nothing slows or batches a write under normal quota, and no transport is banned (REST, GraphQL and MCP all remain in the table).
  • Criterion 3 (rehearsed recovery): second half, with F3.
  • Criterion 4 (ablation, grep on the two files): at origin/main git grep -c -E '身份|限流' on rest-channel.md = 0 and git grep -c -E '销毁|404' on os-dev.md = 0 (lit controls: 探针//rate_limit hit :7/:10/:11/:31; NOT MEASURED hit :96/:100/:174/:344). At head 58885bc0b the same greps read 2 and 1, and NOT MEASURED reads 5. With the new lines removed, criterion 1's question is again unanswerable by the text.
  • Criterion 5: item 3 above.

The three 「⛔ 三条不要走的路」 hold: no transport is banned; nothing relies on 「下次注意」 (the rule is a check with two inputs); no new quota-exhaustion exit is introduced — the fallback that existed unconditionally is now narrower, not wider.

A measured falsification of the dispatch word

The dispatch cited a 2026-09-12 reading (MCP refusal naming user ID 319429713; seat /rate_limit 15000/15000; GET /user answering os-sales) as a switch between two different users. Measured on this container at PR time: GET /user answers login: os-sales, id: 319429713 — the same user ID the MCP refusal named. Under the rule as written the two are one identity and that switch answers 「停」, consistent with the evidence comment on the card (5628795815: one client's bucket dry while another on the same user reads full — per-(user, app) buckets on one identity). The rule is unchanged by this; it is the comparison that catches it. Reported for the seat's reading, no state changed.

Gates (run on head 58885bc0b, exit codes captured by redirect before any pipe)

node scripts/pm/dispatch-gates.mjs --commands derived 17 families; all 17 run, all exit 0; --ran reconciles 17/17 (0 UNRUN). Named: check:pm-skill-ratchet (rest-channel.md 82/82, os-dev.md 403/403, 「declared cross-file moves: 1, total ceilings down 9 lines」 unchanged), check:pm-skill-id-lint (27 files clean), check:skill-frame-sync (frame untouched), check:nul-bytes, check:agent-model-declared, check:doc-authoring, check:agent-test-spelling, check:commit-card-trailers, check:watch-hint-literal, check:refd-timer-probe, check:driver-memory-census, check:pm-governed-merges, closing-keyword-parity (+ self-test), comment-mask-corpus, governed-queue-guard self-test, and the lint-package check:doc-formula-expressions after building the @objectstack/lint closure under os-verify-lock.sh (VERDICT command-exit 0, held 176s). Repo-wide pnpm lint is CI's run, not run here.

Acceptance notes

  • noted, not filed: references/rest-channel.md :53 carries a provenance date (「两条 2026-09-12 两席实调」) of the kind the rules-only rewrite removed elsewhere; a density candidate for any later net-reducing PR on this file. 承接者:无.

维护者速读(草稿)

改了什么:两个文件各加一条纪律、各删一条已在别处写过的话,行数不变。① rest-channel.md〈通道边界〉:限流拒绝绑在被拒的身份上(报文里的 user ID),同一身份的所有写通道一起耗尽,换通道继续写等同重试;只有另一侧凭据 GET /user 答出的是不同的 user ID 才算退路;席内 PM 与 dev 是同一身份。② os-dev.md:复核项的证据被销毁(评论、卡、PR 答 404)时记 NOT MEASURED 并写原因,不记通过、不记「无旗」。期望 5 已由 H40 巡检行满足,不另建。

为什么改:2026-09-10 整队被停用的复盘卡指出,当时的规矩只禁「重试」,没说限流信号绑的是身份而不是手上的客户端,于是一个席位可以合规地换通道继续写。本 PR 只写纪律,不动舰队身份结构(#17392 已关)。

风险与代价(含回滚):纯文本纪律,不改代码、不改门禁、不发布任何包;正常额度下的写入不受影响,也不禁用任何传输方式。删掉的两条在同文件别处仍有原话或被新条款取代。回滚 = revert 本 PR 一个 commit。

席位意见:(留空)

你要做的:确认 ① 「同一身份 ⇒ 停」这条线画在你要的位置(而非按传输方式画);② 期望 2、3 与 platform-readings.md :123 的对齐留给第二半;然后人工直合。


Generated by Claude Code

…the client; destroyed evidence reads NOT MEASURED

rest-channel.md 通道边界: a rate-limit refusal binds to the identity named
in the refusal text; every write channel of that identity is exhausted with
it, and continuing to write on another channel of the same identity is the
same act as a retry. The other side is a fallback only when its credential
answers a different identity on GET /user; within one seat the PM and its
dev subagents are one identity. Paid in place: the platform-readings pointer
(restated at :3 and :67) and the unconditional "open the draft PR without
waiting for reset" prescription (the capability stays at the ✓ POST row).

os-dev.md NOT MEASURED family: a review item whose evidence was destroyed
(its comment, card or PR answers 404) is recorded NOT MEASURED with the
reason, never as passed and never as "no flag". Paid in place: the verdict-
line restatement (already stated at 资源纪律 1 and 门禁结果的读法).

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
@claude

claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读

事情:9 月 10 日整个 fleet 被 GitHub 停用的复盘卡(#17374,p1)提出的第一条纪律:限流拒绝约束的是被拒的那个用户身份,不是手上这个客户端——同一身份换一条通道继续写,与重试同罪;只有对方凭据 GET /user 答出不同的 user ID 才算退路。第二条:证据已被销毁(评论/卡/PR 变 404)的复核项记 NOT MEASURED,永不记作通过。第三条(引用的卡变 404 要看得见)巡查 H40 行已经做到,不再建。

改了什么:rest-channel.md 加两行、删两行(其中删掉的「GraphQL 池空也能开 draft PR ⇒ 不必等重置」正是这条纪律要禁止的动作);os-dev.md 加一行、删一行(被删规则在 :166 逐字存活)。82/82、403/403 不增,门禁 17/17 绿。不改 fleet 身份结构(你 9 月 11 日已裁 #17392 关)。

顺带的自查:本席今早 MCP 被限流后改走 ccr REST 路由继续挂 auto-merge,当时读成「MCP 是另一个身份」。dev 实测 GET /user 答的正是被拒的那个 user ID —— 同一身份两个客户端,按这条新规则应当。已在验收里如实记录并改口。

没做的(第二半,等 PR #17803#17855 合并后再派):写入节流口径、账号事故恢复四步、platform-readings.md :123「要试过另一侧」与本规则的对接。

风险:低。协议文本;这条规则只在收到限流拒绝时生效,正常额度下的写入不受影响。

只问一字:是否合并?


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 12, 2026 15:28
@os-zhuang
os-zhuang enabled auto-merge September 12, 2026 15:28
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 12, 2026
Merged via the queue into main with commit ed8dea1 Sep 12, 2026
36 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17374-rate-limit-identity branch September 12, 2026 15:52
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 17, 2026
…mit; merged-write rule; account-suspension recovery readings (objectstack-ai#18242)

Fixes objectstack-ai#17374

Second half of the shared-identity rate-limit card. The first half (PR
objectstack-ai#17860, landed as `ed8dea17b`) placed expectations 1 and 4 — the
identity-bound rate-limit rows in `references/rest-channel.md` and the
destroyed-evidence NOT MEASURED line in `.claude/agents/os-dev.md`;
expectation 5 is met by the half-state patrol's H40 row. This PR lands
what was deferred behind same-file serial: expectation 2 (merged
writes), expectation 3 (the account-suspension recovery steps as
readings), the reconciliation of the two quota rows that still
prescribed the same-identity channel switch, and the reviewing seat's
NOT MEASURED line. With this the card's five expectations are all
placed. F5 (GitHub App / machine users) is the maintainer's
infrastructure decision and not this card's; the disciplines here hold
independently of it.

Clause-②: no — no published `skills/**` file moves; no operator or
contract semantics.
skip-changeset — nothing published moves (`.claude/**` and
`scripts/pm/**` sit outside every package's `files[]`).

## What changed — 4 files, +60 / −7, head `694b1d2` on base `b3b43b6`

### `references/platform-readings.md` — 454 → 459 (+5 under the standing
one-file exception)

Two quota-block rows re-conditioned in place (line-neutral; they pay
nothing and buy nothing):

- 「限流、403、传输失败都要试过另一侧才说得出我没手段。」 → 「403 与传输失败要试过另一侧才说得出我没手段;限流先比身份,同 ID
的他侧不是手段。」 (114 B)
- 「⇒ MCP 限流先探 REST 再定退避,⛔ 不据一侧限流把整个平台的写都停掉。」 → 「⇒ MCP 限流先 `GET /user` 比
ID:同 ID 的 REST 满额不是退路,写排队到重置;异 ID 才是。」 (109 B)

Until this PR both rows told a seat to do the exact same-identity
channel switch that `rest-channel.md`'s identity-bound rows (landed by
the first half) forbid. The 403 and transport halves stay as they were:
those are per-side readings, and the row above them (「任一侧的拒绝只是那一侧的读数」)
is untouched. Reads are untouched too — the row below (「MCP
的读限流与写限流彼此独立」) still governs them, and the identity test is itself a
read on the other side. 「写排队到重置」 points at the standing
queue-into-the-patrol-word row (:159) rather than restating it.

Five new rows after the retry-alignment row (the end of the
quota-exhaustion prescriptions), one measured event per row, each under
120 B:

1. 「停用报文 account was suspended 遍及 /rate_limit 与 git,不给理由;非会话门 403、非限流。」
(108 B) — the recognition reading: the third 403 shape beside the
session gate and the rate limit, which is what tells a seat the four
steps below now apply.
2. 「账号停用销毁其名下 PR、卡与评论;分支与 commit 属仓库照留远端 ⇒ 代码从未真丢。」 (112 B) — F3 step 1.
3. 「被销毁的 PR 仍占分支名:API 答 404,同名开新 PR 仍被拒 ⇒ 同批 commit 推新分支名再开。」 (114 B) —
F3 step 2.
4. 「本地对象库是最后备份:复核时 fetch 过的每条分支,其 head 在停用后仍在本地可推。」 (110 B) — F3 step 3.
5. 「重建 PR 正文自报四件:head 逐字节同、无 rebase/amend/squash、数字出自旧基底、CI 为准。」 (113 B)
— F3 step 4.

Dedup table for the exception (候选/落地/已有/拒收): candidates 5 / landed 5 /
already present 0 / refused 0. The family grep `suspended`, `停用`, `销毁`,
`幽灵`, `重推`, `重建`, `对象库`, `分支名` on `origin/main` at `b3b43b6` hits only
the Routine-rebuild rows (:445–:446, :453), the issue-transfer rebuild
row (:144) and the landing criterion (:366); none carries any of the
five, and the later suspension-row family the dispatch word anticipated
does not exist on `origin/main`.

Ratchet: ceiling 454 → 459 in `scripts/pm/check-skill-line-ratchet.mjs`,
with a FIFTEENTH `ruledRaises` record citing the standing exception
verbatim — 「唯一例外:`platform-readings.md` 增量抬上限到落地行数,免决策卡,记 `ruledRaises`
引常设裁决。条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排」 — and the increment
accounted for line by line beside the ceiling. The cross-file-move
arithmetic re-derives unchanged (`+11 against a net source decrease of
20`).

### `SKILL.md` 〈平台读数纪律〉 — 812 → 812 (equal-line, paid by density)

Added as the section's last line, beside the pre-dispatch `rate_limit`
read:

- 「写少而大:同卡同轮结论合成一条评论,⛔ 不放慢单笔、不攒着一次性发;写量按身份计。」 (117 B)

Paid by folding the two maintainer-abort lines into one:
「维护者中止只在有显式信号时成立:原话,或宿主回报 stopped by the user。」 + 「⛔
不据推断立一道没有重启条件的门;判据是信号不是症状。」 → 「维护者中止只认原话或宿主回报 stopped by the user,⛔
不据推断立无重启条件的门。」 (108 B). Every operative clause survives (explicit signal
only; no inference-built gate without a restart condition); 「判据是信号不是症状」
is the first clause said twice. `references/core-rules.md` :46 already
digests this pair in one line, so the mirror is unchanged (151 / 151).

A2 measured on `b3b43b6`: `grep -c '合并\|少而大\|节流' SKILL.md` counts 0
lines in the write-merging sense — every 合并 hit is merge-queue /
merged-PR vocabulary — against control `限流` 3 lines. The quota rows in
`platform-readings.md` (:103–:105: the per-minute secondary limit, the
~1 s spacing between mutations, the same-second burst that hits the
minute wall) answer the BURST half of the card's shape and not the MERGE
half: nothing on the seat surface said fewer-and-larger, and nothing
said not-slower. The dev side already carries a merged budget
(`os-dev.md` 写预算四笔); the seat side now carries this line.

### `references/review-checklist.md` 〈测试与门禁证据〉 — 77 → 77 (equal-line,
paid by density)

- 「复核项证据已销毁(评论、卡或 PR 答 404)⇒ 记 NOT MEASURED 并写因,⛔ 不记通过或无旗。」 (113 B) —
directly under the INCONCLUSIVE row, so the reviewer's verdict
vocabulary now has all three: INCONCLUSIVE (the positive control
failed), NOT MEASURED (the evidence is destroyed), 不入账 (a dead-tree
reading).

A5 measured: `grep -c 'NOT MEASURED\|销毁\|404'` on `review-checklist.md`
and on `contract-review.md` at `b3b43b6` = 0 and 0 (control
`INCONCLUSIVE` = 2 in review-checklist), so the reviewer had no line to
read; the first half's line lives in the dev's file. Paid by folding the
dead-code deletion pair (:75–:76) into 「以死代码或不可达为由的删除,PM 先在
`origin/main` 用带引号精确名核引用面,再 ACCEPT。」 (113 B): the rule survives whole
and the deleted half (「这是断言不是 diff 里的事实,而这一查只花十秒」) is rationale.

Face note: the claim comment's file surface names
`platform-readings.md`, `SKILL.md` and `core-rules.md`; the dispatch
word's A5 asks for exactly this one reviewer line in
`review-checklist.md` or `contract-review.md`, inside the ratchets, and
this is the one deviation from the claim's list. All 11 open PRs' file
lists were read at 2026-09-15T02:46Z, immediately before this PR was
opened; none touches any file in this diff.

## Acceptance against the card

1. **Positive** (client A refused, client B has quota): the quota
section itself now answers 停 for the same user ID — 「限流先比身份,同 ID
的他侧不是手段」 and 「同 ID 的 REST 满额不是退路,写排队到重置」 — and 「异 ID 才是」 only when `GET
/user` answers a different id. Measured on this container: `GET /user`
on the REST credential answers `os-zhuang` id 277994282, the same login
as the card's assignee, so PM and dev are one identity in this seat —
exactly the case the rule is for.
2. **Negative control** (normal-quota writes unaffected): every changed
rule fires only on a refusal, a suspension or a destroyed record; the
new SKILL.md line says 「⛔ 不放慢单笔、不攒着一次性发」 in so many words, so it can
neither slow a write nor push a seat toward the burst shape. No
transport is banned, no 「下次注意」 is written, no green-widening exemption
is introduced — the card's three 「不要走的路」 hold.
3. **Rehearsed recovery**: on record rather than staged. The incident's
own recovery is the rehearsal — PRs objectstack-ai#17332, objectstack-ai#17334, objectstack-ai#17336 and objectstack-ai#17339
were rebuilt on new branch names from the same commits with
byte-identical heads, each self-reporting the four items row 5 now
spells. A staged suspension is not something this PR can or should
perform; the five rows are the steps that recovery took, written so the
next seat does not rediscover them.
4. **Ablation** (grep line counts, `origin/main` at `b3b43b6` versus
head `694b1d2`, with a lit control in the same file):
- `platform-readings.md`, pattern 停用 / 销毁 / 新分支名 / 对象库: 0 → 4 (row 5's
term 自报 is excluded because :220 already carries it in another sense;
`自报四件` alone reads 0 → 1); control `限流` 10 → 11.
- `platform-readings.md`, pattern 比 ID / 比身份: 0 → 2; the deleted
instruction 先探 REST / 整个平台的写: 1 → 0.
   - `SKILL.md`, pattern 少而大 / 攒着 / 按身份计: 0 → 1; control `限流` 3 → 3.
- `review-checklist.md`, pattern NOT MEASURED / 销毁: 0 → 1; control
`INCONCLUSIVE` 2 → 2.
Remove the new text and the positive case is again answered only by
`rest-channel.md`, with the quota section arguing the other way.

## Mechanism assumptions from the dispatch word, measured

- A1 — confirmed: :123 and :126 on `b3b43b6` prescribed the switch; both
re-conditioned in place as above.
- A2 — measured as above; a rule line was owed, and it lands in
〈平台读数纪律〉.
- A3 — the family grep found no suspension rows on `origin/main`; all
four F3 steps plus the recognition reading were absent and land.
- A4 — recorded under acceptance 3.
- A5 — measured as above; the reviewer line lands in
`review-checklist.md`.

## Gates — head `694b1d2`

`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (no paths; change set taken from git off
merge base `b3b43b6ea`, 4 committed paths) derived 40 commands. 39 of
the 40 ran in the foreground with the exit captured by redirect before
any pipe, and every one exits 0; the 40th is the tool's own self-test,
run detached (below). `--ran` on the exit-carrying record reconciles 40
derived / 40 run / 0 unrun.

- `check:pm-skill-ratchet` (self-test + gate): `cross-file move into
platform-readings.md: +11 (314→459, less 134 lines of ordinary ruled
raise) against a net source decrease of 20` · `declared cross-file
moves: 1, total ceilings down 9 lines`.
- `check:pm-dispatch-gates` (the tool's own self-test, 1723 cases):
detached per its header's foreground-cap warning, waited on in the
foreground with `tail --pid`; verdict line `✓ dispatch-gates self-test:
1723 cases pass.`
- The three lint-package families ran after `pnpm --filter
"@objectstack/lint..." build` under `os-verify-lock.sh` (VERDICT
command-exit 0, held 220 s, waited 0 s).
- `check:pm-skill-id-lint`, `check:skill-frame-sync`, `check:nul-bytes`,
`check:ratchet-remedy-authority`, `check:pm-governed-prose`,
`check:required-contexts`: exit 0.
- Three roster families the derivation marked as sitting under
`scripts/` beside this diff were run in addition:
`check-published-list-mirrors`, `check:pm-label-desc-cap`,
`check-skills-token-ratchet` — all three exit 0.
- Not measured locally, CI's: the 3 workflow-value families, the Test
Core job, the 11 wide-population families, the 14 changeset-pending
families (skip-changeset), the remaining artifact rosters; repo-wide
`pnpm lint` not run.
- Control-byte scan on the four files: 0 hits. No changed line over 120
B in the three markdown files. No card number in any added operative
line.

## Acceptance notes

- noted, not filed (承接者: the skills seat, holder of the same-batch
tension ruling): `platform-readings.md` :97 「⛔ 不据限流报文里的 user ID 推池子跨席共用」
and :143 「报文里的 user ID 只是报文」 stay as written — the ratchet's own record
says both hold pending a discriminating read, and the first half's `GET
/user` comparison is that read (the id in the refusal text names the
identity and says nothing about cross-seat pools), so :143's 「只是报文」
could become 「只标身份」 at equal bytes in a later density pass. Not edited
here because the ruling says neither is.
- noted, not filed (承接者: none): `core-rules.md` 〈平台读数纪律〉 carries no
digest of the new write-merging line; the mirror's own header says it
adds no rules, and the claim conditions a mirror edit on a core clause
moving, which none did.

## 维护者速读(草稿)

**改了什么**:三份 PM 席位的规则/事实文件加一份门禁台账。① 事实表 `platform-readings.md`
配额段:把两条还在教席位「限流了就换另一条通道继续写」的行改成「先比身份,同一身份就停写排队」,并新增五行记下账号被停用时的识别信号与恢复步骤(分支和提交不丢、被销毁的
PR 仍占着分支名要换名重推、本地对象库是备份、重建的 PR 要自报)。② 席位规则 `SKILL.md`:加一行「写少而大」——
同一张卡同一轮的结论合成一条评论,既不放慢单笔也不攒着突发,写入量按身份合计;用合并两行既有规则付账。③ 复核清单:复核项的证据被销毁时记
NOT MEASURED,不记通过;同样以合并两行付账。④ 棘轮台账:`platform-readings.md` 上限 454 →
459,按常设例外记录。

**为什么改**:这是 2026-09-10 整个 fleet
被停用的事故复盘卡的后半。前半已把「限流绑定身份」写进通道表;但事实表里还留着相反的指引,席位照读就会重演事故里的那个动作。恢复流程当时是现场摸索出来的,没写下来下次还要摸一遍。写入合并的口径此前完全空白。

**风险与代价(含回滚)**:纯文本规则与事实,不碰任何发布包,不改 CI 行为。代价是 `platform-readings.md` 多 5
行(每行 ≤120 字节,一事一行),其余三份文件行数不变。回滚 = revert 本 PR 的一个
commit,无迁移。误读风险:「写排队到重置」不是「所有写变慢」,新行已明写不放慢单笔。

**席位意见**:

**你要做的**:审批本 PR(受管面,需要你的 approve
后由席位入队);若认为「写量按身份计」或恢复五行的措辞有误,直接改文字或留言,席位按你的话修。

---
_Generated by [Claude
Code](https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr)_

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants