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 @@ -17,6 +17,7 @@ Current scenarios:
- `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
- `server-initiated-static-delay` (Client applies configured `static_delay_ms`): start the server first, then the client. The client is configured with a non-zero `static_delay_ms`; the server pre-compensates and the harness asserts the client's actual emission time matches `T − static_delay_ms` within the spec's drift tolerance. Per the audit, `sendspin-rs` and `SendspinKit` parse the field but never apply it (highest-severity bug); seven SDKs don't persist across restarts. No client in the matrix declares the `static-delay-applied` 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 @@ -68,6 +68,7 @@
"pcm-24bit-decode",
"external-source-client-api",
"multi-server-arbitration",
"static-delay-applied",
),
),
),
Expand Down
21 changes: 21 additions & 0 deletions src/conformance/scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,26 @@
)


SERVER_INITIATED_STATIC_DELAY = ScenarioSpec(
id="server-initiated-static-delay",
display_name="Client applies configured `static_delay_ms`",
description=(
"Start the server first, then the client. The client is configured with a "
"non-zero `static_delay_ms`; the server pre-compensates and the harness "
"asserts the client's actual emission time is `T − static_delay_ms` within "
"the spec's drift tolerance. Per the audit, the highest-severity bug is "
"\"parse-but-ignore\": sendspin-rs and SendspinKit parse the field but "
"never apply it. A configure-restart-replay variant covers the "
"\"forgot-to-persist\" gap that affects seven SDKs."
),
initiator_role="server",
preferred_codec="pcm",
required_role_families=("player",),
verification_mode="capability-only",
required_capability="static-delay-applied",
)


SERVER_INITIATED_MULTI_SERVER_ARBITRATION = ScenarioSpec(
id="server-initiated-multi-server-arbitration",
display_name="Client arbitrates between two connected servers",
Expand Down Expand Up @@ -269,6 +289,7 @@
SERVER_INITIATED_PCM_24BIT,
SERVER_INITIATED_EXTERNAL_SOURCE,
SERVER_INITIATED_MULTI_SERVER_ARBITRATION,
SERVER_INITIATED_STATIC_DELAY,
)

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