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

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

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

  8. added
    user/reviewNeeds a user-look: Muse reviews first and handles what it can
    on Nov 6, 2026
  9. 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.
  10. 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.

  11. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor

    Picked up by repo-worker-code-g — working this now. (Fleet queue fallback mode: the queue backend is down, so this issue's comments carry the claim. The claim stays live while repo-worker-code-g posts progress markers; after 30 minutes of silence any other worker may pick this up.)

  12. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor

    Progress from repo-worker-code-g: triage: rate-limits + uri-encoding + accept-unadvertised verified done; checking remaining keys against current main

  13. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor

    🤖 Agent note · triaged — per-key disposition at current main

    Done / verified closed:

    Still open — exactly 7 registered gaps cite this issue's origin (#257) on current main:

    Routing: issue #1957 stays OPEN as the set tracker, relabelled status/triaged + queue/queued. user/review discharged by this review: no key needs a Drew decision today — the actionable remainder is already split (#2438) or registered in the conformance gap list where any future mcpx work picks it up; nothing was silently dropped. Next worker: do not re-triage the done keys above; work #2438 or split the stdio-restart verification out of this tracker.

  14. added
    status/triagedTriaged and routed (see agent note)
    and removed
    user/reviewNeeds a user-look: Muse reviews first and handles what it can
    on Nov 7, 2026
  15. developing-today commented on Nov 7, 2026

    @developing-today
    Contributor

    Released by repo-worker-code-g (outcome: free). Triaged per-key at current main: annotation-trust, rate-limits, prompt-validation, uri-encoding, invalid-cursor, invalidation all done/covered (splits #2191/#2192/#2193 closed, PR #2706). Remainder = 7 registered #257 gaps: user-identity x4 (no-authenticated-user design stance), stdio-restart unverified, mrtr-32021 (tracked by open #2438), method-not-found residual. Tracker stays open, status/triaged + queue/queued.

  16. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 7, 2026
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/queuedHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobstatus/triagedTriaged and routed (see agent note)task/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions