{
  "schema_version": 1,
  "capture_date_utc": "2026-10-07",
  "rows": [
    {
      "id": "put-eof-audio",
      "classification": "observed-supported",
      "observation": "Both delivered byte-identical audio from EOF-delimited PUT.",
      "quikcast_contract": "Support bounded EOF source adapter.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-eof-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 40600,
          "summary": "2.4.4/summary.json",
          "case": "put-eof-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-eof-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 40600,
          "summary": "2.5.0/summary.json",
          "case": "put-eof-listener"
        }
      ]
    },
    {
      "id": "source-admission-timing",
      "classification": "version-dependent",
      "observation": "2.4.4 early final 200; 2.5.0 raw PUT did not emit final 200 in the captured window; both accepted SOURCE immediately.",
      "quikcast_contract": "Raw/legacy use early acceptance; framed HTTP uses normal completion. Never infer rejection from response absence.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-eof.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4/summary.json",
          "case": "put-eof"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-expect.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4/summary.json",
          "case": "put-expect"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/source-ice.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4/summary.json",
          "case": "source-ice"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-eof.response.bin",
          "status": "",
          "body_bytes": 0,
          "summary": "2.5.0/summary.json",
          "case": "put-eof"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-expect.response.bin",
          "status": "HTTP/1.1 100 Continue",
          "body_bytes": 0,
          "summary": "2.5.0/summary.json",
          "case": "put-expect"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/source-ice.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 0,
          "summary": "2.5.0/summary.json",
          "case": "source-ice"
        }
      ]
    },
    {
      "id": "legacy-source",
      "classification": "observed-supported",
      "observation": "Both legacy request-line forms delivered matching audio in both releases.",
      "quikcast_contract": "Support these two SOURCE forms only.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/source-ice-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 40600,
          "summary": "2.4.4/summary.json",
          "case": "source-ice-listener"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/source-http-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 40600,
          "summary": "2.4.4/summary.json",
          "case": "source-http-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/source-ice-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 40600,
          "summary": "2.5.0/summary.json",
          "case": "source-ice-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/source-http-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 40600,
          "summary": "2.5.0/summary.json",
          "case": "source-http-listener"
        }
      ]
    },
    {
      "id": "auth-invalid-or-empty",
      "classification": "observed-rejected",
      "observation": "Invalid or empty Basic tokens received 401 in both releases. auth-missing has an empty token, not an absent header.",
      "quikcast_contract": "Reject invalid/missing credentials before admission/body consumption.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/auth-failure.response.bin",
          "status": "HTTP/1.0 401 Authentication Required",
          "body_bytes": 26,
          "summary": "2.4.4/summary.json",
          "case": "auth-failure"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/auth-missing.response.bin",
          "status": "HTTP/1.0 401 Authentication Required",
          "body_bytes": 26,
          "summary": "2.4.4/summary.json",
          "case": "auth-missing"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/auth-failure.response.bin",
          "status": "HTTP/1.1 401 Authentication Required",
          "body_bytes": 388,
          "summary": "2.5.0/summary.json",
          "case": "auth-failure"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/auth-missing.response.bin",
          "status": "HTTP/1.1 401 Authentication Required",
          "body_bytes": 388,
          "summary": "2.5.0/summary.json",
          "case": "auth-missing"
        }
      ]
    },
    {
      "id": "expect-auth-failure",
      "classification": "observed-rejected",
      "observation": "401 without interim 100 in both releases.",
      "quikcast_contract": "No 100 for failed authentication.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4-followup/expect-auth-denied.response.bin",
          "status": "HTTP/1.0 401 Authentication Required",
          "body_bytes": 26,
          "summary": "2.4.4-followup/summary.json",
          "case": "expect-auth-denied"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0-followup/expect-auth-denied.response.bin",
          "status": "HTTP/1.1 401 Authentication Required",
          "body_bytes": 388,
          "summary": "2.5.0-followup/summary.json",
          "case": "expect-auth-denied"
        }
      ]
    },
    {
      "id": "chunked-audio-integrity",
      "classification": "version-dependent",
      "observation": "2.4.4 admitted but relayed literal chunk markers; 2.5.0 delivered matching decoded audio and final 200 after zero chunk.",
      "quikcast_contract": "Decode framing correctly; do not reproduce corruption.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-chunked.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4/summary.json",
          "case": "put-chunked"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-chunked-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 15400,
          "summary": "2.4.4/summary.json",
          "case": "put-chunked-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-chunked.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 0,
          "summary": "2.5.0/summary.json",
          "case": "put-chunked"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-chunked-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 15400,
          "summary": "2.5.0/summary.json",
          "case": "put-chunked-listener"
        }
      ]
    },
    {
      "id": "finite-content-length",
      "classification": "version-dependent",
      "observation": "2.4.4 finite upload remained listenable; 2.5.0 post-upload listener saw 404. Coverage does not establish full semantics.",
      "quikcast_contract": "Implement standard declared-length semantics and integration-test longer incremental uploads.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-content-length.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4/summary.json",
          "case": "put-content-length"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/put-content-length-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 32200,
          "summary": "2.4.4/summary.json",
          "case": "put-content-length-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-content-length.response.bin",
          "status": "",
          "body_bytes": 0,
          "summary": "2.5.0/summary.json",
          "case": "put-content-length"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/put-content-length-listener.response.bin",
          "status": "HTTP/1.1 404 File Not Found",
          "body_bytes": 405,
          "summary": "2.5.0/summary.json",
          "case": "put-content-length-listener"
        }
      ]
    },
    {
      "id": "source-half-close",
      "classification": "version-dependent",
      "observation": "Focused dialogue retains observed responses/absence and partial-body listener statuses; no guessed final response.",
      "quikcast_contract": "Cleanly end the generation on EOF; do not confuse half-close with successor state.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4-followup/put-eof-half-close.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4-followup/summary.json",
          "case": "put-eof-half-close"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4-followup/put-length-incremental.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 0,
          "summary": "2.4.4-followup/summary.json",
          "case": "put-length-incremental"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0-followup/put-eof-half-close.response.bin",
          "status": "",
          "body_bytes": 0,
          "summary": "2.5.0-followup/summary.json",
          "case": "put-eof-half-close"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0-followup/put-length-incremental.response.bin",
          "status": "",
          "body_bytes": 0,
          "summary": "2.5.0-followup/summary.json",
          "case": "put-length-incremental"
        }
      ]
    },
    {
      "id": "icy-disabled",
      "classification": "observed-supported",
      "observation": "Encoded audio matched the fixture with no ICY insertion.",
      "quikcast_contract": "Unmodified encoded bytes when ICY is not requested.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/icy-disabled.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 40600,
          "summary": "2.4.4/summary.json",
          "case": "icy-disabled"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/icy-disabled.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 40600,
          "summary": "2.5.0/summary.json",
          "case": "icy-disabled"
        }
      ]
    },
    {
      "id": "icy-empty",
      "classification": "observed-supported",
      "observation": "16000-byte interval; padded StreamTitle='' initially, then zero-length unchanged blocks.",
      "quikcast_contract": "Match the measured interval/block format in milestone 4.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/icy-empty.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 42018,
          "summary": "2.4.4/summary.json",
          "case": "icy-empty"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/icy-empty.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 42018,
          "summary": "2.5.0/summary.json",
          "case": "icy-empty"
        }
      ]
    },
    {
      "id": "metadata-update-and-fields",
      "classification": "observed-supported",
      "observation": "Song changes and artist/title composition arrived after historical burst metadata; extra fields accepted, not proven emitted.",
      "quikcast_contract": "Typed latest metadata per interval; explicit song precedence; document historical-burst timing difference.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-set-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 140056,
          "summary": "2.4.4/summary.json",
          "case": "metadata-set-icy"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-change-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 140088,
          "summary": "2.4.4/summary.json",
          "case": "metadata-change-icy"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-fields-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 140072,
          "summary": "2.4.4/summary.json",
          "case": "metadata-fields-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-set-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 140056,
          "summary": "2.5.0/summary.json",
          "case": "metadata-set-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-change-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 140088,
          "summary": "2.5.0/summary.json",
          "case": "metadata-change-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-fields-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 140088,
          "summary": "2.5.0/summary.json",
          "case": "metadata-fields-icy"
        }
      ]
    },
    {
      "id": "metadata-unicode-quotes",
      "classification": "observed-supported",
      "observation": "Sample UTF-8 title preserves apostrophe and backslash bytes in both releases.",
      "quikcast_contract": "Preserve measured bytes; untested embedded delimiters/control cases require targeted evidence before milestone 4.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-unicode-quote-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 141488,
          "summary": "2.4.4/summary.json",
          "case": "metadata-unicode-quote-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-unicode-quote-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 140088,
          "summary": "2.5.0/summary.json",
          "case": "metadata-unicode-quote-icy"
        }
      ]
    },
    {
      "id": "metadata-clearing",
      "classification": "version-dependent",
      "observation": "song= cleared on 2.4.4; 2.5.0 acknowledged success but retained previous title in the extended window.",
      "quikcast_contract": "Explicit empty song clears; omitted values remain distinguishable.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-clear.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 113,
          "summary": "2.4.4/summary.json",
          "case": "metadata-clear"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-clear-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 140056,
          "summary": "2.4.4/summary.json",
          "case": "metadata-clear-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-clear.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 123,
          "summary": "2.5.0/summary.json",
          "case": "metadata-clear"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-clear-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 140072,
          "summary": "2.5.0/summary.json",
          "case": "metadata-clear-icy"
        }
      ]
    },
    {
      "id": "metadata-authorization",
      "classification": "observed-rejected",
      "observation": "Wrong mount credentials and genuinely absent Authorization returned 401.",
      "quikcast_contract": "Authorize only the target mount/current generation.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-cross-mount-denied.response.bin",
          "status": "HTTP/1.0 401 Authentication Required",
          "body_bytes": 26,
          "summary": "2.4.4/summary.json",
          "case": "metadata-cross-mount-denied"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-no-auth.response.bin",
          "status": "HTTP/1.0 401 Authentication Required",
          "body_bytes": 26,
          "summary": "2.4.4/summary.json",
          "case": "metadata-no-auth"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-cross-mount-denied.response.bin",
          "status": "HTTP/1.1 401 Authentication Required",
          "body_bytes": 388,
          "summary": "2.5.0/summary.json",
          "case": "metadata-cross-mount-denied"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-no-auth.response.bin",
          "status": "HTTP/1.1 401 Authentication Required",
          "body_bytes": 388,
          "summary": "2.5.0/summary.json",
          "case": "metadata-no-auth"
        }
      ]
    },
    {
      "id": "metadata-own-mount",
      "classification": "observed-supported",
      "observation": "Mount-specific credentials permitted their own update.",
      "quikcast_contract": "Per-mount credential scope.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/metadata-other-authorized.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 113,
          "summary": "2.4.4/summary.json",
          "case": "metadata-other-authorized"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/metadata-other-authorized.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 123,
          "summary": "2.5.0/summary.json",
          "case": "metadata-other-authorized"
        }
      ]
    },
    {
      "id": "source-disconnect-reconnect",
      "classification": "observed-supported",
      "observation": "Listener EOF after source close, inactive GET 404, reconnect with initial empty title.",
      "quikcast_contract": "Generation-local lifecycle; never cross generations.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/source-disconnect-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 68600,
          "summary": "2.4.4/summary.json",
          "case": "source-disconnect-listener"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/inactive-after-disconnect.response.bin",
          "status": "HTTP/1.0 404 File Not Found",
          "body_bytes": 119,
          "summary": "2.4.4/summary.json",
          "case": "inactive-after-disconnect"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4/reconnect-icy-cleared.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 40618,
          "summary": "2.4.4/summary.json",
          "case": "reconnect-icy-cleared"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/source-disconnect-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 68600,
          "summary": "2.5.0/summary.json",
          "case": "source-disconnect-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/inactive-after-disconnect.response.bin",
          "status": "HTTP/1.1 404 File Not Found",
          "body_bytes": 405,
          "summary": "2.5.0/summary.json",
          "case": "inactive-after-disconnect"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/reconnect-icy-cleared.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 40618,
          "summary": "2.5.0/summary.json",
          "case": "reconnect-icy-cleared"
        }
      ]
    },
    {
      "id": "curl-finite-upload",
      "classification": "version-dependent",
      "observation": "2.4.4 delivered audio but curl timed out at 3s; 2.5.0 returned an empty reply and probe saw 404.",
      "quikcast_contract": "Do not claim all live curl combinations passed; preserve the exact finite-file trace.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/curl-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 15400,
          "summary": "2.4.4/summary.json",
          "case": "curl-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/curl-listener.response.bin",
          "status": "HTTP/1.1 404 File Not Found",
          "body_bytes": 405,
          "summary": "2.5.0/summary.json",
          "case": "curl-listener"
        }
      ]
    },
    {
      "id": "ffmpeg-source",
      "classification": "observed-supported",
      "observation": "FFmpeg exited 0; listener HTTP 200 in both. Output includes an ID3 tag absent from the input tone.",
      "quikcast_contract": "Encoder compatibility test; no FFmpeg runtime dependency.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4/ffmpeg-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 14000,
          "summary": "2.4.4/summary.json",
          "case": "ffmpeg-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0/ffmpeg-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 14000,
          "summary": "2.5.0/summary.json",
          "case": "ffmpeg-listener"
        }
      ],
      "derived_checks": [
        {
          "release": "2.4.4",
          "id3_bytes": 45,
          "remaining_audio_matches_input_prefix": true
        },
        {
          "release": "2.5.0",
          "id3_bytes": 45,
          "remaining_audio_matches_input_prefix": true
        }
      ]
    },
    {
      "id": "liquidsoap-source-and-icy",
      "classification": "observed-supported",
      "observation": "See dedicated bounded readiness captures and source/admin access logs; this classification requires both successful listener probes.",
      "quikcast_contract": "Automated real source/metadata compatibility client; no server-side media process.",
      "evidence": [
        {
          "release": "2.4.4",
          "fixture": "2.4.4-liquidsoap/liquidsoap-listener.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 60200,
          "summary": "2.4.4-liquidsoap/summary.json",
          "case": "liquidsoap-listener"
        },
        {
          "release": "2.4.4",
          "fixture": "2.4.4-liquidsoap/liquidsoap-icy.response.bin",
          "status": "HTTP/1.0 200 OK",
          "body_bytes": 61667,
          "summary": "2.4.4-liquidsoap/summary.json",
          "case": "liquidsoap-icy"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0-liquidsoap/liquidsoap-listener.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 60200,
          "summary": "2.5.0-liquidsoap/summary.json",
          "case": "liquidsoap-listener"
        },
        {
          "release": "2.5.0",
          "fixture": "2.5.0-liquidsoap/liquidsoap-icy.response.bin",
          "status": "HTTP/1.1 200 OK",
          "body_bytes": 61667,
          "summary": "2.5.0-liquidsoap/summary.json",
          "case": "liquidsoap-icy"
        }
      ]
    },
    {
      "id": "remaining-reference-coverage",
      "classification": "unresolved",
      "evidence": [],
      "observation": "Absent source Authorization, large/slow finite bodies, metadata maxima/delimiters/charset, broader client/player versions not measured.",
      "quikcast_contract": "Add targeted fixtures before freezing those ambiguous details; no presumed passes."
    }
  ]
}
