You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
mcpx: smaller conformance gaps -- user identity, annotation trust, rate limits, cursors, URI encoding, prompt validation, restart, invalidation #1957
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.
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.
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.
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
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:12TestMCPXResourceURIs — 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.
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
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.
Activity
developing-today commentedon Oct 28, 2026
CODE-882
dezren39 commentedon Oct 28, 2026
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.mdin 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
35726e8eagainstpkgs/mcpx/docs/spec/conformance-matrix.md:Already resolved since filing (2 of the named items):
pagination-invalid-cursor-32602is marked tested in all five spec sections. Acceptance item 2 is done.Still gaps at HEAD — 29 rows, 13 keys. Routed as fix task 2639 (queue
repo-health-nix-pilot, deduperepo-health:v1:fix:dezren39/nix:issue:257), three tractable clusters:confirmDestructivegate takes an untrusted upstream annotation as its deciding input. Safety-relevant; fix first.prompts/getresults are passed on unvalidated.Staying on this issue (not silently dropped, not in the packet):
caching-notification-invalidates): both rows self-labelled unverified — verify before routing a fix.docs/spec/revision-conflicts.md).revisions.go; reversing it is a design call.dezren39 commentedon Oct 28, 2026
🤖 Agent note · picked up
31 remaining items
dezren39 commentedon Nov 3, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 3, 2026
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
dezren39 commentedon Nov 3, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 3, 2026
🤖 Agent note · handed off
dezren39 commentedon Nov 3, 2026
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 withurl.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:12TestMCPXResourceURIs— asserts the exposed URI parses (mcpxscheme, namespace host, no query/fragment), matches an RFC 3986 path pattern, round-trips throughsplitMCPXURI, 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)pkgs/mcpx/docs/spec/conformance-matrix.md:1023,1545,2262all marked tested.registerGapsentry for URI encoding; the only resource-side gap is the unrelatedresources-annotations-defs(🎨 Palette: Add ARIA labels to empty icon buttons #207).No code changed;
resources-sec-validate-uris/TestResourceSubscriptionsReachUpstreamuntouched and unaffected.dezren39 commentedon Nov 3, 2026
🤖 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:
mrtr-missing-capability-error-32021+errors-method-not-found-for-unadvertised-capabilitystill registered inpkgs/mcpx/internal/conformance/coverage_messages.go:131-133pagination-invalid-cursor-32602is registered as covered inpkgs/mcpx/internal/conformance/coverage_utilities.goandutilities_test.go:407asserts -32602 fortools/listwith cursornot-a-cursor; no longer a registered gapcaching-notification-invalidatesmarked tested (daemon.TestListChangedInvalidatesPoolCache, matrix line 1909)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-client-restart-crashed-serverregistered incoverage_transport.go:116registerGapslist on main, but no conformance row/test for percent-encodingmcpx://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.