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
Mission: a 2026-07-28 client gets spec-correct results from mcpkit on both wires #1552
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.
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.
#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.
#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).
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.
#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
#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.
#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.
#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).
#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.
#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.
#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.
#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.
#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.
Activity
panyam commentedon Oct 16, 2026
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-stateless30/0,make testconf-agents28/28 and 4/4, all green while #1355, #1515 and #1546 are live. #1555 makes it able to fail.Friction: none.
12 remaining items
panyam commentedon Oct 24, 2026
#1619 merged (the five stateless list/completion handlers now run the middleware chain;
ALLOWEDincheck-stateless-middlewareis empty). Progress: 6/17. Next ready: #1515.Exercise @ c92b453: works.
testconf40/0,testconf-stateless30/0,testconf-agents28/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.
panyam commentedon Oct 24, 2026
#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-wireis 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
XXXXXXin its name (mktemp -t), which is cosmetic. Follow-up from this PR: #1628 (dual mode never serves a 2026-07-28 session; P3, waiting).panyam commentedon Oct 25, 2026
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.panyam commentedon Oct 26, 2026
#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
panyam commentedon Oct 26, 2026
#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/listenover 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 sharewireKindFromMessage.panyam commentedon Oct 26, 2026
#1642 merged (in dual mode
_metawins 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-pendingcheckout (#1551 again), and Keycloak's default port 8180 and the documented fallback 8181 were both taken by something else. Both suites pass when pointed atconf-pending-v080and port 8182.panyam commentedon Oct 26, 2026
#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
1625rows (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 testallbefore it hit the same setup gaps as last time (../conf-pendingfor 8f and 8g, Keycloak ports 8180 and 8181 both taken), and the protogen stage deletedexamples/protogen/.../genagain (#1551).panyam commentedon Oct 26, 2026
#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 explicitwire ==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.panyam commentedon Oct 26, 2026
#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":nullbody, where the stateless wire sends a bare error status. Noted in #1647's out-of-scope section; no ticket until someone hits it.panyam commentedon Oct 26, 2026
#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.
panyam commentedon Oct 26, 2026
#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.gocovers it.Friction: the ticket's premise was off. It said a request with no Origin passes the default check; servicekit's
CheckRequestactually falls back toHost, so a server reached under a public name refused every client, not only browser extensions. Our tests never saw it becausehttptestsends a127.0.0.1Host. 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 inserver/README.md.panyam commentedon Oct 26, 2026
#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-v2was 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 twoext/taskslisten 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.NotifyListenersis local to a replica, so a listener on another replica doesn't hear a task's status. The upstreamtasks-status-notificationsscenario still predates subscriptions/listen;known-gaps.yamlnow says a rewrite can grade this.