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
[finding] Platform reading: REST PATCH /pulls/{n} with {"draft": false} answers HTTP 200 and silently does nothing — the channel table records the field as unsupported, but on documentation, and a 200 reads as success #17582
Filed unassigned by the domain:spec execution seat. Recording a platform fact only — no severity asserted, routing and grading are the skills lane's. This is the 「平台事实变化 ⇒ references 事实表改一行」 class.
The reading
rest-channel.md already lists the draft→ready flip as REST-unsupported, on documentation rather than a probe — its own words: "判据 = REST update-a-pull-request 只收 title/body/state/base/maintainer_can_modify,无 draft(与第 5 条同批核对官方文档,未逐个实调)". It is measured now, and the measurement is worse than the doc implies:
PATCH /repos/objectstack-ai/objectstack/pulls/17572 {"draft": false}
→ HTTP 200 ⬅ a success code
→ readback: draft = true ⛔ the field was silently ignored
→ body_len unchanged (7123) (the PATCH disturbed nothing else)
⇒ REST answers 200 and does nothing. ⛔ Not a 422, not a 400, not an "unrecognised field" warning — a success.
⭐ Why the distinction earns a row. A documented absence tells a seat "don't bother". A measured silent 200 tells it something stronger: any seat that flips a draft over REST and reads the status code will record the PR as ready and move on, and the PR will sit in draft until someone notices. The existing row, read literally, does not warn about that — it says the field is not accepted, which a reader naturally imagines as an error. The catch here was the read-back, not the code.
The other two channels, measured in the same minutes
GraphQLmarkPullRequestReadyForReview → HTTP 403, "This GraphQL query is not enabled for this session — only the pinned set of PR-review operations is served."⚠️ A structural refusal: ⛔ no re-run changes it, and it is ⛔ not evidence about the mutation itself.
MCPupdate_pull_request(draft:false) → "API rate limit already exceeded for user ID 324100929", twice, minutes apart — while $GITHUB_TOKEN's REST identity read 14,981 of 15,000 remaining on the same clock. Different identities; the quota does not transfer.
⇒ With MCP exhausted, a green, clean, fully pre-checked PR has no agent-reachable path out of draft. That happened to PR #17572 at 00:12Z and is recorded there.
⚠️ That last point is an instance of the open #17374 (a rate-limit signal binds an identity, not a client), ⛔ not a duplicate of it: this card is about the REST draft field's silent 200, which is true whatever the quota is doing. The quota is what made the gap visible today.
Suggested landing (the skills lane decides)
.claude/skills/pm-dispatch/references/rest-channel.md, item 1 of 不可迁移 — replace the "未逐个实调" basis with the measurement, and say the refusal is a silent 200 with no state change, so the read-back is mandatory rather than advisable. One row, same voice.
What this does NOT claim
⛔ No claim the proxy or GitHub is wrong. It is a fact to record, not a defect to fix.
⛔ No claim about any other REST field. Only draft was probed; title/body/state/base were not, and a single probe does not license a general statement.
Filed unassigned by the
domain:specexecution seat. Recording a platform fact only — no severity asserted, routing and grading are the skills lane's. This is the 「平台事实变化 ⇒ references 事实表改一行」 class.The reading
rest-channel.mdalready lists the draft→ready flip as REST-unsupported, on documentation rather than a probe — its own words: "判据 = REST update-a-pull-request 只收title/body/state/base/maintainer_can_modify,无draft(与第 5 条同批核对官方文档,未逐个实调)". It is measured now, and the measurement is worse than the doc implies:⇒ REST answers 200 and does nothing. ⛔ Not a 422, not a 400, not an "unrecognised field" warning — a success.
⭐ Why the distinction earns a row. A documented absence tells a seat "don't bother". A measured silent 200 tells it something stronger: any seat that flips a draft over REST and reads the status code will record the PR as ready and move on, and the PR will sit in draft until someone notices. The existing row, read literally, does not warn about that — it says the field is not accepted, which a reader naturally imagines as an error. The catch here was the read-back, not the code.
The other two channels, measured in the same minutes
markPullRequestReadyForReview→ HTTP 403, "This GraphQL query is not enabled for this session — only the pinned set of PR-review operations is served."update_pull_request(draft:false)→ "API rate limit already exceeded for user ID 324100929", twice, minutes apart — while$GITHUB_TOKEN's REST identity read 14,981 of 15,000 remaining on the same clock. Different identities; the quota does not transfer.⇒ With MCP exhausted, a green, clean, fully pre-checked PR has no agent-reachable path out of draft. That happened to PR #17572 at 00:12Z and is recorded there.
draftfield's silent 200, which is true whatever the quota is doing. The quota is what made the gap visible today.Suggested landing (the skills lane decides)
.claude/skills/pm-dispatch/references/rest-channel.md, item 1 of 不可迁移 — replace the "未逐个实调" basis with the measurement, and say the refusal is a silent 200 with no state change, so the read-back is mandatory rather than advisable. One row, same voice.What this does NOT claim
draftwas probed;title/body/state/basewere not, and a single probe does not license a general statement.findinganddomain:skillslabel sets,state=all, updated since 2026-08-01 ⇒ 588 unique issues, title+body grepped formarkPullRequestReadyForReview,draft…ready,silently ignored,ready for review. No card carries this fact. Nearest neighbours, both examined: 共享身份的限流纪律不存在:一次限流信号约束的是「身份」不是「客户端」,而规矩只说了不要重试 —— 2026-09-10 全 fleet 停摆事故 #17374 (open — shared-identity rate-limit discipline; the quota half, ⛔ not the REST half) and [finding] Two clause-② PRs were flipped ready and enqueued whileneeds:contract-reviewwas still on them (objectui#8723 01:58Z, #16998 02:00Z) — nothing in the merge queue reads the carrier #17040 (closed — clause-② PRs flipped ready while gated; about whether to flip, ⛔ not about the channel). Lit control on the same corpus:rest-channelreturned five cards ([Decision] Skills optimization program — batch 3 (5 items): DATA-F-07defineHook()vs the platform's own examples · #13597 Phase-2 — X0 quote policy ·CLAUDE.mdexcerpt form · the four-copy decision frame · cross-file line-budget moves #14685, [finding] After ruling B (#14859),AGENTS.md:12-13and thescripts/pm/check-skill-id-lint.mjsheader still describe the pm-dispatch provenance form as "date + verbatim quote" — the two off-surface sentences PR #14911 could not touch #14913, [finding] REST update-branch is a PM-usable merge-main route (full SHA required; 422 when the base has not moved); job-log download is proxy-refused, annotations suffice #14928, [PM decision] skills lane batch 7 — raise the platform-readings.md line ceiling by the measured +34 so the intake family's eight readings can land #15013, [PM corpus] rules only, plain language: strip provenance narratives and incident post-mortems from the pm-dispatch skill corpus (maintainer 2026-09-04) — member 1: SKILL.md #15379) ⇒ the zeros are readings.since=2026-08-01.domain:*.Refs: PR #17572 (where it blocked a fully green PR) · #17374 · #17563 (the sibling REST-channel row measured in the same session).
domain:specexecution seat ·session_01MkQhmuuJAVDjmeWNixwDDH· measured and filed 2026-09-11T00:15ZGenerated by Claude Code