{
  "ok": true,
  "tool": "webftr-js8-real-wav-message174-regeneration",
  "tool_version": "step84-real-wav-status-surface-report-slim",
  "schema": "webftr-js8-real-wav-message174-regeneration-v1",
  "created_utc": "2026-05-28T03:56:08Z",
  "rx_only": true,
  "safety": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false,
    "webftr_productive_integration": false
  },
  "purpose": "Run a visible real-WAV regeneration chain from /decoders/js8_test.wav through candidate export, post-LDPC Info87, source-exact message174 CRC12 probe and guarded control-frame release.",
  "input_wav": "/decoders/js8_test.wav",
  "analysis_wav": "/decoders/js8_decoder/runtime/step83_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/step83_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/step83_quick_windows/js8_quick_selected_window.wav",
  "candidate_export_ok": true,
  "candidate_json": "/decoders/js8_decoder/runtime/step83_fec_candidates/js8_quick_selected_window_fec_candidate_step17.json",
  "runtime_info87_rows_count": 48,
  "post_ldpc_zero_distance_candidate_count": 0,
  "source_exact_zero_distance_candidate_count": 2,
  "message174_decode_count": 2,
  "message174_decodes_preview": [
    {
      "id": "js8-msg174-44978e4b",
      "mode": "JS8",
      "decoder": "webftr-js8lab-step64-message174-source-confirmed",
      "text": "001XqOA2iDZ0",
      "raw": "001XqOA2iDZ0",
      "message_text_12chars": "001XqOA2iDZ0",
      "valid_message174_crc12": true,
      "crc12_distance": 0,
      "received_crc12": 2920,
      "computed_crc12": 2920,
      "message_words_6bit": [
        0,
        0,
        1,
        33,
        52,
        24,
        10,
        2,
        44,
        13,
        35,
        0
      ],
      "alphabet": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+",
      "parsed": {
        "raw": "001XqOA2iDZ0",
        "normalized": "001XQOA2IDZ0",
        "message_type": "MESSAGE",
        "directed_to": null,
        "callsigns": [],
        "primary_callsign": null,
        "locators": [],
        "primary_locator": null,
        "body": "001XQOA2IDZ0"
      },
      "source": {
        "source_file": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
        "json_path": "$.top_llr_row_exports[0].hard_bits",
        "source_kind": "generic_bit_list",
        "row_index": 165,
        "map_name": "raw",
        "map_source": null
      },
      "confidence": "crc12_zero_distance_source_extractmessage174",
      "rx_only": true,
      "sort_index": 0
    },
    {
      "id": "js8-msg174-8368257f",
      "mode": "JS8",
      "decoder": "webftr-js8lab-step64-message174-source-confirmed",
      "text": "Q0VsKWqfJ96x",
      "raw": "Q0VsKWqfJ96x",
      "message_text_12chars": "Q0VsKWqfJ96x",
      "valid_message174_crc12": true,
      "crc12_distance": 0,
      "received_crc12": 980,
      "computed_crc12": 980,
      "message_words_6bit": [
        26,
        0,
        31,
        54,
        20,
        32,
        52,
        41,
        19,
        9,
        6,
        59
      ],
      "alphabet": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+",
      "parsed": {
        "raw": "Q0VsKWqfJ96x",
        "normalized": "Q0VSKWQFJ96X",
        "message_type": "MESSAGE",
        "directed_to": null,
        "callsigns": [],
        "primary_callsign": null,
        "locators": [],
        "primary_locator": null,
        "body": "Q0VSKWQFJ96X"
      },
      "source": {
        "source_file": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
        "json_path": "$.top_llr_row_exports[6].hard_bits",
        "source_kind": "generic_bit_list",
        "row_index": 171,
        "map_name": "raw",
        "map_source": null
      },
      "confidence": "crc12_zero_distance_source_extractmessage174",
      "rx_only": true,
      "sort_index": 1
    }
  ],
  "frame_probe_count": 2,
  "frame_type_counts": {
    "FrameHeartbeat": 1,
    "FrameDirected": 1
  },
  "control_frame_release_count": 2,
  "webftr_display_count": 2,
  "webftr_rx_rows_preview": [
    {
      "id": "js8-rx67-de15d3110b0d",
      "source_candidate_id": "js8-frame66-bf1ce62fdb4a",
      "source_decode_id": "js8-msg174-44978e4b",
      "mode": "JS8",
      "raw_message174": "001XqOA2iDZ0",
      "valid_message174_crc12": true,
      "crc12_distance": 0,
      "received_crc12": 2920,
      "computed_crc12": 2920,
      "frame_type": "FrameHeartbeat",
      "confidence": "high",
      "confidence_score": 6,
      "confidence_reasons": [
        "valid_heartbeat_callsign",
        "valid_heartbeat_grid"
      ],
      "show_in_rx_list": true,
      "candidate_class": "webftr_control_frame_display_ready",
      "release_guard": "step67_source_confirmed_fixed_control_frame_only",
      "sort_index": 0,
      "source": {
        "source_file": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
        "json_path": "$.top_llr_row_exports[0].hard_bits",
        "source_kind": "generic_bit_list",
        "row_index": 165,
        "map_name": "raw",
        "map_source": null
      },
      "status": "HB",
      "from": "004REY/0V4",
      "to": "@HB",
      "grid": "OJ16",
      "message": "HB 004REY/0V4 OJ16",
      "text": "HB 004REY/0V4 OJ16",
      "display_text": "HB 004REY/0V4 OJ16",
      "is_control_frame": true
    },
    {
      "id": "js8-rx67-bd37f68199eb",
      "source_candidate_id": "js8-frame66-66ab29ded46c",
      "source_decode_id": "js8-msg174-8368257f",
      "mode": "JS8",
      "raw_message174": "Q0VsKWqfJ96x",
      "valid_message174_crc12": true,
      "crc12_distance": 0,
      "received_crc12": 980,
      "computed_crc12": 980,
      "frame_type": "FrameDirected",
      "confidence": "high",
      "confidence_score": 10,
      "confidence_reasons": [
        "valid_directed_from",
        "valid_directed_to",
        "directed_command"
      ],
      "show_in_rx_list": true,
      "candidate_class": "webftr_control_frame_display_ready",
      "release_guard": "step67_source_confirmed_fixed_control_frame_only",
      "sort_index": 1,
      "source": {
        "source_file": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
        "json_path": "$.top_llr_row_exports[6].hard_bits",
        "source_kind": "generic_bit_list",
        "row_index": 171,
        "map_name": "raw",
        "map_source": null
      },
      "status": "INFO",
      "from": "9I2TZR/P",
      "to": "0Z0PMP",
      "command": "INFO",
      "extra": 59,
      "extra_value": {
        "kind": "number",
        "value": 28
      },
      "message": "INFO 28",
      "text": "9I2TZR/P 0Z0PMP INFO 28",
      "display_text": "9I2TZR/P 0Z0PMP INFO 28",
      "is_control_frame": true
    }
  ],
  "source_chain_ran_from_real_wav_this_step": true,
  "exit_codes": {
    "input_check": 0,
    "quick_window_scan": 0,
    "candidate_export": 0,
    "post_ldpc_info87_runtime_export": 0,
    "source_exact_map_probe": 0,
    "source_confirmed_message174_decode": 0,
    "source_varicode_frame_unpack_probe": 0,
    "source_confirmed_control_frame_rx_release": 0
  },
  "outputs": {
    "input_check_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_input_check_output.json",
    "quick_window_scan_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_quick_window_scan_output.json",
    "candidate_export_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_candidate_export_output.json",
    "post_ldpc_info87_runtime_export_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_post_ldpc_info87_runtime_export_output.json",
    "source_exact_map_probe_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
    "source_confirmed_message174_decode_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_confirmed_message174_decode_output.json",
    "source_varicode_frame_unpack_probe_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_varicode_frame_unpack_probe_output.json",
    "source_confirmed_control_frame_rx_release_json": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_confirmed_control_frame_rx_release_output.json"
  },
  "output_stats": {
    "input_check_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_input_check_output.json",
      "exists": true,
      "is_file": true,
      "size": 698,
      "mtime_utc": "2026-05-28T03:53:39Z"
    },
    "quick_window_scan_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_quick_window_scan_output.json",
      "exists": true,
      "is_file": true,
      "size": 8839,
      "mtime_utc": "2026-05-28T03:53:52Z"
    },
    "candidate_export_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_candidate_export_output.json",
      "exists": true,
      "is_file": true,
      "size": 99951,
      "mtime_utc": "2026-05-28T03:54:51Z"
    },
    "post_ldpc_info87_runtime_export_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_post_ldpc_info87_runtime_export_output.json",
      "exists": true,
      "is_file": true,
      "size": 106824,
      "mtime_utc": "2026-05-28T03:56:04Z"
    },
    "source_exact_map_probe_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_exact_map_probe_output.json",
      "exists": true,
      "is_file": true,
      "size": 143892,
      "mtime_utc": "2026-05-28T03:56:06Z"
    },
    "source_confirmed_message174_decode_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_confirmed_message174_decode_output.json",
      "exists": true,
      "is_file": true,
      "size": 6617,
      "mtime_utc": "2026-05-28T03:56:07Z"
    },
    "source_varicode_frame_unpack_probe_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_varicode_frame_unpack_probe_output.json",
      "exists": true,
      "is_file": true,
      "size": 60531,
      "mtime_utc": "2026-05-28T03:56:07Z"
    },
    "source_confirmed_control_frame_rx_release_json": {
      "path": "/decoders/js8_decoder/logs/20260528T035339Z_step83_source_confirmed_control_frame_rx_release_output.json",
      "exists": true,
      "is_file": true,
      "size": 9808,
      "mtime_utc": "2026-05-28T03:56:08Z"
    }
  },
  "verdict": "step83_wav_to_message174_regeneration_confirmed",
  "latest_previous_contracts": {
    "step82_real_wav_full_chain_regression": {
      "path": "/decoders/js8_decoder/logs/js8_real_wav_full_chain_regression_latest.json",
      "stat": {
        "path": "/decoders/js8_decoder/logs/js8_real_wav_full_chain_regression_latest.json",
        "exists": true,
        "is_file": true,
        "size": 46354,
        "mtime_utc": "2026-05-28T03:19:08Z"
      },
      "preview": {
        "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."
      }
    },
    "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"
      }
    }
  },
  "warnings": [
    "Quick-window-scan only selects a likely analysis window; it is not a JS8 text decoder.",
    "Step 54 JS8 Costas guard uses leading-only Costas exclusion by default to preserve 58 data symbols / 174 soft bits on JS8Lab windows; full FT8 middle/trailing exclusion remains diagnostic-only.",
    "Step 54 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
    "Step 54 prepares LDPC/FEC input candidates and an LDPC probe harness only; it does not yet run final real JS8 LDPC decode or unpack text.",
    "Step 54 does not decode JS8 text yet. It probes FT8-style Gray de-mapping, bit order and 174-bit interleaver candidates for real LDPC/FEC integration.",
    "lab_mask_xor_preview is only a repeatable diagnostic mask, not a confirmed JS8 whitening implementation.",
    "Step 54 locks candidate export to JS8-realistic timing and reuses the selected profile sync anchor for FEC symbol extraction where available.",
    "It still does not perform real LDPC/FEC decode or message unpack.",
    "Next step can tune real JS8/FT8 LDPC matrix/deinterleaver/message unpack against this anchored candidate contract.",
    "This is still a diagnostic runtime export, not a final JS8 text decoder.",
    "Step61 patches the runtime LDPC probes to expose post-LDPC info87 rows and source-index context for the next reorder/whitening alignment step.",
    "Step63 is still a diagnostic/source-extraction step, not a final text decoder.",
    "It starts no JS8Call GUI/Qt process and performs no TX/PTT/Tune/Send actions.",
    "Step64 emits source-confirmed message174 CRC12-zero-distance text candidates; it is not yet a full live JS8 decoder chain from audio to final chat UI.",
    "It starts no JS8Call GUI/Qt process and performs no TX/PTT/Tune/Send actions.",
    "Random-looking 12-character payloads can still be valid message174 candidates until higher JS8 text/Varicode framing is connected.",
    "Step66 is still RX-only diagnostics. It classifies message174 text as JS8 Varicode frame families but does not start JS8Call GUI/Qt.",
    "Rows remain hidden unless callsign/grid/command/text plausibility survives source-style frame unpacking.",
    "Compressed Data frames still require a later JSC::decompress port before real JS8 chat text can be displayed.",
    "Step67 is still RX-only and does not start JS8Call GUI/Qt.",
    "Only source-confirmed fixed control frames such as Heartbeat/Directed/Compound are released to webftr_rx_rows.",
    "Free-text Data/Compressed frames remain blocked until JSC::decompress and multi-frame assembly are source-ported and tested."
  ],
  "notes": [
    "Step84 intentionally keeps the default ./start.sh path on the real WAV and adds compact status/report surfaces instead of huge JSON previews.",
    "This remains RX-only and does not start or control JS8Call GUI/Qt runtime.",
    "Compressed/free-text release remains governed by the Step79 fixture gate; Step84 validates the real-WAV-to-message174/control-frame chain and makes the result easy to inspect."
  ],
  "next_action": "If Step84 confirms message174/control-frame regeneration from the real WAV, continue with either a wider real-WAV search for FrameDataCompressed or a real JS8Call/RF comparison fixture."
}
