You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] rest-channel.md rows 1–2 say the draft flip and auto-merge are GraphQL-only with no fallback — the proxy's ccr REST routes now do both on the seat's own credential (measured twice on 2026-09-12) #17820
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/main2070a1d8):
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)
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.md to name the ccr routes as the seat-credential channel for the draft flip and for auto-merge / enqueue, with the read-back criterion unchanged (「状态码不作数,读回才作数」; the enqueue is verified by added_to_merge_queue on the timeline, the landing shape by git rev-list --parents). Keep MCP as the alternative, ⛔ not the only channel.
platform-readings.md (449/449, ratcheted) gets no row from this card unless the family PR on that file is open at the time; the rest-channel.md rows are the carrier.
Triage (skills-lane finding self-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.md rows 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. finding dropped; 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 the ccr routes 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.md only (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.md free 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, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T08:47Z.
Claim: PM loop round 1
Session: session_01MCLBsUgfykL74aU716rzVK (GitHub os-sales, skills seat), claimed at 2026-09-12T08:48Z
Branch: claude/issue-17820-rest-channel-ccr-routes
Worktree: objectstack-issue-17820
Domain: 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 on origin/main2070a1d8): name the ccr REST 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, ⛔ not platform-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 seat
Clause-②: no
Thread-read: 5644832032 (the grading comment, 2026-09-12T08:48Z)
Serial constraints cleared: rest-channel.md free 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 open pm:on-hold (evidence 5644551740, 5644830981), #17374 open pm:queue held for the maintainer — read-only, ⛔ not touched.
os-dev-report
{
"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. ⚠️ 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.",
"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."
]
}
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 「写侧 —— 全部可迁移」 carry POST …/ccr/ready_for_review (reverse …/ccr/convert_to_draft), the retained 2026-09-11 naked-PATCH reading with its date, the read-back criterion in both halves, PUT …/ccr/auto_merge{"merge_method":"SQUASH"} (DELETE disarms), the enqueue/landing verdicts (added_to_merge_queue, git rev-list --parents) with the ⛔ on the auto_merge field 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.md untouched.
Read on the diff, not the report: 82 lines before and after (wc -l on 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 in check-skill-line-ratchet.mjs at ~861–867: 「红窗规则由 platform-readings.md 配额段独家持有,rest-channel.md 只留指路」, 「folded into the 不可迁移 heading at zero line cost」) already prescribes; on origin/main the 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 carries Fixes #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-ratchet verdict 「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.md lines 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-decision on 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 on d6ebc638 were still running; the maintainer merges on green. On MERGED: landing record here, pm:dispatched + assignee cleared in one write. Skills seat, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T09:15Z.
Landing record — PR #17823 MERGED 2026-09-12T10:05Z through the merge queue as bac22eb7 by os-zhuang (governed surface: approved 09:41:13Z, flipped ready 09:41:18Z, auto-merge armed 09:41:36Z, added_to_merge_queue 09:42:17Z — all the maintainer's acts; the seat placed the four-piece only: ACCEPT 5644958470, 速读 5644958643). Content verified on origin/main by git at 2026-09-12T10:08Z: references/rest-channel.md carries the ccr/ready_for_review and ccr/auto_merge rows 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 of origin/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:dispatched and the assignee are cleared in the next write. Skills seat, session session_01MCLBsUgfykL74aU716rzVK, 2026-09-12T10:08Z.
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…