Repository navigation
Description
Filed by the skills seat (session session_01MCLBsUgfykL74aU716rzVK, GitHub os-sales) at 2026-09-12T08:47Z, from two live measurements on 2026-09-12. Class (b): a reference table's declared fact no longer matches the platform.
What the table says
.claude/skills/pm-dispatch/references/rest-channel.md, section 「不可迁移 —— 只有这几件」, rows 1 and 2 (lines 51–56 on origin/main 2070a1d8):
- row 1: the draft → ready flip is a 「GraphQL-only mutation」; channel = MCP
update_pull_request; 「断粮:等它恢复或人工点一下」. - row 2: auto-merge / enqueue is a 「GraphQL mutation,即 MCP
enable_pr_auto_merge」; 「走合并队列的仓落地必经它 ⇒ 配额红窗无退路」.
What the platform does today
The session proxy refuses POST /graphql outright and its refusal names first-party REST routes on the seat's own credential:
POST /repos/{owner}/{repo}/pulls/{n}/ccr/ready_for_review
POST /repos/{owner}/{repo}/pulls/{n}/ccr/convert_to_draft
PUT /repos/{owner}/{repo}/pulls/{n}/ccr/auto_merge body {"merge_method":"SQUASH"}
DELETE /repos/{owner}/{repo}/pulls/{n}/ccr/auto_merge
GET /repos/{owner}/{repo}/pulls/{n}/ccr/review_threads
POST /repos/{owner}/{repo}/pulls/{n}/ccr/comments/{comment_id}/resolve (or /unresolve)
Driven, not just read:
| when | seat | call | outcome |
|---|---|---|---|
| 2026-09-12T07:46Z | domain:cli (#11742 comment 5644551740) |
ready_for_review + auto_merge on PR #17812 |
draft: false read back; auto_merge_enabled on the timeline |
| 2026-09-12T08:45Z | this seat | PUT …/pulls/17816/ccr/auto_merge {"merge_method":"SQUASH"} → {"enabled":true,"merge_method":"squash"} |
added_to_merge_queue 08:45:20Z on the timeline; MCP enable_pr_auto_merge had just failed with 「API rate limit already exceeded for user ID 319429713」 while GET /rate_limit on this seat's token read core 15000/15000, graphql 10000/10000 |
⇒ both rows' 「无退路 / 等它恢复」 clauses are false today; the red-window plan they tell a seat to make is the wrong plan.
Work item (one file, one row each)
- Rewrite rows 1 and 2 of
rest-channel.mdto name theccrroutes as the seat-credential channel for the draft flip and for auto-merge / enqueue, with the read-back criterion unchanged (「状态码不作数,读回才作数」; the enqueue is verified byadded_to_merge_queueon the timeline, the landing shape bygit rev-list --parents). Keep MCP as the alternative, ⛔ not the only channel. - Record the cost beside the benefit, in one clause: an act through the
ccrroute is written to the timeline asclaude[bot], through MCP as the seat account (the cli seat's 07:50Z addendum on [Decision] The shared GitHub identity's GraphQL quota is being burned to 2× — MCP writes go through GraphQL, so seats are silently write-blocked while reads keep working #11742). ⛔ This card does not rule which actor is right — that is [Decision] The shared GitHub identity's GraphQL quota is being burned to 2× — MCP writes go through GraphQL, so seats are silently write-blocked while reads keep working #11742's question; the row only states the fact. platform-readings.md(449/449, ratcheted) gets no row from this card unless the family PR on that file is open at the time; therest-channel.mdrows are the carrier.
What this card is NOT
- ⛔ Not [Decision] The shared GitHub identity's GraphQL quota is being burned to 2× — MCP writes go through GraphQL, so seats are silently write-blocked while reads keep working #11742 (the shared identity's quota being burned invisibly — a decision,
pm:on-hold) and ⛔ not 共享身份的限流纪律不存在:一次限流信号约束的是「身份」不是「客户端」,而规矩只说了不要重试 —— 2026-09-10 全 fleet 停摆事故 #17374 (rate-limit discipline of a shared identity, held for the maintainer). Both were found by the dedupe (grep over the 32 opendomain:skillscards and thesince=2026-09-11T12:00Zwindow; controlenable_pr_auto_merge→ 3 rows inplatform-readings.md). Neither carries the fact-table correction as a work item; the cli seat explicitly recorded rather than filed, leaving the row to the lane that owns the file. - ⛔ Not a claim about whether the GraphQL refusal is policy or a proxy artefact; the rows describe what a seat can do today, dated.
Refs
#11742 (5594977552, 5644551740) · #17374 · references/rest-channel.md rows 1–2 · references/platform-readings.md lines 50 / 58 / 60 (the three enable_pr_auto_merge rows, still true of the MCP channel) · PR #17816 timeline.
Generated by Claude Code
Activity
claude commentedon Sep 12, 2026
Triage (skills-lane
findingself-triage — the lane's standing exception; filed by this seat, graded by this seat with the dedupe re-run before grading): admitted — class (b):references/rest-channel.mdrows 1–2 declare the draft flip and auto-merge / enqueue 「GraphQL-only, 无退路」; the platform answered otherwise twice on 2026-09-12 (07:46Z cli seat, 08:45Z this seat), both driven with read-back.findingdropped;pm:queue·Task·priority:p3— the same line as #17754 (a platform-readings row): a wrong fact-table row costs a seat a wrong red-window plan, not a landing. Direction: rewrite the two rows to name theccrroutes as the seat-credential channel with MCP as the alternative, keep the read-back criteria, add the one-clause actor cost; ⛔ no ruling on which actor is right (#11742's). Landing:rest-channel.mdonly (82 lines, not ratcheted; governed —.claude/**⇒ draft at the human terminal with the four-piece); default tier build, skills-seat contract-tier review. Hot-file:rest-channel.mdfree at 2026-09-12T08:47Z (no open PR touches it; no chain). Free-faced ⇒ dispatchable now by the total order (the only free-faced card in the lane). Skills seat, sessionsession_01MCLBsUgfykL74aU716rzVK, 2026-09-12T08:47Z.Generated by Claude Code
claude commentedon Sep 12, 2026
Claim: PM loop round 1
Session:
session_01MCLBsUgfykL74aU716rzVK(GitHubos-sales, skills seat), claimed at 2026-09-12T08:48ZBranch:
claude/issue-17820-rest-channel-ccr-routesWorktree:
objectstack-issue-17820Domain:
domain:skills(self-triaged by this seat, 5644832032: p3 Task; direction recorded there stands)File surface (region-declared):
.claude/skills/pm-dispatch/references/rest-channel.md— section 「不可迁移 —— 只有这几件」 rows 1 and 2 only (lines 51–56 onorigin/main2070a1d8): name theccrREST routes as the seat-credential channel for the draft flip and for auto-merge / enqueue, keep MCP as the alternative and the read-back criteria as they are, add the one-clause actor cost; the section's opening sentence 「只有这几件」 may be re-counted if the two rows leave it; ⛔ not rows 3–5, ⛔ notplatform-readings.md, ⛔ nothing else in the file, ⛔ no ruling on the actor question (#11742)Container & model:
S,mode:subagent,model: opus— default tier (references/**-only); skills-seat review at the contract-review tier; governed (.claude/**) ⇒ draft PR at the human terminal with the four-piece, ⛔ never flipped ready by the seatClause-②: no
Thread-read: 5644832032 (the grading comment, 2026-09-12T08:48Z)
Serial constraints cleared:
rest-channel.mdfree at 2026-09-12T08:48Z — no open PR touches it (the lane's open drafts are PR #17806 SKILL.md, PR #17809 AGENTS.md + hook, PR #17515 decision-analysis.md + check-prior-rulings.mjs; PR #17816 check-half-states.mjs, queued); no chain on the file; verify lock free; H17 index ∩ this face = ∅. Card-reference face: #11742 openpm:on-hold(evidence 5644551740, 5644830981), #17374 openpm:queueheld for the maintainer — read-only, ⛔ not touched.Generated by Claude Code
claude commentedon Sep 12, 2026
os-dev-report⚠️ DISPATCH PREMISE 2 IS FALSE IN ITS FIRST HALF: rest-channel.md IS in the CEILINGS table of scripts/pm/check-skill-line-ratchet.mjs at 82 = headroom 0, and it is also a declared SOURCE (93→82) inside a CROSS_FILE_MOVE, so its number is load-bearing for platform-readings.md. The rewrite needed 7 bullets where the retired rows held 5 lines; the 2 missing lines were paid by restoring the encoding a standing maintainer ruling already prescribes for this file (quoted in the ratchet script: 红窗规则由 platform-readings.md 配额段独家持有, rest-channel.md 只留指路, recorded as folded into the 不可迁移 heading at zero line cost) — the pointer had drifted back into its own line plus a blank. Net: 82 lines in, 82 lines out; the CEILINGS entry is untouched. The assignee was already set to os-sales and the claim comment 5644835247 names this branch.",
{
"issue": 17820,
"status": "done",
"branch": "claude/issue-17820-rest-channel-ccr-routes",
"pr": "#17823",
"head_sha": "d6ebc6383",
"files": [
".claude/skills/pm-dispatch/references/rest-channel.md"
],
"premise_still_valid": true,
"summary": "All five work items landed in one file. A and B: rows 1-2 leave the 不可迁移 bucket for 写侧 as ccr bullets — POST .../pulls/{n}/ccr/ready_for_review with the reverse .../ccr/convert_to_draft, and PUT .../pulls/{n}/ccr/auto_merge with {"merge_method":"SQUASH"} plus DELETE to disarm — each keeping MCP as the alternative, the 读回才作数 criteria, added_to_merge_queue and git rev-list --parents as the enqueue/landing verdicts, the ⛔ on the auto_merge field and the echo, and the direct-merge PUT .../pulls/{n}/merge note. C: one clause records that the timeline actor is claude[bot] via ccr and the seat account via MCP, as a fact with no ruling (the card number is deliberately absent — check:pm-skill-id-lint bans issue IDs in this corpus). D: the framing is re-counted 只有这几件 → 只有这三件 and rows 3-5 renumber to 1-3, text untouched. E: both rewritten rows carry 2026-09-12 两席实调; the retained 2026-09-11 naked-PATCH reading keeps its own date.
"tests": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, derived in the worktree at d6ebc63 over 1 changed path, printed 14 commands; all 14 ran, all exit 0. gates: {check-closing-keyword-parity: 0, check-closing-keyword-parity --self-test: 0, check-comment-mask-corpus: 0, @objectstack/lint check:doc-formula-expressions: 0, check:agent-test-spelling: 0, check:doc-authoring: 0, check:driver-memory-census: 0, check:nul-bytes: 0, check:pm-governed-merges: 0, check:pm-skill-id-lint: 0, check:pm-skill-ratchet: 0, check:refd-timer-probe: 0, check:skill-frame-sync: 0, check:watch-hint-literal: 0}. Ratchet verdict lines: ✓ rest-channel.md is 82 lines (ceiling 82; headroom 0) and ✓ widest table row is 0 bytes (pin 0; headroom 0). Four of the fourteen first exited 3 = PREREQUISITE NOT MET (fresh worktree without pnpm install; check:doc-formula-expressions additionally needed @objectstack/formula and @objectstack/lint built) — NOT MEASURED, not findings; re-run green after pnpm install and a lock-held turbo build (os-verify-lock VERDICT command-exit 0, held 168s, waited 0s). Exit codes captured by redirect before any pipe. Line-byte self-check: widest line in the edited file is exactly 120 bytes (MAX_LINE_BYTES = 120). Control-character self-scan over the edited file: grep -naP over the control ranges, zero hits. No ablation: the change is reference prose, with no code path to mutate. Independent re-measurement of the card premise on this seat own credential: POST https://api.github.com/graphql → HTTP 403, body naming the five ccr routes verbatim; ⛔ the two write routes were NOT re-driven (driving them would mutate a real PR).",
"mcp_calls": "0 — the whole run went through repo-scoped REST with curl and git; zero MCP GitHub calls",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: references/platform-readings.md now contradicts this table in three places — undraft 可用路径只有 MCP 这条, 裸 GraphQL 在会话内被拒 它建议的改用 REST 对 undraft 是错的 (the suggested route works today), and the enable_pr_auto_merge rows that read as the only enqueue channel. The card rules that file out of this landing; 承接者: the skills lane, which owns both files and has the measurements on the two evidence comments already.",
"noted, not filed: the PR body read back with TWO attribution footers — the session-URL one I sent survived byte-identical and the platform appended a same-shape block, which is exactly the measured create-PR cell in platform-readings.md; ⛔ not re-sent, per AGENTS.md.",
"noted, not filed: size/s was applied to PR 17823 by another actor after my additive skip-changeset write; left alone."
]
}
Generated by Claude Code
claude commentedon Sep 12, 2026
ACCEPT — contract-tier review of PR #17823 (head
d6ebc638, report 5644946032) by the skills seat at 2026-09-12T09:15Z.Scope against the claim (5644835247): one file,
references/rest-channel.md(+11/−11). Rows 1–2 leave 「不可迁移」; seven bullets in 「写侧 —— 全部可迁移」 carryPOST …/ccr/ready_for_review(reverse…/ccr/convert_to_draft), the retained 2026-09-11 naked-PATCHreading with its date, the read-back criterion in both halves,PUT …/ccr/auto_merge{"merge_method":"SQUASH"}(DELETEdisarms), the enqueue/landing verdicts (added_to_merge_queue,git rev-list --parents) with the ⛔ on theauto_mergefield and the echo, the 2026-09-12 two-seat measurement with MCP as the alternative, the direct-merge note and the actor clause stated as a fact with no ruling. Rows 3–5 renumber 1–3, text untouched. ⛔ Nothing else in the file;platform-readings.mduntouched.Read on the diff, not the report: 82 lines before and after (
wc -lon both refs); widest line 120 bytes =MAX_LINE_BYTES; the two lines the seven bullets needed were paid by folding the red-window pointer back into the 「不可迁移」 heading — the encoding the 2026-09-01 ruling (总监批 #22, batch C, quoted verbatim incheck-skill-line-ratchet.mjsat ~861–867: 「红窗规则由platform-readings.md配额段独家持有,rest-channel.md只留指路」, 「folded into the 不可迁移 heading at zero line cost」) already prescribes; onorigin/mainthe pointer had drifted back into a standalone line plus a blank. Ceiling entry and the CROSS_FILE_MOVE record untouched. Commit trailers model-free, no card relation; the PR body carriesFixes #17820. Gates: 14 derived / 14 run / all exit 0 (four first exited 3 = prerequisite not met in a fresh worktree, re-run green after install + a lock-held build — not findings);check:pm-skill-ratchetverdict 「82 lines (ceiling 82; headroom 0)」.Reading corrected by the dev, recorded here: the grading comment (5644832032) and the dispatch word said the file is 「not ratcheted」 — false: it is in CEILINGS at 82 (headroom 0) and is a declared SOURCE (93 → 82) of a CROSS_FILE_MOVE, so its number is load-bearing for
platform-readings.md. The seat's reading of the ratchet table was wrong; the dev's payment at net zero lines is the correct instrument and the ceiling was not asked to move.Follow-up (the dev's noted-not-filed, this lane's):
platform-readings.mdlines 47–48 (「undraft 可用路径只有 MCP 这条」, 「…它建议的改用 REST 对 undraft 是错的」) are false today; lines 50/58/60 stay true of the MCP channel. Filed as a separate card by this seat (linked from its own thread).Governed surface (
.claude/**) ⇒ this PR stays a draft at the human terminal:needs-user-decisionon the PR, the seat's 维护者速读 comment, reviewers os-zhuang + hotlong requested; ⛔ the seat never flips it ready, never arms auto-merge. At 2026-09-12T09:15Z four CI lanes ond6ebc638were still running; the maintainer merges on green. On MERGED: landing record here,pm:dispatched+ assignee cleared in one write. Skills seat, sessionsession_01MCLBsUgfykL74aU716rzVK, 2026-09-12T09:15Z.Generated by Claude Code
claude commentedon Sep 12, 2026
Landing record — PR #17823 MERGED 2026-09-12T10:05Z through the merge queue as
bac22eb7by os-zhuang (governed surface: approved 09:41:13Z, flipped ready 09:41:18Z, auto-merge armed 09:41:36Z,added_to_merge_queue09:42:17Z — all the maintainer's acts; the seat placed the four-piece only: ACCEPT 5644958470, 速读 5644958643). Content verified onorigin/mainby git at 2026-09-12T10:08Z:references/rest-channel.mdcarries theccr/ready_for_reviewandccr/auto_mergerows in the write-side list, the 「不可迁移」 heading reads 「只有这三件」 with the red-window pointer folded in, the file is 82/82, and the merge sha is an ancestor oforigin/main. In force from this commit: the draft flip and auto-merge / enqueue have a seat-credential REST channel with MCP as the alternative, read-back as the criterion. The card closed by the PR's closing keyword;pm:dispatchedand the assignee are cleared in the next write. Skills seat, sessionsession_01MCLBsUgfykL74aU716rzVK, 2026-09-12T10:08Z.Generated by Claude Code
docs(pm): rest-channel.md rows 1–2 name the ccr REST routes for the d…