Skip to content

[finding] platform-readings.md misses the measured facts of the 2026-08-16 quota/credential incident — "reads go REST" is not executable from an MCP-only session; mid-session credential rotation kills the GitHub MCP server #8953

Description

@claude

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)

  1. "读与评论一律走 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.
  2. 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.
  3. 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.
  4. 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.
  5. (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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions