Skip to content

pm-dispatch: REST channel as the default read path, plus the per-operation channel map - #11749

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-11364-rest-default-read-path
Aug 24, 2026
Merged

pm-dispatch: REST channel as the default read path, plus the per-operation channel map#11749
hotlong merged 1 commit into
mainfrom
claude/issue-11364-rest-default-read-path

Conversation

@claude

@claudeclaudeBot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Fixes#11364
Fixes#11375
Fixes#11366

Three folded cards from one quota family, one ruling stroke. Governed surface (.claude/**) — this PR stays draft; human merge is the review.

Ruling provenance

  • Maintainer 2026-08-23, live PM chat, verbatim: 「1+2+3」 — approved the quota trio (this PR carries options ① and ③).
  • Maintainer 2026-08-23, live PM chat, verbatim: 「可走 REST 的操作清单,同意立卡」 — approved the fact sheet.
  • Maintainer 2026-08-24, verbatim: 「动手吧」 — approved folding the queue-routing rider rows into the fact sheet.
  • Maintainer 2026-08-24, verbatim: 「我觉得够了」 — the as-configured 9-check required set recorded in the rename-coupling row.

Which card drove which hunk

#11364 — the policy flip (references/platform-readings.md, API-quota section). The read order is now stated as git → REST → MCP/GraphQL, with the container curl channel (App installation token, REST core 15,000/hr, independent bucket — measured 14,938 remaining while this seat's GraphQL pool was exhausted twice in one day) as the default path for list / dedup / card / PR / label reads. GraphQL is reserved for the operations with no REST twin. Every measured fact and provenance date already in the file is preserved; three channel-partition rows consolidated into two, and the downstream wording that still called REST a "退路" was brought in line (the degraded-read row, the "graphql remaining below 1000" rule, and the search-zero fallback row).

#11375 — the content (new references/rest-channel.md, 46 lines). The card body's mapping table lands as its own fact sheet: read side, write side, the GraphQL-only handful, the git zero-quota bucket, and the channel boundary, each ✓ row carrying its 2026-08-23 provenance date. Plus the 2026-08-24 addendum rows: merged_by = enqueuing actor (not bypass evidence), the distinguishing reading for queue routing, and the rename-coupling row (objectui, 9 required checks).

#11366 — the two quota rows (references/platform-readings.md). (a) Right-size perPage to the expected population — points scale with nodes/100, so a 3-item read at perPage:100 pays ~33× the points; composes with the existing 107-point measurement rather than restating it. (b) Pace label/comment mutations ~1s apart — the 2,000-point/minute secondary limit sits beside the hourly pool and mutations count 5× for it, so a same-second batch trips the minute wall while the hourly pool is still green.

Ratchet (scripts/pm/check-skill-line-ratchet.mjs). Data rows only — no mechanism change (#11106 owns the bytes-vs-lines question and is not addressed here). New CEILINGS entry for rest-channel.md at its landed 46, headroom 0, with a provenance comment in the same pattern as the state-machine / contract-review entries. platform-readings.mdLOWERED 133 → 130 — shrinking needs no ruling, and the consolidation paid for both new rows in place with three lines left over.

Two premise corrections, declared rather than papered over

  1. The merge_group zero-count reading is dead, and did not land as written. The dispatched row said "repo-wide event=merge_group run count, zero on an enforced queue = empty required set". That inference was falsified on the same card 29 minutes after the addendum was written (count went 0 → 8 at 2026-08-24T11:04:47Z), and re-measured 224 in this session before writing the row. Landing it verbatim would have written a known-false inference into doctrine. What landed instead is the durable form the correction itself identifies: the count answers "has it happened yet", not "does the mechanism exist"; a zero count is a weak prior; the decisive reading is the attempted action. The measured history (0 → 8 → 224) is kept in the row as its own tombstone. Readings (a) and (b) — the direct-merge 405 and the added_to_merge_queue timeline event — survive untouched, and the fact sheet adds a third attempted-action reading (update-branch on a queued PR).
  2. The "only four" non-migratable operations are five.platform-readings.md already carries a 2026-08-24 measured row that issue transfer has no REST route. Landing "the only four" verbatim while the sibling file measures a fifth would have shipped a contradiction, so issue transfer is listed as item 5 with its own provenance and a pointer to the existing rebuild recipe. Additive — no row from the card's table was dropped or rewritten.

Also checked and not changed: references/dispatch-runbook.md. #11364's body asked for the same reorder there, but the runbook carries no read-order policy — its single quota row is a pre-dispatch batch-sizing rule, unaffected by the flip. Editing it would have been a no-op at best.

One home each

Verified per-fact across the two files: maintainer_can_modify / transfer 路由 / merged_by live only in rest-channel.md; 14,938 / 2,000 点/分 / the 107-point measurement live only in platform-readings.md. added_to_merge_queue appears in both by design — the full doctrine row (spelling, boundary, the auto_merge-field warning) stays in platform-readings.md, and the fact sheet composes with it by pointer, which is what the addendum asked for.

Gates

Derived from the real changeset via node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack with no path arguments (exit 0; provenance line names this repo at the commit below). All 12 matched families run green at HEAD 41b3060d, exit codes captured before any pipe:

check:pm-skill-ratchet ✓ platform-readings.md is 130 lines (ceiling 130; headroom 0)
✓ rest-channel.md is 46 lines (ceiling 46; headroom 0)
✓ self-test: 20 cases pass
check:pm-skill-id-lint ✓ 22 file(s) clean (pattern /#[0-9]{3,}/g)
check:doc-authoring ✓ doc authoring guard: 389 files clean — no bare metadata literals
check:pm-governed-merges ✓ self-test: 129 assertions
check:skill-frame-sync ✓ 4 copies of the decision frame are structurally isomorphic across 3 files
check:doc-formula-expressions ✓ 22 record-scoped formula example(s) across 421 files / 1449 TS blocks judged clean
check:nul-bytes ✓ OK (scanned 6554 text file(s); no raw ASCII control bytes)
check:agent-test-spelling · check:cross-package-test-inputs · check:entry-guard ·
check:parse-guard · check:pnpm-filter-targets · scripts/check-cross-package-test-inputs.mjs — all exit 0

Additionally run: check:pm-dispatch-gates and check:pm-governed-prose (both exit 0). The derivation flags these as artifact rosters sitting in a directory one of the changed paths is in — a silent verdict that "reads as a clearance and is not" — so they were run rather than inferred.

No changeset: .claude/** and scripts/pm/** publish nothing. skip-changeset applied additively and read back.

Generated by Claude Code


Generated by Claude Code

…r-operation channel map
Three folded cards, one quota-family change to the pm-dispatch reference
surface.
Policy flip: platform-readings.md's API-quota section now states the read
order as git -> REST -> MCP/GraphQL, with the container curl channel (App
installation token, REST core 15,000/hr, independent bucket) as the DEFAULT
path for list/dedup/card/PR reads. The GraphQL pool is reserved for the
operations with no REST twin. Every measured fact and provenance date already
in the file is preserved; the three channel-partition rows consolidated into
two, which paid for the two new right-sized-read rows in place.
New references/rest-channel.md carries the per-operation mapping (read side,
write side, the GraphQL-only handful, the git zero-quota bucket, the channel
boundary), each row with its measurement date, plus the queue-routing
readings.
Ratchet: platform-readings.md LOWERED 133 -> 130 (shrink, no ruling needed);
new CEILINGS row for rest-channel.md at its landed 46, headroom 0. Data rows
only - no mechanism change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 24, 2026
@hotlong
hotlong marked this pull request as ready for review August 24, 2026 15:11
@hotlong
hotlong enabled auto-merge August 24, 2026 15:11
@hotlong
hotlong added this pull request to the merge queueAug 24, 2026
Merged via the queue into main with commit 6d0ccccAug 24, 2026
32 checks passed
@hotlong
hotlong deleted the claude/issue-11364-rest-default-read-path branch August 24, 2026 15:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment