Skip to content

Mission: a 2026-07-28 client gets spec-correct results from mcpkit on both wires #1552

Open

Description

@panyam

Outcome

A client built to the 2026-07-28 spec talks to an mcpkit server over either wire, the session wire or the SEP-2575 stateless wire, and gets what the spec says, with nothing missing and nothing leaked. The two wires apply the same middleware and the same capability filters, and every field 2026-07-28 makes required is emitted.

Exercise

make testconf testconf-stateless testconf-agents

It does not grade this mission's bugs yet. Baseline @ 6d743af3 (2026-10-16): stateless 30 pass / 0 fail, agents discovery 28/28 and list-changed 4/4, all green while #1355, #1515 and #1546 are live. The agents fixture sets ttlMs, and nothing drives the stateless wire with a middleware gate or a client lacking fileInputs. The first ticket gives the exercise a wire-parity check that fails today on each of them, and a single make exercise-wire target.

What to look at: the parity check's per-method rows, then each suite's Passed: x/y.

Done when

  • The wire-parity check passes for every method, and went red first for each fix.
  • ttlMs is present on every CacheableResult by default.
  • The suites above stay green.

Not in this mission

Activity

  1. added
    missionA user-visible outcome, with an exercise
    mission:activeA mission being worked now (one per worktree)
    mission_wire_2026_07_28Mission: 2026-07-28 wire correctness on both wires
    on Oct 16, 2026
  2. panyam commented on Oct 16, 2026

    @panyam
    OwnerAuthor

    Mission opened in the 2026-10-16 retriage, after #1508 closed. Progress: 0/11. Next ready: #1555.

    Exercise @ 6d743af: works but grades nothing yet. make testconf-stateless 30/0, make testconf-agents 28/28 and 4/4, all green while #1355, #1515 and #1546 are live. #1555 makes it able to fail.
    Friction: none.

  3. 12 remaining items

  4. panyam commented on Oct 24, 2026

    @panyam
    OwnerAuthor

    #1619 merged (the five stateless list/completion handlers now run the middleware chain; ALLOWED in check-stateless-middleware is empty). Progress: 6/17. Next ready: #1515.

    Exercise @ c92b453: works. testconf 40/0, testconf-stateless 30/0, testconf-agents 28/28 + 4/4.
    Friction: the exercise was green before #1619 too, so it says nothing about #1355 either way. Only the parity tests in #1619 went red on main. That is the gap #1555 is for.

  5. panyam commented on Oct 24, 2026

    @panyam
    OwnerAuthor

    #1627 merged (adds make exercise-wire, the session vs stateless parity rows, and fixes #1515 and #1546; closes #1555, #1515, #1546). Progress: 9/18. Next ready: #1625. The queue lists #346 first by age, but #1625 was sequenced behind #1555 so it could use these rows as its acceptance check.

    Exercise @ 9ff89ce: works. make exercise-wire is now the exercise. All 7 parity rows pass (#1355, #1515 ×2, #1546 ×2, #1560, same result on both wires). testconf 40/0, testconf-stateless 30/0, testconf-agents 28/28 and 4/4.
    Friction: none worth a ticket. On macOS the log dir prints with a literal XXXXXX in its name (mktemp -t), which is cosmetic. Follow-up from this PR: #1628 (dual mode never serves a 2026-07-28 session; P3, waiting).

  6. panyam commented on Oct 25, 2026

    @panyam
    OwnerAuthor

    Exercise @ 3e8cada2 (v0.8.12, 6 PRs since the last run, none in the wire): works, unchanged. All 7 parity rows pass. testconf 40/0, testconf-stateless 30/0, testconf-agents 28/28 and 4/4. Next ready: #1628 (dual-mode routing rule), which blocks #1625.

  7. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1638 merged (stateless tools/call, prompts/get, resources/read and completion/complete now run the session dispatcher's handlers; #1637 item 1 and the first slice of #1625). Progress: 10/20. Next ready: #1637 (items 2 and 3, PR in progress), then #1628.

    Exercise @ b28a383: works. 12/12 parity rows, including five new 1637 rows; testconf 40/0, testconf-stateless 30/0, agents 28/28 and 4/4.
    Friction: none

  8. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1639 merged (stdio serves the stateless wire, and adaptive clients fall back from session-only servers; closes #1637). Progress: 11/20. Next ready: #1628.

    Exercise @ 0b56d98: works. 13/13 parity rows pass, including the new 1637 stdio serves the stateless wire. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, all unchanged from #1638.

    Friction: none. #1637 is fully closed across #1638 and #1639. subscriptions/listen over stdio still answers -32601, which is noted in #1639's out-of-scope section and has no ticket until someone asks for it. #1625 stays blocked on #1628, and stdio now inherits whatever #1628 decides because both transports share wireKindFromMessage.

  9. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1642 merged (in dual mode _meta wins over the session id, written down and pinned; closes #1628). Progress: 12/20. Next ready: #1625, with its two PRs in flight (#1644, then one that closes it).

    Exercise @ c8f7579: works. 13/13 parity rows pass. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged from #1639. Expected, since #1642 is docs plus one test row that pins existing routing.

    Friction: none from this merge. While validating #1625 with make testall, stages 8f and 8g failed for want of a ../conf-pending checkout (#1551 again), and Keycloak's default port 8180 and the documented fallback 8181 were both taken by something else. Both suites pass when pointed at conf-pending-v080 and port 8182.

  10. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1644 merged (both wires run one request path, and the stateless chain sits above its method switch; part of #1625). Progress: 12/20. Next ready: #1625, whose second half is #1645, now retargeted to main.

    Exercise @ d51731e: works. 17/17 parity rows pass, including the four new 1625 rows (middleware sees the handshake, metrics and trace see both wires, a panicking handler is an internal error, handlers get the same request context). testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged.

    Friction: none from the merge. make testall before it hit the same setup gaps as last time (../conf-pending for 8f and 8g, Keycloak ports 8180 and 8181 both taken), and the protogen stage deleted examples/protogen/.../gen again (#1551).

  11. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1645 merged (one method table for both wires, and the stateless dispatcher moves into server; closes #1625). Progress: 12/20. Next ready: #346.

    Correction: the last three logs on this issue overcounted by one. After #1639 it was 10/20, after #1642 and #1644 it was 11/20, and with #1625 closed it is 12/20. Eight blockers remain open: #346, #825, #1111, #1356, #1520, #1523, #1547, #1569.

    Exercise @ 34fe220: works. 18/18 parity rows pass, including 1625 notify interceptors see both wires. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged.

    Friction: none from the merge. With #1625 done, both wires run one request path (Server.runRequest) and one method table (Dispatcher.route), and every wire difference is an explicit wire == branch, so the class of bug behind #1352, #1355 and #1637 can't be written without a visible branch. The cursor fix for the stateless lists becomes testable once #1356 sets a page size.

  12. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1647 merged (notifications carry no id, and no transport answers one; closes #1520). Progress: 13/20. Next ready: #346; #1569 (with #1111) and #1356 are the smaller ones left.

    Exercise @ 9b60c79: works. 19/19 parity rows pass, including 1520 a notification gets no response on either wire. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged.

    Friction: none. #1647 also fixed two things found on the way: concurrent notifications on one session collided in in-flight tracking under the key null, and stdio's no-reply check from #1639 missed "id":null. Left as is: the session wire still answers a notification it refuses before dispatch (not initialized, or missing 2026-07-28 _meta) with HTTP 200 and an "id":null body, where the stateless wire sends a bare error status. Noted in #1647's out-of-scope section; no ticket until someone hits it.

  13. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1649 merged (stateless streams are not resumable, written down and pinned; closes #825). Progress: 14/20. Next ready: #1547 (PR 1650, open) and #1523 (PR in progress); then #346, #1569 with #1111, and #1356.

    Exercise @ 3be6e04: works. 19/19 parity rows pass. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged. Expected, since #1649 is tests and a note.

    Friction: none. The 2026-07-28 Streamable HTTP draft had already decided #825 ("Resumable SSE streams via Last-Event-ID are not supported"), so the ticket closed on a recorded decision plus two tests that fail if a stateless writer ever emits an event id.

  14. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1650 merged (a valid bearer token passes the Origin check, and remote deployments are documented; closes #1547). Progress: 15/20. Next ready: #1523 (PR 1652, open); then #346, #1569 with #1111, and #1356.

    Exercise @ 9199b37: works. 19/19 parity rows pass. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged. The exercise runs on localhost, where the Origin check always passes, so it can't see this change; origin_remote_test.go covers it.

    Friction: the ticket's premise was off. It said a request with no Origin passes the default check; servicekit's CheckRequest actually falls back to Host, so a server reached under a public name refused every client, not only browser extensions. Our tests never saw it because httptest sends a 127.0.0.1 Host. The fix is deliberately narrow (bearer-authenticated requests skip the check) because admitting no-Origin or same-origin requests would reopen DNS rebinding; remote deployments list their own host, now documented in server/README.md.

  15. panyam commented on Oct 26, 2026

    @panyam
    OwnerAuthor

    #1652 merged (ext-tasks' taskIds on subscriptions/listen, so stateless listeners hear notifications/tasks; closes #1523). Progress: 16/20. Next ready: #346; #1569 with #1111, and #1356, are the others left.

    Exercise @ 629192c: works. 19/19 parity rows pass. testconf 40/0, testconf-stateless 30/0, agents discovery 28/28 and list-changed 4/4, unchanged. testconf-tasks-v2 was 44 pass / 0 fail / 1 skip on the branch. There's no parity row for this, since the session wire has no subscriptions/listen; the two ext/tasks listen tests are the check.

    Friction: none from the merge. Two things left as is: no snapshot on subscribe (ext-tasks issue 24 is still open upstream), and Server.NotifyListeners is local to a replica, so a listener on another replica doesn't hear a task's status. The upstream tasks-status-notifications scenario still predates subscriptions/listen; known-gaps.yaml now says a rewrite can grade this.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    missionA user-visible outcome, with an exercisemission:activeA mission being worked now (one per worktree)mission_wire_2026_07_28Mission: 2026-07-28 wire correctness on both wires

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions