pm-dispatch: reconcile the quota rows with the identity-bound rate limit; merged-write rule; account-suspension recovery readings - #18242
Conversation
…account-suspension recovery readings 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 <noreply@anthropic.com>
Contract reviewServed-tier: Reviewing seat: ① Derived judgments
② Semver levelNot applicable — nothing published moves; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)改了什么:三份席位规则/事实文件加一份门禁台账。① 事实表 为什么改:这是 2026-09-10 整个 fleet 被停用事故复盘卡的后半。前半已把「限流绑定身份」写进通道表;事实表里却还留着相反的指引,席位照读就会重演事故里的那个动作。恢复流程当时是现场摸索出来的,没写下来下次还要摸一遍;写入合并的口径此前完全空白。 风险与代价(含回滚):纯文本规则与事实,不碰任何发布包,不改 CI 行为。代价是 席位意见:建议批准。本席核过:两处折叠的规则都幸存(砍掉的只是理由句);五行去重在 你要做的(一个动作):approve 本 PR。approve 后本席翻 ready + 入队,你不必再点合并。 Generated by Claude Code |
|
Ruling-C landing provenance — skills seat, session Generated by Claude Code |
Fixes #17374
Second half of the shared-identity rate-limit card. The first half (PR #17860, landed as
ed8dea17b) placed expectations 1 and 4 — the identity-bound rate-limit rows inreferences/rest-channel.mdand 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/**andscripts/pm/**sit outside every package'sfiles[]).What changed — 4 files, +60 / −7, head
694b1d2on baseb3b43b6references/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):
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:
Dedup table for the exception (候选/落地/已有/拒收): candidates 5 / landed 5 / already present 0 / refused 0. The family grep
suspended,停用,销毁,幽灵,重推,重建,对象库,分支名onorigin/mainatb3b43b6hits 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 onorigin/main.Ratchet: ceiling 454 → 459 in
scripts/pm/check-skill-line-ratchet.mjs, with a FIFTEENTHruledRaisesrecord 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_limitread: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.mdcounts 0 lines in the write-merging sense — every 合并 hit is merge-queue / merged-PR vocabulary — against control限流3 lines. The quota rows inplatform-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)A5 measured:
grep -c 'NOT MEASURED\|销毁\|404'onreview-checklist.mdand oncontract-review.mdatb3b43b6= 0 and 0 (controlINCONCLUSIVE= 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.mdandcore-rules.md; the dispatch word's A5 asks for exactly this one reviewer line inreview-checklist.mdorcontract-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
GET /useranswers a different id. Measured on this container:GET /useron the REST credential answersos-zhuangid 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.origin/mainatb3b43b6versus head694b1d2, 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; controlINCONCLUSIVE2 → 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
b3b43b6prescribed the switch; both re-conditioned in place as above.origin/main; all four F3 steps plus the recognition reading were absent and land.review-checklist.md.Gates — head
694b1d2node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; change set taken from git off merge baseb3b43b6ea, 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).--ranon 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 withtail --pid; verdict line✓ dispatch-gates self-test: 1723 cases pass.pnpm --filter "@objectstack/lint..." buildunderos-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.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.pnpm lintnot run.Acceptance notes
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'sGET /usercomparison 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.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