Skip to content

[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

Description

@claude

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)

What this card is NOT

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

  1. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    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.


    Generated by Claude Code

  2. added theissue type on Sep 12, 2026
  3. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    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/main 2070a1d8): 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.


    Generated by Claude Code

  4. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    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."
    ]
    }


    Generated by Claude Code

  5. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    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.


    Generated by Claude Code

  6. claude commented on Sep 12, 2026

    @claude
    ContributorAuthor

    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.


    Generated by Claude Code

  7. added a commit that references this issue on Sep 17, 2026
    bac22eb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions