Skip to content

Commit 5dc226b

Browse files
committed
Correct the requirements manifest and README after the rework
The client-transport revert left the cancel-posts-frame requirement describing a stream release the client no longer performs; restore its main-branch wording. Record the era-scoped -32800 answer on the legacy HTTP wire as typed Divergence data on the protocol requirement, as the manifest header requires for a test-pinned gap, and give the transport entry an sdk source since the response is an SDK choice rather than a spec mandate. Reword the streaming story's See-also line, which pointed at a cancellation error path that no longer exists. No-Verification-Needed: manifest and example-README text only, no runtime surface
1 parent 706d0ce commit 5dc226b

2 files changed

Lines changed: 20 additions & 20 deletions

File tree

examples/stories/streaming/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,6 @@ uv run python -m stories.streaming.client --http --server server_lowlevel
7171

7272
## See also
7373

74-
`parallel_calls/` (concurrent in-flight calls), `error_handling/` (the
75-
cancellation error path), `tools/` (the basics this builds on).
74+
`parallel_calls/` (concurrent in-flight calls), `error_handling/` (error
75+
surfaces: `is_error` results vs protocol errors), `tools/` (the basics this
76+
builds on).

tests/interaction/_requirements.py

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,15 @@ def __post_init__(self) -> None:
539539
"A cancellation notification for an in-flight request stops the server-side handler, and the "
540540
"receiver does not send a response for the cancelled request - no result and no error."
541541
),
542-
note=(
543-
"The 2025-era streamable HTTP wire has no way to end a request but a response, so that "
544-
"one transport terminates the settled request with REQUEST_CANCELLED (-32800) instead of "
545-
"staying silent; see transport:streamable-http:cancelled-request-terminated. The 2026-07-28 "
546-
"MUST NOT applies to stdio and the 2026 wire, where nothing is sent."
542+
divergence=Divergence(
543+
note=(
544+
"The 2025-era streamable HTTP transport still answers a cancelled request, with a "
545+
"REQUEST_CANCELLED (-32800) error - deliberate and era-scoped: that wire ends a request's "
546+
"stream only with a response for its id, so silence would leave the POST (and any "
547+
"resuming client's replay) open. Every other transport sends nothing, and the "
548+
"2026-07-28 MUST NOT applies only there. Retires with the legacy transport; see "
549+
"transport:streamable-http:cancelled-request-terminated."
550+
),
547551
),
548552
arm_exclusions=(
549553
ArmExclusion(reason="requires-session", transport="streamable-http-stateless"),
@@ -2558,19 +2562,19 @@ def __post_init__(self) -> None:
25582562
note="Only observable over streamable HTTP: JSON-response mode is an HTTP framing option.",
25592563
),
25602564
"transport:streamable-http:cancelled-request-terminated": Requirement(
2561-
source=f"{SPEC_BASE_URL}/basic/utilities/cancellation#behavior-requirements",
2565+
source="sdk",
25622566
behavior=(
25632567
"A request cancelled through notifications/cancelled is terminated with a REQUEST_CANCELLED "
25642568
"(-32800) error response, completing its POST - the JSON body in JSON-response mode, the "
25652569
"final event of its stream in SSE mode."
25662570
),
25672571
transports=("streamable-http",),
25682572
note=(
2569-
"Deliberate SHOULD-level divergence, era-scoped: the 2025-era wire ends a request's stream "
2570-
"only with a response for its id (and stores it so a resuming client's replay terminates "
2571-
"too), so this transport answers where the dispatcher writes nothing. Written through the "
2572-
"same ordered channel as the request's other messages, so it cannot overtake anything "
2573-
"already queued for the request."
2573+
"An SDK choice, not spec-mandated (the spec-side gap is the Divergence on "
2574+
"protocol:cancel:in-flight): this era's wire ends a request's stream only with a response "
2575+
"for its id, and stores it so a resuming client's replay terminates too. The terminator is "
2576+
"written through the same ordered channel as the request's other messages, so it cannot "
2577+
"overtake anything already queued for the request."
25742578
),
25752579
),
25762580
"transport:streamable-http:stateless": Requirement(
@@ -3395,17 +3399,12 @@ def __post_init__(self) -> None:
33953399
source=f"{SPEC_BASE_URL}/basic/utilities/cancellation#cancellation-flow",
33963400
behavior=(
33973401
"At 2025-era revisions, abandoning an in-flight request POSTs exactly one "
3398-
"notifications/cancelled naming its request id, and releases the abandoned request's own "
3399-
"response stream so it neither stays parked nor resumes."
3402+
"notifications/cancelled naming its request id."
34003403
),
34013404
transports=("streamable-http",),
34023405
removed_in="2026-07-28",
34033406
superseded_by="client-transport:http:cancel-closes-stream",
3404-
note=(
3405-
"HTTP-only by nature: pins that the frame travels as its own POST on the legacy HTTP wire. "
3406-
"The frame, not the released stream, is the signal - a 2025 server treats the disconnect "
3407-
"as nothing."
3408-
),
3407+
note="HTTP-only by nature: pins that the frame travels as its own POST on the legacy HTTP wire.",
34093408
),
34103409
"client-transport:http:concurrent-streams": Requirement(
34113410
source="sdk",

0 commit comments

Comments
 (0)