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
(a) ttlMs: the schema declares `number` (@Minimum 0); the u64 binding
rejected spec-legal fractional values on deserialize. CacheableResult.ttl_ms
and its embeddings (ListToolsResult, ListResourcesResult,
ListResourceTemplatesResult, ReadResourceResult, ListPromptsResult,
DiscoverResult) are now f64 via a shared serde helper: fractional values
accepted and round-tripped, negative/non-finite rejected, whole values keep
the compact integer wire form (byte-stable for the common ttlMs: 0).
Contract test covers all four behaviors.
(b) SEP-2577 markers: the 2026-06-07 re-pin deprecated the WHOLE Logging
surface — including the per-request _meta logLevel opt-in and the
LoggingLevel enum — and the bindings/rustdoc still claimed those were "the
non-deprecated replacement". Corrected: #[deprecated] now on LoggingLevel
(+ LogLevel alias), META_KEY_LOG_LEVEL, RequestMetaObject.log_level /
with_log_level, ServerCapabilities.logging, ModelHint / ModelPreferences /
ToolChoice, ContentBlock::ToolUse / ToolResult (variants + constructors),
and the sampling/logging trait surface. The behavior remains normative and
implemented through the migration window (earliest removal 2027-07-28);
framework-internal call sites carry scoped #[allow(deprecated)], so the
markers reach downstream consumers without making the framework warn on
itself. Zero warnings on the default build, test build, clippy, and the
2025 opt-in lane builds.
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
@@ -37,6 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
37
37
38
38
### Fixed (2026-06-10)
39
39
40
+
- **Protocol-fidelity sweep, part 2 — `ttlMs` as a schema `number` + SEP-2577 marker absorption.** (a) `CacheableResult.ttlMs` (and its embeddings in the tools/resources/prompts/discover results) is now `f64` per the schema's `number` type: fractional values are accepted on deserialize and survive round trips, negative/non-finite values reject (`@minimum 0`), and whole values keep the compact integer wire form (byte-stable for the common `ttlMs: 0` case). (b) The re-pinned schema's SEP-2577 deprecations are now fully absorbed as `#[deprecated]` markers: `LoggingLevel` (+ `LogLevel` alias), the per-request `_meta` `logLevel` key and `RequestMetaObject.log_level`/`with_log_level`, `ServerCapabilities.logging`, `ModelHint`/`ModelPreferences`/`ToolChoice`, the `ContentBlock::ToolUse`/`ToolResult` variants and constructors, and the sampling trait surface (`HasCreateMessageRequestParams`/`CreateMessageRequest`/`CreateMessageResult`/`HasLevelParam`). The earlier rustdoc claim that `LoggingLevel`/`logLevel` were "the non-deprecated replacement" was wrong against the re-pin and is corrected — the whole Logging surface (including the per-request opt-in this branch implements) is deprecated-but-normative through the migration window. Framework-internal use sites carry scoped `#[allow(deprecated)]` (the framework intentionally serves the surface through the window); downstream consumers now get compiler nudges.
40
41
- **Protocol-fidelity sweep, part 1 (wire/type drift vs the pinned schema).** (a) `ToolChoice` no longer carries a non-spec `name` field on the wire (the `specific()` constructor is gone) and `mode` is optional per schema (`{}` parses; absent means `"auto"`; `effective_mode()` helper). (b) `PromptReference` is `BaseMetadata`-shaped: gains `title`, drops the non-spec `description`. (c) `Annotations.audience` is the closed `Role[]` union instead of `Vec<String>` — wire-invalid values like `"system"` are now rejected at parse time; the builders' `annotation_audience` takes `Role` (converted to strings on the frozen 2025 lane). (d) The duplicate `Role` binding is gone — `sampling::Role` re-exports the single `prompts::Role`. (e) `LoggingCapabilities`/`CompletionsCapabilities` match the schema's opaque `JSONObject`: the invented `enabled`/`levels` keys are removed from the bindings and from both server builders' capability advertisements (presence of the object is the signal). 5 new wire-shape contract tests in `compliance.rs`; existing tests migrated with the contract (e.g. the empty `ToolChoice` parse fails against the pre-fix required-`mode` binding).
41
42
42
43
-**2025 opt-in lane build regression (same day, pre-push).** The elicitation enum-union slice used the 2026-only union accessors in `turul-mcp-builders` code that also compiles under `protocol-2025-11-25`, breaking the opt-in lane builds (caught by `scripts/ci-gates.sh all`). The validation is now `#[cfg]`-split per lane.
0 commit comments