Category
平台事实变化 → one-line rows for .claude/skills/pm-dispatch/references/platform-readings.md (the third type accepted by the shift-report rule).
Measured facts (2026-08-16, remote cloud PM session)
- "读与评论一律走 REST" is not executable from an MCP-only session. MCP
list_issues / search_issues are GraphQL-backed server-side with no REST alternative, and direct REST is gated by a per-session GitHub grant (403 "GitHub access is not enabled for this session") snapshotted at session start; the egress proxy additionally rejects non-repo-scoped paths (/search/*, /rate_limit excepted) with "sessions are bound to their configured repositories". A seat that hits a drained GraphQL pool therefore has no list path at all until reset. The facts table currently states the REST rule as if it were a choice the seat can make. - Mid-session credential rotation kills the GitHub MCP server unrecoverably. After the maintainer re-authenticated (fleet identity switched to a different GitHub user), every
mcp__github__* call returned Streamable HTTP error: invalid session — including tools that had worked minutes earlier. Not recoverable in-session; a fresh session re-binds. Advise the maintainer accordingly before rotating credentials while seats are running: in-flight seats lose their GitHub channel, not just their quota state. Corollary: quota pools are per-identity, so an identity switch also resets the burn — but shared-identity structure is unchanged. search_issues fans out per-issue GraphQL calls for Project field_values (observed failure: failed to fetch issue field values). Omit field_values via the fields parameter in every list/search call; no pm code path reads it.- After an org-side auth change, repo access propagates gradually — the same endpoint returned 403, then 200, within minutes. A 403 error object saved to a file parses as JSON, and a list-expecting script can silently report a false "0 issues". Zero-hit discipline applies to list reads too: reverse-check an empty lane against the repo's
open_issues_count before believing it. - (documented, not measured) REST conditional requests answered
304 Not Modified do not count against the core pool — relevant only if a direct-REST read path is ever authorized for seats.
Proposed change
Add the facts above as rows in the API-quota / MCP-traps sections of platform-readings.md. Adjacent existing rows to reconcile, not duplicate: the list_issues no-assignees row, the multi-label-OR row, and the HTML-escaped-body row.
Constraints
Fix lands in .claude/skills/pm-dispatch/references/** → domain:skills; claude-fable-5 mandatory; human review + human merge (skills are ADR-class).
Provenance
Filed at the maintainer's direction in the 2026-08-16 PM session (「给 skills 席位写 issue」). Sibling card filed in the same batch: pre-round API-quota gate for pm-dispatch.
Generated by Claude Code
Category
平台事实变化 → one-line rows for
.claude/skills/pm-dispatch/references/platform-readings.md(the third type accepted by the shift-report rule).Measured facts (2026-08-16, remote cloud PM session)
list_issues/search_issuesare GraphQL-backed server-side with no REST alternative, and direct REST is gated by a per-session GitHub grant (403 "GitHub access is not enabled for this session") snapshotted at session start; the egress proxy additionally rejects non-repo-scoped paths (/search/*,/rate_limitexcepted) with"sessions are bound to their configured repositories". A seat that hits a drained GraphQL pool therefore has no list path at all until reset. The facts table currently states the REST rule as if it were a choice the seat can make.mcp__github__*call returnedStreamable HTTP error: invalid session— including tools that had worked minutes earlier. Not recoverable in-session; a fresh session re-binds. Advise the maintainer accordingly before rotating credentials while seats are running: in-flight seats lose their GitHub channel, not just their quota state. Corollary: quota pools are per-identity, so an identity switch also resets the burn — but shared-identity structure is unchanged.search_issuesfans out per-issue GraphQL calls for Projectfield_values(observed failure:failed to fetch issue field values). Omitfield_valuesvia thefieldsparameter in every list/search call; no pm code path reads it.open_issues_countbefore believing it.304 Not Modifieddo not count against the core pool — relevant only if a direct-REST read path is ever authorized for seats.Proposed change
Add the facts above as rows in the API-quota / MCP-traps sections of
platform-readings.md. Adjacent existing rows to reconcile, not duplicate: thelist_issuesno-assignees row, the multi-label-OR row, and the HTML-escaped-body row.Constraints
Fix lands in
.claude/skills/pm-dispatch/references/**→domain:skills;claude-fable-5mandatory; human review + human merge (skills are ADR-class).Provenance
Filed at the maintainer's direction in the 2026-08-16 PM session (「给 skills 席位写 issue」). Sibling card filed in the same batch: pre-round API-quota gate for pm-dispatch.
Generated by Claude Code