Case
sendspin-go -> sendspin-jvm
Start the server first, then the client. The client discovers or looks up the server, initiates the WebSocket connection, advertises PCM as its only supported audio format, streams audio derived from almost_silent.flac, and compares canonical PCM hashes.
Server
sendspin-go
Client
sendspin-jvm
Status
Passed
PCM hashes match exactly
Inspection
Summaries, logs, and builds
Matrix result
RAW{
"case_dir": "artifacts/results/data/macos__client-initiated-pcm__sendspin-go__to__sendspin-jvm",
"client_exit_code": 0,
"client_impl": "sendspin-jvm",
"reason": "PCM hashes match exactly",
"scenario_id": "client-initiated-pcm",
"server_exit_code": 0,
"server_impl": "sendspin-go",
"status": "passed"
}Server summary (JSON)
RAW{
"audio": {
"bit_depth": 16,
"channels": 1,
"clip_seconds": 5,
"duration_seconds": 5,
"fixture": "/Users/runner/work/conformance/conformance/repos/sendspin-cli/tests/fixtures/almost_silent.flac",
"frame_count": 40000,
"sample_rate": 8000,
"sent_audio_chunk_count": 100,
"sent_encoded_byte_count": 80000,
"sent_encoded_sha256": "b3481a3f75dea856a961e7842d12f8344c7147b3925f9f0b67c5445700bd4cf2",
"source_flac_sha256": "8fdda8244e318c63cd8b699fe461cd7cdddbb729327a0ba00d1bfdbe2192fe17",
"source_pcm_sha256": "9d447b5b270bc99b45bb9a616937e436c941ca56c477f9cbe16a93275a6b059e"
},
"client": {
"client_id": "sendspin-jvm-client-id",
"name": "sendspin-jvm-client",
"supported_roles": [
"player@v1",
"metadata@v1",
"artwork@v1",
"controller@v1"
]
},
"discovery_method": "registry_advertised",
"implementation": "sendspin-go",
"initiator_role": "client",
"peer_hello": {
"payload": {
"artwork@v1_support": {
"channels": [
{
"format": "jpeg",
"media_height": 256,
"media_width": 256,
"source": "album"
}
]
},
"client_id": "sendspin-jvm-client-id",
"controller@v1_support": {},
"device_info": {
"manufacturer": "conformance",
"product_name": "conformance-client",
"software_version": "1.0"
},
"metadata@v1_support": {},
"name": "sendspin-jvm-client",
"player@v1_support": {
"buffer_capacity": 262144,
"supported_commands": [
"volume",
"mute"
],
"supported_formats": [
{
"bit_depth": 16,
"channels": 1,
"codec": "pcm",
"sample_rate": 8000
},
{
"bit_depth": 16,
"channels": 2,
"codec": "pcm",
"sample_rate": 48000
}
]
},
"supported_roles": [
"player@v1",
"metadata@v1",
"artwork@v1",
"controller@v1"
],
"version": 1
},
"type": "client/hello"
},
"preferred_codec": "pcm",
"role": "server",
"scenario_id": "client-initiated-pcm",
"server_id": "sendspin-go-server",
"server_name": "sendspin-go server",
"status": "ok",
"stream": {
"bit_depth": 16,
"channels": 1,
"codec": "pcm",
"sample_rate": 8000
}
}Server log
RAW{
"audio": {
"bit_depth": 16,
"channels": 1,
"clip_seconds": 5,
"duration_seconds": 5,
"fixture": "/Users/runner/work/conformance/conformance/repos/sendspin-cli/tests/fixtures/almost_silent.flac",
"frame_count": 40000,
"sample_rate": 8000,
"sent_audio_chunk_count": 100,
"sent_encoded_byte_count": 80000,
"sent_encoded_sha256": "b3481a3f75dea856a961e7842d12f8344c7147b3925f9f0b67c5445700bd4cf2",
"source_flac_sha256": "8fdda8244e318c63cd8b699fe461cd7cdddbb729327a0ba00d1bfdbe2192fe17",
"source_pcm_sha256": "9d447b5b270bc99b45bb9a616937e436c941ca56c477f9cbe16a93275a6b059e"
},
"client": {
"client_id": "sendspin-jvm-client-id",
"name": "sendspin-jvm-client",
"supported_roles": [
"player@v1",
"metadata@v1",
"artwork@v1",
"controller@v1"
]
},
"discovery_method": "registry_advertised",
"implementation": "sendspin-go",
"initiator_role": "client",
"peer_hello": {
"payload": {
"artwork@v1_support": {
"channels": [
{
"format": "jpeg",
"media_height": 256,
"media_width": 256,
"source": "album"
}
]
},
"client_id": "sendspin-jvm-client-id",
"controller@v1_support": {},
"device_info": {
"manufacturer": "conformance",
"product_name": "conformance-client",
"software_version": "1.0"
},
"metadata@v1_support": {},
"name": "sendspin-jvm-client",
"player@v1_support": {
"buffer_capacity": 262144,
"supported_commands": [
"volume",
"mute"
],
"supported_formats": [
{
"bit_depth": 16,
"channels": 1,
"codec": "pcm",
"sample_rate": 8000
},
{
"bit_depth": 16,
"channels": 2,
"codec": "pcm",
"sample_rate": 48000
}
]
},
"supported_roles": [
"player@v1",
"metadata@v1",
"artwork@v1",
"controller@v1"
],
"version": 1
},
"type": "client/hello"
},
"preferred_codec": "pcm",
"role": "server",
"scenario_id": "client-initiated-pcm",
"server_id": "sendspin-go-server",
"server_name": "sendspin-go server",
"status": "ok",
"stream": {
"bit_depth": 16,
"channels": 1,
"codec": "pcm",
"sample_rate": 8000
}
}
Client summary (JSON)
RAW{
"audio": {
"audio_chunk_count": 100,
"received_encoded_sha256": "b3481a3f75dea856a961e7842d12f8344c7147b3925f9f0b67c5445700bd4cf2",
"received_pcm_sha256": "9d447b5b270bc99b45bb9a616937e436c941ca56c477f9cbe16a93275a6b059e",
"received_sample_count": 40000
},
"client_id": "sendspin-jvm-client-id",
"client_name": "sendspin-jvm-client",
"implementation": "sendspin-jvm",
"initiator_role": "client",
"peer_hello": {
"active_roles": [
"player@v1",
"metadata@v1"
],
"connection_reason": "playback",
"name": "sendspin-go server",
"server_id": "sendspin-go-server",
"version": 1
},
"preferred_codec": "pcm",
"role": "client",
"scenario_id": "client-initiated-pcm",
"server": null,
"status": "ok",
"stream": {
"bit_depth": 16,
"channels": 1,
"codec": "pcm",
"codec_header": null,
"sample_rate": 8000
}
}Client log
RAWMay 16, 2026 5:35:25 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: connecting to ws://127.0.0.1:18940/sendspin
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: WebSocket open
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: server hello from 'sendspin-go server' reason=playback
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: stream/start codec=pcm
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: server/state title='Almost Silent'
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: first audio chunk — ts=1193969 size=800 bufferSize=0
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: closing (1000 done)
May 16, 2026 5:35:26 AM com.sendspin.protocol.ProtocolLog i
INFO: SendSpinClient: closed (1000 done)
{
"server": null,
"initiator_role": "client",
"role": "client",
"preferred_codec": "pcm",
"stream": {
"codec": "pcm",
"codec_header": null,
"sample_rate": 8000,
"channels": 1,
"bit_depth": 16
},
"peer_hello": {
"active_roles": [
"player@v1",
"metadata@v1"
],
"name": "sendspin-go server",
"connection_reason": "playback",
"server_id": "sendspin-go-server",
"version": 1
},
"implementation": "sendspin-jvm",
"audio": {
"audio_chunk_count": 100,
"received_encoded_sha256": "b3481a3f75dea856a961e7842d12f8344c7147b3925f9f0b67c5445700bd4cf2",
"received_pcm_sha256": "9d447b5b270bc99b45bb9a616937e436c941ca56c477f9cbe16a93275a6b059e",
"received_sample_count": 40000
},
"client_name": "sendspin-jvm-client",
"client_id": "sendspin-jvm-client-id",
"scenario_id": "client-initiated-pcm",
"status": "ok"
}
Server build log · sendspin-go-server · built · 1.01s
RAWNo build detail was recorded.
Client build log · sendspin-jvm-client · built · 77.84s
RAWDownloading https://services.gradle.org/distributions/gradle-9.4.1-bin.zip .............10%.............20%.............30%.............40%.............50%.............60%..............70%.............80%.............90%.............100% Starting a Gradle Daemon (subsequent builds will be faster) > Task :checkKotlinGradlePluginConfigurationErrors SKIPPED > Task :sendspin-protocol:checkKotlinGradlePluginConfigurationErrors SKIPPED > Task :processResources NO-SOURCE > Task :sendspin-protocol:kspKotlin > Task :sendspin-protocol:processResources > Task :sendspin-protocol:compileKotlin > Task :sendspin-protocol:compileJava NO-SOURCE > Task :sendspin-protocol:classes > Task :sendspin-protocol:jar > Task :compileKotlin > Task :compileJava NO-SOURCE > Task :classes UP-TO-DATE > Task :jar [Incubating] Problems report is available at: file:///Users/runner/work/conformance/conformance/adapters/sendspin-jvm/client/build/reports/problems/problems-report.html Deprecated Gradle features were used in this build, making it incompatible with Gradle 10. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/9.4.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD SUCCESSFUL in 1m 15s 6 actionable tasks: 6 executed Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html