{
  "expected": {
    "n_checks": 24,
    "n_checks_passed": 24,
    "n_param_sets": 3,
    "ok": true,
    "selfcheck_ok": true,
    "sizes_1024": [
      1568,
      1568,
      32
    ],
    "sizes_512": [
      800,
      768,
      32
    ],
    "sizes_768": [
      1184,
      1088,
      32
    ],
    "third_party_ran": true
  },
  "hash_version": 2,
  "name": "interop_3p_contract",
  "note": "S06 row 8 (sealed 2026-09-02 BEFORE liboqs 0.16.0 or OpenSSL 3.6.4 were built into their scratch prefixes and BEFORE tools/interop/third_party_mlkem.py was parametrised over the three FIPS 203 parameter sets). The bar is the OUTCOME contract only: both stacks interoperate in both directions at ML-KEM-512 (ek 800 / ct 768 / ss 32), -768 (1184 / 1088 / 32) and -1024 (1568 / 1568 / 32), 8 checks per set = 24, all passing, the stdlib selfcheck floor still green. NEVER sealed: the `vendors` string (it moves per host, top40_peer_review.py:183); the exact version strings are RECORDED blind in the artifact (expected to read OpenSSL 3.6.4 and liboqs 0.16.0 on the run host). Kill: a build failure or a failed check is an interop-regression finding; a DER-prefix slice that breaks on a parameter set is a parser finding.",
  "note_sha256": "60292a9d5c53e7b1fca12149289e2ce09642bef1510b9cfae86abd3b132409d1",
  "protocol": "pre-registered before the benchmark run. sha256 covers expected+tol; note_sha256 covers the prose. Neither proves ordering on its own -- the git commit of this file does, and git_blob_matches() is the anchor that makes an edit visible.",
  "sealed": true,
  "sha256": "e2e9adb141e1f8f4629fb903463c11d6a9836652e8b468e7360a2b926bd0fd1f",
  "tol": {}
}
