Skip to content

mcpx: smaller conformance gaps -- user identity, annotation trust, rate limits, cursors, URI encoding, prompt validation, restart, invalidation #1957

Open

Description

@dezren39

Relocated from dezren39/darwin-nix#257 on 2026-10-28 (placement audit): mcpx's single source lives in developing-today/code (pkgs/mcpx); re-home tracked at #309. Original body below; issue references inside it are historical (dezren39/nix numbering).

From docs/spec/conformance-matrix.md gap keys: user-identity (4: elicitation/sampling must not assume user identity), annotation-trust (2: untrusted tool annotations shown as trusted), rate-limits (2), 32021-broker-fallback, accept-unadvertised, invalid-cursor (an invalid list cursor restarts at page 1 instead of -32602), resource-uri-encoding (mcpx:/// built without percent-encoding the upstream URI -- RFC 3986), prompt-validation, stdio-restart (client should restart a crashed stdio server; unverified), modern-invalidation (a notification should invalidate a fresh cache entry; unverified). Each row names its test, skipped with the gap.

Acceptance criteria

  • Each named gap key (user-identity, annotation-trust, rate-limits, 32021-broker-fallback, accept-unadvertised, invalid-cursor, resource-uri-encoding, prompt-validation, stdio-restart, invalidation) is either fixed with a conformance row passing, or explicitly split into its own tracked issue — none silently dropped.
  • Invalid list cursors return -32602 instead of restarting at page 1.
  • mcpx:// resource URIs percent-encode the upstream URI per RFC 3986.

Activity

  1. developing-today commented on Oct 28, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    History carried over from dezren39/darwin-nix#257 (verbatim, oldest first):


    @dezren39 · 2026-10-27T15:35:27Z

    Intake review

    Fleet monitor intake pass, 2026-10-27 (repo-fleet-monitor).

    Related: the 2026-09-30 mcpx conformance set — parent analysis #252, siblings #253, #254, #255, #256, #257, #258, #259 (filed together from docs/spec/conformance-matrix.md in dezren39/nix). Treat the set as one body of work; do not re-file per-gap issues.

    Notes: A bundle of the smaller conformance gaps (see the gap-key list in the body). Effort l as a bundle; most individual keys look s/m. Priority low: real spec deviations, no live-user breakage evidenced.

    Risks: Bundle rot — closing this with only the easy keys done. The acceptance criteria force an explicit disposition per key.

    Suggested approach: split per key at work time (invalid-cursor and URI-encoding first — both are small, user-visible correctness fixes), keep this issue as the set tracker.


    @dezren39 · 2026-10-28T19:16:14Z

    Triage verdict (task 2312): PARTIALLY RESOLVED, remainder split by cluster — confirmed gaps routed, design-blocked clusters stay tracked here.

    Verified at developing-today/code main 35726e8e against pkgs/mcpx/docs/spec/conformance-matrix.md:

    Already resolved since filing (2 of the named items):

    • invalid-cursor — pagination-invalid-cursor-32602 is marked tested in all five spec sections. Acceptance item 2 is done.
    • resource-uri-encoding — no matrix row cites it as a gap at HEAD.

    Still gaps at HEAD — 29 rows, 13 keys. Routed as fix task 2639 (queue repo-health-nix-pilot, dedupe repo-health:v1:fix:dezren39/nix:issue:257), three tractable clusters:

    • annotation-trust (8 rows): 'destructiveHint from any upstream decides whether a call is confirmed; a false hint (or readOnlyHint true) is trusted' — the consumer confirmDestructive gate takes an untrusted upstream annotation as its deciding input. Safety-relevant; fix first.
    • rate-limits (7 rows): no per-server/per-session limit on sampling requests; no per-server limit on elicitation requests.
    • prompt-validation (5 rows): upstream prompts/get results are passed on unvalidated.

    Staying on this issue (not silently dropped, not in the packet):

    • user-identity (5 rows): 'mcpx has no authenticated user: state is bound to the request, the session id is whatever the caller sends' — an architecture decision, not a patch.
    • stdio-restart and modern-invalidation (caching-notification-invalidates): both rows self-labelled unverified — verify before routing a fix.
    • 32021-broker-fallback: the row itself notes the specification contradicts itself (docs/spec/revision-conflicts.md).
    • accept-unadvertised: accept-liberally is a stated position in revisions.go; reversing it is a design call.
  3. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/lowNice to have; do when convenient
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)
    queue/queuedHas a queued task in the Supabase agent queue
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 28, 2026
  4. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  5. 31 remaining items

  6. added
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  7. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged (coverage pass)
    Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 30 (priority/low). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
    Found via: coverage pass 2026-11-03

  9. removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  11. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: opencode-claimant
    • Session / ID: ses_e5e5d23d57bffeXQRBrakPMnKc · queue task 8024
    • Route: opencode-route/workhorse · build
  12. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    resource-uri-encoding disposition (task 8024, repo-health-code-pilot)

    Already encoded at current main — no fix needed. Verified at main bb4624b2a (code present since the mcpx migration, #4626).

    Construction (pkgs/mcpx/internal/cli/serve.go):

    • mcpxURI (serve.go:1433-1435): "mcpx://" + ns + "/" + escapeURIPath(strings.TrimPrefix(uri, "/")) — upstream URI is never concatenated raw.
    • escapeURIPath (serve.go:1453-1465): percent-encodes every byte RFC 3986 disallows in a path (keeps pchar + /, emits uppercase %HH, including encoding % itself so already-encoded upstreams round-trip exactly).
    • splitMCPXURI (serve.go:1438-1449): inverts it with url.PathUnescape.
    • exposedTemplate (serve.go:1515-1538): same escaping on literal portions, {expressions} preserved verbatim so templates keep their variables.

    Test evidence: pkgs/mcpx/internal/cli/serve_uri_test.go:12 TestMCPXResourceURIs — asserts the exposed URI parses (mcpx scheme, namespace host, no query/fragment), matches an RFC 3986 path pattern, round-trips through splitMCPXURI, and leaves an ordinary URI unchanged, across revisions 2025-06-18 / 2025-11-25 / 2026-07-28 (spaces, #, ?, unicode, malformed %, already-encoded inputs covered).

    Conformance registration (already present, nothing to add):

    • pkgs/mcpx/internal/conformance/coverage_features.go:15: resources-custom-scheme-rfc3986 (PerRev over the three revisions)
    • Matrix rows pkgs/mcpx/docs/spec/conformance-matrix.md:1023,1545,2262 all marked tested.
    • No registerGaps entry for URI encoding; the only resource-side gap is the unrelated resources-annotations-defs (🎨 Palette: Add ARIA labels to empty icon buttons #207).

    No code changed; resources-sec-validate-uris / TestResourceSubscriptionsReachUpstream untouched and unaffected.

  13. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

    Re-triage verdict (2026-11-03, main c3c9423) — still live; most keys landed, one unverified key routed to task 8024

    Disposition of all ten gap keys against fresh main:

    Key State
    annotation-trust FIXED — split #2191 CLOSED
    rate-limits FIXED — split #2192 CLOSED, PR #2706 merged, register truth-up #2334 CLOSED
    prompt-validation FIXED — split #2193 CLOSED
    accept-unadvertised FIXED — split via design #2434 to #2436 CLOSED
    32021-broker-fallback OPEN, owned by #2438 (Phase 3 of #2434); gaps mrtr-missing-capability-error-32021 + errors-method-not-found-for-unadvertised-capability still registered in pkgs/mcpx/internal/conformance/coverage_messages.go:131-133
    invalid-cursor LANDED — pagination-invalid-cursor-32602 is registered as covered in pkgs/mcpx/internal/conformance/coverage_utilities.go and utilities_test.go:407 asserts -32602 for tools/list with cursor not-a-cursor; no longer a registered gap
    modern-invalidation LANDED — conformance matrix row caching-notification-invalidates marked tested (daemon.TestListChangedInvalidatesPoolCache, matrix line 1909)
    user-identity STILL A GAP on this issue — elicitation user-binding gaps registered in coverage_clientfeatures.go:156-160 (elicitation-server-state-bound-to-user, -stored-state-bound-to-user, -no-trust-client-user-id, -state-not-session-id-alone)
    stdio-restart STILL A GAP on this issue — stdio-client-restart-crashed-server registered in coverage_transport.go:116
    resource-uri-encoding UNVERIFIED — appears in no registerGaps list on main, but no conformance row/test for percent-encoding mcpx:// upstream URIs was found either. It is an explicit acceptance bullet of this issue, so it must not silently drop: routed to follow-up queue task 8024 (small_fix, verify-then-fix, packet-1957-uri-encoding.json)

    Ordering/blockers: none blocking. #2438 proceeds independently; the two still-registered gaps above stay owned by this issue until split or fixed; task 8024 closes the last unverified bullet. This issue stays open as the parent for the remaining keys.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-inskind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/lowNice to have; do when convenientqueue/claimedQueue worker lifecycle statesource/creatorFiled by the new-issue-creator jobstatus/in-progressQueue worker lifecycle statetask/triageQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions