Skip to content

Design: mcpx elicitation era edges — downgrade rich enums for old hosts, complete the -32042 circuit, close the stale url row #2077

Closed
3 of 3 issues completed

Description

@dezren39

No Drew direction decision needed — origin #1935's acceptance is explicit; the judgment calls (multi-select refused to old hosts rather than flattened; -32042 production gated on a declared, undeliverable URL question; the script hook stays a documented question) are recorded in the design doc with their reasons.

Summary

Design originated by the repo design architect (pass 11, 2026-10-28) from origin umbrella #1935 (relocated from dezren39/darwin-nix#214) and its compare-register rows ELI-04 / ELI-09 / ELI-12 / ELI-21 in pkgs/mcpx/docs/compare/register/elicitation.md, audited against current main 26221fcc. Full design doc: files/designs/code-mcpx-elicitation-era-edges.md in the keep-the-four-repos-healthy goal workspace.

Audit verdict per row:

  • ELI-04 — OPEN. Question.paramsFor (pkgs/mcpx/internal/mcpserver/conn.go ~L465-507) strips mode/elicitationId per era but never rewrites requestedSchema: a 2025-11-25 upstream's rich enums (titled/untitled, single/multi-select, SEP-1330) reach a 2025-06-18 host verbatim, and a strict old host rejects the whole elicitation/create.
  • ELI-09 — LANDED (register is stale). Client.capabilities (pkgs/mcpx/internal/mcpclient/modern.go ~L71-84) declares elicitation.url whenever a server-request handler is installed, in both eras; the pool installs that handler for every upstream connection (pkgs/mcpx/internal/pool/pool.go:508); elicitModeDeclared gates url questions on the negotiated revision. mcpx: elicitation edges — enum downgrade for 2025-06-18, url mode upstream, -32042, and a script-side answer hook #1935's ELI-09 acceptance bullet is met — what remains is the register truth-up (Phase 3), not code.
  • ELI-12 — OPEN, both directions. -32042 appears nowhere in internal/mcpclient or internal/daemon (grep-verified): an upstream's -32042 propagates as an opaque rpcError and the call fails — no URL flow, no retry. Server-side, conformance gap elicitation-server-must-return-32042 (internal/conformance/coverage_clientfeatures.go) stands against the 2025-11-25 MUST.
  • ELI-21 — OPEN, deliberately NOT a phase. docs/elicitation.md §5.2 designs an onElicit script global and marks it "NOT BUILT" itself; mcpx: elicitation edges — enum downgrade for 2025-06-18, url mode upstream, -32042, and a script-side answer hook #1935's acceptance offers the alternative ending "or the broker-only path is documented as the deliberate design". The unsettled core is routing precedence (broker Route sends credential/consent questions to a human on purpose — may a script handler answer those?) plus the call-vs-script correlation docs/protocol.md ~L379-382 names. Recorded as an open question in the design doc with the evidence assembled; no phase filed for it.

Proposal (recorded decisions)

  • Phase 1 — enum downgrade at the rendering seam. In paramsFor, for a pre-2025-11-25 peer: titled single-select (oneOf[{const,title}]) → enum+enumNames; untitled/legacy shapes pass through. Multi-select has no 2025-06-18 representation (form schemas are flat primitives — no array type), and flattening would change the answer's type (string[]→string) so the upstream's own validation rejects what mcpx elicited — so a multi-select question is not sendable to that peer (the Sendable refusal pattern url mode already uses) and stays with the era-less broker. No answer back-mapping is needed for downgraded single-selects (host answers the const, the value in both eras).
  • Phase 2 — client-side -32042: complete the circuit. On a connection negotiated at 2025-11-25, a -32042 call error's data.elicitations (url-mode + elicitationId, per the spec MUSTs) are opened as broker URL questions through the existing elicitViaBroker path — full URL shown, consent, completion notification already handled (internal/daemon/hooks.go ~L57-68) — and on completion the original call is retried exactly once. Decline/expiry/second -32042 surface as errors; malformed data passes the original error through. Era-scoped to exactly the revision that defines the code (2026 reserves it; pre-2025-11-25 doesn't have it).
  • Phase 3 — server-side -32042 + truth-up + mcpx: elicitation edges — enum downgrade for 2025-06-18, url mode upstream, -32042, and a script-side answer hook #1935 closure. Produce -32042 only when all hold: host negotiated 2025-11-25, host declared elicitation.url, a URL question from that call is pending, and it cannot be delivered inline; data.elicitations lists exactly the blocking questions with ids. Never for form, never when inline delivery works, never at 2026. An unhandled upstream -32042 is relayed only to url-declared hosts. Plus: register rows ELI-04/09/12 updated to as-built (ELI-09 landed, with evidence), gap elicitation-server-must-return-32042 retired or recorded partial, and completion evidence on mcpx: elicitation edges — enum downgrade for 2025-06-18, url mode upstream, -32042, and a script-side answer hook #1935 against every acceptance bullet — closing it iff all are met, ELI-21's bullet answered by the documented-question record.

Alternatives considered and risks are in the design doc (flattening multi-select — rejected, corrupts answer type; downgrading at broker intake — rejected, era translation belongs at the era boundary; generic all-era -32042 handling — rejected, era discipline; unbounded retry — rejected; filing onElicit as a phase — rejected this run, genuine open question).

Phased breakdown

  • Phase 1: enum downgrade for pre-2025-11-25 hosts (internal/mcpserver/conn.go: paramsFor rewrite + multi-select Sendable refusal). Filed as a sub-issue of this issue, triage packet enqueued.
  • Phase 2: client-side -32042 — broker URL questions + one retry (internal/mcpclient call path + internal/daemon). Independent of Phase 1 in code. Filed as a sub-issue, triage packet enqueued.
  • Phase 3: server-side -32042 production + register truth-up + mcpx: elicitation edges — enum downgrade for 2025-06-18, url mode upstream, -32042, and a script-side answer hook #1935 closure. Gated on Phases 1–2. Filed as a sub-issue (status/blocked), triage packet enqueued.

Open questions stay in the design doc, not as issues: ELI-21 routing precedence + script correlation; ELI-05 defaults across the same boundary (Phase 1 triage checks the downgrade interaction); mcpx-originated URL elicitation; ELI-11's unexercised completion emitter.

Distinct from neighbours: #1753 (capability gating — its CanElicit shape reading is a reused seam), #1675 (broker storage/UI hygiene), #1481/#1484 (schema validation of answers), #1834 (sampling relay).


🤖 agent-note:v1 — filed by the design-architect job (pass 11, developing-today/code) per the design doc above. Origin: #1935 (ex dezren39/darwin-nix#214). Audit basis: main 26221fcc, 2026-10-28.

Acceptance criteria

Activity

  1. added
    priority/normalOrdinary priority (the default)
    app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)
    epicMeta-issue grouping multiple items (org Project Type=Epic)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    on Oct 29, 2026
  2. developing-today commented on Oct 29, 2026

    @developing-today
    Contributor
  3. added
    kind/designA design proposal (design-architect): multi-step, phased, decision-bearing
    on Oct 29, 2026
  4. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    🤖 agent-note:v1 — design-architect pass 11 (2026-10-28), filing record.

  5. added
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 29, 2026
  6. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake (2026-10-29) — verified still live: no merged PR or commit implements this yet; the filing audit/decision record it cites is current.

    Notes: Design epic, audited against main 26221fc; the design doc lives in the goal workspace (files/designs/code-mcpx-elicitation-era-edges.md). Already labelled kind/design, priority/normal, effort/l, source/design-architect at filing; phases #2078/#2079/#2080 were filed the same pass and carry their own labels. This pass adds the acceptance section and meta/enriched. No Drew decision is needed — the judgment calls are recorded in the design doc.

    Suggested approach: Track the three phase issues; this epic closes when #2080's truth-up lands.

    Risks: Register truth-up (ELI-09 already landed but marked open) shows the register drifts — Phase 3's truth-up is a required deliverable, not bookkeeping.

    Labels normalized by the monitor; acceptance criteria appended to the body (original text preserved verbatim above it).

  7. 6 remaining items

  8. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  9. 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 40 (priority/normal). 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

  10. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 4, 2026
  11. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: picked-up
    queue: repo-health-code-pilot
    task: 8733 (triage, worker repo-worker-code, lane 262eb403-3347-4a7c-ba6b-e7bc263ca853)
    by: openchamber-scheduled-lane
    at: 2026-11-04T04:06:23Z

    Triage of issue #2077 after queue claim. Fresh GitHub state confirms the three phases (#2078/#2079/#2080) are closed and their implementation PRs are merged; #1935 is also now closed via merged PR #5054. I’m verifying the acceptance against that state and will close this tracking issue if nothing remains, without creating duplicate implementation work.

  12. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged
    queue: repo-health-code-pilot
    task: 8733 (triage, worker repo-worker-code, lane 262eb403-3347-4a7c-ba6b-e7bc263ca853)
    by: openchamber-scheduled-lane
    at: 2026-11-04T04:08Z

    Triage result: already resolved; no follow-up task is warranted. Fresh GitHub verification confirms all three phases named in this issue's acceptance are closed: #2078 (PR #2719 merged), #2079 (PR #2760 merged), and #2080 (PR #2886 merged). The other acceptance items are met as well: #2080 delivered the ELI-04/09/12 register truth-up, and umbrella #1935 is now closed as completed with the broker-only script elicitation decision recorded in merged PR #5054 (pkgs/mcpx/docs/elicitation.md §5.2 and the compare register). Thus the issue's remaining tracking purpose is complete; closing #2077 with this evidence. No duplicate implementation or CI task enqueued.

  13. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: done
    queue: repo-health-code-pilot
    task: 8733 (triage, worker repo-worker-code, lane 262eb403-3347-4a7c-ba6b-e7bc263ca853)
    by: openchamber-scheduled-lane
    at: 2026-11-04T04:08Z

    Completed as already resolved. Closed #2077 after fresh verification: #2078/#2079/#2080 are closed with PRs #2719/#2760/#2886 merged; #1935 is closed with the broker-only ELI-21 decision merged in PR #5054. No implementation or CI follow-up is needed. Removed the queue/claimed, status/in-progress, and work/assigned labels.

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-insepicMeta-issue grouping multiple items (org Project Type=Epic)kind/designA design proposal (design-architect): multi-step, phased, decision-bearingmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)source/design-architectFiled by the repo design architect jobtask/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