Summary
Follow-up to #93 / #94. After fixing the SendspinServer()/SendspinClient() constructor mismatch in #94, connection, handshake (including legacy unencrypted admission), and role negotiation between two aiosendspin instances now succeed. However, running the conformance harness with both roles played by aiosendspin (--from aiosendspin --to aiosendspin) still fails most scenarios past that point, on what looks like separate, additional protocol/API drift in aiosendspin's audio/metadata/artwork/controller role plumbing.
This is likely irrelevant to any single-sided matrix cell (--from aiosendspin --to <other-client> or --from <other-server> --to aiosendspin) where only one adapter round-trips through aiosendspin, but it blocks a clean aiosendspin↔aiosendspin self-test and may hint at adapter bugs that also affect mixed-implementation runs.
Reproduction
Clone current aiosendspin (https://github.com/Sendspin-Protocol/aiosendspin, tip as of 2026-07-16, commit a3a4401) and sendspin-cli (for the fixture), point CONFORMANCE_REPO_AIOSENDSPIN / CONFORMANCE_REPO_SENDSPIN_CLI at them, and run:
conformance run --from aiosendspin --to aiosendspin --timeout-seconds 25
Observed failures (after #94's fix)
server-initiated-pcm / server-initiated-pcm-24bit: "Client summary shows zero audio chunks"
server-initiated-metadata: "Client summary shows zero metadata updates"
server-initiated-artwork: "Client summary shows zero artwork frames"
server-initiated-flac: "Server did not negotiate FLAC transport (codec=None)"
server-initiated-opus: client hangs, times out waiting for client-ready.json
client-initiated-pcm: fails with an empty reason string (needs its own investigation)
Connection/handshake/role-negotiation itself is confirmed working: the server logs Sendspin server started successfully, an unencrypted legacy client/hello is admitted with Accepting unencrypted legacy connection (transition mode), and role snapshots (client.active_role_ids) populate correctly. The failures above happen later, during actual stream/metadata/artwork data transfer.
Suggested investigation
Compare src/conformance/adapters/aiosendspin_server.py / aiosendspin_client.py (_run_audio_scenario, _run_metadata_scenario, _run_artwork_scenario, _run_controller_scenario, and the stream.prepare_audio/stream.commit_audio/client.group.start_stream() calls) against aiosendspin's own integration tests (tests/integration/*.py in the aiosendspin repo) to see the current expected usage pattern for streaming/metadata/artwork/controller roles post-encryption, since the role-activation and stream-negotiation flow may have changed shape in the same PR series (Sendspin/aiosendspin#292–298) that broke the constructors fixed in #94.
🤖 Filed with Claude Code while verifying the fix for #93.
Summary
Follow-up to #93 / #94. After fixing the
SendspinServer()/SendspinClient()constructor mismatch in #94, connection, handshake (including legacy unencrypted admission), and role negotiation between twoaiosendspininstances now succeed. However, running the conformance harness with both roles played byaiosendspin(--from aiosendspin --to aiosendspin) still fails most scenarios past that point, on what looks like separate, additional protocol/API drift in aiosendspin's audio/metadata/artwork/controller role plumbing.This is likely irrelevant to any single-sided matrix cell (
--from aiosendspin --to <other-client>or--from <other-server> --to aiosendspin) where only one adapter round-trips through aiosendspin, but it blocks a clean aiosendspin↔aiosendspin self-test and may hint at adapter bugs that also affect mixed-implementation runs.Reproduction
Clone current
aiosendspin(https://github.com/Sendspin-Protocol/aiosendspin, tip as of 2026-07-16, commita3a4401) andsendspin-cli(for the fixture), pointCONFORMANCE_REPO_AIOSENDSPIN/CONFORMANCE_REPO_SENDSPIN_CLIat them, and run:Observed failures (after #94's fix)
server-initiated-pcm/server-initiated-pcm-24bit: "Client summary shows zero audio chunks"server-initiated-metadata: "Client summary shows zero metadata updates"server-initiated-artwork: "Client summary shows zero artwork frames"server-initiated-flac: "Server did not negotiate FLAC transport (codec=None)"server-initiated-opus: client hangs, times out waiting forclient-ready.jsonclient-initiated-pcm: fails with an empty reason string (needs its own investigation)Connection/handshake/role-negotiation itself is confirmed working: the server logs
Sendspin server started successfully, an unencrypted legacyclient/hellois admitted withAccepting unencrypted legacy connection (transition mode), and role snapshots (client.active_role_ids) populate correctly. The failures above happen later, during actual stream/metadata/artwork data transfer.Suggested investigation
Compare
src/conformance/adapters/aiosendspin_server.py/aiosendspin_client.py(_run_audio_scenario,_run_metadata_scenario,_run_artwork_scenario,_run_controller_scenario, and thestream.prepare_audio/stream.commit_audio/client.group.start_stream()calls) against aiosendspin's own integration tests (tests/integration/*.pyin the aiosendspin repo) to see the current expected usage pattern for streaming/metadata/artwork/controller roles post-encryption, since the role-activation and stream-negotiation flow may have changed shape in the same PR series (Sendspin/aiosendspin#292–298) that broke the constructors fixed in #94.🤖 Filed with Claude Code while verifying the fix for #93.