docs(pm): rest-channel.md rows 1–2 name the ccr REST routes for the draft flip and auto-merge - #17823
Conversation
…raft flip and auto-merge The session proxy refuses POST /graphql outright and its refusal names first-party REST routes on the seat's own credential, so the draft -> ready flip and auto-merge / enqueue are no longer GraphQL-only: both were driven with read-back on 2026-09-12 by two seats. The two rows leave the "not migratable" bucket for the write-side list, keeping MCP as the alternative rather than the only channel, keeping the read-back criteria, and recording the one cost that comes with the new channel -- the timeline actor differs by channel. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
维护者速读改了什么 — PM 的 REST 通道对照表( 为什么改 — 表里的事实错了。代价不是掉链子,是排错计划:席位按旧表会在 MCP 限流时干等,而它自己的通道是通的。今天两次实调都带读回:cli 席 07:46Z(PR #17812),本席 08:45Z(PR #17816,MCP 刚被限流,改走 ccr 路由,入队事件落在时间线上)。 风险与代价(含回滚) — 一条已写进表里、不裁:走 ccr 路由时时间线上的操作者记成 席位意见 — 接受(ACCEPT 5644958470,契约档复核)。附带更正一处本席自己的误读:派发时说这文件「不在棘轮里」,实际在,余量为 0;dev 的净零行支付是对的做法。 你要做的 — 受管面( Generated by Claude Code |
The session proxy refuses
POST /graphqloutright and its refusal names first-party REST routes on the seat's own credential, sorest-channel.mdrows 1 and 2 — the draft → ready flip and auto-merge / enqueue — are no longer GraphQL-only with no fallback. Both routes were driven with read-back on 2026-09-12, by the cli seat at 07:46Z and by the skills seat at 08:45Z. The two rows therefore leave the 「不可迁移」 bucket for the write-side list asccrbullets that keep MCP as the alternative rather than the only channel, keep the read-back criteria unchanged, and record in one clause the cost the new channel brings: the timeline actor differs by channel.Fixes #17820
Acceptance notes
Premises, checked on
origin/mainbefore the first edit2070a1d8(git diff 2070a1d8 HEAD -- .claude/skills/pm-dispatch/references/rest-channel.mdis empty); the rows sit at lines 53–57 onc1078a559, not 51–56, which is a line-number drift only.['.claude/skills/pm-dispatch/references/rest-channel.md', 82]inscripts/pm/check-skill-line-ratchet.mjs, i.e. the file sits at headroom 0, and it is additionally recorded as a SOURCE (93 → 82) inside a declared CROSS_FILE_MOVE, so its ceiling number is load-bearing arithmetic for another file's raise. The second half of the premise holds:MAX_LINE_BYTES = 120applies per line, and every line written here is within it (the widest is exactly 120 bytes).rest-channel.md— checked by reading the file list of all 20 open PRs, not from memory.How the required content was paid for, at net zero lines
The rewrite needed seven bullets where the two retired rows occupied five lines, and a ratchet at headroom 0 admits no raise without a maintainer ruling. The missing two lines came from restoring an encoding a standing maintainer ruling already prescribed for this very file, quoted in the ratchet script's own CEILINGS comment (2026-09-01, 总监批): 「C 同批:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:红窗规则由
platform-readings.md配额段独家持有,rest-channel.md只留指路」, which the same comment records as having been paid "folded into the 不可迁移 heading at zero line cost". The pointer had since drifted back out into a standalone line plus its blank; it is folded back into the heading here, verbatim in substance. Result: 82 lines before, 82 lines after, ceiling 82, headroom 0 — the file's own convention, and the CEILINGS entry is untouched.What landed, per work item
POST .../pulls/{n}/ccr/ready_for_reviewand the reverse.../ccr/convert_to_draftare named as the seat-credential channel; MCPupdate_pull_requeststays as the alternative; the read-back criterion 「状态码不作数,读回才作数」 stays, now spelled with both halves (GET /pulls/{n}→draft: false, timelineready_for_review). The 「断粮:等它恢复或人工点一下」 clause is gone.PUT .../pulls/{n}/ccr/auto_mergewith{"merge_method":"SQUASH"},DELETEdisarms; MCPenable_pr_auto_mergestays as the alternative; enqueue is verified byadded_to_merge_queueon the timeline and the landing shape bygit rev-list --parents, with 「⛔auto_merge与回显都不作数」 keeping both unreliable readings out. 「配额红窗无退路」 is gone; the direct-merge notePUT .../pulls/{n}/mergeis kept.claude[bot],MCP 记席位账号」. Stated as a fact, with no recommendation and no ruling; the card number is deliberately absent becausepnpm check:pm-skill-id-lintbans issue IDs in this corpus, so the question's owner cannot be cited in-file.Reading kept rather than dropped
The old row 1's naked-
PATCHreading (「PATCH /pulls/{n}带{"draft": false}回 200 且什么都没改」) is kept, as the ⛔ line directly under the new route. It is what stops a seat from reaching for the plain REST route now that a REST route exists, and it is the evidence behind 「状态码不作数」.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackin this worktree, derived atd6ebc6383, printed 14 commands; all 14 were run and all exited 0. Verdict lines worth quoting:Two of the fourteen first exited 3 — PREREQUISITE NOT MET, not a finding:
pnpm installhad not run in this fresh worktree, andcheck:doc-formula-expressionsadditionally needed@objectstack/formulaand@objectstack/lintbuilt. Both were re-run green afterpnpm installand a lock-heldturbo run build --filter=@objectstack/formula --filter=@objectstack/lint. No changeset: the diff is.claude/**only, which publishes nothing from any released package, so the PR carriesskip-changeset.Out of scope, reported not done
references/platform-readings.mdnow contradicts this table in three of its lines — 「undraft 可用路径只有 MCP 这条」, 「裸 GraphQL 在会话内被拒,它建议的改用 REST 对 undraft 是错的」 (the suggested route now works) and theenable_pr_auto_mergerows that read as the only enqueue channel. The card explicitly rules that file out of this landing, so nothing here touches it; the skills lane owns the follow-up. Also noted, not filed: the actor question — an act through accrroute is written to the timeline asclaude[bot]and through MCP as the seat account — belongs to the open card that holds it, and this PR rules nothing about it.维护者速读(草稿)
改了什么 — PM 用的 REST 通道对照表里,「draft 转 ready」和「挂 auto-merge / 入队」两条原本写着「只能走 GraphQL、配额红窗里无路可走」。今天平台不再这样:会话代理直接拒绝 GraphQL,并在拒绝里点名一组席位凭据可用的 REST 路由。这两条改写成「有 REST 通道、MCP 仍是备选」,并从「不可迁移」挪到「写侧」,同时保留原有的「读回才作数」判据。
为什么改 — 表里的事实错了,代价不是掉链子而是排错计划:席位按旧表会在配额红窗里干等或去找人工点按钮,而它自己的通道是通的。两次实调(2026-09-12,cli 席 07:46Z、skills 席 08:45Z)都带读回验证。
风险与代价(含回滚) — 风险有一条并已写进表里:走 ccr 路由时,时间线上的操作者记成
claude[bot],走 MCP 记成席位账号;哪个对是另一张卡的问题,本 PR 不裁。回滚成本为零 —— 单文件文档改动,git revert即可,无代码、无发布物、无 changeset。行数守恒:82 行进、82 行出,棘轮天花板与其跨文件移动声明都没动。席位意见 —
你要做的 — 这是受管面(
.claude/**),按规矩只能由维护者人工合并;PR 停在 draft,席位不会翻 ready、不会挂 auto-merge。需要你确认的只有一点:本 PR 把「红窗规则只在platform-readings.md、本表只留指路」那条既有裁决的编码方式(折进「不可迁移」标题、零行成本)恢复了原样,以此腾出两行装下新内容。若你希望改用「把天花板从 82 提到 84」的方式承载,请直接说,届时需要你的一句提额裁决。Generated by Claude Code
Generated by Claude Code