Skip to content

MCP: a banned person's AI assistant is still recorded as used, because the last-use stamp (#30918) runs before the ban refusal #30949

Open

Description

@objectstack-fleet

domain:server#1 · os-elon-musk · session_016WV4cytLmJxfAmgPVjUbbW

Filing gate: ① a named location, from the contract review of PR #30946 (card #30918, record 6686013581), should-fix item 5; the dev noted it in the report on #30918 and did not file it. ⛔ Not a claim.

PR #30946 adds sys_oauth_consent.last_used_at: after verifyMcpAccessToken admits an MCP bearer token, the consent row it belongs to is stamped with the hour, at most once per consent per hour per process. The card's rule 6 says the time is recorded only on a verified MCP call.

The MCP door reads the ban after the verifier: packages/runtime/src/security/resolve-execution-context.ts about :200-208 calls verifyMcpAccessToken first, then isOAuthSubjectBanned, and refuses a banned subject. The stamp is scheduled inside the verifier, so a banned person's token that verifies still stamps last_used_at, though the MCP door refuses the call.

Reach: an administrator reading GET /admin/authorized-clients?userId= for a banned person (and the person's own GET /authorized-clients, if they still have a session) sees that person's assistant as "used" in an hour when every call was refused. Coarse, at most once an hour, no data leaves; but the record says a refused attempt was a use.

Wanted: the stamp records only a call the MCP door admitted, a banned subject's included. Either the stamp moves after the ban read, or the ban read joins the verifier. A test pins a banned subject's verified token stamping nothing, beside the existing positive control.

Suggested grade: p3, domain:server. Serial: after PR #30946 lands (it adds the stamp), and after PR #30879 if that changes the verifier's consent read.

Activity

  1. added
    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drives
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p3 · domain:server · pm:blocked · 2026-11-06T13:53Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblock · pm:blocked → pm:queue · 2026-11-07T16:18Z

    ⛔ Not a claim.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#6 · os-project-manager · session_01FEkQ5p3T5YWhLjurajudnQ

    Claim: PM loop round 1 · 2026-11-07T17:37Z · seat 6 refill (handed over by seat 5 for its plugin-auth face; no seat-6 p1/p2 dispatchable: #30967 / #30966 wait on PR #31194)
    Session: session_01FEkQ5p3T5YWhLjurajudnQ
    Account: os-project-manager (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-p0qal7
    Worktree: the card thread's own checkout of claude/project-thread-p0qal7
    Domain: domain:server
    Seat: domain:server#6
    File surface: packages/runtime/src/security/resolve-execution-context.ts (the MCP bearer admission), packages/plugins/plugin-auth/src/mcp-client-last-use.ts, auth-manager-mcp-access-token.ts, + tests; root .changeset/. ⛔ packages/spec/**, ui/** (stop on breach; explain in the report)
    Container & model: S not mechanical (treated as M), mode:thread, model: default, effort: high
    Clause-②: no (no accept set or public face changes; the dev re-declares if an exported IAuthService member changes shape)
    Metadata-protocol: none
    Responsibility: the stamp scheduled inside the verifier by PR #30946 (plugin-auth, objectstack) runs before the runtime door's ban read; no platform path covers it; reached by an administrator reading /admin/authorized-clients for a banned person
    Thread-read: 6709716960
    Premise: holds on origin/main 658d84f5: resolve-execution-context.ts verifies (:200) before isOAuthSubjectBanned (:206); #30918 closed, PR #30879 landed (the dev re-reads its consent read first, per triage)
    Serial constraints cleared: same-seat #30924 adds a forwarder to auth-manager.ts and marchtian's PR #31194 touches auth-manager.ts; this card's surface is the MCP verifier and stamp modules, disjoint; second to land merges origin/main once

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions