Skip to content

connector-github: ship providerConfig.toolsSnapshot for search_issues and issue_read, digests measured against GitHub's live MCP server, so the listing's sha256 is the pin set (ruling 6556740185, #28590 B) #28647

Open

Description

@objectstack-fleet

epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

Filing gate: ④ execution of a maintainer ruling. Ruling 6556740185 on #28590 (letter B, maintainer 「28590 27855 同意」 2026-11-01T10:29Z) requires every MCP connector app on the shelf to ship providerConfig.toolsSnapshot for every tool it includes. The listing's sha256 is the digest of that pin set. Child of #27293 (E4). ⛔ Not a claim.

Ruling-ref: 6556740185

Work

packages/apps/connector-github/src/connectors/github.connector.ts:39 (read at origin/main) includes ['search_issues', 'issue_read'] and pins nothing. Do the following:

  • Add providerConfig.toolsSnapshot with one sha256 per included tool. Take the digests as computeMcpToolsSnapshot (@objectstack/connector-mcp, PR feat(connector-mcp,spec): toolsSnapshot pins each MCP tool; a mismatch degrades through CONNECTOR_UPSTREAM_CHANGED #28515) computes them over the live tools/list answer of https://api.githubcopilot.com/mcp/, with the headers the app already sends (X-MCP-Readonly: true). Record the date and the measured digests in the app's README, beside the existing provenance section.
  • Add a test in packages/apps/connector-github/test/ that fails when an included tool has no pin or a pin is not 64 lowercase hex. It must stay offline (no live call in CI).
  • Give the listing a provenance line: upstream = the server URL, commit = the package commit, sha256 = the digest of the pin set. The digest is stableStringify of the record, then sha256. Name the exact recipe in the README so cloud's ingestion can recompute it.
  • Re-pinning when GitHub changes a tool is the shelf's routine. The ruling says a degraded instance means re-pin and re-publish, never drop the pin.

Measurement constraint: tools/list on GitHub's server needs a token whose scopes list both tools. A session without one cannot measure the digests. A measurement with no token, or with an under-scoped one, is no measurement: the answer is a 401, or a list missing a tool. If no token is available, the dev reports blocked naming the secret it needs; it must not commit placeholder digests.

Business reason

#27293's Done-when gives each shelf listing a verifiable upstream, commit and sha256. For an MCP app, only the pin set makes sha256 mean something, and it also turns silent tool drift into a named, degraded instance on the app that administrators install.

Reader

The epic PM of #27293 dispatches it (domain:server, packages/apps/*). Cloud seat 2 reads the provenance recipe for its ingestion (#28278).

Dedupe

The 200 most recent issues and PRs (read 2026-11-01T11:05Z), titles grepped for toolsSnapshot|\bpin\b: 3 hits (PR #28515, the mechanism; #28582 and PR #28597, the skills recipe); none pins a shelf app. Control connector: 21 hits.

Activity

  1. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 发布并装进一个环境 | none | P④

    Triage: p2 · area:automation · pm:epic kept · 2026-11-01T11:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U

    Dispatch held: the environment cannot do the measurement. ⛔ Not a claim.

    • Measured at 2026-11-01T12:03Z from this seat's container: a POST to https://api.githubcopilot.com/mcp/ (an MCP initialize, no token) answered curl: (56) CONNECT tunnel failed, response 403. The environment's network policy denies the host before any request reaches GitHub. With a token, the call would still be refused there.
    • This environment also has no dedicated measurement secret. The session's own GitHub credential is the fleet operator's and will not be used to measure a shelf app.
    • Two things unblock the card, both the maintainer's to set in the cloud environment: (1) add api.githubcopilot.com to the environment's allowed network domains; (2) store a read-only GitHub token whose scopes list both search_issues and issue_read, as the environment secret GITHUB_MCP_TOKEN (the app's own credentialRef). Once both are in place, the epic seat claims and dispatches this card. No placeholder digests will be committed.
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

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions