Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Current scenarios:
- `server-initiated-request-format` (Client requests a mid-stream codec switch): start the server first, then the client. The server begins streaming in Opus; the client is instructed to emit `stream/request-format` with FLAC at a fixed timestamp and the server responds with a fresh `stream/start`. No SDK currently emits `stream/request-format`, so every case currently fails fast on the `stream-request-format-emit` capability
- `server-initiated-pcm-24bit` (Server initiates connection and client wants 24-bit PCM): start the server first, then the client. The server re-packs the fixture as 24-bit PCM (3-byte packed, little-endian, two's complement). No SDK in the matrix declares the `pcm-24bit-decode` capability yet, so every case currently fails fast and the matrix surfaces the gap (notably the `sendspin-go` SDK has no 24-bit code path per the audit)
- `server-initiated-external-source` (Client enters and leaves `external_source` mid-stream): start the server first, then the client. The client transitions to `external_source` and back; the harness verifies the server emits the right `group/update` and `stream/end` and that the previous group is restored. Per the audit only SendspinKit exposes a client-side API; no client in the matrix declares the `external-source-client-api` capability yet, so every case fails fast
- `server-initiated-multi-server-arbitration` (Client arbitrates between two connected servers): two servers connect to one client with different `connection_reason` values; the harness verifies the client sends `client/goodbye` with `'another_server'` on the right socket and ends up speaking to the right server per the spec's decision table. Per the audit only sendspin-cpp and sendspin-cli implement these rules; no client in the matrix declares the `multi-server-arbitration` capability yet, so every case fails fast

## Current coverage

Expand Down
1 change: 1 addition & 0 deletions src/conformance/implementations.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
"stream-request-format-emit",
"pcm-24bit-decode",
"external-source-client-api",
"multi-server-arbitration",
),
),
),
Expand Down
22 changes: 22 additions & 0 deletions src/conformance/scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,27 @@
)


SERVER_INITIATED_MULTI_SERVER_ARBITRATION = ScenarioSpec(
id="server-initiated-multi-server-arbitration",
display_name="Client arbitrates between two connected servers",
description=(
"Two servers connect to one client (one with "
"`connection_reason: 'discovery'`, one with `'playback'`). The harness "
"asserts the client sends `client/goodbye` with the right reason "
"(`'another_server'`) on the right socket and ends up speaking to the "
"right server per the spec's decision table. Per the audit, only "
"sendspin-cpp and sendspin-cli (via aiosendspin) implement these rules; "
"every other client SDK collapses to \"whichever connection happened "
"first\" and defaults to the wrong goodbye reason on switch."
),
initiator_role="server",
preferred_codec="pcm",
required_role_families=("player",),
verification_mode="capability-only",
required_capability="multi-server-arbitration",
)


SERVER_INITIATED_EXTERNAL_SOURCE = ScenarioSpec(
id="server-initiated-external-source",
display_name="Client enters and leaves `external_source` mid-stream",
Expand Down Expand Up @@ -247,6 +268,7 @@
SERVER_INITIATED_REQUEST_FORMAT,
SERVER_INITIATED_PCM_24BIT,
SERVER_INITIATED_EXTERNAL_SOURCE,
SERVER_INITIATED_MULTI_SERVER_ARBITRATION,
)

SCENARIOS: dict[str, ScenarioSpec] = {scenario.id: scenario for scenario in SCENARIO_LIST}
Expand Down