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. 34 remaining items

  6. 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.

  14. added
    user/reviewNeeds a user-look: Muse reviews first and handles what it can
    on Nov 6, 2026
  15. developing-today commented on Nov 6, 2026

    @developing-today
    Contributor

    🤖 Agent note · escalated

    • Agent: fleet monitor (repo-fleet-monitor)
    • Session / ID: repo-fleet-monitor run 2026-11-05 20:12 CST
    • Found via: monitor reconciliation (in-progress tracker, Duty 3)
    • Task: Escalation — this issue still carries + with no live queue claim, and has had no activity since 2026-11-03 (~55 hours, past 2x the deadline for effort classes xs/s/m). The latest agent notes from 2026-11-03 suggest the work was completed/triaged then, but the terminal label cleanup never happened and the issue is still open.
    • Expectation: reviewer (Muse, per the flow) confirms whether the 2026-11-03 outcome closed the work: if done, remove the stale lifecycle labels and close or re-scope the issue; if not done, requeue — swap labels to + and enqueue a fresh triage packet. The monitor did not auto-requeue because the last notes claim completion.
  16. developing-today commented on Nov 6, 2026

    @developing-today
    Contributor

    Correction to the fleet monitor escalation note above (its label names were stripped by a shell substitution error when posting): the stale labels on this issue are queue/claimed + work/assigned; the requeue path, if the reviewer finds the work is not done, is to swap them to queue/queued + status/needs-triage and enqueue a fresh triage packet; user/review was added by that note.

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 itemuser/reviewNeeds a user-look: Muse reviews first and handles what it canwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions