{
  "ok": true,
  "tool": "webftr-js8-real-wav-full-chain-regression",
  "tool_version": "step82-real-wav-full-chain-regression",
  "schema": "webftr-js8-real-wav-full-chain-regression-v1",
  "created_utc": "2026-05-28T03:19:08Z",
  "rx_only": true,
  "safety": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false,
    "webftr_productive_integration": false
  },
  "purpose": "Make the default Step82 run visibly re-read the real JS8 WAV and perform the fast audio path before later source/JSC logic is considered.",
  "verdict": "step82_real_wav_regression_complete",
  "input_wav": "/decoders/js8_test.wav",
  "analysis_wav": "/decoders/js8_decoder/runtime/step82_quick_windows/js8_quick_selected_window.wav",
  "wav_was_read": true,
  "wav_duration_seconds": 192.016583,
  "quick_window_selected": true,
  "selected_window": {
    "start_seconds": 18.0,
    "end_seconds": 78.0,
    "duration_seconds": 60.0,
    "avg_activity_score": -6.286,
    "active_chunks": 10,
    "chunk_count": 10,
    "selection_score": 18.714,
    "window_wav": "/decoders/js8_decoder/runtime/step82_quick_windows/js8_quick_selected_window.wav",
    "tone_candidates": [
      {
        "freq_hz": 1000.0,
        "relative_db": 0.0,
        "power": 15.76347305
      },
      {
        "freq_hz": 1025.0,
        "relative_db": -0.8,
        "power": 13.10923242
      },
      {
        "freq_hz": 2025.0,
        "relative_db": -14.3,
        "power": 0.58516574
      },
      {
        "freq_hz": 975.0,
        "relative_db": -16.4,
        "power": 0.3608126
      },
      {
        "freq_hz": 1050.0,
        "relative_db": -29.42,
        "power": 0.01801849
      },
      {
        "freq_hz": 1525.0,
        "relative_db": -32.35,
        "power": 0.00916685
      },
      {
        "freq_hz": 1825.0,
        "relative_db": -32.46,
        "power": 0.00893784
      },
      {
        "freq_hz": 1925.0,
        "relative_db": -34.06,
        "power": 0.00619164
      },
      {
        "freq_hz": 1650.0,
        "relative_db": -34.23,
        "power": 0.0059545
      },
      {
        "freq_hz": 2575.0,
        "relative_db": -34.47,
        "power": 0.00562689
      },
      {
        "freq_hz": 1625.0,
        "relative_db": -34.8,
        "power": 0.00521457
      },
      {
        "freq_hz": 950.0,
        "relative_db": -35.04,
        "power": 0.00494236
      }
    ]
  },
  "selected_window_wav": "/decoders/js8_decoder/runtime/step82_quick_windows/js8_quick_selected_window.wav",
  "sync_candidate_count": 12,
  "best_sync_candidate": {
    "ok": true,
    "start_sample": 376164,
    "start_seconds": 31.347,
    "base_freq_hz": 1000.0,
    "tone_spacing_hz": 1.937984,
    "nsps": 6192,
    "costas_pattern": [
      3,
      1,
      4,
      0,
      6,
      5,
      2
    ],
    "costas_hits": 2,
    "costas_symbols": 7,
    "avg_margin_db": 2.4,
    "energy_score_db": 5.26,
    "candidate_score": 27.66,
    "symbols": [
      {
        "symbol": 0,
        "expected_tone": 3,
        "strongest_tone": 3,
        "expected_is_strongest": true,
        "expected_power": 173.3098525436,
        "median_other_power": 4.0136394344,
        "margin_db": 16.35,
        "tone_powers": [
          15.9425535414,
          16.7064438607,
          3.6144531567,
          173.3098525436,
          95.4717245231,
          2.9193626913,
          4.0136394344,
          0.1693303583
        ]
      },
      {
        "symbol": 1,
        "expected_tone": 1,
        "strongest_tone": 3,
        "expected_is_strongest": false,
        "expected_power": 28.1803520794,
        "median_other_power": 18.8050880779,
        "margin_db": 1.76,
        "tone_powers": [
          20.9762208024,
          28.1803520794,
          5.7419781066,
          71.0558343619,
          24.7557112336,
          18.8050880779,
          2.0989356467,
          0.2430214014
        ]
      },
      {
        "symbol": 2,
        "expected_tone": 4,
        "strongest_tone": 2,
        "expected_is_strongest": false,
        "expected_power": 71.6248687943,
        "median_other_power": 38.8187957059,
        "margin_db": 2.66,
        "tone_powers": [
          38.8187957059,
          45.4486252133,
          72.3087962275,
          34.7312575895,
          71.6248687943,
          1.77870258,
          40.2071552171,
          29.3427085469
        ]
      },
      {
        "symbol": 3,
        "expected_tone": 0,
        "strongest_tone": 7,
        "expected_is_strongest": false,
        "expected_power": 0.2622539501,
        "median_other_power": 6.4065684994,
        "margin_db": -13.88,
        "tone_powers": [
          0.2622539501,
          5.3123464342,
          6.4065684994,
          0.0185561141,
          4.0123103831,
          16.6485585208,
          30.7318605032,
          45.2413496556
        ]
      },
      {
        "symbol": 4,
        "expected_tone": 6,
        "strongest_tone": 2,
        "expected_is_strongest": false,
        "expected_power": 5.0109164476,
        "median_other_power": 4.7646757363,
        "margin_db": 0.22,
        "tone_powers": [
          4.0082543216,
          2.6972288443,
          7.2574165131,
          5.6821055182,
          4.7646757363,
          6.2751230304,
          5.0109164476,
          3.9892771877
        ]
      },
      {
        "symbol": 5,
        "expected_tone": 5,
        "strongest_tone": 6,
        "expected_is_strongest": false,
        "expected_power": 16.3535460217,
        "median_other_power": 3.8125993628,
        "margin_db": 6.32,
        "tone_powers": [
          3.255794393,
          3.8125993628,
          0.106178069,
          3.3903884596,
          10.6058363401,
          16.3535460217,
          21.3440985425,
          20.457437264
        ]
      },
      {
        "symbol": 6,
        "expected_tone": 2,
        "strongest_tone": 2,
        "expected_is_strongest": true,
        "expected_power": 69.0973179158,
        "median_other_power": 31.8068413839,
        "margin_db": 3.37,
        "tone_powers": [
          46.9814165652,
          31.8068413839,
          69.0973179158,
          32.7987510886,
          39.5558795637,
          8.4831093131,
          1.3130524868,
          0.2201954402
        ]
      }
    ],
    "symbol_preview": [
      {
        "symbol": 0,
        "tone_index": 3,
        "confidence_db": 2.59,
        "powers": [
          15.9425535414,
          16.7064438607,
          3.6144531567,
          173.3098525436,
          95.4717245231,
          2.9193626913,
          4.0136394344,
          0.1693303583
        ]
      },
      {
        "symbol": 1,
        "tone_index": 3,
        "confidence_db": 4.02,
        "powers": [
          20.9762208024,
          28.1803520794,
          5.7419781066,
          71.0558343619,
          24.7557112336,
          18.8050880779,
          2.0989356467,
          0.2430214014
        ]
      },
      {
        "symbol": 2,
        "tone_index": 2,
        "confidence_db": 0.04,
        "powers": [
          38.8187957059,
          45.4486252133,
          72.3087962275,
          34.7312575895,
          71.6248687943,
          1.77870258,
          40.2071552171,
          29.3427085469
        ]
      },
      {
        "symbol": 3,
        "tone_index": 7,
        "confidence_db": 1.68,
        "powers": [
          0.2622539501,
          5.3123464342,
          6.4065684994,
          0.0185561141,
          4.0123103831,
          16.6485585208,
          30.7318605032,
          45.2413496556
        ]
      },
      {
        "symbol": 4,
        "tone_index": 2,
        "confidence_db": 0.63,
        "powers": [
          4.0082543216,
          2.6972288443,
          7.2574165131,
          5.6821055182,
          4.7646757363,
          6.2751230304,
          5.0109164476,
          3.9892771877
        ]
      },
      {
        "symbol": 5,
        "tone_index": 6,
        "confidence_db": 0.18,
        "powers": [
          3.255794393,
          3.8125993628,
          0.106178069,
          3.3903884596,
          10.6058363401,
          16.3535460217,
          21.3440985425,
          20.457437264
        ]
      },
      {
        "symbol": 6,
        "tone_index": 2,
        "confidence_db": 1.68,
        "powers": [
          46.9814165652,
          31.8068413839,
          69.0973179158,
          32.7987510886,
          39.5558795637,
          8.4831093131,
          1.3130524868,
          0.2201954402
        ]
      },
      {
        "symbol": 7,
        "tone_index": 6,
        "confidence_db": 0.36,
        "powers": [
          0.0629283536,
          3.0124650248,
          2.468160732,
          0.2225482449,
          4.4643187524,
          18.5556593714,
          38.6239050934,
          35.5384115811
        ]
      },
      {
        "symbol": 8,
        "tone_index": 0,
        "confidence_db": 3.58,
        "powers": [
          51.7003137421,
          22.6654786526,
          10.2647749623,
          0.7338068813,
          0.5959166114,
          1.0856570407,
          0.5900548002,
          0.2839134732
        ]
      },
      {
        "symbol": 9,
        "tone_index": 3,
        "confidence_db": 1.07,
        "powers": [
          1.4796655515,
          12.1054506125,
          33.4390522719,
          42.7952693524,
          29.2713114212,
          13.1339502314,
          0.838227994,
          0.3977469966
        ]
      },
      {
        "symbol": 10,
        "tone_index": 0,
        "confidence_db": 7.05,
        "powers": [
          3.8021340128,
          0.7507762707,
          0.2978649112,
          0.0865288349,
          0.4188550056,
          0.3510137616,
          0.3321666239,
          0.0771960487
        ]
      },
      {
        "symbol": 11,
        "tone_index": 6,
        "confidence_db": 0.3,
        "powers": [
          0.0210093782,
          1.5143422975,
          3.7724887739,
          0.4083904831,
          3.7523006972,
          24.1449148934,
          40.0439871543,
          37.3772424523
        ]
      },
      {
        "symbol": 12,
        "tone_index": 6,
        "confidence_db": 0.41,
        "powers": [
          0.0109343582,
          1.9233440029,
          2.579563716,
          0.2904271254,
          4.0535156863,
          21.1102304339,
          41.820006292,
          38.0891239855
        ]
      },
      {
        "symbol": 13,
        "tone_index": 5,
        "confidence_db": 1.02,
        "powers": [
          0.172114006,
          0.1445949201,
          0.1822446788,
          0.1639477524,
          0.157369185,
          0.2304836028,
          0.149017709,
          0.1303750464
        ]
      },
      {
        "symbol": 14,
        "tone_index": 1,
        "confidence_db": 2.25,
        "powers": [
          0.158294336,
          0.8024176986,
          0.4774565415,
          0.171771953,
          0.3435910183,
          0.2150891283,
          0.0664453529,
          0.0117068462
        ]
      },
      {
        "symbol": 15,
        "tone_index": 0,
        "confidence_db": 2.82,
        "powers": [
          0.9429973402,
          0.2194876093,
          0.4927987108,
          0.296484266,
          0.2724135549,
          0.3059153636,
          0.1171919035,
          0.2277210294
        ]
      },
      {
        "symbol": 16,
        "tone_index": 2,
        "confidence_db": 1.05,
        "powers": [
          0.9886947642,
          15.2533994562,
          46.4017479022,
          36.4288409122,
          33.5023068387,
          4.1614953364,
          1.6047486967,
          1.5781366508
        ]
      },
      {
        "symbol": 17,
        "tone_index": 2,
        "confidence_db": 0.29,
        "powers": [
          38.0082486891,
          50.2272680621,
          53.7458997861,
          39.5879636035,
          28.3147057357,
          5.5691491742,
          0.8237785114,
          0.9557250636
        ]
      },
      {
        "symbol": 18,
        "tone_index": 1,
        "confidence_db": 1.57,
        "powers": [
          0.0918783675,
          0.307797933,
          0.1050100761,
          0.0141874336,
          0.1515434304,
          0.2145300217,
          0.1105823567,
          0.0880243845
        ]
      },
      {
        "symbol": 19,
        "tone_index": 6,
        "confidence_db": 0.74,
        "powers": [
          0.0868825702,
          0.0397866232,
          0.1686785232,
          0.0927654971,
          0.0154835097,
          0.1791772439,
          0.2125035654,
          0.0792307676
        ]
      },
      {
        "symbol": 20,
        "tone_index": 6,
        "confidence_db": 0.24,
        "powers": [
          0.0086936555,
          0.0628387052,
          0.0498876206,
          0.0421193635,
          0.1264136464,
          0.1308918823,
          0.1449241888,
          0.1370848814
        ]
      },
      {
        "symbol": 21,
        "tone_index": 5,
        "confidence_db": 0.26,
        "powers": [
          0.0039904011,
          0.0008005547,
          0.0273221681,
          0.0195367608,
          0.0129234533,
          0.0325339455,
          0.0306277596,
          0.0214755839
        ]
      },
      {
        "symbol": 22,
        "tone_index": 6,
        "confidence_db": 2.65,
        "powers": [
          0.1788142554,
          0.4853471741,
          0.2694809704,
          0.4544718388,
          0.6492196999,
          0.3152692631,
          1.1938135494,
          0.4456102593
        ]
      },
      {
        "symbol": 23,
        "tone_index": 1,
        "confidence_db": 5.18,
        "powers": [
          0.181050027,
          1.6778984579,
          0.4701928836,
          0.307478218,
          0.1431618802,
          0.5094538581,
          0.0631630623,
          0.0575143534
        ]
      },
      {
        "symbol": 24,
        "tone_index": 1,
        "confidence_db": 1.35,
        "powers": [
          33.2015442878,
          62.2968777169,
          43.8426328549,
          45.6891069921,
          19.6205599411,
          5.8107647037,
          0.0185971127,
          0.6717585263
        ]
      },
      {
        "symbol": 25,
        "tone_index": 4,
        "confidence_db": 0.16,
        "powers": [
          2.5571353043,
          3.8143679082,
          2.4766498838,
          3.4608756257,
          3.9561522002,
          2.7219017493,
          2.8968871756,
          2.4777395482
        ]
      }
    ]
  },
  "exit_codes": {
    "input_check": 0,
    "quick_window_scan": 0,
    "sync_probe": 0
  },
  "outputs": {
    "input_check_json": "/decoders/js8_decoder/logs/20260528T031839Z_step82_input_check_output.json",
    "quick_window_scan_json": "/decoders/js8_decoder/logs/20260528T031839Z_step82_quick_window_scan_output.json",
    "sync_probe_json": "/decoders/js8_decoder/logs/20260528T031839Z_step82_sync_probe_output.json"
  },
  "output_stats": {
    "input_check_json": {
      "path": "/decoders/js8_decoder/logs/20260528T031839Z_step82_input_check_output.json",
      "exists": true,
      "is_file": true,
      "size": 698,
      "mtime_utc": "2026-05-28T03:18:39Z"
    },
    "quick_window_scan_json": {
      "path": "/decoders/js8_decoder/logs/20260528T031839Z_step82_quick_window_scan_output.json",
      "exists": true,
      "is_file": true,
      "size": 8839,
      "mtime_utc": "2026-05-28T03:18:52Z"
    },
    "sync_probe_json": {
      "path": "/decoders/js8_decoder/logs/20260528T031839Z_step82_sync_probe_output.json",
      "exists": true,
      "is_file": true,
      "size": 60947,
      "mtime_utc": "2026-05-28T03:19:07Z"
    },
    "selected_window_wav": {
      "path": "/decoders/js8_decoder/runtime/step82_quick_windows/js8_quick_selected_window.wav",
      "exists": true,
      "is_file": true,
      "size": 1440044,
      "mtime_utc": "2026-05-28T03:18:40Z"
    }
  },
  "latest_previous_contracts": {
    "step68_webftr_rx_ui_contract": {
      "path": "/decoders/js8_decoder/logs/js8_webftr_rx_ui_contract_latest.json",
      "stat": {
        "path": "/decoders/js8_decoder/logs/js8_webftr_rx_ui_contract_latest.json",
        "exists": true,
        "is_file": true,
        "size": 5935,
        "mtime_utc": "2026-05-27T18:16:44Z"
      },
      "preview": {
        "ok": true,
        "tool": "webftr-js8-webftr-rx-ui-contract-export",
        "tool_version": "step69-jsc-decompress-source-audit-probe",
        "schema": "webftr-js8-rx-ui-contract-v1",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false,
          "webftr_productive_integration": false
        },
        "no_gui_runtime_started": true,
        "root": "/decoders/js8_decoder",
        "log_dir": "/decoders/js8_decoder/logs",
        "input_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
            "exists": true,
            "selected_latest_step67": true,
            "webftr_display_count": 2
          }
        ],
        "source_step67_version": "step67-source-confirmed-control-frame-rx-release",
        "source_webftr_display_count": 2,
        "source_hidden_candidate_count": 0,
        "webftr_rx_ui_count": 2,
        "webftr_rx_rows": [
          {
            "id": "js8-ui68-80c34aaa298675",
            "source_row_id": "js8-rx67-de15d3110b0d",
            "mode": "JS8",
            "protocol": "JS8",
            "decoder": "JS8Lab Step68 guarded control-frame contract",
            "row_type": "control_frame",
            "frame_type": "FrameHeartbeat",
            "status": "HB",
            "from": "004REY/0V4",
            "to": "@HB",
            "grid": "OJ16",
            "command": "HB",
            "message": "HB 004REY/0V4 OJ16",
            "text": "HB 004REY/0V4 OJ16",
            "display_text": "HB 004REY/0V4 OJ16",
            "raw_message174": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "confidence": "high",
            "confidence_score": 6,
            "confidence_reasons": [
              "valid_heartbeat_callsign",
              "valid_heartbeat_grid"
            ],
            "show_in_rx_list": true,
            "ui_badge": "HB",
            "ui_title": "HB 004REY/0V4 OJ16",
            "ui_subtitle": "004REY/0V4 → @HB OJ16",
            "sort_index": 0,
            "rx_only": true,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260527T150600Z_source_exact_map_probe_output.json",
              "json_path": "$.best_candidate.candidate_bits",
              "source_kind": "generic_bit_list",
              "row_index": 237,
              "map_name": "raw",
              "map_source": null
            },
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "candidate_class": "webftr_control_frame_display_ready"
          },
          {
            "id": "js8-ui68-50f4e1e7052c17",
            "source_row_id": "js8-rx67-bd37f68199eb",
            "mode": "JS8",
            "protocol": "JS8",
            "decoder": "JS8Lab Step68 guarded control-frame contract",
            "row_type": "control_frame",
            "frame_type": "FrameDirected",
            "status": "INFO",
            "from": "9I2TZR/P",
            "to": "0Z0PMP",
            "grid": "",
            "command": "INFO",
            "message": "INFO 28",
            "text": "9I2TZR/P 0Z0PMP INFO 28",
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "raw_message174": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "confidence": "high",
            "confidence_score": 10,
            "confidence_reasons": [
              "valid_directed_from",
              "valid_directed_to",
              "directed_command"
            ],
            "show_in_rx_list": true,
            "ui_badge": "INFO",
            "ui_title": "9I2TZR/P 0Z0PMP INFO 28",
            "ui_subtitle": "9I2TZR/P → 0Z0PMP",
            "sort_index": 1,
            "rx_only": true,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260527T150600Z_source_exact_map_probe_output.json",
              "json_path": "$.top_llr_row_exports[6].hard_bits",
              "source_kind": "generic_bit_list",
              "row_index": 82,
              "map_name": "raw",
              "map_source": null
            },
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "candidate_class": "webftr_control_frame_display_ready"
          }
        ],
        "ui_contract": {
          "polling_target": "logs/js8_webftr_rx_ui_contract_latest.json",
          "rows_key": "webftr_rx_rows",
          "display_fields": [
            "mode",
            "status",
            "from",
            "to",
            "grid",
            "message",
            "display_text",
            "confidence"
          ],
          "dedupe_key": "id",
          "sort_key": "sort_index",
          "current_scope": "source-confirmed fixed JS8 control frames only",
          "blocked_scope": "FrameData and FrameDataCompressed remain excluded until JSC::decompress and multi-frame assembly are source-ported."
        },
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "suggested_module": "JS8 RX preview / diagnostics panel",
          "do_not_merge_as_chat_text_yet": true,
          "note": "This contract is stable enough for WebFTR display experiments, but it is still diagnostic and control-frame-only."
        },
        "suppressed_candidates": [],
        "source_release_decisions": [
          {
            "source_candidate_id": "js8-frame66-bf1ce62fdb4a",
            "raw_message174": "001XqOA2iDZ0",
            "frame_type": "FrameHeartbeat",
            "decision": "released_source_confirmed_control_frame",
            "sort_index": 0,
            "released_row_id": "js8-rx67-de15d3110b0d"
          },
          {
            "source_candidate_id": "js8-frame66-66ab29ded46c",
            "raw_message174": "Q0VsKWqfJ96x",
            "frame_type": "FrameDirected",
            "decision": "released_source_confirmed_control_frame",
            "sort_index": 1,
            "released_row_id": "js8-rx67-bd37f68199eb"
          }
        ],
        "verdict": "webftr_rx_ui_contract_ready_control_frames_only",
        "warnings": [
          "Step68 remains RX-only and does not start JS8Call GUI/Qt.",
          "Only Step67 source-confirmed fixed control frames are exported for UI display.",
          "Normal JS8 free text still needs JSC::decompress and multi-frame assembly before productive display."
        ],
        "next_action": "Use this contract as a read-only WebFTR JS8 RX preview source; next research step is source-porting JSC::decompress/multi-frame assembly for free text."
      }
    },
    "step79_compressed_text_release_gate": {
      "path": "/decoders/js8_decoder/logs/js8_compressed_text_release_gate_latest.json",
      "stat": {
        "path": "/decoders/js8_decoder/logs/js8_compressed_text_release_gate_latest.json",
        "exists": true,
        "is_file": true,
        "size": 3100,
        "mtime_utc": "2026-05-28T02:49:01Z"
      },
      "preview": {
        "ok": true,
        "tool": "webftr-js8-real-compressed-text-release-gate",
        "tool_version": "step79-real-compressed-text-release-gate",
        "schema": "webftr-js8-real-compressed-text-release-gate-v1",
        "created_utc": "2026-05-28T02:49:00Z",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false,
          "webftr_productive_integration": false
        },
        "no_gui_runtime_started": true,
        "root": "/decoders/js8_decoder",
        "log_dir": "/decoders/js8_decoder/logs",
        "state": "waiting_for_real_external_compressed_fixture",
        "step78_state": "operator_commands_ready_waiting_for_real_fixture",
        "step74_verdict": "fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture",
        "external_fixture_count": 0,
        "external_fixture_pass_count": 0,
        "external_source_comparison_pass_count": 0,
        "synthetic_selftest_all_passed": true,
        "jsc_entry_count": 200000,
        "allow_experimental_lab_display": false,
        "release_candidate_count": 0,
        "release_candidate_rows": [],
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "step68_contract_remains_current_stable_ui_source": true,
          "compressed_text_latest": "/logs/js8_compressed_text_release_gate_latest.json",
          "do_not_merge_as_productive_chat_text_yet": true,
          "lab_display_requires_flag": "JS8LAB_ALLOW_EXPERIMENTAL_COMPRESSED_TEXT_RELEASE=1"
        },
        "release_gate_policy": {
          "requires_external_source_comparison": true,
          "requires_expected_text_match": true,
          "requires_jsc_complete": true,
          "releases_only_single_frame_FrameDataCompressed": true,
          "multi_frame_assembly_validated": false,
          "productive_webftr_integration_allowed": false,
          "tx_ptt_tune_send_allowed": false
        },
        "helper_files": {
          "step78_readme": "/decoders/js8_decoder/runtime/fixtures/README_STEP78_REAL_FIXTURE_COMMAND_EXPORT.md",
          "step78_print_helper": "/decoders/js8_decoder/runtime/fixtures/step78_print_fixture_commands.sh",
          "target_fixture_file": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
          "step74_gate_latest": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_gate_latest.json",
          "step78_command_latest": "/decoders/js8_decoder/logs/js8_real_fixture_command_export_latest.json"
        },
        "warnings": [
          "Step79 is a release gate, not productive WebFTR integration.",
          "Without a real externally confirmed compressed fixture, no compressed JS8 text is released.",
          "Even with a validated fixture, lab display rows require an explicit flag and multi-frame assembly remains unvalidated.",
          "RX-only safety remains enforced: no JS8Call runtime control and no TX/PTT/Tune/Send."
        ],
        "verdict": "release_gate_ready_but_waiting_for_external_fixture",
        "next_action": "Import one externally confirmed compressed FrameDataCompressed fixture using the Step78/76 helpers, then rerun Step79.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_compressed_text_release_gate_latest.json"
      }
    },
    "step81_jsc_cpp_reference_compare": {
      "path": "/decoders/js8_decoder/logs/js8_jsc_cpp_reference_compare_latest.json",
      "stat": {
        "path": "/decoders/js8_decoder/logs/js8_jsc_cpp_reference_compare_latest.json",
        "exists": true,
        "is_file": true,
        "size": 14399,
        "mtime_utc": "2026-05-28T03:07:38Z"
      },
      "preview": {
        "ok": true,
        "tool": "webftr-js8-jsc-cpp-reference-map-transport-fix",
        "tool_version": "step81-jsc-cpp-reference-map-transport-fix",
        "schema": "webftr-js8-jsc-cpp-reference-map-transport-fix-v1",
        "created_utc": "2026-05-28T03:07:38Z",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false,
          "webftr_productive_integration": false
        },
        "no_gui_runtime_started": true,
        "root": "/decoders/js8_decoder",
        "log_dir": "/decoders/js8_decoder/logs",
        "state": "cpp_reference_compare_passed_waiting_for_real_fixture",
        "source_resolution": {
          "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
          "source_found": true,
          "checked": [
            {
              "path": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
              "exists": true,
              "is_dir": true
            }
          ]
        },
        "jsc_map": {
          "ok": true,
          "source_file": "JS8_JSC/JSC_map.cpp",
          "entry_count": 200000,
          "declared_size": 262144,
          "declared_size_matches": false,
          "map_fingerprint_sha256": "edbc4c529a809c0e900f2ad443aefe6cca271f1f6df52f6e651b4997b3d4d949",
          "sample_entries": [
            "E",
            "T",
            "A",
            "O",
            "I",
            "N",
            "S",
            "H",
            "R",
            "D",
            "L",
            "C",
            "U",
            "M",
            "W",
            "F",
            "G",
            "Y",
            "P",
            "B"
          ],
          "attempts": [
            {
              "path": "JS8_JSC/JSC_map.cpp",
              "bytes": 7082880,
              "sha256": "ab2bd62ef594f4629a2c93b6de43f5469b1fd6fe67ebf4d24f915bd11ccef813",
              "declared_size": 262144,
              "parsed_entry_count": 200000,
              "sample": [
                "E",
                "T",
                "A",
                "O",
                "I",
                "N",
                "S",
                "H",
                "R",
                "D",
                "L",
                "C"
              ]
            }
          ]
        },
        "cpp_reference_harness": {
          "work_dir": "/decoders/js8_decoder/runtime/jsc_cpp_reference_step81",
          "map_transport": "hex-lines-utf8-v1",
          "available": true,
          "compiled": true,
          "ran": true,
          "reason": null,
          "returncode": 0,
          "stderr_tail": ""
        },
        "comparison": {
          "fixture_count": 36,
          "pass_count": 36,
          "all_passed": true,
          "rows": [
            {
              "index": 121,
              "word": "CQ",
              "separate": false,
              "bits": "0111111000100",
              "python_text": "CQ",
              "cpp_text": "CQ",
              "expected_text": "CQ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 121,
              "word": "CQ",
              "separate": true,
              "bits": "0111111000101",
              "python_text": "CQ ",
              "cpp_text": "CQ ",
              "expected_text": "CQ ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 240,
              "word": "TEST",
              "separate": false,
              "bits": "1001110100100",
              "python_text": "TEST",
              "cpp_text": "TEST",
              "expected_text": "TEST",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 240,
              "word": "TEST",
              "separate": true,
              "bits": "1001110100101",
              "python_text": "TEST ",
              "cpp_text": "TEST ",
              "expected_text": "TEST ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 6571,
              "word": "HELLO",
              "separate": false,
              "bits": "011110001011100001010",
              "python_text": "HELLO",
              "cpp_text": "HELLO",
              "expected_text": "HELLO",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 6571,
              "word": "HELLO",
              "separate": true,
              "bits": "011110001011100001011",
              "python_text": "HELLO ",
              "cpp_text": "HELLO ",
              "expected_text": "HELLO ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 125,
              "word": "DE",
              "separate": false,
              "bits": "0111111001100",
              "python_text": "DE",
              "cpp_text": "DE",
              "expected_text": "DE",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 125,
              "word": "DE",
              "separate": true,
              "bits": "0111111001101",
              "python_text": "DE ",
              "cpp_text": "DE ",
              "expected_text": "DE ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 0,
              "word": "E",
              "separate": false,
              "bits": "00000",
              "python_text": "E",
              "cpp_text": "E",
              "expected_text": "E",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 0,
              "word": "E",
              "separate": true,
              "bits": "00001",
              "python_text": "E ",
              "cpp_text": "E ",
              "expected_text": "E ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 1,
              "word": "T",
              "separate": false,
              "bits": "00010",
              "python_text": "T",
              "cpp_text": "T",
              "expected_text": "T",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 1,
              "word": "T",
              "separate": true,
              "bits": "00011",
              "python_text": "T ",
              "cpp_text": "T ",
              "expected_text": "T ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 2,
              "word": "A",
              "separate": false,
              "bits": "00100",
              "python_text": "A",
              "cpp_text": "A",
              "expected_text": "A",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 2,
              "word": "A",
              "separate": true,
              "bits": "00101",
              "python_text": "A ",
              "cpp_text": "A ",
              "expected_text": "A ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 67,
              "word": " ",
              "separate": false,
              "bits": "111101000",
              "python_text": " ",
              "cpp_text": " ",
              "expected_text": " ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 67,
              "word": " ",
              "separate": true,
              "bits": "111101001",
              "python_text": "  ",
              "cpp_text": "  ",
              "expected_text": "  ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 3,
              "word": "O",
              "separate": false,
              "bits": "00110",
              "python_text": "O",
              "cpp_text": "O",
              "expected_text": "O",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 3,
              "word": "O",
              "separate": true,
              "bits": "00111",
              "python_text": "O ",
              "cpp_text": "O ",
              "expected_text": "O ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 6,
              "word": "S",
              "separate": false,
              "bits": "01100",
              "python_text": "S",
              "cpp_text": "S",
              "expected_text": "S",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 6,
              "word": "S",
              "separate": true,
              "bits": "01101",
              "python_text": "S ",
              "cpp_text": "S ",
              "expected_text": "S ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 7,
              "word": "H",
              "separate": false,
              "bits": "011100000",
              "python_text": "H",
              "cpp_text": "H",
              "expected_text": "H",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 7,
              "word": "H",
              "separate": true,
              "bits": "011100001",
              "python_text": "H ",
              "cpp_text": "H ",
              "expected_text": "H ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 8,
              "word": "R",
              "separate": false,
              "bits": "011100010",
              "python_text": "R",
              "cpp_text": "R",
              "expected_text": "R",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 8,
              "word": "R",
              "separate": true,
              "bits": "011100011",
              "python_text": "R ",
              "cpp_text": "R ",
              "expected_text": "R ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 15,
              "word": "F",
              "separate": false,
              "bits": "100000010",
              "python_text": "F",
              "cpp_text": "F",
              "expected_text": "F",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 15,
              "word": "F",
              "separate": true,
              "bits": "100000011",
              "python_text": "F ",
              "cpp_text": "F ",
              "expected_text": "F ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 31,
              "word": ")",
              "separate": false,
              "bits": "101000110",
              "python_text": ")",
              "cpp_text": ")",
              "expected_text": ")",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 31,
              "word": ")",
              "separate": true,
              "bits": "101000111",
              "python_text": ") ",
              "cpp_text": ") ",
              "expected_text": ") ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 100,
              "word": "BD",
              "separate": false,
              "bits": "0111101100100",
              "python_text": "BD",
              "cpp_text": "BD",
              "expected_text": "BD",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 100,
              "word": "BD",
              "separate": true,
              "bits": "0111101100101",
              "python_text": "BD ",
              "cpp_text": "BD ",
              "expected_text": "BD ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 1000,
              "word": "TNU",
              "separate": false,
              "bits": "01111100110101100",
              "python_text": "TNU",
              "cpp_text": "TNU",
              "expected_text": "TNU",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 1000,
              "word": "TNU",
              "separate": true,
              "bits": "01111100110101101",
              "python_text": "TNU ",
              "cpp_text": "TNU ",
              "expected_text": "TNU ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 12345,
              "word": "EB33",
              "separate": false,
              "bits": "100010011100111001000",
              "python_text": "EB33",
              "cpp_text": "EB33",
              "expected_text": "EB33",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 12345,
              "word": "EB33",
              "separate": true,
              "bits": "100010011100111001001",
              "python_text": "EB33 ",
              "cpp_text": "EB33 ",
              "expected_text": "EB33 ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 199999,
              "word": "LSYR",
              "separate": false,
              "bits": "1010100101111100101100100",
              "python_text": "LSYR",
              "cpp_text": "LSYR",
              "expected_text": "LSYR",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            },
            {
              "index": 199999,
              "word": "LSYR",
              "separate": true,
              "bits": "1010100101111100101100101",
              "python_text": "LSYR ",
              "cpp_text": "LSYR ",
              "expected_text": "LSYR ",
              "python_complete": true,
              "cpp_complete": true,
              "passes": true
            }
          ]
        },
        "release_gate_status": {
          "compressed_text_release_allowed": false,
          "productive_webftr_integration_allowed": false,
          "step79_release_gate_still_required": true,
          "external_fixture_still_required": true,
          "multi_frame_assembly_validated": false
        },
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "step68_contract_remains_current_stable_ui_source": true,
          "cpp_reference_latest": "/logs/js8_jsc_cpp_reference_compare_latest.json",
          "do_not_merge_as_productive_chat_text_yet": true
        },
        "warnings": [
          "Step81 compares the Python JSC decompressor against an independent C++ harness using the source-extracted JSC map with a hex length-safe map transport.",
          "It still does not prove a real RF/JS8Call FrameDataCompressed text fixture.",
          "Compressed JS8 free-text release remains blocked until Step79 sees an externally confirmed fixture.",
          "RX-only safety remains enforced: no JS8Call runtime control and no TX/PTT/Tune/Send."
        ],
        "map_transport_fix": {
          "previous_step80_issue": "line-delimited-map-transport-corrupted-words-with-embedded-newlines-or-control-bytes",
          "current_transport": "hex-lines-utf8-v1",
          "purpose": "keep Python and C++ harness map indices byte-identical"
        },
        "verdict": "step81_cpp_reference_compare_passed_waiting_for_real_external_fixture",
        "next_action": "Import one externally confirmed compressed FrameDataCompressed fixture, then rerun Step79/Step81 before any lab text release.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_cpp_reference_compare_latest.json"
      }
    }
  },
  "source_chain_mode": "not_run",
  "warnings": [
    "Quick-window-scan only selects a likely analysis window; it is not a JS8 text decoder.",
    "No JS8 text decode is expected in Step 54. Final real LDPC/FEC and Varicode/message unpack are not implemented yet.",
    "Costas7 scoring is a lab candidate extractor; real decoder validation requires actual JS8 WAV samples."
  ],
  "decodes": [],
  "webftr_display_count": 0,
  "notes": [
    "Step82 is a real-WAV regression gate, not a chat text release.",
    "A fast run is expected because only input-check, quick-window-scan and bounded sync-probe are mandatory by default.",
    "For deeper audio-to-LDPC regeneration use server-deep-run or real-run manually; Step82 keeps the normal ./start.sh cycle lightweight."
  ],
  "next_action": "If Step82 confirms the WAV path and sync candidates, continue with a bounded full audio-to-message174 regeneration step before any new Freitext release work."
}
