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
Copy file name to clipboardExpand all lines: CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -102,6 +102,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
102
102
103
103
### Fixed (2026-07-13)
104
104
105
+
- **OUTSTANDING.md compliance punch-list burned down** (schema pin `6e4cba2d…` re-verified byte-identical upstream first — findings actioned as written). Wire/contract fixes in `turul-mcp-protocol-2026-07-28`: `RequestMetaObject` gained the hand-written `Serialize` collision guard (a caller-populated `extra` entry can no longer duplicate `progressToken` or an `io.modelcontextprotocol/*` reserved key on the wire — same pattern as `SubscriptionsListenResultMeta`); `ElicitResult.content` values retyped from `Value` to `ElicitResultValue` (`string | number | boolean | string[]` per schema, object values now rejected on deserialize; builders keep their `Value`-based public signatures via an infallible feature-gated conversion); `CompletionReference` deserialize now dispatches strictly on the `type` discriminator (`ref/resource` / `ref/prompt`; unknown or missing → rejected, previously silently matched structurally); `CompleteResult.completion.total` `u32`→`f64` (schema `number`; `CompletionHandler` cfg-split since the frozen 2025-11-25 crate keeps `u32`); `RootsCapabilities` reduced to the schema's empty object (removed the no-op `listChanged` field); `CreateMessageRequestParams.metadata` retyped `Option<Value>`→`Option<HashMap<String, Value>>`; dead non-spec `SamplingRequest`/`SamplingResult` removed. Server: under `protocol-2026-07-28`, `notifications/progress` and `notifications/message` are no longer registered as inbound client-notification handlers (both are absent from the schema's `ClientNotification` union; HTTP 202 semantics unchanged, outbound server→client progress untouched, 2025-11-25 lane unchanged — `notifications_2026.rs`). Tests: prompt-shape compliance assertions deepened to full field coverage; `DRAFT-2026-v1` fixture strings modernized to `"2026-07-28"`; new round-trip/rejection/collision suites, each behavior change with revert-and-fail evidence. Comment/doc corrections across content.rs / caching.rs / tools.rs / meta.rs / notifications.rs / completion.rs per the repo comment rules. `completion.values` `@maxItems 100` closed by disposition: enforcement already lives (tested) in the server dispatch layer; constructor-level truncation would lossily pre-empt the `total` count. Sole surviving punch-list item: `SubscriptionsListenResult` graceful-close emission (needs shutdown-signal infrastructure; spec-legal as-is). See OUTSTANDING.md §Addendum 2026-07-13.
105
106
- **Lambda transport routed the 2026-07-28 lane to the sessionless legacy handler — tools received `session: None`.** `LambdaMcpHandler::handle()` (buffered, non-streaming Lambda runtime) delegated every request to `SessionMcpHandler`, and `handle_streaming()` trusted the request's `MCP-Protocol-Version` header for routing — but on a `protocol-2026-07-28` build only `StreamableHttpHandler` mints the stateless core's internal per-request session and enforces SEP-2243 Server Validation. Result: a middleware-authenticated `tools/call` over Lambda reached the tool with no `SessionContext` (field symptom: `-32602 "session required"` even though `SessionInjection::set_state` had run), and the buffered lane bypassed header validation, the POST-only surface, and unknown-method 404 mapping entirely. Both entry points now mirror `server.rs`: under `protocol-2026-07-28` all requests go to the streamable handler (the JSON-framed 2026 path returns buffered bodies, so the non-streaming Lambda runtime is unaffected); the `protocol-2025-11-25` lane keeps its existing unconditional `SessionMcpHandler` delegation for `handle()`, and header-based routing for `handle_streaming()`, unchanged. Closes the ADR-029 §Consequences "Lambda simplification" drift (one Lambda = one feature = one protocol). Tests: `stateless_session_2026_07_28.rs` (production path `LambdaMcpServerBuilder → handler() → handle()`: middleware-injected state readable via `SessionContext::get_typed_state` in the tool, missing `MCP-Protocol-Version` → 400/`-32020`, middleware `Unauthenticated` short-circuit → `-32001`; all three fail with the routing fix reverted — revert-and-fail recorded). `middleware_parity.rs` (drives the `initialize`/`Mcp-Session-Id` lifecycle) is now gated `protocol-2025-11-25` — it only passed on the 2026 default because of the wrong legacy routing.
**Status: PARKED.** Snapshot date: 2026-07-02. Schema content sha256: `6e4cba2d…`. Fixture pin: `60dc69e9…`. Reason: awaiting upstream 2026-07-28 draft stabilization / release proximity before investing further compliance-review effort. **On resume, the first action must be re-fetching and diffing the live draft schema against `6e4cba2d…`** — do not assume the findings or test results below still hold; the draft has drifted underneath this document twice already this week. This file is a temporary 0.4 punch list, not a permanent record (see §6) — fold the surviving open items into `docs/plans/2026-07-28-spec-compliance.md` and delete this file during final release preparation.
3
+
**Status: BURNED DOWN (2026-07-13) — one open item remains.** Snapshot date: 2026-07-02; resumed 2026-07-13. This file is a temporary 0.4 punch list, not a permanent record (see §6) — fold the surviving open item into `docs/plans/2026-07-28-spec-compliance.md` and delete this file during final release preparation.
4
+
5
+
## Addendum 2026-07-13 — resume + burn-down
6
+
7
+
-**Resume precondition satisfied.** Live `schema/draft/schema.ts` re-fetched and diffed against the `6e4cba2d…` pin: byte-for-byte identical, zero upstream commits touching `schema/` since 2026-07-02 (only a typedoc devDependency bump under `docs/specification/draft` on 2026-07-07). The published draft changelog contains nothing beyond what the vendored README's revision log already accounts for. The findings below were therefore actioned as written.
8
+
- **Closed this pass** (all §3 low-severity items, plus two of §2's three disclosed gaps): `RequestMetaObject.extra` collision guard (hand-written `Serialize`, same pattern as `SubscriptionsListenResultMeta`); 2026-lane dispatch narrowing — `notifications/progress` / `notifications/message` no longer registered as client notifications under `protocol-2026-07-28` (202 semantics unchanged; 2025-11-25 lane untouched); `ElicitResult.content` values retyped to `ElicitResultValue` (`string | number | boolean | string[]`); `CompletionReference` strict `type`-discriminator deserialize; `CompleteResult.completion.total` u32→f64; `RootsCapabilities` reduced to the schema's empty object; `CreateMessageRequestParams.metadata` retyped to the JSONObject convention; dead `SamplingRequest`/`SamplingResult` removed; prompt-shape compliance assertions deepened; `DRAFT-2026-v1` test fixtures modernized to `"2026-07-28"`; all §3 comment/doc corrections (content.rs `_meta`, caching.rs module doc, tools.rs ADR-citation + overclaim, meta.rs tombstone, notifications.rs / completion.rs orphaned docs, architecture-review.md stale-count annotation).
9
+
-**Closed by disposition, not code:**`completion.values``@maxItems 100` producer guard — enforcement already exists and is tested at the server dispatch layer (`CompletionHandler` truncates to 100 and captures the pre-truncation count into `total`; `completion_values_are_capped_at_100`); a constructor-level guard would be a second, lossy truncation path. Documented on the field instead (`completion_result_new_does_not_truncate`).
10
+
-**Still open (the sole survivor):**`SubscriptionsListenResult` graceful-close emission — schema-bound and wire-tested, but the server has no shutdown-signal infrastructure to emit it from (no `CancellationToken` / `tokio::signal` wiring). Spec-legal as-is (abrupt transport close carries no response); needs a dedicated feature slice.
11
+
-**Discovered while gating (pre-existing, not a 2026-compliance item):**`turul-mcp-server`'s `tests::pagination_integration_tests::test_pagination_with_invalid_cursor` fails on the `protocol-2025-11-25,http,sse` combo — confirmed failing on the pre-burn-down tree via stash-bisect, so it predates this pass. Untriaged.
0 commit comments