{
  "schema": "webftr-js8-decoder-lab-browser-report-v1",
  "version": "step76-real-compressed-fixture-intake-helper",
  "created_utc": "2026-05-27T23:11:44Z",
  "project": "WebFTR JS8 Decoder Lab",
  "root": "/decoders/js8_decoder",
  "expected_root": "/decoders/js8_decoder",
  "logs_dir": "/decoders/js8_decoder/logs",
  "runtime_dir": "/decoders/js8_decoder/runtime",
  "daemon_status": {
    "schema": "webftr-js8lab-daemon-status-v2",
    "version": "step76-real-compressed-fixture-intake-helper",
    "created_utc": "2026-05-26T07:46:12Z",
    "updated_utc": "2026-05-27T19:39:47Z",
    "state": "diagnostics_ok",
    "detail": "Diagnose fertig",
    "exit_code": 0,
    "root": "/decoders/js8_decoder",
    "expected_root": "/decoders/js8_decoder",
    "wav": "/decoders/js8_test.wav",
    "mode": "real-compressed-fixture-intake-helper",
    "start_guard": {
      "start_stops_existing_instance": true,
      "stale_pid_cleanup": true,
      "root_orphan_cleanup": true,
      "port_guard": true,
      "foreign_port_owner_not_killed": true
    },
    "server": {
      "host": "0.0.0.0",
      "port": 8000,
      "pid": 62560,
      "running": true,
      "log": "/decoders/js8_decoder/logs/js8_browser_server.log"
    },
    "diagnostics": {
      "pid": 62576,
      "running": false,
      "log": "/decoders/js8_decoder/logs/js8_start_diagnostics_latest.log",
      "last_command": "./run_js8_decoder_lab.sh real-compressed-fixture-intake-helper /decoders/js8_test.wav"
    },
    "links": {
      "home": "/",
      "api_report": "/api/report",
      "api_status": "/api/status",
      "logs": "/logs/",
      "latest_log": "/logs/latest.log",
      "start_diagnostics_log": "/logs/js8_start_diagnostics_latest.log",
      "server_log": "/logs/js8_browser_server.log"
    },
    "rx_only_guard": {
      "tx": false,
      "ptt": false,
      "tune": false,
      "send": false,
      "js8call_runtime_control": false
    },
    "history": [
      {
        "utc": "2026-05-27T18:24:59Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:25:04Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:33:29Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:33:30Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:33:31Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:33:31Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: data-frame-text-unpack-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:33:32Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:33:37Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:39:16Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:39:17Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:39:18Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:39:18Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: jsc-table-extract-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:39:19Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:39:26Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:52:45Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:52:46Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:52:47Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T18:52:47Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: jsc-decompress-port-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:52:48Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T18:52:57Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:05:31Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:05:32Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:05:33Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:05:33Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: varicode-compressed-bitslice-jsc-bridge-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:05:34Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:05:38Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:13:55Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:13:55Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:13:56Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:13:57Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: compressed-frame-fixture-gate-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:13:58Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:14:01Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:15:01Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:15:01Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:15:02Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:15:02Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: compressed-frame-fixture-gate-probe ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:15:04Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:15:07Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:25:41Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:25:42Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:25:43Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:25:43Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-compressed-fixture-request ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:25:44Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:25:48Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:39:40Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:39:41Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:39:42Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-27T19:39:42Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-compressed-fixture-intake-helper ",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:39:43Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-27T19:39:47Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      }
    ],
    "status_file": "/decoders/js8_decoder/runtime/js8lab_status.json"
  },
  "wav_candidates": [
    {
      "path": "/decoders/js8_test.wav",
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 4608442,
      "mtime_utc": "2026-05-26T06:05:27Z"
    },
    {
      "path": "/home/webftr/decoders/js8_test.wav",
      "exists": false,
      "error": "[Errno 2] No such file or directory: '/home/webftr/decoders/js8_test.wav'"
    },
    {
      "path": "/decoders/js8_decoder/decoders/js8_test.wav",
      "exists": false,
      "error": "[Errno 2] No such file or directory: '/decoders/js8_decoder/decoders/js8_test.wav'"
    }
  ],
  "selected_wav_hint": {
    "path": "/decoders/js8_test.wav",
    "exists": true,
    "is_file": true,
    "is_dir": false,
    "size": 4608442,
    "mtime_utc": "2026-05-26T06:05:27Z"
  },
  "rx_only_guard": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false,
    "webftr_productive_integration": false
  },
  "latest_manifest": {
    "name": "20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json",
    "url": "/logs/20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 1474,
      "mtime_utc": "2026-05-27T19:39:45Z"
    },
    "json": {
      "schema": "webftr-js8-decoder-lab-log-manifest-v2",
      "project": "WebFTR JS8 Decoder Lab",
      "version": "step76-real-compressed-fixture-intake-helper",
      "status": "ok",
      "exit_code": 0,
      "command": "real-compressed-fixture-intake-helper",
      "timestamp_utc": "2026-05-27T19:39:45Z",
      "root": "/decoders/js8_decoder",
      "log_file": "/decoders/js8_decoder/logs/20260527T193942Z_real-compressed-fixture-intake-helper.log",
      "python": "3.11.2",
      "platform": "Linux-6.12.75+rpt-rpi-v8-aarch64-with-glibc2.36",
      "rx_only_guard": {
        "tx": false,
        "ptt": false,
        "tune": false,
        "send": false,
        "note": "This lab wrapper performs RX-only WAV/source inspection and never starts JS8Call runtime TX actions."
      },
      "outputs": {
        "real_fixture_intake_helper_json": "/decoders/js8_decoder/logs/20260527T193942Z_real_fixture_intake_helper_output.json",
        "real_fixture_intake_helper_latest_json": "/decoders/js8_decoder/logs/js8_real_fixture_intake_helper_latest.json",
        "step75_request_latest_json": "/decoders/js8_decoder/logs/js8_real_compressed_fixture_request_latest.json",
        "step74_gate_latest_json": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_gate_latest.json"
      },
      "input_arg": "",
      "source_arg": "",
      "fixture_arg": "",
      "next_step": "If no real fixture was imported, use runtime/fixtures/add_real_js8_fixture_step76.sh or JS8LAB_FIXTURE_* environment variables with a JS8Call/RF reference. Chat release remains blocked."
    }
  },
  "latest_log": {
    "url": "/logs/latest.log",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 4770,
      "mtime_utc": "2026-05-27T19:39:47Z"
    },
    "tail": "[webftr-js8-lab] command=real-compressed-fixture-intake-helper\n[webftr-js8-lab] root=/decoders/js8_decoder\n[webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T193942Z_real-compressed-fixture-intake-helper.log\n[webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json\n[webftr-js8-lab] utc=20260527T193942Z\n[webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send\n\n[webftr-js8-lab] Step76 real compressed FrameDataCompressed fixture intake helper\n[webftr-js8-lab] fixture JSON or source-dir argument: auto-detect runtime/fixtures + source + JS8LAB_FIXTURE_* env\n[webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T193942Z_real_fixture_intake_helper_output.json\n[webftr-js8-lab] JSON timeout guard: 180s\n{\n  \"ok\": true,\n  \"tool\": \"webftr-js8-real-compressed-fixture-intake-helper\",\n  \"tool_version\": \"step76-real-compressed-fixture-intake-helper\",\n  \"schema\": \"webftr-js8-real-compressed-fixture-intake-helper-v1\",\n  \"rx_only_guard\": {\n    \"tx\": false,\n    \"ptt\": false,\n    \"tune\": false,\n    \"send\": false,\n    \"js8call_runtime_control\": false,\n    \"webftr_productive_integration\": false\n  },\n  \"no_gui_runtime_started\": true,\n  \"root\": \"/decoders/js8_decoder\",\n  \"log_dir\": \"/decoders/js8_decoder/logs\",\n  \"state\": \"fixture_intake_ready_waiting_for_real_values\",\n  \"intake_errors\": [],\n  \"operator_input_seen\": false,\n  \"normalized_message174\": null,\n  \"target_fixture_file\": \"/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json\",\n  \"fixture_write_result\": null,\n  \"helper_files\": {\n    \"readme\": \"/decoders/js8_decoder/runtime/fixtures/README_STEP76_REAL_FIXTURE_INTAKE.md\",\n    \"shell_helper\": \"/decoders/js8_decoder/runtime/fixtures/add_real_js8_fixture_step76.sh\"\n  },\n  \"step75_summary\": {\n    \"tool_version\": \"step75-real-compressed-fixture-capture-request\",\n    \"state\": \"waiting_for_real_compressed_framedata_fixture\",\n    \"next_action\": \"Fill runtime/fixtures/js8_compressed_frame_fixtures.json from the generated template, then rerun Step75.\",\n    \"step74_gate_summary\": {\n      \"tool_version\": \"step75-real-compressed-fixture-capture-request\",\n      \"verdict\": \"fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture\",\n      \"next_action\": \"Add a real fixture JSON under runtime/fixtures/js8_compressed_frame_fixtures.json or pass it as argument to Step74.\",\n      \"source_found\": true,\n      \"jsc_entry_count\": 200000,\n      \"external_fixture_count\": 0,\n      \"external_fixture_pass_count\": 0,\n      \"external_source_comparison_pass_count\": 0,\n      \"synthetic_selftest_fixture_count\": 8,\n      \"synthetic_selftest_pass_count\": 8,\n      \"synthetic_selftest_all_passed\": true,\n      \"webftr_display_count\": 0\n    },\n    \"target_fixture_file\": \"/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json\",\n    \"written_template\": \"/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.template.json\"\n  },\n  \"webftr_rx_rows\": [],\n  \"webftr_display_count\": 0,\n  \"webftr_adapter_hint\": {\n    \"safe_to_poll_read_only\": true,\n    \"productive_integration\": false,\n    \"do_not_merge_as_chat_text_yet\": true,\n    \"step68_contract_remains_current_ui_source\": true,\n    \"step76_intake_latest\": \"/logs/js8_real_fixture_intake_helper_latest.json\",\n    \"step75_request_latest\": \"/logs/js8_real_compressed_fixture_request_latest.json\",\n    \"step74_gate_latest\": \"/logs/js8_compressed_frame_fixture_gate_latest.json\"\n  },\n  \"one_command_examples\": [\n    \"JS8LAB_FIXTURE_MESSAGE174='12CHARSxxxxx' JS8LAB_FIXTURE_EXPECTED_TEXT='HELLO' JS8LAB_FIXTURE_REFERENCE='JS8Call reference log line' JS8LAB_FIXTURE_CONFIRM_EXTERNAL=1 ./RUN_JS8_STEP76_REAL_FIXTURE_INTAKE_HELPER.sh\",\n    \"runtime/fixtures/add_real_js8_fixture_step76.sh 12CHARSxxxxx 'HELLO' 'JS8Call reference log line' /decoders/js8_test.wav\"\n  ],\n  \"warnings\": [\n    \"Step76 only imports and validates a real/reference compressed fixture; it does not release WebFTR chat text.\",\n    \"A fixture must be externally confirmed against JS8Call/JS8Call-Improved or a trusted RF comparison before it can be used for a release gate.\",\n    \"The package remains RX-only and never starts JS8Call GUI/runtime control or TX/PTT/Tune/Send actions.\"\n  ],\n  \"next_action\": \"Use runtime/fixtures/add_real_js8_fixture_step76.sh or JS8LAB_FIXTURE_* environment variables to import one real JS8Call/RF comparison frame.\",\n  \"stable_latest_written\": \"/decoders/js8_decoder/logs/js8_real_fixture_intake_helper_latest.json\"\n}\n\n[webftr-js8-lab] OK\n[webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T193942Z_real-compressed-fixture-intake-helper.log\n[webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json\n"
  },
  "output_refs": {
    "input_check": {
      "name": "20260527T110128Z_input_check_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_input_check_output.json",
      "url": "/logs/20260527T110128Z_input_check_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 684,
        "mtime_utc": "2026-05-27T11:01:29Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-input-check",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": "/decoders/js8_test.wav",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "decodes": [],
        "warnings": [],
        "wav": {
          "path": "/decoders/js8_test.wav",
          "channels": 1,
          "sample_rate": 12000,
          "sample_width_bytes": 2,
          "frames": 2304199,
          "duration_seconds": 192.016583,
          "rms_dbfs": -9.14,
          "peak_dbfs": -0.72,
          "clipped": false
        },
        "next_action": "Run profile-scan, then auto-ldpc-probe on this WAV."
      }
    },
    "sync_probe": {
      "name": "20260527T100315Z_selftest_sync_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T100315Z_selftest_sync_probe_output.json",
      "url": "/logs/20260527T100315Z_selftest_sync_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 9747,
        "mtime_utc": "2026-05-27T10:03:24Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-sync-probe",
        "tool_version": "step49-source-constants-rx-core-extract-audit",
        "input_wav": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step43_sync_candidates_with_ldpc_probe_followup_no_final_decode",
        "wav": {
          "path": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav",
          "channels": 1,
          "sample_rate": 12000,
          "sample_width_bytes": 2,
          "frames": 148608,
          "duration_seconds": 12.384,
          "rms_dbfs": -15.61,
          "peak_dbfs": -12.25,
          "clipped": false
        },
        "js8_reference": {
          "source": "JS8Call-Improved source-map orientation plus FT8-like Costas7 hypothesis",
          "sample_rate_hz": 12000,
          "default_nsps": 6192,
          "default_symbol_duration_seconds": 0.516,
          "costas7_candidate": [
            3,
            1,
            4,
            0,
            6,
            5,
            2
          ],
          "tone_count_candidate": 8,
          "note": "This is a sync/symbol candidate extractor only. It estimates frame/symbol candidates for lab work and does not perform LDPC/FEC decode or JS8 message unpacking."
        },
        "scan": {
          "nsps": 6192,
          "tone_spacing_hz": 1.937984,
          "freq_min_hz": 300.0,
          "freq_max_hz": 3000.0,
          "max_seconds_analyzed": 4.0,
          "start_candidates_scanned": 1,
          "base_candidates_scanned": 1,
          "base_candidates_hz": [
            1000.0
          ],
          "coarse_tone_candidates": [
            {
              "freq_hz": 1000.0,
              "relative_db": 0.0,
              "power": 6.94910418
            },
            {
              "freq_hz": 1025.0,
              "relative_db": -27.24,
              "power": 0.0131166
            },
            {
              "freq_hz": 975.0,
              "relative_db": -27.53,
              "power": 0.01227993
            },
            {
              "freq_hz": 1050.0,
              "relative_db": -37.39,
              "power": 0.0012678
            },
            {
              "freq_hz": 1075.0,
              "relative_db": -41.43,
              "power": 0.00049951
            },
            {
              "freq_hz": 950.0,
              "relative_db": -43.35,
              "power": 0.00032115
            },
            {
              "freq_hz": 1100.0,
              "relative_db": -46.57,
              "power": 0.00015313
            },
            {
              "freq_hz": 1250.0,
              "relative_db": -47.96,
              "power": 0.00011108
            },
            {
              "freq_hz": 1125.0,
              "relative_db": -48.58,
              "power": 9.635e-05
            },
            {
              "freq_hz": 1200.0,
              "relative_db": -50.32,
              "power": 6.457e-05
            },
            {
              "freq_hz": 875.0,
              "relative_db": -50.9,
              "power": 5.646e-05
            },
            {
              "freq_hz": 1175.0,
              "relative_db": -51.46,
              "power": 4.965e-05
            }
          ]
        },
        "sync_candidates": [
          {
            "ok": true,
            "start_sample": 0,
            "start_seconds": 0.0,
            "base_freq_hz": 1000.0,
            "tone_spacing_hz": 1.937984,
            "nsps": 6192,
            "costas_pattern": [
              3,
              1,
              4,
              0,
              6,
              5,
              2
            ],
            "costas_hits": 7,
            "costas_symbols": 7,
            "avg_margin_db": 29.11,
            "energy_score_db": 29.11,
            "candidate_score": 128.22,
            "symbols": [
              {
                "symbol": 0,
                "expected_tone": 3,
                "strongest_tone": 3,
                "expected_is_strongest": true,
                "expected_power": 83.0873099286,
                "median_other_power": 0.1042308968,
                "margin_db": 29.02,
                "tone_powers": [
                  0.0981480318,
                  0.1051242996,
                  0.1064179268,
                  83.0873099286,
                  0.1057422016,
                  0.1042308968,
                  0.0993799575,
                  0.0932492823
                ]
              },
              {
                "symbol": 1,
                "expected_tone": 1,
                "strongest_tone": 1,
                "expected_is_strongest": true,
                "expected_power": 83.0774568889,
                "median_other_power": 0.1014706768,
                "margin_db": 29.13,
                "tone_powers": [
                  0.1068702304,
                  83.0774568889,
                  0.1052822376,
                  0.105564598,
                  0.1014706768,
                  0.0956100015,
                  0.0879534486,
                  0.0800992227
                ]
              },
              {
                "symbol": 2,
                "expected_tone": 4,
                "strongest_tone": 4,
                "expected_is_strongest": true,
                "expected_power": 83.0917714671,
                "median_other_power": 0.1044873575,
                "margin_db": 29.0,
                "tone_powers": [
                  0.0960127168,
                  0.0986802754,
                  0.1054058068,
                  0.1081981246,
                  83.0917714671,
                  0.1055965002,
                  0.1044873575,
                  0.0990928872
                ]
              },
              {
                "symbol": 3,
                "expected_tone": 0,
                "strongest_tone": 0,
                "expected_is_strongest": true,
                "expected_power": 83.0749822549,
                "median_other_power": 0.0948551103,
                "margin_db": 29.42,
                "tone_powers": [
                  83.0749822549,
                  0.1081775542,
                  0.1032741915,
                  0.1002757935,
                  0.0948551103,
                  0.0864721839,
                  0.080493759,
                  0.0726495994
                ]
              },
              {
                "symbol": 4,
                "expected_tone": 6,
                "strongest_tone": 6,
                "expected_is_strongest": true,
                "expected_power": 83.0368796528,
                "median_other_power": 0.1013897721,
                "margin_db": 29.13,
                "tone_powers": [
                  0.0811328494,
                  0.088780076,
                  0.0950670222,
                  0.1013897721,
                  0.1027811248,
                  0.1070386893,
                  83.0368796528,
                  0.1089829146
                ]
              },
              {
                "symbol": 5,
                "expected_tone": 5,
                "strongest_tone": 5,
                "expected_is_strongest": true,
                "expected_power": 83.0780861176,
                "median_other_power": 0.1045690469,
                "margin_db": 29.0,
                "tone_powers": [
                  0.0865241623,
                  0.0949217802,
                  0.099666939,
                  0.1045690469,
                  0.1061057949,
                  83.0780861176,
                  0.1100149946,
                  0.1049352501
                ]
              },
              {
                "symbol": 6,
                "expected_tone": 2,
                "strongest_tone": 2,
                "expected_is_strongest": true,
                "expected_power": 83.0649691812,
                "median_other_power": 0.1027968836,
                "margin_db": 29.07,
                "tone_powers": [
                  0.1060939743,
                  0.1064017103,
                  83.0649691812,
                  0.1058247328,
                  0.1027968836,
                  0.1002472492,
                  0.0945580448,
                  0.088818472
                ]
              }
            ],
            "symbol_preview": [
              {
                "symbol": 0,
                "tone_index": 3,
                "confidence_db": 28.93,
                "powers": [
                  0.0981480318,
                  0.1051242996,
                  0.1064179268,
                  83.0873099286,
                  0.1057422016,
                  0.1042308968,
                  0.0993799575,
                  0.0932492823
                ]
              },
              {
                "symbol": 1,
                "tone_index": 1,
                "confidence_db": 28.91,
                "powers": [
                  0.1068702304,
                  83.0774568889,
                  0.1052822376,
                  0.105564598,
                  0.1014706768,
                  0.0956100015,
                  0.0879534486,
                  0.0800992227
                ]
              },
              {
                "symbol": 2,
                "tone_index": 4,
                "confidence_db": 28.85,
                "powers": [
                  0.0960127168,
                  0.0986802754,
                  0.1054058068,
                  0.1081981246,
                  83.0917714671,
                  0.1055965002,
                  0.1044873575,
                  0.0990928872
                ]
              },
              {
                "symbol": 3,
                "tone_index": 0,
                "confidence_db": 28.85,
                "powers": [
                  83.0749822549,
                  0.1081775542,
                  0.1032741915,
                  0.1002757935,
                  0.0948551103,
                  0.0864721839,
                  0.080493759,
                  0.0726495994
                ]
              },
              {
                "symbol": 4,
                "tone_index": 6,
                "confidence_db": 28.82,
                "powers": [
                  0.0811328494,
                  0.088780076,
                  0.0950670222,
                  0.1013897721,
                  0.1027811248,
                  0.1070386893,
                  83.0368796528,
                  0.1089829146
                ]
              },
              {
                "symbol": 5,
                "tone_index": 5,
                "confidence_db": 28.78,
                "powers": [
                  0.0865241623,
                  0.0949217802,
                  0.099666939,
                  0.1045690469,
                  0.1061057949,
                  83.0780861176,
                  0.1100149946,
                  0.1049352501
                ]
              },
              {
                "symbol": 6,
                "tone_index": 2,
                "confidence_db": 28.92,
                "powers": [
                  0.1060939743,
                  0.1064017103,
                  83.0649691812,
                  0.1058247328,
                  0.1027968836,
                  0.1002472492,
                  0.0945580448,
                  0.088818472
                ]
              }
            ]
          }
        ],
        "decodes": [],
        "warnings": [
          "No JS8 text decode is expected in Step 49. 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."
        ],
        "next_action": "Run sync-probe on real JS8 WAV captures. If stable sync_candidates appear, Step 49 can continue soft-symbol metric extraction for the LDPC/FEC path."
      }
    },
    "real_run_quick_prefilter": {
      "name": "20260527T110128Z_real_run_quick_prefilter_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_quick_prefilter_output.json",
      "url": "/logs/20260527T110128Z_real_run_quick_prefilter_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 8815,
        "mtime_utc": "2026-05-27T11:01:42Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-quick-window-scan",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": "/decoders/js8_test.wav",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "wav": {
          "sample_rate": 12000,
          "duration_seconds": 192.016583,
          "frames": 2304199,
          "rms_dbfs": -9.164808449038551,
          "peak_dbfs": -0.7246929351669301,
          "clipped": false
        },
        "scan_params": {
          "window_seconds": 60.0,
          "hop_seconds": 12.0,
          "max_seconds": 180.0,
          "output_dir": "/decoders/js8_decoder/runtime/quick_prefilter_windows"
        },
        "selected_window": {
          "start_seconds": 24.0,
          "end_seconds": 84.0,
          "duration_seconds": 60.0,
          "avg_activity_score": -6.2272,
          "active_chunks": 5,
          "chunk_count": 5,
          "selection_score": 11.2728,
          "window_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
          "tone_candidates": [
            {
              "freq_hz": 1025.0,
              "relative_db": 0.0,
              "power": 7.98385996
            },
            {
              "freq_hz": 1000.0,
              "relative_db": -0.38,
              "power": 7.31762699
            },
            {
              "freq_hz": 2025.0,
              "relative_db": -9.29,
              "power": 0.93974646
            },
            {
              "freq_hz": 975.0,
              "relative_db": -13.3,
              "power": 0.37314359
            },
            {
              "freq_hz": 1050.0,
              "relative_db": -25.6,
              "power": 0.02199227
            },
            {
              "freq_hz": 1775.0,
              "relative_db": -27.4,
              "power": 0.01453049
            },
            {
              "freq_hz": 1150.0,
              "relative_db": -27.44,
              "power": 0.01439727
            },
            {
              "freq_hz": 1425.0,
              "relative_db": -28.11,
              "power": 0.01233556
            },
            {
              "freq_hz": 1250.0,
              "relative_db": -29.08,
              "power": 0.00987629
            },
            {
              "freq_hz": 1825.0,
              "relative_db": -29.2,
              "power": 0.00959995
            },
            {
              "freq_hz": 1950.0,
              "relative_db": -29.78,
              "power": 0.00840634
            },
            {
              "freq_hz": 950.0,
              "relative_db": -29.91,
              "power": 0.00814511
            }
          ]
        },
        "selected_window_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
        "top_windows": [
          {
            "start_seconds": 24.0,
            "end_seconds": 84.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2272,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2728,
            "window_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
            "tone_candidates": [
              {
                "freq_hz": 1025.0,
                "relative_db": 0.0,
                "power": 7.98385996
              },
              {
                "freq_hz": 1000.0,
                "relative_db": -0.38,
                "power": 7.31762699
              },
              {
                "freq_hz": 2025.0,
                "relative_db": -9.29,
                "power": 0.93974646
              },
              {
                "freq_hz": 975.0,
                "relative_db": -13.3,
                "power": 0.37314359
              },
              {
                "freq_hz": 1050.0,
                "relative_db": -25.6,
                "power": 0.02199227
              },
              {
                "freq_hz": 1775.0,
                "relative_db": -27.4,
                "power": 0.01453049
              },
              {
                "freq_hz": 1150.0,
                "relative_db": -27.44,
                "power": 0.01439727
              },
              {
                "freq_hz": 1425.0,
                "relative_db": -28.11,
                "power": 0.01233556
              },
              {
                "freq_hz": 1250.0,
                "relative_db": -29.08,
                "power": 0.00987629
              },
              {
                "freq_hz": 1825.0,
                "relative_db": -29.2,
                "power": 0.00959995
              },
              {
                "freq_hz": 1950.0,
                "relative_db": -29.78,
                "power": 0.00840634
              },
              {
                "freq_hz": 950.0,
                "relative_db": -29.91,
                "power": 0.00814511
              }
            ]
          },
          {
            "start_seconds": 12.0,
            "end_seconds": 72.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2278,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2722
          },
          {
            "start_seconds": 36.0,
            "end_seconds": 96.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2346,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2654
          },
          {
            "start_seconds": 48.0,
            "end_seconds": 108.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2483,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2517
          },
          {
            "start_seconds": 0.0,
            "end_seconds": 60.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2606,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2394
          },
          {
            "start_seconds": 60.0,
            "end_seconds": 120.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2619,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2381
          },
          {
            "start_seconds": 108.0,
            "end_seconds": 168.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2716,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2284
          },
          {
            "start_seconds": 72.0,
            "end_seconds": 132.0,
            "duration_seconds": 60.0,
            "avg_activity_score": -6.2752,
            "active_chunks": 5,
            "chunk_count": 5,
            "selection_score": 11.2248
          }
        ],
        "chunk_preview": [
          {
            "chunk_index": 0,
            "start_seconds": 0.0,
            "end_seconds": 12.0,
            "rms_dbfs": -9.07,
            "peak_dbfs": -3.22,
            "activity_score": -6.2351
          },
          {
            "chunk_index": 1,
            "start_seconds": 12.0,
            "end_seconds": 24.0,
            "rms_dbfs": -9.27,
            "peak_dbfs": -3.01,
            "activity_score": -6.4225
          },
          {
            "chunk_index": 2,
            "start_seconds": 24.0,
            "end_seconds": 36.0,
            "rms_dbfs": -9.24,
            "peak_dbfs": -2.73,
            "activity_score": -6.3769
          },
          {
            "chunk_index": 3,
            "start_seconds": 36.0,
            "end_seconds": 48.0,
            "rms_dbfs": -9.24,
            "peak_dbfs": -2.39,
            "activity_score": -6.3632
          },
          {
            "chunk_index": 4,
            "start_seconds": 48.0,
            "end_seconds": 60.0,
            "rms_dbfs": -8.87,
            "peak_dbfs": -0.72,
            "activity_score": -5.9054
          },
          {
            "chunk_index": 5,
            "start_seconds": 60.0,
            "end_seconds": 72.0,
            "rms_dbfs": -9.03,
            "peak_dbfs": -0.72,
            "activity_score": -6.0711
          },
          {
            "chunk_index": 6,
            "start_seconds": 72.0,
            "end_seconds": 84.0,
            "rms_dbfs": -9.26,
            "peak_dbfs": -3.1,
            "activity_score": -6.4194
          },
          {
            "chunk_index": 7,
            "start_seconds": 84.0,
            "end_seconds": 96.0,
            "rms_dbfs": -9.29,
            "peak_dbfs": -2.42,
            "activity_score": -6.4141
          }
        ],
        "chunk_tail_preview": [
          {
            "chunk_index": 7,
            "start_seconds": 84.0,
            "end_seconds": 96.0,
            "rms_dbfs": -9.29,
            "peak_dbfs": -2.42,
            "activity_score": -6.4141
          },
          {
            "chunk_index": 8,
            "start_seconds": 96.0,
            "end_seconds": 108.0,
            "rms_dbfs": -9.3,
            "peak_dbfs": -2.65,
            "activity_score": -6.4314
          },
          {
            "chunk_index": 9,
            "start_seconds": 108.0,
            "end_seconds": 120.0,
            "rms_dbfs": -8.87,
            "peak_dbfs": -2.1,
            "activity_score": -5.9734
          },
          {
            "chunk_index": 10,
            "start_seconds": 120.0,
            "end_seconds": 132.0,
            "rms_dbfs": -9.02,
            "peak_dbfs": -2.36,
            "activity_score": -6.1378
          },
          {
            "chunk_index": 11,
            "start_seconds": 132.0,
            "end_seconds": 144.0,
            "rms_dbfs": -9.41,
            "peak_dbfs": -0.72,
            "activity_score": -6.4474
          },
          {
            "chunk_index": 12,
            "start_seconds": 144.0,
            "end_seconds": 156.0,
            "rms_dbfs": -9.3,
            "peak_dbfs": -2.31,
            "activity_score": -6.4185
          },
          {
            "chunk_index": 13,
            "start_seconds": 156.0,
            "end_seconds": 168.0,
            "rms_dbfs": -9.34,
            "peak_dbfs": -0.89,
            "activity_score": -6.3807
          },
          {
            "chunk_index": 14,
            "start_seconds": 168.0,
            "end_seconds": 180.0,
            "rms_dbfs": -8.99,
            "peak_dbfs": -3.03,
            "activity_score": -6.1457
          }
        ],
        "decodes": [],
        "warnings": [
          "Quick-window-scan only selects a likely analysis window; it is not a JS8 text decoder."
        ],
        "next_action": "Run sync/soft-symbol/FEC probes on selected_window_wav. Message unpack is not implemented in Step 51."
      }
    },
    "real_run_dirty_window_scan": {
      "name": "20260527T110128Z_real_run_dirty_window_scan_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_dirty_window_scan_output.json",
      "url": "/logs/20260527T110128Z_real_run_dirty_window_scan_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 1269,
        "mtime_utc": "2026-05-27T11:02:43Z"
      },
      "json_preview": {
        "ok": false,
        "error": "json_command_timeout_guard",
        "timeout_seconds": 60,
        "exit_code": 143,
        "command": [
          "python3",
          "-m",
          "webftr_js8_lab.js8_dirty_window_scan",
          "--input",
          "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
          "--pretty",
          "--window-seconds",
          "54",
          "--hop-seconds",
          "30",
          "--max-seconds",
          "75",
          "--max-windows",
          "1",
          "--max-starts",
          "3",
          "--max-base-candidates",
          "2",
          "--output-dir",
          "/decoders/js8_decoder/runtime/dirty_windows",
          "--prefer-js8"
        ],
        "stderr_log": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_dirty_window_scan_output.stderr.log",
        "stderr_tail": "/decoders/js8_decoder/src/webftr_js8_lab/js8_dirty_window_scan.py:4: DeprecationWarning: 'audioop' is deprecated and slated for removal in Python 3.13\n  import audioop\n",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "next_action": "Step 51 timeout guard stopped this expensive probe; preserved partial timing JSON when available. The real-run now continues with quick-window fallback when available; otherwise inspect stderr/log bundle."
      }
    },
    "dirty_window_scan": {
      "name": "20260527T110128Z_real_run_dirty_window_scan_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_dirty_window_scan_output.json",
      "url": "/logs/20260527T110128Z_real_run_dirty_window_scan_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 1269,
        "mtime_utc": "2026-05-27T11:02:43Z"
      },
      "json_preview": {
        "ok": false,
        "error": "json_command_timeout_guard",
        "timeout_seconds": 60,
        "exit_code": 143,
        "command": [
          "python3",
          "-m",
          "webftr_js8_lab.js8_dirty_window_scan",
          "--input",
          "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
          "--pretty",
          "--window-seconds",
          "54",
          "--hop-seconds",
          "30",
          "--max-seconds",
          "75",
          "--max-windows",
          "1",
          "--max-starts",
          "3",
          "--max-base-candidates",
          "2",
          "--output-dir",
          "/decoders/js8_decoder/runtime/dirty_windows",
          "--prefer-js8"
        ],
        "stderr_log": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_dirty_window_scan_output.stderr.log",
        "stderr_tail": "/decoders/js8_decoder/src/webftr_js8_lab/js8_dirty_window_scan.py:4: DeprecationWarning: 'audioop' is deprecated and slated for removal in Python 3.13\n  import audioop\n",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "next_action": "Step 51 timeout guard stopped this expensive probe; preserved partial timing JSON when available. The real-run now continues with quick-window fallback when available; otherwise inspect stderr/log bundle."
      }
    },
    "ldpc_soft_decode": {
      "name": "20260527T111112Z_ldpc_soft_decode_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T111112Z_ldpc_soft_decode_output.json",
      "url": "/logs/20260527T111112Z_ldpc_soft_decode_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 112544,
        "mtime_utc": "2026-05-27T11:11:21Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-soft-ldpc-minsum-probe",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": null,
        "candidate_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_best_timing_fec_candidate.json",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step43_direct_primary_syndrome_closure_repair_candidates_no_message_unpack",
        "matrix": {
          "code": "(174,91)",
          "message_bits": 91,
          "parity_bits": 83,
          "codeword_bits": 174,
          "check_count": 83
        },
        "decoder": {
          "algorithm": "normalized_min_sum_multi_trial",
          "max_iterations": 32,
          "default_alpha": 0.8,
          "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely",
          "mapping_expansion": "ft8_gray_demap_plus_bitrev_interleaver_candidates",
          "max_decode_rows": 1,
          "fast_trials": true,
          "trial_count": 2,
          "timeout_avoidance": "direct_primary_first_default_1_row",
          "direct_timing_primary_preserved": true,
          "hard_repair_probe": {
            "repair_rows": 1,
            "repair_pool_size": 18,
            "repair_max_depth": 2
          }
        },
        "candidate_context": {
          "nsps_used": 6192,
          "nsps_is_js8_realistic": true,
          "selected_profile": null,
          "selected_variant": {
            "name": "step43_timing_sweep_best_syndrome_row",
            "rank_score": 1105.166392,
            "complete_174bit_candidate": true,
            "hard_bits_sha256_16": "95a1e941fbdff6b2",
            "hard_weight_174": 36,
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            }
          }
        },
        "candidate_mapping_rows": 865,
        "probe_count": 2,
        "best_soft_decode": {
          "variant": "step43_timing_sweep_best_syndrome_row",
          "transform": "direct_timing_sweep_primary",
          "mapping_meta": {
            "direct_timing_sweep_primary": true,
            "source_mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "source_transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "source_variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver"
          },
          "decoder_trial": {
            "llr_scale": 0.75,
            "alpha": 0.7
          },
          "source_rank_score": 3105.166392,
          "source_llr_stats": {
            "count": 174,
            "avg_abs": 1.291598,
            "min_abs": 0.001433,
            "max_abs": 3.895705,
            "positive": 129,
            "negative": 45,
            "zero": 0
          },
          "success": false,
          "iterations_used": 32,
          "final_syndrome_weight": 33,
          "message91": null,
          "message91_sha256_16": "f36bdab26772186a",
          "codeword174_sha256_16": "96bf7b01bb067d48",
          "trace": [
            {
              "iteration": 0,
              "syndrome_weight": 43
            },
            {
              "iteration": 1,
              "syndrome_weight": 40
            },
            {
              "iteration": 2,
              "syndrome_weight": 42
            },
            {
              "iteration": 3,
              "syndrome_weight": 37
            },
            {
              "iteration": 4,
              "syndrome_weight": 40
            },
            {
              "iteration": 5,
              "syndrome_weight": 39
            },
            {
              "iteration": 6,
              "syndrome_weight": 48
            },
            {
              "iteration": 7,
              "syndrome_weight": 37
            },
            {
              "iteration": 8,
              "syndrome_weight": 41
            },
            {
              "iteration": 9,
              "syndrome_weight": 39
            },
            {
              "iteration": 10,
              "syndrome_weight": 44
            },
            {
              "iteration": 15,
              "syndrome_weight": 40
            },
            {
              "iteration": 20,
              "syndrome_weight": 44
            },
            {
              "iteration": 25,
              "syndrome_weight": 45
            },
            {
              "iteration": 30,
              "syndrome_weight": 41
            }
          ],
          "hard_repair_probe": {
            "ok": true,
            "initial_syndrome_weight": 22,
            "best_syndrome_weight": 21,
            "best_flip_indices": [
              91
            ],
            "best_flip_count": 1,
            "pool_size": 18,
            "max_depth": 2,
            "probes": 171,
            "valid_codeword_hard_decision": false,
            "message91_sha256_16": "d4ca2a05f15dd009",
            "codeword174_sha256_16": "4cf9e06f787f90f7"
          },
          "syndrome_closure_repair_probe": {
            "ok": true,
            "diagnostic_only": true,
            "method": "systematic_syndrome_closure_ranked_by_llr_cost",
            "initial_syndrome_weight": 22,
            "initial_unsatisfied_checks": [
              0,
              3,
              4,
              12,
              14,
              17,
              27,
              30,
              31,
              33,
              34,
              36,
              38,
              44,
              45,
              46,
              51,
              61,
              62,
              68,
              77,
              81
            ],
            "message_pool_size": 18,
            "message_pool_indices": [
              8,
              80,
              29,
              60,
              32,
              4,
              37,
              67,
              19,
              64,
              52,
              47,
              54,
              24,
              79,
              69,
              70,
              90
            ],
            "max_message_depth": 3,
            "evaluated_candidates": 988,
            "best": {
              "message_flip_indices": [
                29,
                52,
                24
              ],
              "parity_flip_indices": [
                93,
                95,
                96,
                99,
                101,
                102,
                104,
                106,
                111,
                113,
                117,
                123,
                125,
                127,
                128,
                129,
                131,
                133,
                134,
                135,
                141,
                147,
                149,
                159,
                160,
                161,
                162,
                163,
                166,
                170,
                171
              ],
              "all_flip_indices": [
                29,
                52,
                24,
                93,
                95,
                96,
                99,
                101,
                102,
                104,
                106,
                111,
                113,
                117,
                123,
                125,
                127,
                128,
                129,
                131,
                133,
                134,
                135,
                141,
                147,
                149,
                159,
                160,
                161,
                162,
                163,
                166,
                170,
                171
              ],
              "message_flip_count": 3,
              "parity_flip_count": 31,
              "total_flip_count": 34,
              "message_flip_cost": 0.200562,
              "parity_flip_cost": 26.763065,
              "total_reliability_cost": 26.963627,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
              "message91_sha256_16": "4969d515d475345c",
              "codeword174_sha256_16": "5eb7a37dfa462a9d"
            },
            "top_candidates": [
              {
                "message_flip_indices": [
                  29,
                  52,
                  24
                ],
                "parity_flip_indices": [
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "all_flip_indices": [
                  29,
                  52,
                  24,
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "message_flip_count": 3,
                "parity_flip_count": 31,
                "total_flip_count": 34,
                "message_flip_cost": 0.200562,
                "parity_flip_cost": 26.763065,
                "total_reliability_cost": 26.963627,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
                "message91_sha256_16": "4969d515d475345c",
                "codeword174_sha256_16": "5eb7a37dfa462a9d"
              },
              {
                "message_flip_indices": [],
                "parity_flip_indices": [
                  91,
                  94,
                  95,
                  103,
                  105,
                  108,
                  118,
                  121,
                  122,
                  124,
                  125,
                  127,
                  129,
                  135,
                  136,
                  137,
                  142,
                  152,
                  153,
                  159,
                  168,
                  172
                ],
                "all_flip_indices": [
                  91,
                  94,
                  95,
                  103,
                  105,
                  108,
                  118,
                  121,
                  122,
                  124,
                  125,
                  127,
                  129,
                  135,
                  136,
                  137,
                  142,
                  152,
                  153,
                  159,
                  168,
                  172
                ],
                "message_flip_count": 0,
                "parity_flip_count": 22,
                "total_flip_count": 22,
                "message_flip_cost": 0.0,
                "parity_flip_cost": 30.00735,
                "total_reliability_cost": 30.00735,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                "message91_sha256_16": "d4ca2a05f15dd009",
                "codeword174_sha256_16": "ceaa20e1644a6624"
              },
              {
                "message_flip_indices": [
                  32,
                  54,
                  69
                ],
                "parity_flip_indices": [
                  91,
                  92,
                  93,
                  100,
                  101,
                  104,
                  105,
                  106,
                  109,
                  112,
                  115,
                  116,
                  118,
                  120,
                  127,
                  134,
                  136,
                  138,
                  140,
                  145,
                  151,
                  158,
                  167,
                  168,
                  172
                ],
                "all_flip_indices": [
                  32,
                  54,
                  69,
                  91,
                  92,
                  93,
                  100,
                  101,
                  104,
                  105,
                  106,
                  109,
                  112,
                  115,
                  116,
                  118,
                  120,
                  127,
                  134,
                  136,
                  138,
                  140,
                  145,
                  151,
                  158,
                  167,
                  168,
                  172
                ],
                "message_flip_count": 3,
                "parity_flip_count": 25,
                "total_flip_count": 28,
                "message_flip_cost": 0.356944,
                "parity_flip_cost": 29.730529,
                "total_reliability_cost": 30.087473,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000010000010001000000000011000000000000000100000000101000100110",
                "message91_sha256_16": "c7b3956c1566b60c",
                "codeword174_sha256_16": "c674187693259e74"
              },
              {
                "message_flip_indices": [
                  4,
                  19,
                  64
                ],
                "parity_flip_indices": [
                  91,
                  101,
                  102,
                  106,
                  110,
                  111,
                  112,
                  113,
                  117,
                  118,
                  120,
                  126,
                  128,
                  129,
                  135,
                  138,
                  142,
                  143,
                  145,
                  146,
                  147,
                  150,
                  154,
                  157,
                  159,
                  160,
                  161,
                  162,
                  165,
                  171,
                  172
                ],
                "all_flip_indices": [
                  4,
                  19,
                  64,
                  91,
                  101,
                  102,
                  106,
                  110,
                  111,
                  112,
                  113,
                  117,
                  118,
                  120,
                  126,
                  128,
                  129,
                  135,
                  138,
                  142,
                  143,
                  145,
                  146,
                  147,
                  150,
                  154,
                  157,
                  159,
                  160,
                  161,
                  162,
                  165,
                  171,
                  172
                ],
                "message_flip_count": 3,
                "parity_flip_count": 31,
                "total_flip_count": 34,
                "message_flip_cost": 0.101419,
                "parity_flip_cost": 31.795027,
                "total_reliability_cost": 31.896446,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000100100000001000101000100000000000010001000000000010000000000100001100000000101000100110",
                "message91_sha256_16": "a2c47af107dec776",
                "codeword174_sha256_16": "8b5ec7d6029ef1fa"
              },
              {
                "message_flip_indices": [
                  8,
                  80,
                  54
                ],
                "parity_flip_indices": [
                  93,
                  95,
                  96,
                  97,
                  99,
                  100,
                  102,
                  106,
                  107,
                  108,
                  112,
                  118,
                  123,
                  125,
                  127,
                  129,
                  130,
                  131,
                  134,
                  135,
                  136,
                  138,
                  141,
                  144,
                  149,
                  153,
                  155,
                  160,
                  161,
                  162,
                  167,
                  170,
                  172
                ],
                "all_flip_indices": [
                  8,
                  80,
                  54,
                  93,
                  95,
                  96,
                  97,
                  99,
                  100,
                  102,
                  106,
                  107,
                  108,
                  112,
                  118,
                  123,
                  125,
                  127,
                  129,
                  130,
                  131,
                  134,
                  135,
                  136,
                  138,
                  141,
                  144,
                  149,
                  153,
                  155,
                  160,
                  161,
                  162,
                  167,
                  170,
                  172
                ],
                "message_flip_count": 3,
                "parity_flip_count": 33,
                "total_flip_count": 36,
                "message_flip_cost": 0.112312,
                "parity_flip_cost": 31.909172,
                "total_reliability_cost": 32.021484,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000110000001000001000100000000000010001000000000011000000000000001100000000111000100110",
                "message91_sha256_16": "53280bfeb41c2e78",
                "codeword174_sha256_16": "da214f762455b3fd"
              },
              {
                "message_flip_indices": [
                  24
                ],
                "parity_flip_indices": [
                  91,
                  94,
                  96,
                  97,
                  98,
                  99,
                  104,
                  105,
                  106,
                  107,
                  108,
                  113,
                  115,
                  116,
                  118,
                  122,
                  124,
                  125,
                  126,
                  133,
                  134,
                  135,
                  138,
                  141,
                  146,
                  150,
                  153,
                  154,
                  156,
                  157,
                  163,
                  164,
                  170
                ],
                "all_flip_indices": [
                  24,
                  91,
                  94,
                  96,
                  97,
                  98,
                  99,
                  104,
                  105,
                  106,
                  107,
                  108,
                  113,
                  115,
                  116,
                  118,
                  122,
                  124,
                  125,
                  126,
                  133,
                  134,
                  135,
                  138,
                  141,
                  146,
                  150,
                  153,
                  154,
                  156,
                  157,
                  163,
                  164,
                  170
                ],
                "message_flip_count": 1,
                "parity_flip_count": 33,
                "total_flip_count": 34,
                "message_flip_cost": 0.120611,
                "parity_flip_cost": 32.322615,
                "total_reliability_cost": 32.443226,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001001100000000000010001000000000010000000000000001100000000101000100110",
                "message91_sha256_16": "7b4f0bbb486c2729",
                "codeword174_sha256_16": "c60be927dc9a8795"
              },
              {
                "message_flip_indices": [
                  67,
                  54,
                  79
                ],
                "parity_flip_indices": [
                  94,
                  96,
                  100,
                  103,
                  105,
                  108,
                  112,
                  116,
                  118,
                  122,
                  124,
                  125,
                  127,
                  128,
                  133,
                  134,
                  135,
                  140,
                  141,
                  146,
                  147,
                  150,
                  152,
                  153,
                  154,
                  157,
                  169,
                  172,
                  173
                ],
                "all_flip_indices": [
                  67,
                  54,
                  79,
                  94,
                  96,
                  100,
                  103,
                  105,
                  108,
                  112,
                  116,
                  118,
                  122,
                  124,
                  125,
                  127,
                  128,
                  133,
                  134,
                  135,
                  140,
                  141,
                  146,
                  147,
                  150,
                  152,
                  153,
                  154,
                  157,
                  169,
                  172,
                  173
                ],
                "message_flip_count": 3,
                "parity_flip_count": 29,
                "total_flip_count": 32,
                "message_flip_cost": 0.334,
                "parity_flip_cost": 32.688588,
                "total_reliability_cost": 33.022588,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000000000010001000000000011000000000000101100000000001000100110",
                "message91_sha256_16": "ea6738f37fdd0bca",
                "codeword174_sha256_16": "e64696234a9e9700"
              },
              {
                "message_flip_indices": [
                  8,
                  4
                ],
                "parity_flip_indices": [
                  91,
                  93,
                  95,
                  101,
                  103,
                  110,
                  112,
                  117,
                  118,
                  123,
                  125,
                  126,
                  127,
                  129,
                  135,
                  137,
                  140,
                  141,
                  143,
                  145,
                  149,
                  152,
                  154,
                  156,
                  160,
                  168,
                  172,
                  173
                ],
                "all_flip_indices": [
                  8,
                  4,
                  91,
                  93,
                  95,
                  101,
                  103,
                  110,
                  112,
                  117,
                  118,
                  123,
                  125,
                  126,
                  127,
                  129,
                  135,
                  137,
                  140,
                  141,
                  143,
                  145,
                  149,
                  152,
                  154,
                  156,
                  160,
                  168,
                  172,
                  173
                ],
                "message_flip_count": 2,
                "parity_flip_count": 28,
                "total_flip_count": 30,
                "message_flip_cost": 0.020221,
                "parity_flip_cost": 33.270029,
                "total_reliability_cost": 33.29025,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000100110000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                "message91_sha256_16": "36258d9d38b0281f",
                "codeword174_sha256_16": "cb03d310703a3bef"
              },
              {
                "message_flip_indices": [
                  80,
                  32
                ],
                "parity_flip_indices": [
                  95,
                  97,
                  99,
                  100,
                  102,
                  103,
                  108,
                  109,
                  121,
                  123,
                  124,
                  126,
                  127,
                  128,
                  129,
                  133,
                  141,
                  142,
                  143,
                  148,
                  151,
                  155,
                  157,
                  159,
                  160,
                  163,
                  165,
                  166,
                  167,
                  168,
                  170,
                  171
                ],
                "all_flip_indices": [
                  80,
                  32,
                  95,
                  97,
                  99,
                  100,
                  102,
                  103,
                  108,
                  109,
                  121,
                  123,
                  124,
                  126,
                  127,
                  128,
                  129,
                  133,
                  141,
                  142,
                  143,
                  148,
                  151,
                  155,
                  157,
                  159,
                  160,
                  163,
                  165,
                  166,
                  167,
                  168,
                  170,
                  171
                ],
                "message_flip_count": 2,
                "parity_flip_count": 32,
                "total_flip_count": 34,
                "message_flip_cost": 0.01723,
                "parity_flip_cost": 33.416528,
                "total_reliability_cost": 33.433758,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000010000010001000000000010000000000000001100000000111000100110",
                "message91_sha256_16": "d1dd1f00eea52156",
                "codeword174_sha256_16": "4529cc6ea45b8c15"
              },
              {
                "message_flip_indices": [
                  37,
                  52,
                  54
                ],
                "parity_flip_indices": [
                  93,
                  95,
                  96,
                  98,
                  99,
                  100,
                  102,
                  106,
                  107,
                  108,
                  111,
                  112,
                  116,
                  118,
                  120,
                  123,
                  125,
                  127,
                  130,
                  133,
                  134,
                  135,
                  136,
                  138,
                  141,
                  144,
                  154,
                  155,
                  160,
                  161,
                  165,
                  167,
                  170
                ],
                "all_flip_indices": [
                  37,
                  52,
                  54,
                  93,
                  95,
                  96,
                  98,
                  99,
                  100,
                  102,
                  106,
                  107,
                  108,
                  111,
                  112,
                  116,
                  118,
                  120,
                  123,
                  125,
                  127,
                  130,
                  133,
                  134,
                  135,
                  136,
                  138,
                  141,
                  144,
                  154,
                  155,
                  160,
                  161,
                  165,
                  167,
                  170
                ],
                "message_flip_count": 3,
                "parity_flip_count": 33,
                "total_flip_count": 36,
                "message_flip_cost": 0.212962,
                "parity_flip_cost": 33.260317,
                "total_reliability_cost": 33.473279,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000000000110001000000000111000000000000001100000000101000100110",
                "message91_sha256_16": "f89221702d6c6b08",
                "codeword174_sha256_16": "17b3bb4d1d83b9f3"
              },
              {
                "message_flip_indices": [
                  80,
                  69,
                  90
                ],
                "parity_flip_indices": [
                  91,
                  93,
                  95,
                  97,
                  99,
                  100,
                  101,
                  102,
                  103,
                  106,
                  109,
                  110,
                  113,
                  117,
                  124,
                  125,
                  133,
                  135,
                  137,
                  140,
                  146,
                  149,
                  153,
                  154,
                  157,
                  160,
                  161,
                  163,
                  164,
                  165,
                  166,
                  167,
                  168,
                  170,
                  173
                ],
                "all_flip_indices": [
                  80,
                  69,
                  90,
                  91,
                  93,
                  95,
                  97,
                  99,
                  100,
                  101,
                  102,
                  103,
                  106,
                  109,
                  110,
                  113,
                  117,
                  124,
                  125,
                  133,
                  135,
                  137,
                  140,
                  146,
                  149,
                  153,
                  154,
                  157,
                  160,
                  161,
                  163,
                  164,
                  165,
                  166,
                  167,
                  168,
                  170,
                  173
                ],
                "message_flip_count": 3,
                "parity_flip_count": 35,
                "total_flip_count": 38,
                "message_flip_cost": 0.520175,
                "parity_flip_cost": 33.163717,
                "total_reliability_cost": 33.683892,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001000100000000000010001000000000010000000000000000100000000111000100111",
                "message91_sha256_16": "c8c54b0e1ae8c13f",
                "codeword174_sha256_16": "283f17c6b9b19017"
              },
              {
                "message_flip_indices": [
                  47,
                  24,
                  69
                ],
                "parity_flip_indices": [
                  92,
                  93,
                  94,
                  95,
                  99,
                  100,
                  101,
                  102,
                  105,
                  108,
                  109,
                  110,
                  123,
                  124,
                  129,
                  134,
                  135,
                  136,
                  138,
                  141,
                  142,
                  143,
                  145,
                  146,
                  153,
                  154,
                  158,
                  159,
                  160,
                  161,
                  162,
                  164,
                  165,
                  166,
                  167,
                  170,
                  172
                ],
                "all_flip_indices": [
                  47,
                  24,
                  69,
                  92,
                  93,
                  94,
                  95,
                  99,
                  100,
                  101,
                  102,
                  105,
                  108,
                  109,
                  110,
                  123,
                  124,
                  129,
                  134,
                  135,
                  136,
                  138,
                  141,
                  142,
                  143,
                  145,
                  146,
                  153,
                  154,
                  158,
                  159,
                  160,
                  161,
                  162,
                  164,
                  165,
                  166,
                  167,
                  170,
                  172
                ],
                "message_flip_count": 3,
                "parity_flip_count": 37,
                "total_flip_count": 40,
                "message_flip_cost": 0.429542,
                "parity_flip_cost": 33.702714,
                "total_reliability_cost": 34.132256,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001001100000000000010001000010000010000000000000000100000000101000100110",
                "message91_sha256_16": "937bbbe6622a93b8",
                "codeword174_sha256_16": "24013711efc6e35f"
              }
            ],
            "warning": "Syndrome closure can always form a codeword by parity repair; this is only a ranked candidate generator until JS8 message unpack/CRC validates a candidate."
          }
        },
        "best_hard_repair_probe": {
          "ok": true,
          "initial_syndrome_weight": 22,
          "best_syndrome_weight": 21,
          "best_flip_indices": [
            91
          ],
          "best_flip_count": 1,
          "pool_size": 18,
          "max_depth": 2,
          "probes": 171,
          "valid_codeword_hard_decision": false,
          "message91_sha256_16": "d4ca2a05f15dd009",
          "codeword174_sha256_16": "4cf9e06f787f90f7"
        },
        "best_syndrome_closure_repair_probe": {
          "ok": true,
          "diagnostic_only": true,
          "method": "systematic_syndrome_closure_ranked_by_llr_cost",
          "initial_syndrome_weight": 22,
          "initial_unsatisfied_checks": [
            0,
            3,
            4,
            12,
            14,
            17,
            27,
            30,
            31,
            33,
            34,
            36,
            38,
            44,
            45,
            46,
            51,
            61,
            62,
            68,
            77,
            81
          ],
          "message_pool_size": 18,
          "message_pool_indices": [
            8,
            80,
            29,
            60,
            32,
            4,
            37,
            67,
            19,
            64,
            52,
            47,
            54,
            24,
            79,
            69,
            70,
            90
          ],
          "max_message_depth": 3,
          "evaluated_candidates": 988,
          "best": {
            "message_flip_indices": [
              29,
              52,
              24
            ],
            "parity_flip_indices": [
              93,
              95,
              96,
              99,
              101,
              102,
              104,
              106,
              111,
              113,
              117,
              123,
              125,
              127,
              128,
              129,
              131,
              133,
              134,
              135,
              141,
              147,
              149,
              159,
              160,
              161,
              162,
              163,
              166,
              170,
              171
            ],
            "all_flip_indices": [
              29,
              52,
              24,
              93,
              95,
              96,
              99,
              101,
              102,
              104,
              106,
              111,
              113,
              117,
              123,
              125,
              127,
              128,
              129,
              131,
              133,
              134,
              135,
              141,
              147,
              149,
              159,
              160,
              161,
              162,
              163,
              166,
              170,
              171
            ],
            "message_flip_count": 3,
            "parity_flip_count": 31,
            "total_flip_count": 34,
            "message_flip_cost": 0.200562,
            "parity_flip_cost": 26.763065,
            "total_reliability_cost": 26.963627,
            "closed_syndrome_weight": 999,
            "valid_codeword_hard_decision": true,
            "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
            "message91_sha256_16": "4969d515d475345c",
            "codeword174_sha256_16": "5eb7a37dfa462a9d"
          },
          "top_candidates": [
            {
              "message_flip_indices": [
                29,
                52,
                24
              ],
              "parity_flip_indices": [
                93,
                95,
                96,
                99,
                101,
                102,
                104,
                106,
                111,
                113,
                117,
                123,
                125,
                127,
                128,
                129,
                131,
                133,
                134,
                135,
                141,
                147,
                149,
                159,
                160,
                161,
                162,
                163,
                166,
                170,
                171
              ],
              "all_flip_indices": [
                29,
                52,
                24,
                93,
                95,
                96,
                99,
                101,
                102,
                104,
                106,
                111,
                113,
                117,
                123,
                125,
                127,
                128,
                129,
                131,
                133,
                134,
                135,
                141,
                147,
                149,
                159,
                160,
                161,
                162,
                163,
                166,
                170,
                171
              ],
              "message_flip_count": 3,
              "parity_flip_count": 31,
              "total_flip_count": 34,
              "message_flip_cost": 0.200562,
              "parity_flip_cost": 26.763065,
              "total_reliability_cost": 26.963627,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
              "message91_sha256_16": "4969d515d475345c",
              "codeword174_sha256_16": "5eb7a37dfa462a9d"
            },
            {
              "message_flip_indices": [],
              "parity_flip_indices": [
                91,
                94,
                95,
                103,
                105,
                108,
                118,
                121,
                122,
                124,
                125,
                127,
                129,
                135,
                136,
                137,
                142,
                152,
                153,
                159,
                168,
                172
              ],
              "all_flip_indices": [
                91,
                94,
                95,
                103,
                105,
                108,
                118,
                121,
                122,
                124,
                125,
                127,
                129,
                135,
                136,
                137,
                142,
                152,
                153,
                159,
                168,
                172
              ],
              "message_flip_count": 0,
              "parity_flip_count": 22,
              "total_flip_count": 22,
              "message_flip_cost": 0.0,
              "parity_flip_cost": 30.00735,
              "total_reliability_cost": 30.00735,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "ceaa20e1644a6624"
            },
            {
              "message_flip_indices": [
                32,
                54,
                69
              ],
              "parity_flip_indices": [
                91,
                92,
                93,
                100,
                101,
                104,
                105,
                106,
                109,
                112,
                115,
                116,
                118,
                120,
                127,
                134,
                136,
                138,
                140,
                145,
                151,
                158,
                167,
                168,
                172
              ],
              "all_flip_indices": [
                32,
                54,
                69,
                91,
                92,
                93,
                100,
                101,
                104,
                105,
                106,
                109,
                112,
                115,
                116,
                118,
                120,
                127,
                134,
                136,
                138,
                140,
                145,
                151,
                158,
                167,
                168,
                172
              ],
              "message_flip_count": 3,
              "parity_flip_count": 25,
              "total_flip_count": 28,
              "message_flip_cost": 0.356944,
              "parity_flip_cost": 29.730529,
              "total_reliability_cost": 30.087473,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000010000010001000000000011000000000000000100000000101000100110",
              "message91_sha256_16": "c7b3956c1566b60c",
              "codeword174_sha256_16": "c674187693259e74"
            },
            {
              "message_flip_indices": [
                4,
                19,
                64
              ],
              "parity_flip_indices": [
                91,
                101,
                102,
                106,
                110,
                111,
                112,
                113,
                117,
                118,
                120,
                126,
                128,
                129,
                135,
                138,
                142,
                143,
                145,
                146,
                147,
                150,
                154,
                157,
                159,
                160,
                161,
                162,
                165,
                171,
                172
              ],
              "all_flip_indices": [
                4,
                19,
                64,
                91,
                101,
                102,
                106,
                110,
                111,
                112,
                113,
                117,
                118,
                120,
                126,
                128,
                129,
                135,
                138,
                142,
                143,
                145,
                146,
                147,
                150,
                154,
                157,
                159,
                160,
                161,
                162,
                165,
                171,
                172
              ],
              "message_flip_count": 3,
              "parity_flip_count": 31,
              "total_flip_count": 34,
              "message_flip_cost": 0.101419,
              "parity_flip_cost": 31.795027,
              "total_reliability_cost": 31.896446,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000100100000001000101000100000000000010001000000000010000000000100001100000000101000100110",
              "message91_sha256_16": "a2c47af107dec776",
              "codeword174_sha256_16": "8b5ec7d6029ef1fa"
            },
            {
              "message_flip_indices": [
                8,
                80,
                54
              ],
              "parity_flip_indices": [
                93,
                95,
                96,
                97,
                99,
                100,
                102,
                106,
                107,
                108,
                112,
                118,
                123,
                125,
                127,
                129,
                130,
                131,
                134,
                135,
                136,
                138,
                141,
                144,
                149,
                153,
                155,
                160,
                161,
                162,
                167,
                170,
                172
              ],
              "all_flip_indices": [
                8,
                80,
                54,
                93,
                95,
                96,
                97,
                99,
                100,
                102,
                106,
                107,
                108,
                112,
                118,
                123,
                125,
                127,
                129,
                130,
                131,
                134,
                135,
                136,
                138,
                141,
                144,
                149,
                153,
                155,
                160,
                161,
                162,
                167,
                170,
                172
              ],
              "message_flip_count": 3,
              "parity_flip_count": 33,
              "total_flip_count": 36,
              "message_flip_cost": 0.112312,
              "parity_flip_cost": 31.909172,
              "total_reliability_cost": 32.021484,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000110000001000001000100000000000010001000000000011000000000000001100000000111000100110",
              "message91_sha256_16": "53280bfeb41c2e78",
              "codeword174_sha256_16": "da214f762455b3fd"
            },
            {
              "message_flip_indices": [
                24
              ],
              "parity_flip_indices": [
                91,
                94,
                96,
                97,
                98,
                99,
                104,
                105,
                106,
                107,
                108,
                113,
                115,
                116,
                118,
                122,
                124,
                125,
                126,
                133,
                134,
                135,
                138,
                141,
                146,
                150,
                153,
                154,
                156,
                157,
                163,
                164,
                170
              ],
              "all_flip_indices": [
                24,
                91,
                94,
                96,
                97,
                98,
                99,
                104,
                105,
                106,
                107,
                108,
                113,
                115,
                116,
                118,
                122,
                124,
                125,
                126,
                133,
                134,
                135,
                138,
                141,
                146,
                150,
                153,
                154,
                156,
                157,
                163,
                164,
                170
              ],
              "message_flip_count": 1,
              "parity_flip_count": 33,
              "total_flip_count": 34,
              "message_flip_cost": 0.120611,
              "parity_flip_cost": 32.322615,
              "total_reliability_cost": 32.443226,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001001100000000000010001000000000010000000000000001100000000101000100110",
              "message91_sha256_16": "7b4f0bbb486c2729",
              "codeword174_sha256_16": "c60be927dc9a8795"
            },
            {
              "message_flip_indices": [
                67,
                54,
                79
              ],
              "parity_flip_indices": [
                94,
                96,
                100,
                103,
                105,
                108,
                112,
                116,
                118,
                122,
                124,
                125,
                127,
                128,
                133,
                134,
                135,
                140,
                141,
                146,
                147,
                150,
                152,
                153,
                154,
                157,
                169,
                172,
                173
              ],
              "all_flip_indices": [
                67,
                54,
                79,
                94,
                96,
                100,
                103,
                105,
                108,
                112,
                116,
                118,
                122,
                124,
                125,
                127,
                128,
                133,
                134,
                135,
                140,
                141,
                146,
                147,
                150,
                152,
                153,
                154,
                157,
                169,
                172,
                173
              ],
              "message_flip_count": 3,
              "parity_flip_count": 29,
              "total_flip_count": 32,
              "message_flip_cost": 0.334,
              "parity_flip_cost": 32.688588,
              "total_reliability_cost": 33.022588,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000000000010001000000000011000000000000101100000000001000100110",
              "message91_sha256_16": "ea6738f37fdd0bca",
              "codeword174_sha256_16": "e64696234a9e9700"
            },
            {
              "message_flip_indices": [
                8,
                4
              ],
              "parity_flip_indices": [
                91,
                93,
                95,
                101,
                103,
                110,
                112,
                117,
                118,
                123,
                125,
                126,
                127,
                129,
                135,
                137,
                140,
                141,
                143,
                145,
                149,
                152,
                154,
                156,
                160,
                168,
                172,
                173
              ],
              "all_flip_indices": [
                8,
                4,
                91,
                93,
                95,
                101,
                103,
                110,
                112,
                117,
                118,
                123,
                125,
                126,
                127,
                129,
                135,
                137,
                140,
                141,
                143,
                145,
                149,
                152,
                154,
                156,
                160,
                168,
                172,
                173
              ],
              "message_flip_count": 2,
              "parity_flip_count": 28,
              "total_flip_count": 30,
              "message_flip_cost": 0.020221,
              "parity_flip_cost": 33.270029,
              "total_reliability_cost": 33.29025,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000100110000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "message91_sha256_16": "36258d9d38b0281f",
              "codeword174_sha256_16": "cb03d310703a3bef"
            },
            {
              "message_flip_indices": [
                80,
                32
              ],
              "parity_flip_indices": [
                95,
                97,
                99,
                100,
                102,
                103,
                108,
                109,
                121,
                123,
                124,
                126,
                127,
                128,
                129,
                133,
                141,
                142,
                143,
                148,
                151,
                155,
                157,
                159,
                160,
                163,
                165,
                166,
                167,
                168,
                170,
                171
              ],
              "all_flip_indices": [
                80,
                32,
                95,
                97,
                99,
                100,
                102,
                103,
                108,
                109,
                121,
                123,
                124,
                126,
                127,
                128,
                129,
                133,
                141,
                142,
                143,
                148,
                151,
                155,
                157,
                159,
                160,
                163,
                165,
                166,
                167,
                168,
                170,
                171
              ],
              "message_flip_count": 2,
              "parity_flip_count": 32,
              "total_flip_count": 34,
              "message_flip_cost": 0.01723,
              "parity_flip_cost": 33.416528,
              "total_reliability_cost": 33.433758,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000010000010001000000000010000000000000001100000000111000100110",
              "message91_sha256_16": "d1dd1f00eea52156",
              "codeword174_sha256_16": "4529cc6ea45b8c15"
            },
            {
              "message_flip_indices": [
                37,
                52,
                54
              ],
              "parity_flip_indices": [
                93,
                95,
                96,
                98,
                99,
                100,
                102,
                106,
                107,
                108,
                111,
                112,
                116,
                118,
                120,
                123,
                125,
                127,
                130,
                133,
                134,
                135,
                136,
                138,
                141,
                144,
                154,
                155,
                160,
                161,
                165,
                167,
                170
              ],
              "all_flip_indices": [
                37,
                52,
                54,
                93,
                95,
                96,
                98,
                99,
                100,
                102,
                106,
                107,
                108,
                111,
                112,
                116,
                118,
                120,
                123,
                125,
                127,
                130,
                133,
                134,
                135,
                136,
                138,
                141,
                144,
                154,
                155,
                160,
                161,
                165,
                167,
                170
              ],
              "message_flip_count": 3,
              "parity_flip_count": 33,
              "total_flip_count": 36,
              "message_flip_cost": 0.212962,
              "parity_flip_cost": 33.260317,
              "total_reliability_cost": 33.473279,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000000000110001000000000111000000000000001100000000101000100110",
              "message91_sha256_16": "f89221702d6c6b08",
              "codeword174_sha256_16": "17b3bb4d1d83b9f3"
            },
            {
              "message_flip_indices": [
                80,
                69,
                90
              ],
              "parity_flip_indices": [
                91,
                93,
                95,
                97,
                99,
                100,
                101,
                102,
                103,
                106,
                109,
                110,
                113,
                117,
                124,
                125,
                133,
                135,
                137,
                140,
                146,
                149,
                153,
                154,
                157,
                160,
                161,
                163,
                164,
                165,
                166,
                167,
                168,
                170,
                173
              ],
              "all_flip_indices": [
                80,
                69,
                90,
                91,
                93,
                95,
                97,
                99,
                100,
                101,
                102,
                103,
                106,
                109,
                110,
                113,
                117,
                124,
                125,
                133,
                135,
                137,
                140,
                146,
                149,
                153,
                154,
                157,
                160,
                161,
                163,
                164,
                165,
                166,
                167,
                168,
                170,
                173
              ],
              "message_flip_count": 3,
              "parity_flip_count": 35,
              "total_flip_count": 38,
              "message_flip_cost": 0.520175,
              "parity_flip_cost": 33.163717,
              "total_reliability_cost": 33.683892,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000000100000000111000100111",
              "message91_sha256_16": "c8c54b0e1ae8c13f",
              "codeword174_sha256_16": "283f17c6b9b19017"
            },
            {
              "message_flip_indices": [
                47,
                24,
                69
              ],
              "parity_flip_indices": [
                92,
                93,
                94,
                95,
                99,
                100,
                101,
                102,
                105,
                108,
                109,
                110,
                123,
                124,
                129,
                134,
                135,
                136,
                138,
                141,
                142,
                143,
                145,
                146,
                153,
                154,
                158,
                159,
                160,
                161,
                162,
                164,
                165,
                166,
                167,
                170,
                172
              ],
              "all_flip_indices": [
                47,
                24,
                69,
                92,
                93,
                94,
                95,
                99,
                100,
                101,
                102,
                105,
                108,
                109,
                110,
                123,
                124,
                129,
                134,
                135,
                136,
                138,
                141,
                142,
                143,
                145,
                146,
                153,
                154,
                158,
                159,
                160,
                161,
                162,
                164,
                165,
                166,
                167,
                170,
                172
              ],
              "message_flip_count": 3,
              "parity_flip_count": 37,
              "total_flip_count": 40,
              "message_flip_cost": 0.429542,
              "parity_flip_cost": 33.702714,
              "total_reliability_cost": 34.132256,
              "closed_syndrome_weight": 999,
              "valid_codeword_hard_decision": true,
              "message91": "0000000100000001000001001100000000000010001000010000010000000000000000100000000101000100110",
              "message91_sha256_16": "937bbbe6622a93b8",
              "codeword174_sha256_16": "24013711efc6e35f"
            }
          ],
          "warning": "Syndrome closure can always form a codeword by parity repair; this is only a ranked candidate generator until JS8 message unpack/CRC validates a candidate."
        },
        "soft_decode_results": [
          {
            "variant": "step43_timing_sweep_best_syndrome_row",
            "transform": "direct_timing_sweep_primary",
            "mapping_meta": {
              "direct_timing_sweep_primary": true,
              "source_mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "source_transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "source_variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver"
            },
            "decoder_trial": {
              "llr_scale": 0.75,
              "alpha": 0.7
            },
            "source_rank_score": 3105.166392,
            "source_llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            },
            "success": false,
            "iterations_used": 32,
            "final_syndrome_weight": 33,
            "message91": null,
            "message91_sha256_16": "f36bdab26772186a",
            "codeword174_sha256_16": "96bf7b01bb067d48",
            "trace": [
              {
                "iteration": 0,
                "syndrome_weight": 43
              },
              {
                "iteration": 1,
                "syndrome_weight": 40
              },
              {
                "iteration": 2,
                "syndrome_weight": 42
              },
              {
                "iteration": 3,
                "syndrome_weight": 37
              },
              {
                "iteration": 4,
                "syndrome_weight": 40
              },
              {
                "iteration": 5,
                "syndrome_weight": 39
              },
              {
                "iteration": 6,
                "syndrome_weight": 48
              },
              {
                "iteration": 7,
                "syndrome_weight": 37
              },
              {
                "iteration": 8,
                "syndrome_weight": 41
              },
              {
                "iteration": 9,
                "syndrome_weight": 39
              },
              {
                "iteration": 10,
                "syndrome_weight": 44
              },
              {
                "iteration": 15,
                "syndrome_weight": 40
              },
              {
                "iteration": 20,
                "syndrome_weight": 44
              },
              {
                "iteration": 25,
                "syndrome_weight": 45
              },
              {
                "iteration": 30,
                "syndrome_weight": 41
              }
            ],
            "hard_repair_probe": {
              "ok": true,
              "initial_syndrome_weight": 22,
              "best_syndrome_weight": 21,
              "best_flip_indices": [
                91
              ],
              "best_flip_count": 1,
              "pool_size": 18,
              "max_depth": 2,
              "probes": 171,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "4cf9e06f787f90f7"
            },
            "syndrome_closure_repair_probe": {
              "ok": true,
              "diagnostic_only": true,
              "method": "systematic_syndrome_closure_ranked_by_llr_cost",
              "initial_syndrome_weight": 22,
              "initial_unsatisfied_checks": [
                0,
                3,
                4,
                12,
                14,
                17,
                27,
                30,
                31,
                33,
                34,
                36,
                38,
                44,
                45,
                46,
                51,
                61,
                62,
                68,
                77,
                81
              ],
              "message_pool_size": 18,
              "message_pool_indices": [
                8,
                80,
                29,
                60,
                32,
                4,
                37,
                67,
                19,
                64,
                52,
                47,
                54,
                24,
                79,
                69,
                70,
                90
              ],
              "max_message_depth": 3,
              "evaluated_candidates": 988,
              "best": {
                "message_flip_indices": [
                  29,
                  52,
                  24
                ],
                "parity_flip_indices": [
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "all_flip_indices": [
                  29,
                  52,
                  24,
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "message_flip_count": 3,
                "parity_flip_count": 31,
                "total_flip_count": 34,
                "message_flip_cost": 0.200562,
                "parity_flip_cost": 26.763065,
                "total_reliability_cost": 26.963627,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
                "message91_sha256_16": "4969d515d475345c",
                "codeword174_sha256_16": "5eb7a37dfa462a9d"
              },
              "top_candidates": [
                {
                  "message_flip_indices": [
                    29,
                    52,
                    24
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    99,
                    101,
                    102,
                    104,
                    106,
                    111,
                    113,
                    117,
                    123,
                    125,
                    127,
                    128,
                    129,
                    131,
                    133,
                    134,
                    135,
                    141,
                    147,
                    149,
                    159,
                    160,
                    161,
                    162,
                    163,
                    166,
                    170,
                    171
                  ],
                  "all_flip_indices": [
                    29,
                    52,
                    24,
                    93,
                    95,
                    96,
                    99,
                    101,
                    102,
                    104,
                    106,
                    111,
                    113,
                    117,
                    123,
                    125,
                    127,
                    128,
                    129,
                    131,
                    133,
                    134,
                    135,
                    141,
                    147,
                    149,
                    159,
                    160,
                    161,
                    162,
                    163,
                    166,
                    170,
                    171
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 31,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.200562,
                  "parity_flip_cost": 26.763065,
                  "total_reliability_cost": 26.963627,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
                  "message91_sha256_16": "4969d515d475345c",
                  "codeword174_sha256_16": "5eb7a37dfa462a9d"
                },
                {
                  "message_flip_indices": [],
                  "parity_flip_indices": [
                    91,
                    94,
                    95,
                    103,
                    105,
                    108,
                    118,
                    121,
                    122,
                    124,
                    125,
                    127,
                    129,
                    135,
                    136,
                    137,
                    142,
                    152,
                    153,
                    159,
                    168,
                    172
                  ],
                  "all_flip_indices": [
                    91,
                    94,
                    95,
                    103,
                    105,
                    108,
                    118,
                    121,
                    122,
                    124,
                    125,
                    127,
                    129,
                    135,
                    136,
                    137,
                    142,
                    152,
                    153,
                    159,
                    168,
                    172
                  ],
                  "message_flip_count": 0,
                  "parity_flip_count": 22,
                  "total_flip_count": 22,
                  "message_flip_cost": 0.0,
                  "parity_flip_cost": 30.00735,
                  "total_reliability_cost": 30.00735,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "d4ca2a05f15dd009",
                  "codeword174_sha256_16": "ceaa20e1644a6624"
                },
                {
                  "message_flip_indices": [
                    32,
                    54,
                    69
                  ],
                  "parity_flip_indices": [
                    91,
                    92,
                    93,
                    100,
                    101,
                    104,
                    105,
                    106,
                    109,
                    112,
                    115,
                    116,
                    118,
                    120,
                    127,
                    134,
                    136,
                    138,
                    140,
                    145,
                    151,
                    158,
                    167,
                    168,
                    172
                  ],
                  "all_flip_indices": [
                    32,
                    54,
                    69,
                    91,
                    92,
                    93,
                    100,
                    101,
                    104,
                    105,
                    106,
                    109,
                    112,
                    115,
                    116,
                    118,
                    120,
                    127,
                    134,
                    136,
                    138,
                    140,
                    145,
                    151,
                    158,
                    167,
                    168,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 25,
                  "total_flip_count": 28,
                  "message_flip_cost": 0.356944,
                  "parity_flip_cost": 29.730529,
                  "total_reliability_cost": 30.087473,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000010000010001000000000011000000000000000100000000101000100110",
                  "message91_sha256_16": "c7b3956c1566b60c",
                  "codeword174_sha256_16": "c674187693259e74"
                },
                {
                  "message_flip_indices": [
                    4,
                    19,
                    64
                  ],
                  "parity_flip_indices": [
                    91,
                    101,
                    102,
                    106,
                    110,
                    111,
                    112,
                    113,
                    117,
                    118,
                    120,
                    126,
                    128,
                    129,
                    135,
                    138,
                    142,
                    143,
                    145,
                    146,
                    147,
                    150,
                    154,
                    157,
                    159,
                    160,
                    161,
                    162,
                    165,
                    171,
                    172
                  ],
                  "all_flip_indices": [
                    4,
                    19,
                    64,
                    91,
                    101,
                    102,
                    106,
                    110,
                    111,
                    112,
                    113,
                    117,
                    118,
                    120,
                    126,
                    128,
                    129,
                    135,
                    138,
                    142,
                    143,
                    145,
                    146,
                    147,
                    150,
                    154,
                    157,
                    159,
                    160,
                    161,
                    162,
                    165,
                    171,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 31,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.101419,
                  "parity_flip_cost": 31.795027,
                  "total_reliability_cost": 31.896446,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000100100000001000101000100000000000010001000000000010000000000100001100000000101000100110",
                  "message91_sha256_16": "a2c47af107dec776",
                  "codeword174_sha256_16": "8b5ec7d6029ef1fa"
                },
                {
                  "message_flip_indices": [
                    8,
                    80,
                    54
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    97,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    112,
                    118,
                    123,
                    125,
                    127,
                    129,
                    130,
                    131,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    149,
                    153,
                    155,
                    160,
                    161,
                    162,
                    167,
                    170,
                    172
                  ],
                  "all_flip_indices": [
                    8,
                    80,
                    54,
                    93,
                    95,
                    96,
                    97,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    112,
                    118,
                    123,
                    125,
                    127,
                    129,
                    130,
                    131,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    149,
                    153,
                    155,
                    160,
                    161,
                    162,
                    167,
                    170,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 33,
                  "total_flip_count": 36,
                  "message_flip_cost": 0.112312,
                  "parity_flip_cost": 31.909172,
                  "total_reliability_cost": 32.021484,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000110000001000001000100000000000010001000000000011000000000000001100000000111000100110",
                  "message91_sha256_16": "53280bfeb41c2e78",
                  "codeword174_sha256_16": "da214f762455b3fd"
                },
                {
                  "message_flip_indices": [
                    24
                  ],
                  "parity_flip_indices": [
                    91,
                    94,
                    96,
                    97,
                    98,
                    99,
                    104,
                    105,
                    106,
                    107,
                    108,
                    113,
                    115,
                    116,
                    118,
                    122,
                    124,
                    125,
                    126,
                    133,
                    134,
                    135,
                    138,
                    141,
                    146,
                    150,
                    153,
                    154,
                    156,
                    157,
                    163,
                    164,
                    170
                  ],
                  "all_flip_indices": [
                    24,
                    91,
                    94,
                    96,
                    97,
                    98,
                    99,
                    104,
                    105,
                    106,
                    107,
                    108,
                    113,
                    115,
                    116,
                    118,
                    122,
                    124,
                    125,
                    126,
                    133,
                    134,
                    135,
                    138,
                    141,
                    146,
                    150,
                    153,
                    154,
                    156,
                    157,
                    163,
                    164,
                    170
                  ],
                  "message_flip_count": 1,
                  "parity_flip_count": 33,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.120611,
                  "parity_flip_cost": 32.322615,
                  "total_reliability_cost": 32.443226,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "7b4f0bbb486c2729",
                  "codeword174_sha256_16": "c60be927dc9a8795"
                },
                {
                  "message_flip_indices": [
                    67,
                    54,
                    79
                  ],
                  "parity_flip_indices": [
                    94,
                    96,
                    100,
                    103,
                    105,
                    108,
                    112,
                    116,
                    118,
                    122,
                    124,
                    125,
                    127,
                    128,
                    133,
                    134,
                    135,
                    140,
                    141,
                    146,
                    147,
                    150,
                    152,
                    153,
                    154,
                    157,
                    169,
                    172,
                    173
                  ],
                  "all_flip_indices": [
                    67,
                    54,
                    79,
                    94,
                    96,
                    100,
                    103,
                    105,
                    108,
                    112,
                    116,
                    118,
                    122,
                    124,
                    125,
                    127,
                    128,
                    133,
                    134,
                    135,
                    140,
                    141,
                    146,
                    147,
                    150,
                    152,
                    153,
                    154,
                    157,
                    169,
                    172,
                    173
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 29,
                  "total_flip_count": 32,
                  "message_flip_cost": 0.334,
                  "parity_flip_cost": 32.688588,
                  "total_reliability_cost": 33.022588,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000011000000000000101100000000001000100110",
                  "message91_sha256_16": "ea6738f37fdd0bca",
                  "codeword174_sha256_16": "e64696234a9e9700"
                },
                {
                  "message_flip_indices": [
                    8,
                    4
                  ],
                  "parity_flip_indices": [
                    91,
                    93,
                    95,
                    101,
                    103,
                    110,
                    112,
                    117,
                    118,
                    123,
                    125,
                    126,
                    127,
                    129,
                    135,
                    137,
                    140,
                    141,
                    143,
                    145,
                    149,
                    152,
                    154,
                    156,
                    160,
                    168,
                    172,
                    173
                  ],
                  "all_flip_indices": [
                    8,
                    4,
                    91,
                    93,
                    95,
                    101,
                    103,
                    110,
                    112,
                    117,
                    118,
                    123,
                    125,
                    126,
                    127,
                    129,
                    135,
                    137,
                    140,
                    141,
                    143,
                    145,
                    149,
                    152,
                    154,
                    156,
                    160,
                    168,
                    172,
                    173
                  ],
                  "message_flip_count": 2,
                  "parity_flip_count": 28,
                  "total_flip_count": 30,
                  "message_flip_cost": 0.020221,
                  "parity_flip_cost": 33.270029,
                  "total_reliability_cost": 33.29025,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000100110000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "36258d9d38b0281f",
                  "codeword174_sha256_16": "cb03d310703a3bef"
                },
                {
                  "message_flip_indices": [
                    80,
                    32
                  ],
                  "parity_flip_indices": [
                    95,
                    97,
                    99,
                    100,
                    102,
                    103,
                    108,
                    109,
                    121,
                    123,
                    124,
                    126,
                    127,
                    128,
                    129,
                    133,
                    141,
                    142,
                    143,
                    148,
                    151,
                    155,
                    157,
                    159,
                    160,
                    163,
                    165,
                    166,
                    167,
                    168,
                    170,
                    171
                  ],
                  "all_flip_indices": [
                    80,
                    32,
                    95,
                    97,
                    99,
                    100,
                    102,
                    103,
                    108,
                    109,
                    121,
                    123,
                    124,
                    126,
                    127,
                    128,
                    129,
                    133,
                    141,
                    142,
                    143,
                    148,
                    151,
                    155,
                    157,
                    159,
                    160,
                    163,
                    165,
                    166,
                    167,
                    168,
                    170,
                    171
                  ],
                  "message_flip_count": 2,
                  "parity_flip_count": 32,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.01723,
                  "parity_flip_cost": 33.416528,
                  "total_reliability_cost": 33.433758,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000010000010001000000000010000000000000001100000000111000100110",
                  "message91_sha256_16": "d1dd1f00eea52156",
                  "codeword174_sha256_16": "4529cc6ea45b8c15"
                },
                {
                  "message_flip_indices": [
                    37,
                    52,
                    54
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    98,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    111,
                    112,
                    116,
                    118,
                    120,
                    123,
                    125,
                    127,
                    130,
                    133,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    154,
                    155,
                    160,
                    161,
                    165,
                    167,
                    170
                  ],
                  "all_flip_indices": [
                    37,
                    52,
                    54,
                    93,
                    95,
                    96,
                    98,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    111,
                    112,
                    116,
                    118,
                    120,
                    123,
                    125,
                    127,
                    130,
                    133,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    154,
                    155,
                    160,
                    161,
                    165,
                    167,
                    170
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 33,
                  "total_flip_count": 36,
                  "message_flip_cost": 0.212962,
                  "parity_flip_cost": 33.260317,
                  "total_reliability_cost": 33.473279,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000110001000000000111000000000000001100000000101000100110",
                  "message91_sha256_16": "f89221702d6c6b08",
                  "codeword174_sha256_16": "17b3bb4d1d83b9f3"
                },
                {
                  "message_flip_indices": [
                    80,
                    69,
                    90
                  ],
                  "parity_flip_indices": [
                    91,
                    93,
                    95,
                    97,
                    99,
                    100,
                    101,
                    102,
                    103,
                    106,
                    109,
                    110,
                    113,
                    117,
                    124,
                    125,
                    133,
                    135,
                    137,
                    140,
                    146,
                    149,
                    153,
                    154,
                    157,
                    160,
                    161,
                    163,
                    164,
                    165,
                    166,
                    167,
                    168,
                    170,
                    173
                  ],
                  "all_flip_indices": [
                    80,
                    69,
                    90,
                    91,
                    93,
                    95,
                    97,
                    99,
                    100,
                    101,
                    102,
                    103,
                    106,
                    109,
                    110,
                    113,
                    117,
                    124,
                    125,
                    133,
                    135,
                    137,
                    140,
                    146,
                    149,
                    153,
                    154,
                    157,
                    160,
                    161,
                    163,
                    164,
                    165,
                    166,
                    167,
                    168,
                    170,
                    173
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 35,
                  "total_flip_count": 38,
                  "message_flip_cost": 0.520175,
                  "parity_flip_cost": 33.163717,
                  "total_reliability_cost": 33.683892,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000010000000000000000100000000111000100111",
                  "message91_sha256_16": "c8c54b0e1ae8c13f",
                  "codeword174_sha256_16": "283f17c6b9b19017"
                },
                {
                  "message_flip_indices": [
                    47,
                    24,
                    69
                  ],
                  "parity_flip_indices": [
                    92,
                    93,
                    94,
                    95,
                    99,
                    100,
                    101,
                    102,
                    105,
                    108,
                    109,
                    110,
                    123,
                    124,
                    129,
                    134,
                    135,
                    136,
                    138,
                    141,
                    142,
                    143,
                    145,
                    146,
                    153,
                    154,
                    158,
                    159,
                    160,
                    161,
                    162,
                    164,
                    165,
                    166,
                    167,
                    170,
                    172
                  ],
                  "all_flip_indices": [
                    47,
                    24,
                    69,
                    92,
                    93,
                    94,
                    95,
                    99,
                    100,
                    101,
                    102,
                    105,
                    108,
                    109,
                    110,
                    123,
                    124,
                    129,
                    134,
                    135,
                    136,
                    138,
                    141,
                    142,
                    143,
                    145,
                    146,
                    153,
                    154,
                    158,
                    159,
                    160,
                    161,
                    162,
                    164,
                    165,
                    166,
                    167,
                    170,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 37,
                  "total_flip_count": 40,
                  "message_flip_cost": 0.429542,
                  "parity_flip_cost": 33.702714,
                  "total_reliability_cost": 34.132256,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100000000000010001000010000010000000000000000100000000101000100110",
                  "message91_sha256_16": "937bbbe6622a93b8",
                  "codeword174_sha256_16": "24013711efc6e35f"
                }
              ],
              "warning": "Syndrome closure can always form a codeword by parity repair; this is only a ranked candidate generator until JS8 message unpack/CRC validates a candidate."
            }
          },
          {
            "variant": "step43_timing_sweep_best_syndrome_row",
            "transform": "direct_timing_sweep_primary",
            "mapping_meta": {
              "direct_timing_sweep_primary": true,
              "source_mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "source_transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "source_variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver"
            },
            "decoder_trial": {
              "llr_scale": 1.0,
              "alpha": 0.8
            },
            "source_rank_score": 3105.166392,
            "source_llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            },
            "success": false,
            "iterations_used": 32,
            "final_syndrome_weight": 34,
            "message91": null,
            "message91_sha256_16": "9586359777910051",
            "codeword174_sha256_16": "67141e7930f85c33",
            "trace": [
              {
                "iteration": 0,
                "syndrome_weight": 43
              },
              {
                "iteration": 1,
                "syndrome_weight": 40
              },
              {
                "iteration": 2,
                "syndrome_weight": 42
              },
              {
                "iteration": 3,
                "syndrome_weight": 35
              },
              {
                "iteration": 4,
                "syndrome_weight": 40
              },
              {
                "iteration": 5,
                "syndrome_weight": 36
              },
              {
                "iteration": 6,
                "syndrome_weight": 40
              },
              {
                "iteration": 7,
                "syndrome_weight": 35
              },
              {
                "iteration": 8,
                "syndrome_weight": 37
              },
              {
                "iteration": 9,
                "syndrome_weight": 44
              },
              {
                "iteration": 10,
                "syndrome_weight": 35
              },
              {
                "iteration": 15,
                "syndrome_weight": 42
              },
              {
                "iteration": 20,
                "syndrome_weight": 42
              },
              {
                "iteration": 25,
                "syndrome_weight": 41
              },
              {
                "iteration": 30,
                "syndrome_weight": 39
              }
            ],
            "hard_repair_probe": {
              "ok": true,
              "initial_syndrome_weight": 22,
              "best_syndrome_weight": 21,
              "best_flip_indices": [
                91
              ],
              "best_flip_count": 1,
              "pool_size": 18,
              "max_depth": 2,
              "probes": 171,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "4cf9e06f787f90f7"
            },
            "syndrome_closure_repair_probe": {
              "ok": true,
              "diagnostic_only": true,
              "method": "systematic_syndrome_closure_ranked_by_llr_cost",
              "initial_syndrome_weight": 22,
              "initial_unsatisfied_checks": [
                0,
                3,
                4,
                12,
                14,
                17,
                27,
                30,
                31,
                33,
                34,
                36,
                38,
                44,
                45,
                46,
                51,
                61,
                62,
                68,
                77,
                81
              ],
              "message_pool_size": 18,
              "message_pool_indices": [
                8,
                80,
                29,
                60,
                32,
                4,
                37,
                67,
                19,
                64,
                52,
                47,
                54,
                24,
                79,
                69,
                70,
                90
              ],
              "max_message_depth": 3,
              "evaluated_candidates": 988,
              "best": {
                "message_flip_indices": [
                  29,
                  52,
                  24
                ],
                "parity_flip_indices": [
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "all_flip_indices": [
                  29,
                  52,
                  24,
                  93,
                  95,
                  96,
                  99,
                  101,
                  102,
                  104,
                  106,
                  111,
                  113,
                  117,
                  123,
                  125,
                  127,
                  128,
                  129,
                  131,
                  133,
                  134,
                  135,
                  141,
                  147,
                  149,
                  159,
                  160,
                  161,
                  162,
                  163,
                  166,
                  170,
                  171
                ],
                "message_flip_count": 3,
                "parity_flip_count": 31,
                "total_flip_count": 34,
                "message_flip_cost": 0.200562,
                "parity_flip_cost": 26.763065,
                "total_reliability_cost": 26.963627,
                "closed_syndrome_weight": 999,
                "valid_codeword_hard_decision": true,
                "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
                "message91_sha256_16": "4969d515d475345c",
                "codeword174_sha256_16": "5eb7a37dfa462a9d"
              },
              "top_candidates": [
                {
                  "message_flip_indices": [
                    29,
                    52,
                    24
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    99,
                    101,
                    102,
                    104,
                    106,
                    111,
                    113,
                    117,
                    123,
                    125,
                    127,
                    128,
                    129,
                    131,
                    133,
                    134,
                    135,
                    141,
                    147,
                    149,
                    159,
                    160,
                    161,
                    162,
                    163,
                    166,
                    170,
                    171
                  ],
                  "all_flip_indices": [
                    29,
                    52,
                    24,
                    93,
                    95,
                    96,
                    99,
                    101,
                    102,
                    104,
                    106,
                    111,
                    113,
                    117,
                    123,
                    125,
                    127,
                    128,
                    129,
                    131,
                    133,
                    134,
                    135,
                    141,
                    147,
                    149,
                    159,
                    160,
                    161,
                    162,
                    163,
                    166,
                    170,
                    171
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 31,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.200562,
                  "parity_flip_cost": 26.763065,
                  "total_reliability_cost": 26.963627,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100010000000010001000000000110000000000000001100000000101000100110",
                  "message91_sha256_16": "4969d515d475345c",
                  "codeword174_sha256_16": "5eb7a37dfa462a9d"
                },
                {
                  "message_flip_indices": [],
                  "parity_flip_indices": [
                    91,
                    94,
                    95,
                    103,
                    105,
                    108,
                    118,
                    121,
                    122,
                    124,
                    125,
                    127,
                    129,
                    135,
                    136,
                    137,
                    142,
                    152,
                    153,
                    159,
                    168,
                    172
                  ],
                  "all_flip_indices": [
                    91,
                    94,
                    95,
                    103,
                    105,
                    108,
                    118,
                    121,
                    122,
                    124,
                    125,
                    127,
                    129,
                    135,
                    136,
                    137,
                    142,
                    152,
                    153,
                    159,
                    168,
                    172
                  ],
                  "message_flip_count": 0,
                  "parity_flip_count": 22,
                  "total_flip_count": 22,
                  "message_flip_cost": 0.0,
                  "parity_flip_cost": 30.00735,
                  "total_reliability_cost": 30.00735,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "d4ca2a05f15dd009",
                  "codeword174_sha256_16": "ceaa20e1644a6624"
                },
                {
                  "message_flip_indices": [
                    32,
                    54,
                    69
                  ],
                  "parity_flip_indices": [
                    91,
                    92,
                    93,
                    100,
                    101,
                    104,
                    105,
                    106,
                    109,
                    112,
                    115,
                    116,
                    118,
                    120,
                    127,
                    134,
                    136,
                    138,
                    140,
                    145,
                    151,
                    158,
                    167,
                    168,
                    172
                  ],
                  "all_flip_indices": [
                    32,
                    54,
                    69,
                    91,
                    92,
                    93,
                    100,
                    101,
                    104,
                    105,
                    106,
                    109,
                    112,
                    115,
                    116,
                    118,
                    120,
                    127,
                    134,
                    136,
                    138,
                    140,
                    145,
                    151,
                    158,
                    167,
                    168,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 25,
                  "total_flip_count": 28,
                  "message_flip_cost": 0.356944,
                  "parity_flip_cost": 29.730529,
                  "total_reliability_cost": 30.087473,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000010000010001000000000011000000000000000100000000101000100110",
                  "message91_sha256_16": "c7b3956c1566b60c",
                  "codeword174_sha256_16": "c674187693259e74"
                },
                {
                  "message_flip_indices": [
                    4,
                    19,
                    64
                  ],
                  "parity_flip_indices": [
                    91,
                    101,
                    102,
                    106,
                    110,
                    111,
                    112,
                    113,
                    117,
                    118,
                    120,
                    126,
                    128,
                    129,
                    135,
                    138,
                    142,
                    143,
                    145,
                    146,
                    147,
                    150,
                    154,
                    157,
                    159,
                    160,
                    161,
                    162,
                    165,
                    171,
                    172
                  ],
                  "all_flip_indices": [
                    4,
                    19,
                    64,
                    91,
                    101,
                    102,
                    106,
                    110,
                    111,
                    112,
                    113,
                    117,
                    118,
                    120,
                    126,
                    128,
                    129,
                    135,
                    138,
                    142,
                    143,
                    145,
                    146,
                    147,
                    150,
                    154,
                    157,
                    159,
                    160,
                    161,
                    162,
                    165,
                    171,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 31,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.101419,
                  "parity_flip_cost": 31.795027,
                  "total_reliability_cost": 31.896446,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000100100000001000101000100000000000010001000000000010000000000100001100000000101000100110",
                  "message91_sha256_16": "a2c47af107dec776",
                  "codeword174_sha256_16": "8b5ec7d6029ef1fa"
                },
                {
                  "message_flip_indices": [
                    8,
                    80,
                    54
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    97,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    112,
                    118,
                    123,
                    125,
                    127,
                    129,
                    130,
                    131,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    149,
                    153,
                    155,
                    160,
                    161,
                    162,
                    167,
                    170,
                    172
                  ],
                  "all_flip_indices": [
                    8,
                    80,
                    54,
                    93,
                    95,
                    96,
                    97,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    112,
                    118,
                    123,
                    125,
                    127,
                    129,
                    130,
                    131,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    149,
                    153,
                    155,
                    160,
                    161,
                    162,
                    167,
                    170,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 33,
                  "total_flip_count": 36,
                  "message_flip_cost": 0.112312,
                  "parity_flip_cost": 31.909172,
                  "total_reliability_cost": 32.021484,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000110000001000001000100000000000010001000000000011000000000000001100000000111000100110",
                  "message91_sha256_16": "53280bfeb41c2e78",
                  "codeword174_sha256_16": "da214f762455b3fd"
                },
                {
                  "message_flip_indices": [
                    24
                  ],
                  "parity_flip_indices": [
                    91,
                    94,
                    96,
                    97,
                    98,
                    99,
                    104,
                    105,
                    106,
                    107,
                    108,
                    113,
                    115,
                    116,
                    118,
                    122,
                    124,
                    125,
                    126,
                    133,
                    134,
                    135,
                    138,
                    141,
                    146,
                    150,
                    153,
                    154,
                    156,
                    157,
                    163,
                    164,
                    170
                  ],
                  "all_flip_indices": [
                    24,
                    91,
                    94,
                    96,
                    97,
                    98,
                    99,
                    104,
                    105,
                    106,
                    107,
                    108,
                    113,
                    115,
                    116,
                    118,
                    122,
                    124,
                    125,
                    126,
                    133,
                    134,
                    135,
                    138,
                    141,
                    146,
                    150,
                    153,
                    154,
                    156,
                    157,
                    163,
                    164,
                    170
                  ],
                  "message_flip_count": 1,
                  "parity_flip_count": 33,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.120611,
                  "parity_flip_cost": 32.322615,
                  "total_reliability_cost": 32.443226,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "7b4f0bbb486c2729",
                  "codeword174_sha256_16": "c60be927dc9a8795"
                },
                {
                  "message_flip_indices": [
                    67,
                    54,
                    79
                  ],
                  "parity_flip_indices": [
                    94,
                    96,
                    100,
                    103,
                    105,
                    108,
                    112,
                    116,
                    118,
                    122,
                    124,
                    125,
                    127,
                    128,
                    133,
                    134,
                    135,
                    140,
                    141,
                    146,
                    147,
                    150,
                    152,
                    153,
                    154,
                    157,
                    169,
                    172,
                    173
                  ],
                  "all_flip_indices": [
                    67,
                    54,
                    79,
                    94,
                    96,
                    100,
                    103,
                    105,
                    108,
                    112,
                    116,
                    118,
                    122,
                    124,
                    125,
                    127,
                    128,
                    133,
                    134,
                    135,
                    140,
                    141,
                    146,
                    147,
                    150,
                    152,
                    153,
                    154,
                    157,
                    169,
                    172,
                    173
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 29,
                  "total_flip_count": 32,
                  "message_flip_cost": 0.334,
                  "parity_flip_cost": 32.688588,
                  "total_reliability_cost": 33.022588,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000011000000000000101100000000001000100110",
                  "message91_sha256_16": "ea6738f37fdd0bca",
                  "codeword174_sha256_16": "e64696234a9e9700"
                },
                {
                  "message_flip_indices": [
                    8,
                    4
                  ],
                  "parity_flip_indices": [
                    91,
                    93,
                    95,
                    101,
                    103,
                    110,
                    112,
                    117,
                    118,
                    123,
                    125,
                    126,
                    127,
                    129,
                    135,
                    137,
                    140,
                    141,
                    143,
                    145,
                    149,
                    152,
                    154,
                    156,
                    160,
                    168,
                    172,
                    173
                  ],
                  "all_flip_indices": [
                    8,
                    4,
                    91,
                    93,
                    95,
                    101,
                    103,
                    110,
                    112,
                    117,
                    118,
                    123,
                    125,
                    126,
                    127,
                    129,
                    135,
                    137,
                    140,
                    141,
                    143,
                    145,
                    149,
                    152,
                    154,
                    156,
                    160,
                    168,
                    172,
                    173
                  ],
                  "message_flip_count": 2,
                  "parity_flip_count": 28,
                  "total_flip_count": 30,
                  "message_flip_cost": 0.020221,
                  "parity_flip_cost": 33.270029,
                  "total_reliability_cost": 33.29025,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000100110000001000001000100000000000010001000000000010000000000000001100000000101000100110",
                  "message91_sha256_16": "36258d9d38b0281f",
                  "codeword174_sha256_16": "cb03d310703a3bef"
                },
                {
                  "message_flip_indices": [
                    80,
                    32
                  ],
                  "parity_flip_indices": [
                    95,
                    97,
                    99,
                    100,
                    102,
                    103,
                    108,
                    109,
                    121,
                    123,
                    124,
                    126,
                    127,
                    128,
                    129,
                    133,
                    141,
                    142,
                    143,
                    148,
                    151,
                    155,
                    157,
                    159,
                    160,
                    163,
                    165,
                    166,
                    167,
                    168,
                    170,
                    171
                  ],
                  "all_flip_indices": [
                    80,
                    32,
                    95,
                    97,
                    99,
                    100,
                    102,
                    103,
                    108,
                    109,
                    121,
                    123,
                    124,
                    126,
                    127,
                    128,
                    129,
                    133,
                    141,
                    142,
                    143,
                    148,
                    151,
                    155,
                    157,
                    159,
                    160,
                    163,
                    165,
                    166,
                    167,
                    168,
                    170,
                    171
                  ],
                  "message_flip_count": 2,
                  "parity_flip_count": 32,
                  "total_flip_count": 34,
                  "message_flip_cost": 0.01723,
                  "parity_flip_cost": 33.416528,
                  "total_reliability_cost": 33.433758,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000010000010001000000000010000000000000001100000000111000100110",
                  "message91_sha256_16": "d1dd1f00eea52156",
                  "codeword174_sha256_16": "4529cc6ea45b8c15"
                },
                {
                  "message_flip_indices": [
                    37,
                    52,
                    54
                  ],
                  "parity_flip_indices": [
                    93,
                    95,
                    96,
                    98,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    111,
                    112,
                    116,
                    118,
                    120,
                    123,
                    125,
                    127,
                    130,
                    133,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    154,
                    155,
                    160,
                    161,
                    165,
                    167,
                    170
                  ],
                  "all_flip_indices": [
                    37,
                    52,
                    54,
                    93,
                    95,
                    96,
                    98,
                    99,
                    100,
                    102,
                    106,
                    107,
                    108,
                    111,
                    112,
                    116,
                    118,
                    120,
                    123,
                    125,
                    127,
                    130,
                    133,
                    134,
                    135,
                    136,
                    138,
                    141,
                    144,
                    154,
                    155,
                    160,
                    161,
                    165,
                    167,
                    170
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 33,
                  "total_flip_count": 36,
                  "message_flip_cost": 0.212962,
                  "parity_flip_cost": 33.260317,
                  "total_reliability_cost": 33.473279,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000110001000000000111000000000000001100000000101000100110",
                  "message91_sha256_16": "f89221702d6c6b08",
                  "codeword174_sha256_16": "17b3bb4d1d83b9f3"
                },
                {
                  "message_flip_indices": [
                    80,
                    69,
                    90
                  ],
                  "parity_flip_indices": [
                    91,
                    93,
                    95,
                    97,
                    99,
                    100,
                    101,
                    102,
                    103,
                    106,
                    109,
                    110,
                    113,
                    117,
                    124,
                    125,
                    133,
                    135,
                    137,
                    140,
                    146,
                    149,
                    153,
                    154,
                    157,
                    160,
                    161,
                    163,
                    164,
                    165,
                    166,
                    167,
                    168,
                    170,
                    173
                  ],
                  "all_flip_indices": [
                    80,
                    69,
                    90,
                    91,
                    93,
                    95,
                    97,
                    99,
                    100,
                    101,
                    102,
                    103,
                    106,
                    109,
                    110,
                    113,
                    117,
                    124,
                    125,
                    133,
                    135,
                    137,
                    140,
                    146,
                    149,
                    153,
                    154,
                    157,
                    160,
                    161,
                    163,
                    164,
                    165,
                    166,
                    167,
                    168,
                    170,
                    173
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 35,
                  "total_flip_count": 38,
                  "message_flip_cost": 0.520175,
                  "parity_flip_cost": 33.163717,
                  "total_reliability_cost": 33.683892,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001000100000000000010001000000000010000000000000000100000000111000100111",
                  "message91_sha256_16": "c8c54b0e1ae8c13f",
                  "codeword174_sha256_16": "283f17c6b9b19017"
                },
                {
                  "message_flip_indices": [
                    47,
                    24,
                    69
                  ],
                  "parity_flip_indices": [
                    92,
                    93,
                    94,
                    95,
                    99,
                    100,
                    101,
                    102,
                    105,
                    108,
                    109,
                    110,
                    123,
                    124,
                    129,
                    134,
                    135,
                    136,
                    138,
                    141,
                    142,
                    143,
                    145,
                    146,
                    153,
                    154,
                    158,
                    159,
                    160,
                    161,
                    162,
                    164,
                    165,
                    166,
                    167,
                    170,
                    172
                  ],
                  "all_flip_indices": [
                    47,
                    24,
                    69,
                    92,
                    93,
                    94,
                    95,
                    99,
                    100,
                    101,
                    102,
                    105,
                    108,
                    109,
                    110,
                    123,
                    124,
                    129,
                    134,
                    135,
                    136,
                    138,
                    141,
                    142,
                    143,
                    145,
                    146,
                    153,
                    154,
                    158,
                    159,
                    160,
                    161,
                    162,
                    164,
                    165,
                    166,
                    167,
                    170,
                    172
                  ],
                  "message_flip_count": 3,
                  "parity_flip_count": 37,
                  "total_flip_count": 40,
                  "message_flip_cost": 0.429542,
                  "parity_flip_cost": 33.702714,
                  "total_reliability_cost": 34.132256,
                  "closed_syndrome_weight": 999,
                  "valid_codeword_hard_decision": true,
                  "message91": "0000000100000001000001001100000000000010001000010000010000000000000000100000000101000100110",
                  "message91_sha256_16": "937bbbe6622a93b8",
                  "codeword174_sha256_16": "24013711efc6e35f"
                }
              ],
              "warning": "Syndrome closure can always form a codeword by parity repair; this is only a ranked candidate generator until JS8 message unpack/CRC validates a candidate."
            }
          }
        ],
        "decodes": [],
        "outputs": {
          "ldpc_soft_decode_json": "/decoders/js8_decoder/runtime/ldpc_soft_decode/step43_ldpc_soft_decode.json"
        },
        "warnings": [
          "Step 51 keeps the direct timing-sweep primary row first and adds a bounded syndrome-closure repair candidate generator ranked by LLR reliability cost.",
          "Step 51 syndrome-closure repair is diagnostic only: parity repair can force syndrome zero, so candidates still need JS8 message unpack/CRC validation before they count as real decodes.",
          "This still does not unpack JS8 text or validate CRC/message payloads.",
          "If soft success is true or a syndrome-closure candidate passes future JS8 message/CRC validation, the next step can unpack the 91-bit message. Otherwise continue timing/interleaver/LLR tuning."
        ],
        "next_action": "Inspect best_syndrome_closure_repair_probe.top_candidates. Next step should add bounded JS8 91-bit message unpack/CRC validation for the ranked candidate messages while keeping timing best row unchanged."
      }
    },
    "ldpc_matrix_probe": {
      "name": "20260527T111109Z_ldpc_matrix_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T111109Z_ldpc_matrix_probe_output.json",
      "url": "/logs/20260527T111109Z_ldpc_matrix_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 35253,
        "mtime_utc": "2026-05-27T11:11:11Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-real-ldpc-matrix-syndrome-probe",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": null,
        "candidate_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_best_timing_fec_candidate.json",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step43_bounded_gray_interleaver_matrix_ranking_no_message_unpack",
        "matrix": {
          "code": "(174,91) LDPC generator matrix",
          "generator_rows": 83,
          "generator_cols": 91,
          "message_bits": 91,
          "parity_bits": 83,
          "source_file": "ldpc_174_91_c_generator.f90"
        },
        "bounds": {
          "total_transform_rows_before_limit": 865,
          "max_rows": 72,
          "repair_rows": 10,
          "max_flips": 6,
          "candidate_pool": 12
        },
        "candidate_context": {
          "nsps_used": 6192,
          "nsps_is_js8_realistic": true,
          "selected_profile": null,
          "selected_variant": {
            "name": "step43_timing_sweep_best_syndrome_row",
            "rank_score": 1105.166392,
            "complete_174bit_candidate": true,
            "hard_bits_sha256_16": "95a1e941fbdff6b2",
            "hard_weight_174": 36,
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            }
          }
        },
        "variant_probe_count": 72,
        "best_matrix_probe": {
          "variant": "step43_timing_sweep_best_syndrome_row",
          "transform": "direct_timing_sweep_primary",
          "mapping_meta": {
            "direct_timing_sweep_primary": true,
            "source_mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "source_transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "source_variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver"
          },
          "hard_weight_174": 36,
          "llr_avg_abs": 1001.2915982873564,
          "syndrome": {
            "bits_len": 174,
            "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
            "parity83_observed": "00101000000010010001000000010000110101000000000011100101101000000000001001001000110",
            "parity83_expected": "10110000000000110101000000000011101111100000111011110101101001100000101001001100100",
            "syndrome83": "10011000000010100100000000010011011010100000111000010000000001100000100000000100010",
            "syndrome_weight": 22,
            "valid_codeword_hard_decision": false,
            "message91_sha256_16": "d4ca2a05f15dd009",
            "codeword174_sha256_16": "95a1e941fbdff6b2"
          },
          "repair": {
            "attempted": true,
            "max_flips": 6,
            "candidate_pool": 12,
            "flip_count": 0,
            "repair_success": false,
            "final_syndrome_weight": 22,
            "trace": [],
            "repaired_message91_sha256_16": "d4ca2a05f15dd009"
          }
        },
        "all_matrix_probes": [
          {
            "variant": "step43_timing_sweep_best_syndrome_row",
            "transform": "direct_timing_sweep_primary",
            "mapping_meta": {
              "direct_timing_sweep_primary": true,
              "source_mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "source_transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "source_variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver"
            },
            "hard_weight_174": 36,
            "llr_avg_abs": 1001.2915982873564,
            "syndrome": {
              "bits_len": 174,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "parity83_observed": "00101000000010010001000000010000110101000000000011100101101000000000001001001000110",
              "parity83_expected": "10110000000000110101000000000011101111100000111011110101101001100000101001001100100",
              "syndrome83": "10011000000010100100000000010011011010100000111000010000000001100000100000000100010",
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 22,
              "trace": [],
              "repaired_message91_sha256_16": "d4ca2a05f15dd009"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 36,
            "llr_avg_abs": 1.2915982873563212,
            "syndrome": {
              "bits_len": 174,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "parity83_observed": "00101000000010010001000000010000110101000000000011100101101000000000001001001000110",
              "parity83_expected": "10110000000000110101000000000011101111100000111011110101101001100000101001001100100",
              "syndrome83": "10011000000010100100000000010011011010100000111000010000000001100000100000000100010",
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 22,
              "trace": [],
              "repaired_message91_sha256_16": "d4ca2a05f15dd009"
            }
          },
          {
            "variant": "step43_timing_sweep_best_syndrome_row",
            "transform": "raw_msb+no_interleaver",
            "mapping_meta": {
              "tone_mapping": "raw_msb",
              "interleaver": "none"
            },
            "hard_weight_174": 36,
            "llr_avg_abs": 1.2915982873563212,
            "syndrome": {
              "bits_len": 174,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "parity83_observed": "00101000000010010001000000010000110101000000000011100101101000000000001001001000110",
              "parity83_expected": "10110000000000110101000000000011101111100000111011110101101001100000101001001100100",
              "syndrome83": "10011000000010100100000000010011011010100000111000010000000001100000100000000100010",
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 22,
              "trace": [],
              "repaired_message91_sha256_16": "d4ca2a05f15dd009"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 36,
            "llr_avg_abs": 1.2893225114942535,
            "syndrome": {
              "bits_len": 174,
              "message91": "0000000100000001000001000100000000000010001000000000010000000000000001100000000101000100110",
              "parity83_observed": "00101000000010010001000000010000110101000000000011100101101000000000001001001000110",
              "parity83_expected": "10110000000000110101000000000011101111100000111011110101101001100000101001001100100",
              "syndrome83": "10011000000010100100000000010011011010100000111000010000000001100000100000000100010",
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 22,
              "trace": [],
              "repaired_message91_sha256_16": "d4ca2a05f15dd009"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none"
            },
            "hard_weight_174": 61,
            "llr_avg_abs": 1.1143301551724138,
            "syndrome": {
              "bits_len": 174,
              "message91": "1100001110000000010110010110001010001010000010000001110001100011100110110000001010000010110",
              "parity83_observed": "00110000000011000110011000000110100100001001000110001100110000000011110110000000011",
              "parity83_expected": "00111100101110110000011000110111100101001001000110100101100101001111011111100010011",
              "syndrome83": "00001100101101110110000000110001000001000000000000101001010101001100101001100010000",
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 1,
              "repair_success": false,
              "final_syndrome_weight": 26,
              "trace": [
                {
                  "flip_index": 165,
                  "llr_abs": 0.041242,
                  "gain": 1,
                  "syndrome_weight_after": 26
                }
              ],
              "repaired_message91_sha256_16": "bab866be6de1cc5a"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none"
            },
            "hard_weight_174": 61,
            "llr_avg_abs": 1.0792917931034485,
            "syndrome": {
              "bits_len": 174,
              "message91": "1100001110000000010110010110001010001010000010000001110001100011100110110000001010000010110",
              "parity83_observed": "00110000000011000110011000000110100100001001000110001100110000000011110110000000011",
              "parity83_expected": "00111100101110110000011000110111100101001001000110100101100101001111011111100010011",
              "syndrome83": "00001100101101110110000000110001000001000000000000101001010101001100101001100010000",
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 1,
              "repair_success": false,
              "final_syndrome_weight": 26,
              "trace": [
                {
                  "flip_index": 165,
                  "llr_abs": 0.003629,
                  "gain": 1,
                  "syndrome_weight_after": 26
                }
              ],
              "repaired_message91_sha256_16": "bab866be6de1cc5a"
            }
          },
          {
            "variant": "lab_mask_xor_preview",
            "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "deinterleave_rx_to_codeword",
              "order_len": 174,
              "polarity": "inverted"
            },
            "hard_weight_174": 93,
            "llr_avg_abs": 1.818736224137931,
            "syndrome": {
              "bits_len": 174,
              "message91": "0011110111101100001011010010101110101000011100011010011111110101111100100101100100001011111",
              "parity83_observed": "00000111101100000100100110100110110100001011111101100100011010101010110111110010101",
              "parity83_expected": "00000011100100100100000110110101101100101111110011100101110010110000011100100111000",
              "syndrome83": "00000100001000100000100000010011011000100100001110000001101000011010101011010101101",
              "syndrome_weight": 29,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "4439454e612f6636",
              "codeword174_sha256_16": "953e2bc596e8a67e"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 3,
              "repair_success": false,
              "final_syndrome_weight": 26,
              "trace": [
                {
                  "flip_index": 155,
                  "llr_abs": 0.01702,
                  "gain": 1,
                  "syndrome_weight_after": 28
                },
                {
                  "flip_index": 149,
                  "llr_abs": 0.031568,
                  "gain": 1,
                  "syndrome_weight_after": 27
                },
                {
                  "flip_index": 170,
                  "llr_abs": 0.066433,
                  "gain": 1,
                  "syndrome_weight_after": 26
                }
              ],
              "repaired_message91_sha256_16": "4439454e612f6636"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "lsb_within_each_tone",
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 45,
            "llr_avg_abs": 1.6256335402298847,
            "syndrome": {
              "bits_len": 174,
              "message91": "1100000100110000000101000100000100001110000000001001000010000000001110000010000100100110000",
              "parity83_observed": "00100000000001001000010000010000000011010110001101000000000001100001100000110011010",
              "parity83_expected": "11010000101000001010101011011001000100110100011000010001100001000101110001110011000",
              "syndrome83": "11110000101001000010111011001001000111100010010101010001100000100100010001000000010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 3,
              "repair_success": false,
              "final_syndrome_weight": 28,
              "trace": [
                {
                  "flip_index": 113,
                  "llr_abs": 0.003629,
                  "gain": 1,
                  "syndrome_weight_after": 30
                },
                {
                  "flip_index": 112,
                  "llr_abs": 0.100589,
                  "gain": 1,
                  "syndrome_weight_after": 29
                },
                {
                  "flip_index": 160,
                  "llr_abs": 0.101553,
                  "gain": 1,
                  "syndrome_weight_after": 28
                }
              ],
              "repaired_message91_sha256_16": "1bf4f3a7e6e5f651"
            }
          },
          {
            "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "none"
            },
            "hard_weight_174": 45,
            "llr_avg_abs": 1.6172086091954023,
            "syndrome": {
              "bits_len": 174,
              "message91": "0000000110000001100001100110000000010010001101100000010000000000000000110000000110000000110",
              "parity83_observed": "00010000000101000111000000000000110111000000000001110111001000000000001001011000011",
              "parity83_expected": "01001010101000000111001100000110100111100010000101110001101101110110111011100000011",
              "syndrome83": "01011010101101000000001100000110010000100010000100000110100101110110110010111000000",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "202d2650a31499d7",
              "codeword174_sha256_16": "6c43e3bd22022c79"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 3,
              "repair_success": false,
              "final_syndrome_weight": 28,
              "trace": [
                {
                  "flip_index": 167,
                  "llr_abs": 0.001539,
                  "gain": 1,
                  "syndrome_weight_after": 30
                },
                {
                  "flip_index": 166,
                  "llr_abs": 0.029448,
                  "gain": 1,
                  "syndrome_weight_after": 29
                },
                {
                  "flip_index": 124,
                  "llr_abs": 0.064735,
                  "gain": 1,
                  "syndrome_weight_after": 28
                }
              ],
              "repaired_message91_sha256_16": "202d2650a31499d7"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "lsb_within_each_tone",
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 45,
            "llr_avg_abs": 1.6664229885057469,
            "syndrome": {
              "bits_len": 174,
              "message91": "1100000100110000000101000100000100001110000000001001000010000000001110000010000100100110000",
              "parity83_observed": "00100000000001001000010000010000000011010110001101000000000001100001100000110011010",
              "parity83_expected": "11010000101000001010101011011001000100110100011000010001100001000101110001110011000",
              "syndrome83": "11110000101001000010111011001001000111100010010101010001100000100100010001000000010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            "repair": {
              "attempted": true,
              "max_flips": 6,
              "candidate_pool": 12,
              "flip_count": 2,
              "repair_success": false,
              "final_syndrome_weight": 29,
              "trace": [
                {
                  "flip_index": 113,
                  "llr_abs": 0.041242,
                  "gain": 1,
                  "syndrome_weight_after": 30
                },
                {
                  "flip_index": 112,
                  "llr_abs": 0.103273,
                  "gain": 1,
                  "syndrome_weight_after": 29
                }
              ],
              "repaired_message91_sha256_16": "1bf4f3a7e6e5f651"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none",
              "polarity": "inverted"
            },
            "hard_weight_174": 127,
            "llr_avg_abs": 1.3337297126436785,
            "syndrome": {
              "bits_len": 174,
              "message91": "1111111001111111110011101101111000101111111000010011111111101110011001111111111011101111111",
              "parity83_observed": "11111001100111111110111111100001001100111100110111110111001111100001111110111111111",
              "parity83_expected": "10110001101001101110011110000001101010111101010101010001110111000111101100101000101",
              "syndrome83": "01001000001110010000100001100000100110000001100010100110111000100110010010010111010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "332fb0dabe874c89",
              "codeword174_sha256_16": "b69cc7a7a2c9cfc9"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "332fb0dabe874c89"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none",
              "polarity": "inverted"
            },
            "hard_weight_174": 127,
            "llr_avg_abs": 1.2983798793103447,
            "syndrome": {
              "bits_len": 174,
              "message91": "1111111001111111110011101101111000101111111000010011111111101110011001111111111011101111111",
              "parity83_observed": "11111001100111111110111111100001001100111100110111110111001111100001111110111111111",
              "parity83_expected": "10110001101001101110011110000001101010111101010101010001110111000111101100101000101",
              "syndrome83": "01001000001110010000100001100000100110000001100010100110111000100110010010010111010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "332fb0dabe874c89",
              "codeword174_sha256_16": "b69cc7a7a2c9cfc9"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "332fb0dabe874c89"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none",
              "polarity": "inverted"
            },
            "hard_weight_174": 127,
            "llr_avg_abs": 1.2560504137931032,
            "syndrome": {
              "bits_len": 174,
              "message91": "1111111001111111110011101101111000101111111000010011111111101110011001111111111011101111111",
              "parity83_observed": "11111001100111111110111111100001001100111100110111110111001111100001111110111111111",
              "parity83_expected": "10110001101001101110011110000001101010111101010101010001110111000111101100101000101",
              "syndrome83": "01001000001110010000100001100000100110000001100010100110111000100110010010010111010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "332fb0dabe874c89",
              "codeword174_sha256_16": "b69cc7a7a2c9cfc9"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "332fb0dabe874c89"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "ft8_bitrev",
              "direction": "deinterleave_rx_to_codeword",
              "order_len": 174
            },
            "hard_weight_174": 37,
            "llr_avg_abs": 1.2423823563218392,
            "syndrome": {
              "bits_len": 174,
              "message91": "0100010011001000000000000111000000100000000000010001110000000010000000100000000000011000010",
              "parity83_observed": "01000000000010010010000000100010000110100011000011001010000000000001000000011000001",
              "parity83_expected": "01001001001001100010101001101110001000001011100010111111100001000101001010000000000",
              "syndrome83": "00001001001011110000101001001100001110101000100001110101100001000100001010011000001",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "24f38de55dffa50e",
              "codeword174_sha256_16": "a5cef5b3b7fef29e"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "24f38de55dffa50e"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "none",
              "polarity": "inverted"
            },
            "hard_weight_174": 127,
            "llr_avg_abs": 1.217521729885057,
            "syndrome": {
              "bits_len": 174,
              "message91": "1111111001111111110011101101111000101111111000010011111111101110011001111111111011101111111",
              "parity83_observed": "11111001100111111110111111100001001100111100110111110111001111100001111110111111111",
              "parity83_expected": "10110001101001101110011110000001101010111101010101010001110111000111101100101000101",
              "syndrome83": "01001000001110010000100001100000100110000001100010100110111000100110010010010111010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "332fb0dabe874c89",
              "codeword174_sha256_16": "b69cc7a7a2c9cfc9"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "332fb0dabe874c89"
            }
          },
          {
            "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 57,
            "llr_avg_abs": 1.208058896551724,
            "syndrome": {
              "bits_len": 174,
              "message91": "0010100010100001100000001000010000001000000010100010100000001111110000001001001011100101100",
              "parity83_observed": "00110000000100110100000010000100010000101101001010000101100110001000000100110111110",
              "parity83_expected": "01110111010100110100100110000000011111000100011001001110001010001011101100110010100",
              "syndrome83": "01000111010000000000100100000100001111101001010011001011101100000011101000000101010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "678915ad8b5b531e",
              "codeword174_sha256_16": "0bfb984669bc190f"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "678915ad8b5b531e"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_alt_high",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": true,
              "interleaver": "ft8_bitrev",
              "direction": "deinterleave_rx_to_codeword",
              "order_len": 174
            },
            "hard_weight_174": 37,
            "llr_avg_abs": 1.2055921379310346,
            "syndrome": {
              "bits_len": 174,
              "message91": "0100010011001000000000000111000000100000000000010001110000000010000000100000000000011000010",
              "parity83_observed": "01000000000010010010000000100010000110100011000011001010000000000001000000011000001",
              "parity83_expected": "01001001001001100010101001101110001000001011100010111111100001000101001010000000000",
              "syndrome83": "00001001001011110000101001001100001110101000100001110101100001000100001010011000001",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "24f38de55dffa50e",
              "codeword174_sha256_16": "a5cef5b3b7fef29e"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "24f38de55dffa50e"
            }
          },
          {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "hard_weight_174": 57,
            "llr_avg_abs": 1.1703414942528743,
            "syndrome": {
              "bits_len": 174,
              "message91": "0010100010100001100000001000010000001000000010100010100000001111110000001001001011100101100",
              "parity83_observed": "00110000000100110100000010000100010000101101001010000101100110001000000100110111110",
              "parity83_expected": "01110111010100110100100110000000011111000100011001001110001010001011101100110010100",
              "syndrome83": "01000111010000000000100100000100001111101001010011001011101100000011101000000101010",
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "678915ad8b5b531e",
              "codeword174_sha256_16": "0bfb984669bc190f"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 31,
              "trace": [],
              "repaired_message91_sha256_16": "678915ad8b5b531e"
            }
          },
          {
            "variant": "lsb_within_each_tone",
            "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
            "mapping_meta": {
              "tone_mapping": "raw_msb",
              "interleaver": "ft8_bitrev",
              "direction": "deinterleave_rx_to_codeword",
              "order_len": 174
            },
            "hard_weight_174": 30,
            "llr_avg_abs": 2.2186752701149435,
            "syndrome": {
              "bits_len": 174,
              "message91": "0100000000000100011001000000000100000000000110000000001000000100000100010001001100000000001",
              "parity83_observed": "00001000000000010001100000010010001000010000000000110001010000100000000000000100000",
              "parity83_expected": "11010100100010100010111000111011101010000001011001100001100100010000100000001101000",
              "syndrome83": "11011100100010110011011000101001100010010001011001010000110100110000100000001001000",
              "syndrome_weight": 32,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "770633de1c822554",
              "codeword174_sha256_16": "3605fe147cc4f9f8"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 32,
              "trace": [],
              "repaired_message91_sha256_16": "770633de1c822554"
            }
          },
          {
            "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
            "transform": "raw_msb+no_interleaver",
            "mapping_meta": {
              "tone_mapping": "raw_msb",
              "interleaver": "none"
            },
            "hard_weight_174": 30,
            "llr_avg_abs": 2.2186752701149435,
            "syndrome": {
              "bits_len": 174,
              "message91": "0100000000000100011001000000000100000000000110000000001000000100000100010001001100000000001",
              "parity83_observed": "00001000000000010001100000010010001000010000000000110001010000100000000000000100000",
              "parity83_expected": "11010100100010100010111000111011101010000001011001100001100100010000100000001101000",
              "syndrome83": "11011100100010110011011000101001100010010001011001010000110100110000100000001001000",
              "syndrome_weight": 32,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "770633de1c822554",
              "codeword174_sha256_16": "3605fe147cc4f9f8"
            },
            "repair": {
              "attempted": false,
              "flip_count": 0,
              "repair_success": false,
              "final_syndrome_weight": 32,
              "trace": [],
              "repaired_message91_sha256_16": "770633de1c822554"
            }
          }
        ],
        "decodes": [],
        "outputs": {
          "ldpc_matrix_probe_json": "/decoders/js8_decoder/runtime/ldpc_matrix_probe/step43_ldpc_matrix_probe.json"
        },
        "warnings": [
          "Step 51 preserves the exact timing-sweep primary row in matrix ranking, then repairs only a bounded subset to avoid Raspberry Pi timeouts.",
          "This is still a diagnostic LDPC/FEC probe and does not unpack JS8 text yet.",
          "If best_matrix_probe reaches syndrome_weight 0, the next step can feed message91 into CRC/message unpack. Otherwise continue timing, symbol boundary, deinterleaver/order or LLR tuning using best mapping_meta."
        ],
        "next_action": "Upload Step35 logs. Inspect best_matrix_probe.mapping_meta and final_syndrome_weight; then either unpack message91 on syndrome 0 or continue bounded LDPC/timing tuning."
      }
    },
    "candidate_export": {
      "name": "20260527T110128Z_real_run_candidate_export_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_candidate_export_output.json",
      "url": "/logs/20260527T110128Z_real_run_candidate_export_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 99113,
        "mtime_utc": "2026-05-27T11:08:30Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-fec-candidate-export",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step43_profile_anchor_candidate_export_no_message_unpack",
        "selected_profile": {
          "profile": "js8_near_6400",
          "nsps": 6400,
          "symbol_duration_seconds": 0.533333,
          "tone_spacing_hz": 1.875,
          "note": "0.533 s timing guard candidate",
          "ok": true,
          "sync": {
            "start_seconds": 4.8,
            "base_freq_hz": 1025.0,
            "candidate_score": 47.4,
            "costas_hits": 2,
            "avg_margin_db": 8.01,
            "candidate_count": 12
          },
          "frame": {
            "symbols_available_after_start": 103,
            "data_symbol_count_estimate": 58,
            "expected_data_symbols_candidate": 58
          },
          "fec": {
            "soft_bit_count_estimate": 174,
            "missing_soft_bits_estimate": 0,
            "complete_ldpc_input_candidate_estimate": true
          },
          "rank_score": 225.085
        },
        "profile_selection_source": "profile_scan_json_anchor",
        "profile_scan_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
        "anchor_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_auto_ldpc_probe_output.json",
        "anchor_selection": {
          "source": "profile_scan_json",
          "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
          "selection": "profile_scan_selected_profile",
          "nsps": 6400,
          "start_seconds": 4.8,
          "base_freq_hz": 1025.0,
          "tone_spacing_hz": 1.875
        },
        "anchor_attempts": [
          {
            "source": "profile_scan_json",
            "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
            "selection": "profile_scan_selected_profile",
            "nsps": 6400,
            "start_seconds": 4.8,
            "base_freq_hz": 1025.0,
            "tone_spacing_hz": 1.875
          }
        ],
        "anchor_expected_enabled": true,
        "prefer_js8_realistic_profile": true,
        "nsps_used": 6400,
        "nsps_is_js8_realistic": true,
        "wav": {
          "path": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
          "channels": 1,
          "sample_rate": 12000,
          "sample_width_bytes": 2,
          "frames": 720000,
          "duration_seconds": 60.0,
          "rms_dbfs": -9.13,
          "peak_dbfs": -0.72,
          "clipped": false
        },
        "sync_candidate": {
          "start_sample": 57600,
          "start_seconds": 4.8,
          "base_freq_hz": 1025.0,
          "tone_spacing_hz": 1.875,
          "nsps": 6400,
          "candidate_score": null,
          "costas_hits": null,
          "avg_margin_db": null,
          "anchor_source": "profile_scan_json"
        },
        "frame_candidate": {
          "input_symbol_count": 96,
          "excluded_costas_symbol_count": 0,
          "detected_costas_blocks": [],
          "data_symbol_count_available": 96,
          "data_symbol_count_used": 58,
          "expected_data_symbols_candidate": 58,
          "costas_policy": "js8_leading_only"
        },
        "fec_input_summary": {
          "soft_bit_count": 174,
          "missing_soft_bits": 0,
          "complete_ldpc_input_candidate": true,
          "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
        },
        "anchor_context": {
          "enabled": true,
          "source": "profile_scan_json",
          "start_seconds": 4.8,
          "base_freq_hz": 1025.0,
          "tone_spacing_hz": 1.875,
          "nsps": 6400,
          "symbol_count_extracted": 96
        },
        "variant_count": 23,
        "selected_variant": {
          "name": "raw_msb_symbol_order",
          "rank_score": 127.195892,
          "complete_174bit_candidate": true,
          "hard_bits_sha256_16": "c87312f86dbe74fc",
          "hard_weight_174": 36,
          "llr_stats": {
            "count": 174,
            "avg_abs": 2.298973,
            "min_abs": 0.012672,
            "max_abs": 4.421458,
            "positive": 141,
            "negative": 33,
            "zero": 0
          }
        },
        "variants": [
          {
            "name": "raw_msb_symbol_order",
            "description": "Current FEC bridge: Costas-stripped symbols, MSB-first tone bits.",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000010000010011000001000110101000011010000010010000001000000011011011000000000000000000000011000000001000010001001010001000010010000001010000010000001001000000",
            "hard_bits_sha256_16": "c87312f86dbe74fc",
            "hard_weight_174": 36,
            "llr_full_174": [
              4.145349,
              4.116374,
              3.511245,
              4.180269,
              4.169674,
              4.14242,
              4.168008,
              4.153984,
              4.12139,
              4.168076,
              4.135428,
              4.11961,
              4.07648,
              4.076237,
              4.08862,
              2.756476,
              2.742424,
              3.003457,
              2.955568,
              -1.875523,
              1.978199,
              2.658519,
              0.652185,
              1.080854,
              3.045159,
              -2.198749,
              1.333744,
              0.789541,
              0.471669,
              -0.473047,
              2.454295,
              1.837215,
              1.942431,
              3.352145,
              2.163158,
              -2.926977,
              3.300296,
              1.818615,
              2.678266,
              0.27805,
              -1.765651,
              0.507303,
              0.384955,
              0.866369,
              -0.118003,
              3.200765,
              2.063815,
              1.87262,
              1.0381,
              -1.355162,
              -1.599648,
              3.332469,
              -2.249717,
              1.748972,
              3.56793,
              3.262649,
              3.617447,
              2.319559,
              -1.211827,
              1.719706,
              3.019019,
              -3.210486,
              3.575036,
              2.726546,
              0.281133,
              1.361861,
              0.844266,
              0.012672,
              -0.477879,
              2.427052,
              0.927501,
              2.023583,
              1.640172,
              0.441842,
              1.473774,
              0.724531,
              -1.103418,
              -1.264035,
              0.966046,
              -0.916188,
              -0.820746,
              2.920695,
              -1.395798,
              -1.732909,
              4.123045,
              3.154533,
              1.694026,
              4.167475,
              4.14333,
              4.094062,
              4.166411,
              4.137106,
              4.073255,
              4.16641,
              4.1509,
              4.091336,
              4.16914,
              4.045318,
              3.8423,
              4.098287,
              3.599922,
              1.677122,
              3.447718,
              0.044719,
              2.01941,
              3.666068,
              -1.085865,
              -1.807547,
              2.689748,
              0.585744,
              2.065345,
              3.083072,
              2.617179,
              1.346997,
              2.548193,
              2.264806,
              -0.571842,
              2.351419,
              1.247615,
              1.499097,
              3.383096,
              -3.47555,
              3.593033,
              0.355702,
              2.45095,
              -3.635826,
              2.165497,
              2.132701,
              -2.226011,
              2.192378,
              -1.921746,
              1.999342,
              3.137893,
              2.980057,
              -2.621792,
              3.666644,
              0.533081,
              1.582817,
              3.285701,
              -3.283029,
              3.223063,
              2.568732,
              -0.251398,
              0.268492,
              1.534973,
              1.692448,
              1.48451,
              3.152828,
              0.300403,
              -0.280146,
              1.052121,
              -0.948727,
              1.008293,
              0.777135,
              0.891886,
              0.17487,
              2.402306,
              -2.356355,
              2.750596,
              1.575325,
              0.833633,
              2.006609,
              1.914037,
              2.633553,
              -1.988459,
              1.730599,
              1.570304,
              -1.598288,
              4.421458,
              0.617935,
              1.642426,
              3.964669,
              3.566732,
              3.449224
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 127.195892
          },
          {
            "name": "lsb_within_each_tone",
            "description": "Same symbols, but each 3-bit tone value reversed for bit-order comparison.",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000010000010110000100000011101000110010000010010000100000000110110110000000000000000000000110000000100000010100100010100000010010000100010000010000100100000000",
            "hard_bits_sha256_16": "1caf67e82a3cc0f1",
            "hard_weight_174": 36,
            "llr_full_174": [
              4.145349,
              4.116374,
              3.511245,
              4.180269,
              4.169674,
              4.14242,
              4.168008,
              4.153984,
              4.12139,
              4.168076,
              4.135428,
              4.11961,
              4.07648,
              4.076237,
              4.08862,
              2.756476,
              2.742424,
              3.003457,
              2.955568,
              -1.875523,
              1.978199,
              2.658519,
              0.652185,
              1.080854,
              3.045159,
              -2.198749,
              1.333744,
              0.789541,
              0.471669,
              -0.473047,
              2.454295,
              1.837215,
              1.942431,
              3.352145,
              2.163158,
              -2.926977,
              3.300296,
              1.818615,
              2.678266,
              0.27805,
              -1.765651,
              0.507303,
              0.384955,
              0.866369,
              -0.118003,
              3.200765,
              2.063815,
              1.87262,
              1.0381,
              -1.355162,
              -1.599648,
              3.332469,
              -2.249717,
              1.748972,
              3.56793,
              3.262649,
              3.617447,
              2.319559,
              -1.211827,
              1.719706,
              3.019019,
              -3.210486,
              3.575036,
              2.726546,
              0.281133,
              1.361861,
              0.844266,
              0.012672,
              -0.477879,
              2.427052,
              0.927501,
              2.023583,
              1.640172,
              0.441842,
              1.473774,
              0.724531,
              -1.103418,
              -1.264035,
              0.966046,
              -0.916188,
              -0.820746,
              2.920695,
              -1.395798,
              -1.732909,
              4.123045,
              3.154533,
              1.694026,
              4.167475,
              4.14333,
              4.094062,
              4.166411,
              4.137106,
              4.073255,
              4.16641,
              4.1509,
              4.091336,
              4.16914,
              4.045318,
              3.8423,
              4.098287,
              3.599922,
              1.677122,
              3.447718,
              0.044719,
              2.01941,
              3.666068,
              -1.085865,
              -1.807547,
              2.689748,
              0.585744,
              2.065345,
              3.083072,
              2.617179,
              1.346997,
              2.548193,
              2.264806,
              -0.571842,
              2.351419,
              1.247615,
              1.499097,
              3.383096,
              -3.47555,
              3.593033,
              0.355702,
              2.45095,
              -3.635826,
              2.165497,
              2.132701,
              -2.226011,
              2.192378,
              -1.921746,
              1.999342,
              3.137893,
              2.980057,
              -2.621792,
              3.666644,
              0.533081,
              1.582817,
              3.285701,
              -3.283029,
              3.223063,
              2.568732,
              -0.251398,
              0.268492,
              1.534973,
              1.692448,
              1.48451,
              3.152828,
              0.300403,
              -0.280146,
              1.052121,
              -0.948727,
              1.008293,
              0.777135,
              0.891886,
              0.17487,
              2.402306,
              -2.356355,
              2.750596,
              1.575325,
              0.833633,
              2.006609,
              1.914037,
              2.633553,
              -1.988459,
              1.730599,
              1.570304,
              -1.598288,
              4.421458,
              0.617935,
              1.642426,
              3.964669,
              3.566732,
              3.449224
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 119.195892
          },
          {
            "name": "reverse_symbol_order",
            "description": "Same 3-bit symbols in reverse order; diagnostic only.",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000001001000010000010001000010010000001010001001010000001000000011000000000000000000000011011011000000001000010010000010011000101110000001000011010000010000000000000000000",
            "hard_bits_sha256_16": "1c72d827ce8d55e5",
            "hard_weight_174": 36,
            "llr_full_174": [
              3.449224,
              3.566732,
              3.964669,
              1.642426,
              0.617935,
              4.421458,
              -1.598288,
              1.570304,
              1.730599,
              -1.988459,
              2.633553,
              1.914037,
              2.006609,
              0.833633,
              1.575325,
              2.750596,
              -2.356355,
              2.402306,
              0.17487,
              0.891886,
              0.777135,
              1.008293,
              -0.948727,
              1.052121,
              -0.280146,
              0.300403,
              3.152828,
              1.48451,
              1.692448,
              1.534973,
              0.268492,
              -0.251398,
              2.568732,
              3.223063,
              -3.283029,
              3.285701,
              1.582817,
              0.533081,
              3.666644,
              -2.621792,
              2.980057,
              3.137893,
              1.999342,
              -1.921746,
              2.192378,
              -2.226011,
              2.132701,
              2.165497,
              -3.635826,
              2.45095,
              0.355702,
              3.593033,
              -3.47555,
              3.383096,
              1.499097,
              1.247615,
              2.351419,
              -0.571842,
              2.264806,
              2.548193,
              1.346997,
              2.617179,
              3.083072,
              2.065345,
              0.585744,
              2.689748,
              -1.807547,
              -1.085865,
              3.666068,
              2.01941,
              0.044719,
              3.447718,
              1.677122,
              3.599922,
              4.098287,
              3.8423,
              4.045318,
              4.16914,
              4.091336,
              4.1509,
              4.16641,
              4.073255,
              4.137106,
              4.166411,
              4.094062,
              4.14333,
              4.167475,
              1.694026,
              3.154533,
              4.123045,
              -1.732909,
              -1.395798,
              2.920695,
              -0.820746,
              -0.916188,
              0.966046,
              -1.264035,
              -1.103418,
              0.724531,
              1.473774,
              0.441842,
              1.640172,
              2.023583,
              0.927501,
              2.427052,
              -0.477879,
              0.012672,
              0.844266,
              1.361861,
              0.281133,
              2.726546,
              3.575036,
              -3.210486,
              3.019019,
              1.719706,
              -1.211827,
              2.319559,
              3.617447,
              3.262649,
              3.56793,
              1.748972,
              -2.249717,
              3.332469,
              -1.599648,
              -1.355162,
              1.0381,
              1.87262,
              2.063815,
              3.200765,
              -0.118003,
              0.866369,
              0.384955,
              0.507303,
              -1.765651,
              0.27805,
              2.678266,
              1.818615,
              3.300296,
              -2.926977,
              2.163158,
              3.352145,
              1.942431,
              1.837215,
              2.454295,
              -0.473047,
              0.471669,
              0.789541,
              1.333744,
              -2.198749,
              3.045159,
              1.080854,
              0.652185,
              2.658519,
              1.978199,
              -1.875523,
              2.955568,
              3.003457,
              2.742424,
              2.756476,
              4.08862,
              4.076237,
              4.07648,
              4.11961,
              4.135428,
              4.168076,
              4.12139,
              4.153984,
              4.168008,
              4.14242,
              4.169674,
              4.180269,
              3.511245,
              4.116374,
              4.145349
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 113.195892
          },
          {
            "name": "reverse_full_bitstream",
            "description": "Full hard-bit stream reversed; diagnostic only.",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000100100000010000010100000010010000100010100100010000100000000110000000000000000000000110110110000000100000010010000010110000101011000100000110010000010000000000000000000",
            "hard_bits_sha256_16": "99d197b705881255",
            "hard_weight_174": 36,
            "llr_full_174": [
              3.449224,
              3.566732,
              3.964669,
              1.642426,
              0.617935,
              4.421458,
              -1.598288,
              1.570304,
              1.730599,
              -1.988459,
              2.633553,
              1.914037,
              2.006609,
              0.833633,
              1.575325,
              2.750596,
              -2.356355,
              2.402306,
              0.17487,
              0.891886,
              0.777135,
              1.008293,
              -0.948727,
              1.052121,
              -0.280146,
              0.300403,
              3.152828,
              1.48451,
              1.692448,
              1.534973,
              0.268492,
              -0.251398,
              2.568732,
              3.223063,
              -3.283029,
              3.285701,
              1.582817,
              0.533081,
              3.666644,
              -2.621792,
              2.980057,
              3.137893,
              1.999342,
              -1.921746,
              2.192378,
              -2.226011,
              2.132701,
              2.165497,
              -3.635826,
              2.45095,
              0.355702,
              3.593033,
              -3.47555,
              3.383096,
              1.499097,
              1.247615,
              2.351419,
              -0.571842,
              2.264806,
              2.548193,
              1.346997,
              2.617179,
              3.083072,
              2.065345,
              0.585744,
              2.689748,
              -1.807547,
              -1.085865,
              3.666068,
              2.01941,
              0.044719,
              3.447718,
              1.677122,
              3.599922,
              4.098287,
              3.8423,
              4.045318,
              4.16914,
              4.091336,
              4.1509,
              4.16641,
              4.073255,
              4.137106,
              4.166411,
              4.094062,
              4.14333,
              4.167475,
              1.694026,
              3.154533,
              4.123045,
              -1.732909,
              -1.395798,
              2.920695,
              -0.820746,
              -0.916188,
              0.966046,
              -1.264035,
              -1.103418,
              0.724531,
              1.473774,
              0.441842,
              1.640172,
              2.023583,
              0.927501,
              2.427052,
              -0.477879,
              0.012672,
              0.844266,
              1.361861,
              0.281133,
              2.726546,
              3.575036,
              -3.210486,
              3.019019,
              1.719706,
              -1.211827,
              2.319559,
              3.617447,
              3.262649,
              3.56793,
              1.748972,
              -2.249717,
              3.332469,
              -1.599648,
              -1.355162,
              1.0381,
              1.87262,
              2.063815,
              3.200765,
              -0.118003,
              0.866369,
              0.384955,
              0.507303,
              -1.765651,
              0.27805,
              2.678266,
              1.818615,
              3.300296,
              -2.926977,
              2.163158,
              3.352145,
              1.942431,
              1.837215,
              2.454295,
              -0.473047,
              0.471669,
              0.789541,
              1.333744,
              -2.198749,
              3.045159,
              1.080854,
              0.652185,
              2.658519,
              1.978199,
              -1.875523,
              2.955568,
              3.003457,
              2.742424,
              2.756476,
              4.08862,
              4.076237,
              4.07648,
              4.11961,
              4.135428,
              4.168076,
              4.12139,
              4.153984,
              4.168008,
              4.14242,
              4.169674,
              4.180269,
              3.511245,
              4.116374,
              4.145349
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 112.195892
          },
          {
            "name": "mapped_raw_msb+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'raw_msb', 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000010000010011000001000110101000011010000010010000001000000011011011000000000000000000000011000000001000010001001010001000010010000001010000010000001001000000",
            "hard_bits_sha256_16": "c87312f86dbe74fc",
            "hard_weight_174": 36,
            "llr_full_174": [
              4.145349,
              4.116374,
              3.511245,
              4.180269,
              4.169674,
              4.14242,
              4.168008,
              4.153984,
              4.12139,
              4.168076,
              4.135428,
              4.11961,
              4.07648,
              4.076237,
              4.08862,
              2.756476,
              2.742424,
              3.003457,
              2.955568,
              -1.875523,
              1.978199,
              2.658519,
              0.652185,
              1.080854,
              3.045159,
              -2.198749,
              1.333744,
              0.789541,
              0.471669,
              -0.473047,
              2.454295,
              1.837215,
              1.942431,
              3.352145,
              2.163158,
              -2.926977,
              3.300296,
              1.818615,
              2.678266,
              0.27805,
              -1.765651,
              0.507303,
              0.384955,
              0.866369,
              -0.118003,
              3.200765,
              2.063815,
              1.87262,
              1.0381,
              -1.355162,
              -1.599648,
              3.332469,
              -2.249717,
              1.748972,
              3.56793,
              3.262649,
              3.617447,
              2.319559,
              -1.211827,
              1.719706,
              3.019019,
              -3.210486,
              3.575036,
              2.726546,
              0.281133,
              1.361861,
              0.844266,
              0.012672,
              -0.477879,
              2.427052,
              0.927501,
              2.023583,
              1.640172,
              0.441842,
              1.473774,
              0.724531,
              -1.103418,
              -1.264035,
              0.966046,
              -0.916188,
              -0.820746,
              2.920695,
              -1.395798,
              -1.732909,
              4.123045,
              3.154533,
              1.694026,
              4.167475,
              4.14333,
              4.094062,
              4.166411,
              4.137106,
              4.073255,
              4.16641,
              4.1509,
              4.091336,
              4.16914,
              4.045318,
              3.8423,
              4.098287,
              3.599922,
              1.677122,
              3.447718,
              0.044719,
              2.01941,
              3.666068,
              -1.085865,
              -1.807547,
              2.689748,
              0.585744,
              2.065345,
              3.083072,
              2.617179,
              1.346997,
              2.548193,
              2.264806,
              -0.571842,
              2.351419,
              1.247615,
              1.499097,
              3.383096,
              -3.47555,
              3.593033,
              0.355702,
              2.45095,
              -3.635826,
              2.165497,
              2.132701,
              -2.226011,
              2.192378,
              -1.921746,
              1.999342,
              3.137893,
              2.980057,
              -2.621792,
              3.666644,
              0.533081,
              1.582817,
              3.285701,
              -3.283029,
              3.223063,
              2.568732,
              -0.251398,
              0.268492,
              1.534973,
              1.692448,
              1.48451,
              3.152828,
              0.300403,
              -0.280146,
              1.052121,
              -0.948727,
              1.008293,
              0.777135,
              0.891886,
              0.17487,
              2.402306,
              -2.356355,
              2.750596,
              1.575325,
              0.833633,
              2.006609,
              1.914037,
              2.633553,
              -1.988459,
              1.730599,
              1.570304,
              -1.598288,
              4.421458,
              0.617935,
              1.642426,
              3.964669,
              3.566732,
              3.449224
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'raw_msb', 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "001000000001001100101000001010100001100000100011000000000101100000000010000010100011000011000100001000000000010000000010000001000000000000000100000011000001101000000001000000",
            "hard_bits_sha256_16": "3c11aac3c214ac9f",
            "hard_weight_174": 36,
            "llr_full_174": [
              4.145349,
              4.167475,
              -0.118003,
              1.999342,
              0.652185,
              0.585744,
              0.844266,
              0.777135,
              4.11961,
              3.8423,
              3.262649,
              -0.251398,
              3.352145,
              3.383096,
              -1.264035,
              -1.988459,
              4.168008,
              4.16641,
              -1.599648,
              1.582817,
              0.471669,
              2.264806,
              1.640172,
              1.575325,
              3.003457,
              2.01941,
              -3.210486,
              0.300403,
              0.27805,
              2.165497,
              -1.395798,
              0.617935,
              4.180269,
              4.166411,
              1.87262,
              -2.621792,
              -2.198749,
              2.617179,
              2.427052,
              2.402306,
              4.08862,
              1.677122,
              -1.211827,
              1.692448,
              3.300296,
              0.355702,
              -0.820746,
              -1.598288,
              4.168076,
              4.16914,
              1.748972,
              3.223063,
              1.837215,
              1.247615,
              0.724531,
              1.914037,
              1.978199,
              -1.807547,
              0.281133,
              -0.948727,
              0.384955,
              2.192378,
              3.154533,
              3.566732,
              3.511245,
              4.094062,
              2.063815,
              2.980057,
              3.045159,
              3.083072,
              -0.477879,
              0.17487,
              4.076237,
              3.599922,
              2.319559,
              1.534973,
              -2.926977,
              3.593033,
              -0.916188,
              1.570304,
              4.12139,
              4.091336,
              -2.249717,
              -3.283029,
              2.454295,
              2.351419,
              1.473774,
              2.006609,
              -1.875523,
              -1.085865,
              2.726546,
              1.052121,
              0.507303,
              -2.226011,
              4.123045,
              3.964669,
              4.14242,
              4.073255,
              -1.355162,
              0.533081,
              0.789541,
              2.548193,
              2.023583,
              2.750596,
              2.742424,
              0.044719,
              3.019019,
              3.152828,
              2.678266,
              -3.635826,
              2.920695,
              4.421458,
              4.135428,
              4.045318,
              3.56793,
              2.568732,
              1.942431,
              1.499097,
              -1.103418,
              2.633553,
              2.658519,
              2.689748,
              1.361861,
              1.008293,
              0.866369,
              -1.921746,
              1.694026,
              3.449224,
              4.116374,
              4.14333,
              3.200765,
              3.137893,
              1.080854,
              2.065345,
              0.012672,
              0.891886,
              4.07648,
              4.098287,
              3.617447,
              0.268492,
              2.163158,
              -3.47555,
              0.966046,
              1.730599,
              4.153984,
              4.1509,
              3.332469,
              3.285701,
              -0.473047,
              -0.571842,
              0.441842,
              0.833633,
              2.955568,
              3.666068,
              3.575036,
              -0.280146,
              -1.765651,
              2.132701,
              -1.732909,
              1.642426,
              4.169674,
              4.137106,
              1.0381,
              3.666644,
              1.333744,
              1.346997,
              0.927501,
              -2.356355,
              2.756476,
              3.447718,
              1.719706,
              1.48451,
              1.818615,
              2.45095
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'raw_msb', 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "010000001000001000000000101000011001100100000100000011000010100010010000000000100000000000000000100000001000100000001000001000110110001001010001000100000000110010000010000000",
            "hard_bits_sha256_16": "3eca32111a82bfa5",
            "hard_weight_174": 36,
            "llr_full_174": [
              4.145349,
              -2.226011,
              0.281133,
              1.942431,
              0.833633,
              4.16914,
              2.742424,
              1.534973,
              -0.820746,
              1.0381,
              2.617179,
              4.12139,
              0.533081,
              1.640172,
              -1.765651,
              4.421458,
              2.01941,
              3.045159,
              1.008293,
              4.14333,
              3.617447,
              3.383096,
              4.169674,
              3.137893,
              -0.477879,
              3.300296,
              -1.988459,
              3.599922,
              1.978199,
              0.300403,
              4.123045,
              -2.249717,
              -0.571842,
              4.07648,
              3.223063,
              -1.103418,
              -0.118003,
              3.566732,
              2.689748,
              0.471669,
              2.402306,
              4.073255,
              3.019019,
              2.45095,
              3.511245,
              -1.921746,
              0.844266,
              2.163158,
              1.914037,
              3.8423,
              2.955568,
              1.48451,
              -1.395798,
              -1.599648,
              2.548193,
              4.135428,
              3.285701,
              1.473774,
              0.384955,
              1.642426,
              -1.085865,
              1.333744,
              0.891886,
              4.166411,
              -1.211827,
              3.593033,
              4.168008,
              -2.621792,
              0.927501,
              2.678266,
              1.570304,
              3.447718,
              0.652185,
              1.052121,
              1.694026,
              3.56793,
              1.247615,
              4.08862,
              -0.251398,
              0.966046,
              2.063815,
              2.065345,
              2.454295,
              2.750596,
              4.1509,
              3.575036,
              2.165497,
              4.116374,
              2.192378,
              1.361861,
              3.352145,
              2.006609,
              4.045318,
              3.003457,
              1.692448,
              2.920695,
              -1.355162,
              1.346997,
              4.168076,
              1.582817,
              0.441842,
              0.507303,
              0.617935,
              3.666068,
              -2.198749,
              0.777135,
              4.094062,
              2.319559,
              -3.47555,
              4.14242,
              2.980057,
              2.427052,
              1.818615,
              1.730599,
              1.677122,
              2.658519,
              -0.280146,
              3.154533,
              1.748972,
              2.351419,
              4.076237,
              2.568732,
              -1.264035,
              3.200765,
              3.449224,
              0.585744,
              -0.473047,
              -2.356355,
              4.16641,
              -3.210486,
              -3.635826,
              4.180269,
              1.999342,
              0.012672,
              -2.926977,
              2.633553,
              4.098287,
              -1.875523,
              3.152828,
              -1.732909,
              3.332469,
              2.264806,
              4.11961,
              -3.283029,
              0.724531,
              0.866369,
              3.964669,
              -1.807547,
              0.789541,
              0.17487,
              4.137106,
              1.719706,
              0.355702,
              4.153984,
              3.666644,
              2.023583,
              0.27805,
              -1.598288,
              0.044719,
              1.080854,
              -0.948727,
              4.167475,
              3.262649,
              1.499097,
              2.756476,
              0.268492,
              -0.916188,
              1.87262,
              3.083072,
              1.837215,
              1.575325,
              4.091336,
              2.726546,
              2.132701
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_lsb_within_each_tone+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'lsb_within_each_tone', 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000010000010110000100000011101000110010000010010000100000000110110110000000000000000000000110000000100000010100100010100000010010000100010000010000100100000000",
            "hard_bits_sha256_16": "1caf67e82a3cc0f1",
            "hard_weight_174": 36,
            "llr_full_174": [
              3.511245,
              4.116374,
              4.145349,
              4.14242,
              4.169674,
              4.180269,
              4.12139,
              4.153984,
              4.168008,
              4.11961,
              4.135428,
              4.168076,
              4.08862,
              4.076237,
              4.07648,
              3.003457,
              2.742424,
              2.756476,
              1.978199,
              -1.875523,
              2.955568,
              1.080854,
              0.652185,
              2.658519,
              1.333744,
              -2.198749,
              3.045159,
              -0.473047,
              0.471669,
              0.789541,
              1.942431,
              1.837215,
              2.454295,
              -2.926977,
              2.163158,
              3.352145,
              2.678266,
              1.818615,
              3.300296,
              0.507303,
              -1.765651,
              0.27805,
              -0.118003,
              0.866369,
              0.384955,
              1.87262,
              2.063815,
              3.200765,
              -1.599648,
              -1.355162,
              1.0381,
              1.748972,
              -2.249717,
              3.332469,
              3.617447,
              3.262649,
              3.56793,
              1.719706,
              -1.211827,
              2.319559,
              3.575036,
              -3.210486,
              3.019019,
              1.361861,
              0.281133,
              2.726546,
              -0.477879,
              0.012672,
              0.844266,
              2.023583,
              0.927501,
              2.427052,
              1.473774,
              0.441842,
              1.640172,
              -1.264035,
              -1.103418,
              0.724531,
              -0.820746,
              -0.916188,
              0.966046,
              -1.732909,
              -1.395798,
              2.920695,
              1.694026,
              3.154533,
              4.123045,
              4.094062,
              4.14333,
              4.167475,
              4.073255,
              4.137106,
              4.166411,
              4.091336,
              4.1509,
              4.16641,
              3.8423,
              4.045318,
              4.16914,
              1.677122,
              3.599922,
              4.098287,
              2.01941,
              0.044719,
              3.447718,
              -1.807547,
              -1.085865,
              3.666068,
              2.065345,
              0.585744,
              2.689748,
              1.346997,
              2.617179,
              3.083072,
              -0.571842,
              2.264806,
              2.548193,
              1.499097,
              1.247615,
              2.351419,
              3.593033,
              -3.47555,
              3.383096,
              -3.635826,
              2.45095,
              0.355702,
              -2.226011,
              2.132701,
              2.165497,
              1.999342,
              -1.921746,
              2.192378,
              -2.621792,
              2.980057,
              3.137893,
              1.582817,
              0.533081,
              3.666644,
              3.223063,
              -3.283029,
              3.285701,
              0.268492,
              -0.251398,
              2.568732,
              1.48451,
              1.692448,
              1.534973,
              -0.280146,
              0.300403,
              3.152828,
              1.008293,
              -0.948727,
              1.052121,
              0.17487,
              0.891886,
              0.777135,
              2.750596,
              -2.356355,
              2.402306,
              2.006609,
              0.833633,
              1.575325,
              -1.988459,
              2.633553,
              1.914037,
              -1.598288,
              1.570304,
              1.730599,
              1.642426,
              0.617935,
              4.421458,
              3.449224,
              3.566732,
              3.964669
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'lsb_within_each_tone', 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "001000100001100000001000001001100000100000100100000000110001100000000000000000100011000011001000001011000001001000000010000001000001000000000111000000000100100000100001000000",
            "hard_bits_sha256_16": "c16db5c46eb49777",
            "hard_weight_174": 36,
            "llr_full_174": [
              3.511245,
              4.094062,
              0.384955,
              2.192378,
              0.652185,
              0.585744,
              -0.477879,
              0.17487,
              4.168076,
              4.16914,
              3.262649,
              -0.251398,
              -2.926977,
              3.593033,
              0.724531,
              1.914037,
              4.12139,
              4.091336,
              1.0381,
              3.666644,
              0.471669,
              2.264806,
              1.473774,
              2.006609,
              2.756476,
              3.447718,
              -3.210486,
              0.300403,
              0.507303,
              -2.226011,
              -1.395798,
              0.617935,
              4.14242,
              4.073255,
              3.200765,
              3.137893,
              -2.198749,
              2.617179,
              2.023583,
              2.750596,
              4.07648,
              4.098287,
              -1.211827,
              1.692448,
              2.678266,
              -3.635826,
              0.966046,
              1.730599,
              4.11961,
              3.8423,
              3.332469,
              3.285701,
              1.837215,
              1.247615,
              -1.264035,
              -1.988459,
              2.955568,
              3.666068,
              0.281133,
              -0.948727,
              -0.118003,
              1.999342,
              3.154533,
              3.566732,
              4.145349,
              4.167475,
              2.063815,
              2.980057,
              1.333744,
              1.346997,
              0.844266,
              0.777135,
              4.076237,
              3.599922,
              1.719706,
              1.48451,
              3.352145,
              3.383096,
              -0.916188,
              1.570304,
              4.168008,
              4.16641,
              -2.249717,
              -3.283029,
              1.942431,
              1.499097,
              1.640172,
              1.575325,
              -1.875523,
              -1.085865,
              1.361861,
              1.008293,
              0.27805,
              2.165497,
              1.694026,
              3.449224,
              4.180269,
              4.166411,
              -1.355162,
              0.533081,
              -0.473047,
              -0.571842,
              2.427052,
              2.402306,
              2.742424,
              0.044719,
              3.575036,
              -0.280146,
              3.300296,
              0.355702,
              -1.732909,
              1.642426,
              4.135428,
              4.045318,
              3.617447,
              0.268492,
              2.454295,
              2.351419,
              -1.103418,
              2.633553,
              1.080854,
              2.065345,
              2.726546,
              1.052121,
              0.866369,
              -1.921746,
              4.123045,
              3.964669,
              4.116374,
              4.14333,
              1.87262,
              -2.621792,
              2.658519,
              2.689748,
              0.012672,
              0.891886,
              4.08862,
              1.677122,
              3.56793,
              2.568732,
              2.163158,
              -3.47555,
              -0.820746,
              -1.598288,
              4.153984,
              4.1509,
              1.748972,
              3.223063,
              0.789541,
              2.548193,
              0.441842,
              0.833633,
              1.978199,
              -1.807547,
              3.019019,
              3.152828,
              -1.765651,
              2.132701,
              2.920695,
              4.421458,
              4.169674,
              4.137106,
              -1.599648,
              1.582817,
              3.045159,
              3.083072,
              0.927501,
              -2.356355,
              3.003457,
              2.01941,
              2.319559,
              1.534973,
              1.818615,
              2.45095
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'lsb_within_each_tone', 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000100001000000001000000010001100100000110100010100010100010000000000000110000001000100001100001011000100001000000000000010100000001100001100010001000000010000010000000",
            "hard_bits_sha256_16": "2349237a6c1ad4a1",
            "hard_weight_174": 36,
            "llr_full_174": [
              3.511245,
              2.165497,
              0.281133,
              2.454295,
              0.833633,
              3.8423,
              2.742424,
              1.48451,
              0.966046,
              -1.599648,
              2.617179,
              4.168008,
              0.533081,
              1.473774,
              -1.765651,
              1.642426,
              3.447718,
              1.333744,
              1.052121,
              4.14333,
              3.56793,
              3.593033,
              4.169674,
              -2.621792,
              0.844266,
              2.678266,
              1.914037,
              3.599922,
              2.955568,
              0.300403,
              1.694026,
              -2.249717,
              2.548193,
              4.08862,
              3.285701,
              -1.103418,
              0.384955,
              3.566732,
              2.065345,
              0.471669,
              2.750596,
              4.166411,
              3.575036,
              2.45095,
              4.145349,
              -1.921746,
              -0.477879,
              2.163158,
              -1.988459,
              4.16914,
              1.978199,
              1.534973,
              -1.395798,
              1.0381,
              -0.571842,
              4.135428,
              3.223063,
              1.640172,
              -0.118003,
              4.421458,
              -1.085865,
              3.045159,
              0.891886,
              4.073255,
              -1.211827,
              3.383096,
              4.12139,
              3.137893,
              0.927501,
              3.300296,
              1.570304,
              2.01941,
              0.652185,
              1.008293,
              4.123045,
              3.617447,
              1.247615,
              4.07648,
              -0.251398,
              -0.820746,
              2.063815,
              2.689748,
              1.942431,
              2.402306,
              4.1509,
              3.019019,
              -2.226011,
              4.116374,
              1.999342,
              2.726546,
              -2.926977,
              1.575325,
              4.045318,
              2.756476,
              1.692448,
              -1.732909,
              -1.355162,
              3.083072,
              4.11961,
              3.666644,
              0.441842,
              0.27805,
              0.617935,
              -1.807547,
              -2.198749,
              0.17487,
              4.167475,
              1.719706,
              -3.47555,
              4.180269,
              2.980057,
              2.023583,
              1.818615,
              -1.598288,
              4.098287,
              1.080854,
              3.152828,
              3.154533,
              3.332469,
              1.499097,
              4.076237,
              0.268492,
              0.724531,
              1.87262,
              3.964669,
              0.585744,
              0.789541,
              -2.356355,
              4.091336,
              -3.210486,
              0.355702,
              4.14242,
              2.192378,
              0.012672,
              3.352145,
              2.633553,
              1.677122,
              -1.875523,
              -0.280146,
              2.920695,
              1.748972,
              2.264806,
              4.168076,
              -3.283029,
              -1.264035,
              0.866369,
              3.449224,
              3.666068,
              -0.473047,
              0.777135,
              4.137106,
              2.319559,
              -3.635826,
              4.153984,
              1.582817,
              2.427052,
              0.507303,
              1.730599,
              0.044719,
              2.658519,
              -0.948727,
              4.094062,
              3.262649,
              2.351419,
              3.003457,
              2.568732,
              -0.916188,
              3.200765,
              1.346997,
              1.837215,
              2.006609,
              4.16641,
              1.361861,
              2.132701
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 109.195892
          },
          {
            "name": "mapped_ft8_gray_primary_demap_msb_input+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000011000011010000001000101100000010011000011011000001000000010010010000000000000000000000010000000001000011001001011001000011011000001011000011000001001000000",
            "hard_bits_sha256_16": "df16269c1fa0fa06",
            "hard_weight_174": 40,
            "llr_full_174": [
              4.145349,
              3.452473,
              3.086486,
              4.180269,
              3.489968,
              3.470833,
              4.168008,
              3.476142,
              3.45256,
              4.168076,
              3.466732,
              3.442433,
              4.07648,
              3.391909,
              3.398004,
              2.756476,
              2.085357,
              2.201863,
              2.955568,
              -1.622839,
              -1.279105,
              2.658519,
              0.584512,
              0.334781,
              3.045159,
              -1.913077,
              -1.05028,
              0.789541,
              0.355787,
              0.070686,
              2.454295,
              1.465874,
              1.259168,
              3.352145,
              2.148484,
              -1.593118,
              3.300296,
              1.631791,
              1.487633,
              0.27805,
              -0.679046,
              -0.859382,
              0.384955,
              0.516186,
              0.304115,
              3.200765,
              1.8241,
              1.313865,
              1.0381,
              -1.202946,
              0.271605,
              3.332469,
              -2.000617,
              -1.317992,
              3.56793,
              2.723053,
              2.74392,
              2.319559,
              -0.99225,
              -0.827198,
              3.019019,
              -2.4347,
              -2.703961,
              2.726546,
              0.253328,
              0.172804,
              0.844266,
              0.009756,
              0.001731,
              2.427052,
              0.7793,
              0.708649,
              1.640172,
              0.322631,
              0.301313,
              0.724531,
              -0.918917,
              0.050637,
              0.966046,
              -0.745342,
              0.005093,
              2.920695,
              -1.36693,
              0.77557,
              4.123045,
              2.877556,
              1.508338,
              4.167475,
              3.470682,
              3.433481,
              4.166411,
              3.467154,
              3.419835,
              4.16641,
              3.474034,
              3.435811,
              4.16914,
              3.422479,
              3.254487,
              4.098287,
              3.187851,
              1.562671,
              3.447718,
              0.042283,
              0.03456,
              3.666068,
              -1.076662,
              0.695554,
              2.689748,
              0.516457,
              0.457348,
              3.083072,
              2.218749,
              1.160866,
              2.548193,
              2.037409,
              -0.303721,
              2.351419,
              1.033145,
              0.774902,
              3.383096,
              -2.750704,
              -2.856231,
              0.355702,
              2.334924,
              -0.246542,
              2.165497,
              2.051906,
              -1.067205,
              2.192378,
              -1.42718,
              -1.339671,
              3.137893,
              2.926083,
              -1.778059,
              3.666644,
              0.510044,
              0.351311,
              3.285701,
              -2.612578,
              -2.58036,
              2.568732,
              -0.230927,
              -0.048807,
              1.534973,
              1.07191,
              1.044958,
              3.152828,
              0.289654,
              -0.027576,
              1.052121,
              -0.562778,
              -0.546582,
              0.777135,
              0.565054,
              0.316264,
              2.402306,
              -1.726242,
              -1.882543,
              1.575325,
              0.564689,
              0.656222,
              1.914037,
              2.436748,
              -0.998732,
              1.730599,
              1.457999,
              -0.555668,
              4.421458,
              0.604867,
              0.41283,
              3.964669,
              3.066087,
              2.824202
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.927169,
              "min_abs": 0.001731,
              "max_abs": 4.421458,
              "positive": 137,
              "negative": 37,
              "zero": 0
            },
            "rank_score": 107.708676
          },
          {
            "name": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000100000001000100001000001010100001100000100001001100001001100000000010000011100011000011001100001000010000010000000010000101000000000000010100000001000011000000001001001000",
            "hard_bits_sha256_16": "ae82c24c7b38f3d2",
            "hard_weight_174": 40,
            "llr_full_174": [
              4.145349,
              4.167475,
              0.304115,
              -1.339671,
              0.584512,
              0.516457,
              0.844266,
              0.777135,
              3.442433,
              3.254487,
              2.723053,
              -0.230927,
              3.352145,
              3.383096,
              0.050637,
              -0.998732,
              4.168008,
              4.16641,
              0.271605,
              0.351311,
              0.355787,
              2.037409,
              1.640172,
              1.575325,
              2.201863,
              0.03456,
              -2.4347,
              0.289654,
              0.27805,
              2.165497,
              -1.36693,
              0.604867,
              4.180269,
              4.166411,
              1.313865,
              -1.778059,
              -1.913077,
              2.218749,
              2.427052,
              2.402306,
              3.398004,
              1.562671,
              -0.99225,
              1.07191,
              3.300296,
              0.355702,
              0.005093,
              -0.555668,
              4.168076,
              4.16914,
              -1.317992,
              -2.58036,
              1.465874,
              1.033145,
              0.724531,
              1.914037,
              -1.279105,
              0.695554,
              0.253328,
              -0.562778,
              0.384955,
              2.192378,
              2.877556,
              3.066087,
              3.086486,
              3.433481,
              1.8241,
              2.926083,
              3.045159,
              3.083072,
              0.001731,
              0.316264,
              3.391909,
              3.187851,
              2.319559,
              1.534973,
              -1.593118,
              -2.856231,
              -0.745342,
              1.457999,
              3.45256,
              3.435811,
              -2.000617,
              -2.612578,
              2.454295,
              2.351419,
              0.301313,
              0.656222,
              -1.622839,
              -1.076662,
              2.726546,
              1.052121,
              -0.859382,
              -1.067205,
              4.123045,
              3.964669,
              3.470833,
              3.419835,
              -1.202946,
              0.510044,
              0.789541,
              2.548193,
              0.708649,
              -1.882543,
              2.085357,
              0.042283,
              3.019019,
              3.152828,
              1.487633,
              -0.246542,
              2.920695,
              4.421458,
              3.466732,
              3.422479,
              3.56793,
              2.568732,
              1.259168,
              0.774902,
              -0.918917,
              2.436748,
              2.658519,
              2.689748,
              0.172804,
              -0.546582,
              0.516186,
              -1.42718,
              1.508338,
              2.824202,
              3.452473,
              3.470682,
              3.200765,
              3.137893,
              0.334781,
              0.457348,
              0.009756,
              0.565054,
              4.07648,
              4.098287,
              2.74392,
              -0.048807,
              2.148484,
              -2.750704,
              0.966046,
              1.730599,
              3.476142,
              3.474034,
              3.332469,
              3.285701,
              0.070686,
              -0.303721,
              0.322631,
              0.564689,
              2.955568,
              3.666068,
              -2.703961,
              -0.027576,
              -0.679046,
              2.051906,
              0.77557,
              0.41283,
              3.489968,
              3.467154,
              1.0381,
              3.666644,
              -1.05028,
              1.160866,
              0.7793,
              -1.726242,
              2.756476,
              3.447718,
              -0.827198,
              1.044958,
              1.631791,
              2.334924
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.927169,
              "min_abs": 0.001731,
              "max_abs": 4.421458,
              "positive": 137,
              "negative": 37,
              "zero": 0
            },
            "rank_score": 107.708676
          },
          {
            "name": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "010000000000000000100000101010011011000100000100000010000010110011010000000000100001010000000000100001001000100000001010000000010110101001000001000000010000110010000110000000",
            "hard_bits_sha256_16": "295f8a69db86c215",
            "hard_weight_174": 40,
            "llr_full_174": [
              4.145349,
              -1.067205,
              0.253328,
              1.259168,
              0.564689,
              4.16914,
              2.085357,
              1.534973,
              0.005093,
              1.0381,
              2.218749,
              3.45256,
              0.510044,
              1.640172,
              -0.679046,
              4.421458,
              0.03456,
              3.045159,
              -0.546582,
              3.470682,
              2.74392,
              3.383096,
              3.489968,
              3.137893,
              0.001731,
              3.300296,
              -0.998732,
              3.187851,
              -1.279105,
              0.289654,
              4.123045,
              -2.000617,
              -0.303721,
              4.07648,
              -2.58036,
              -0.918917,
              0.304115,
              3.066087,
              2.689748,
              0.355787,
              2.402306,
              3.419835,
              3.019019,
              2.334924,
              3.086486,
              -1.42718,
              0.844266,
              2.148484,
              1.914037,
              3.254487,
              2.955568,
              1.044958,
              -1.36693,
              0.271605,
              2.548193,
              3.466732,
              3.285701,
              0.301313,
              0.384955,
              0.41283,
              -1.076662,
              -1.05028,
              0.565054,
              4.166411,
              -0.99225,
              -2.856231,
              4.168008,
              -1.778059,
              0.7793,
              1.487633,
              1.457999,
              3.447718,
              0.584512,
              1.052121,
              1.508338,
              3.56793,
              1.033145,
              3.398004,
              -0.230927,
              0.966046,
              1.8241,
              0.457348,
              2.454295,
              -1.882543,
              3.474034,
              -2.703961,
              2.165497,
              3.452473,
              2.192378,
              0.172804,
              3.352145,
              0.656222,
              3.422479,
              2.201863,
              1.07191,
              2.920695,
              -1.202946,
              1.160866,
              4.168076,
              0.351311,
              0.322631,
              -0.859382,
              0.604867,
              3.666068,
              -1.913077,
              0.777135,
              3.433481,
              2.319559,
              -2.750704,
              3.470833,
              2.926083,
              2.427052,
              1.631791,
              1.730599,
              1.562671,
              2.658519,
              -0.027576,
              2.877556,
              -1.317992,
              2.351419,
              3.391909,
              2.568732,
              0.050637,
              3.200765,
              2.824202,
              0.516457,
              0.070686,
              -1.726242,
              4.16641,
              -2.4347,
              -0.246542,
              4.180269,
              -1.339671,
              0.009756,
              -1.593118,
              2.436748,
              4.098287,
              -1.622839,
              3.152828,
              0.77557,
              3.332469,
              2.037409,
              3.442433,
              -2.612578,
              0.724531,
              0.516186,
              3.964669,
              0.695554,
              0.789541,
              0.316264,
              3.467154,
              -0.827198,
              0.355702,
              3.476142,
              3.666644,
              0.708649,
              0.27805,
              -0.555668,
              0.042283,
              0.334781,
              -0.562778,
              4.167475,
              2.723053,
              0.774902,
              2.756476,
              -0.048807,
              -0.745342,
              1.313865,
              3.083072,
              1.465874,
              1.575325,
              3.435811,
              2.726546,
              2.051906
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.927169,
              "min_abs": 0.001731,
              "max_abs": 4.421458,
              "positive": 137,
              "negative": 37,
              "zero": 0
            },
            "rank_score": 107.708676
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000011000011010000001000101111000010011000011011000001000000010010010000000000000000000000010000000001000011001001011001000011011000001011000011000001001000000",
            "hard_bits_sha256_16": "ca523696fc2e0440",
            "hard_weight_174": 42,
            "llr_full_174": [
              4.145349,
              3.437868,
              3.076058,
              4.180269,
              3.482047,
              3.463052,
              4.168008,
              3.468067,
              3.444662,
              4.168076,
              3.458719,
              3.4346,
              4.07648,
              3.383499,
              3.389547,
              2.756476,
              2.060361,
              2.174491,
              2.955568,
              -1.591113,
              -1.253376,
              2.658519,
              0.56185,
              0.31333,
              3.045159,
              -1.847073,
              -1.011161,
              0.789541,
              0.174324,
              -0.107643,
              2.454295,
              1.419337,
              1.217867,
              3.352145,
              1.901332,
              -1.786838,
              3.300296,
              1.619799,
              1.476712,
              0.27805,
              -0.196181,
              -0.355267,
              0.384955,
              0.155455,
              -0.048096,
              3.200765,
              1.790739,
              1.289837,
              1.0381,
              -0.578368,
              0.827582,
              3.332469,
              -1.961803,
              -1.29335,
              3.56793,
              2.711617,
              2.732275,
              2.319559,
              -0.955261,
              -0.79266,
              3.019019,
              -2.418998,
              -2.684222,
              2.726546,
              0.246221,
              0.165756,
              0.844266,
              0.005053,
              -0.002971,
              2.427052,
              0.760335,
              0.690148,
              1.640172,
              0.29567,
              0.274437,
              0.724531,
              -0.352049,
              0.576942,
              0.966046,
              -0.389375,
              0.336351,
              2.920695,
              -1.212139,
              0.899911,
              4.123045,
              2.833396,
              1.4931,
              4.167475,
              3.462428,
              3.42551,
              4.166411,
              3.458752,
              3.411796,
              4.16641,
              3.465722,
              3.427791,
              4.16914,
              3.412437,
              3.245894,
              4.098287,
              3.125681,
              1.545767,
              3.447718,
              0.04196,
              0.034236,
              3.666068,
              -1.021437,
              0.743729,
              2.689748,
              0.507762,
              0.448774,
              3.083072,
              2.133428,
              1.118333,
              2.548193,
              1.711438,
              -0.459934,
              2.351419,
              0.988211,
              0.73449,
              3.383096,
              -2.736158,
              -2.840271,
              0.355702,
              0.298316,
              -2.186416,
              2.165497,
              1.469319,
              -1.497835,
              2.192378,
              -1.370996,
              -1.28627,
              3.137893,
              2.364918,
              -2.095502,
              3.666644,
              0.505329,
              0.346751,
              3.285701,
              -2.59262,
              -2.560943,
              2.568732,
              -0.215309,
              -0.033375,
              1.534973,
              0.95636,
              0.930803,
              3.152828,
              0.275455,
              -0.0415,
              1.052121,
              -0.432768,
              -0.417069,
              0.777135,
              0.312353,
              0.07304,
              2.402306,
              -1.69446,
              -1.847061,
              1.575325,
              0.530183,
              0.620799,
              1.914037,
              1.527821,
              -1.576503,
              1.730599,
              0.990283,
              -0.932253,
              4.421458,
              0.602345,
              0.410424,
              3.964669,
              3.053424,
              2.814003
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.894503,
              "min_abs": 0.002971,
              "max_abs": 4.421458,
              "positive": 134,
              "negative": 40,
              "zero": 0
            },
            "rank_score": 107.578012
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "001100000001000100001000001010100001100000100001001100001001100000000010000011100011000011001100001000010000010000000010000111000000000000010100000001000011000000001001001000",
            "hard_bits_sha256_16": "2663b8086b53d8ff",
            "hard_weight_174": 42,
            "llr_full_174": [
              4.145349,
              4.167475,
              -0.048096,
              -1.28627,
              0.56185,
              0.507762,
              0.844266,
              0.777135,
              3.4346,
              3.245894,
              2.711617,
              -0.215309,
              3.352145,
              3.383096,
              0.576942,
              -1.576503,
              4.168008,
              4.16641,
              0.827582,
              0.346751,
              0.174324,
              1.711438,
              1.640172,
              1.575325,
              2.174491,
              0.034236,
              -2.418998,
              0.275455,
              0.27805,
              2.165497,
              -1.212139,
              0.602345,
              4.180269,
              4.166411,
              1.289837,
              -2.095502,
              -1.847073,
              2.133428,
              2.427052,
              2.402306,
              3.389547,
              1.545767,
              -0.955261,
              0.95636,
              3.300296,
              0.355702,
              0.336351,
              -0.932253,
              4.168076,
              4.16914,
              -1.29335,
              -2.560943,
              1.419337,
              0.988211,
              0.724531,
              1.914037,
              -1.253376,
              0.743729,
              0.246221,
              -0.432768,
              0.384955,
              2.192378,
              2.833396,
              3.053424,
              3.076058,
              3.42551,
              1.790739,
              2.364918,
              3.045159,
              3.083072,
              -0.002971,
              0.07304,
              3.383499,
              3.125681,
              2.319559,
              1.534973,
              -1.786838,
              -2.840271,
              -0.389375,
              0.990283,
              3.444662,
              3.427791,
              -1.961803,
              -2.59262,
              2.454295,
              2.351419,
              0.274437,
              0.620799,
              -1.591113,
              -1.021437,
              2.726546,
              1.052121,
              -0.355267,
              -1.497835,
              4.123045,
              3.964669,
              3.463052,
              3.411796,
              -0.578368,
              0.505329,
              0.789541,
              2.548193,
              0.690148,
              -1.847061,
              2.060361,
              0.04196,
              3.019019,
              3.152828,
              1.476712,
              -2.186416,
              2.920695,
              4.421458,
              3.458719,
              3.412437,
              3.56793,
              2.568732,
              1.217867,
              0.73449,
              -0.352049,
              1.527821,
              2.658519,
              2.689748,
              0.165756,
              -0.417069,
              0.155455,
              -1.370996,
              1.4931,
              2.814003,
              3.437868,
              3.462428,
              3.200765,
              3.137893,
              0.31333,
              0.448774,
              0.005053,
              0.312353,
              4.07648,
              4.098287,
              2.732275,
              -0.033375,
              1.901332,
              -2.736158,
              0.966046,
              1.730599,
              3.468067,
              3.465722,
              3.332469,
              3.285701,
              -0.107643,
              -0.459934,
              0.29567,
              0.530183,
              2.955568,
              3.666068,
              -2.684222,
              -0.0415,
              -0.196181,
              1.469319,
              0.899911,
              0.410424,
              3.482047,
              3.458752,
              1.0381,
              3.666644,
              -1.011161,
              1.118333,
              0.760335,
              -1.69446,
              2.756476,
              3.447718,
              -0.79266,
              0.930803,
              1.619799,
              0.298316
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.894503,
              "min_abs": 0.002971,
              "max_abs": 4.421458,
              "positive": 134,
              "negative": 40,
              "zero": 0
            },
            "rank_score": 107.578012
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': False, 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "010000000000000000100000101010011011100100000100000010000010110011010000000000100001010000000000100001001000100000001010000000010110101001000001010000010000110010000110000000",
            "hard_bits_sha256_16": "cd7e0a7d331a9605",
            "hard_weight_174": 42,
            "llr_full_174": [
              4.145349,
              -1.497835,
              0.246221,
              1.217867,
              0.530183,
              4.16914,
              2.060361,
              1.534973,
              0.336351,
              1.0381,
              2.133428,
              3.444662,
              0.505329,
              1.640172,
              -0.196181,
              4.421458,
              0.034236,
              3.045159,
              -0.417069,
              3.462428,
              2.732275,
              3.383096,
              3.482047,
              3.137893,
              -0.002971,
              3.300296,
              -1.576503,
              3.125681,
              -1.253376,
              0.275455,
              4.123045,
              -1.961803,
              -0.459934,
              4.07648,
              -2.560943,
              -0.352049,
              -0.048096,
              3.053424,
              2.689748,
              0.174324,
              2.402306,
              3.411796,
              3.019019,
              0.298316,
              3.076058,
              -1.370996,
              0.844266,
              1.901332,
              1.914037,
              3.245894,
              2.955568,
              0.930803,
              -1.212139,
              0.827582,
              2.548193,
              3.458719,
              3.285701,
              0.274437,
              0.384955,
              0.410424,
              -1.021437,
              -1.011161,
              0.312353,
              4.166411,
              -0.955261,
              -2.840271,
              4.168008,
              -2.095502,
              0.760335,
              1.476712,
              0.990283,
              3.447718,
              0.56185,
              1.052121,
              1.4931,
              3.56793,
              0.988211,
              3.389547,
              -0.215309,
              0.966046,
              1.790739,
              0.448774,
              2.454295,
              -1.847061,
              3.465722,
              -2.684222,
              2.165497,
              3.437868,
              2.192378,
              0.165756,
              3.352145,
              0.620799,
              3.412437,
              2.174491,
              0.95636,
              2.920695,
              -0.578368,
              1.118333,
              4.168076,
              0.346751,
              0.29567,
              -0.355267,
              0.602345,
              3.666068,
              -1.847073,
              0.777135,
              3.42551,
              2.319559,
              -2.736158,
              3.463052,
              2.364918,
              2.427052,
              1.619799,
              1.730599,
              1.545767,
              2.658519,
              -0.0415,
              2.833396,
              -1.29335,
              2.351419,
              3.383499,
              2.568732,
              0.576942,
              3.200765,
              2.814003,
              0.507762,
              -0.107643,
              -1.69446,
              4.16641,
              -2.418998,
              -2.186416,
              4.180269,
              -1.28627,
              0.005053,
              -1.786838,
              1.527821,
              4.098287,
              -1.591113,
              3.152828,
              0.899911,
              3.332469,
              1.711438,
              3.4346,
              -2.59262,
              0.724531,
              0.155455,
              3.964669,
              0.743729,
              0.789541,
              0.07304,
              3.458752,
              -0.79266,
              0.355702,
              3.468067,
              3.666644,
              0.690148,
              0.27805,
              -0.932253,
              0.04196,
              0.31333,
              -0.432768,
              4.167475,
              2.711617,
              0.73449,
              2.756476,
              -0.033375,
              -0.389375,
              1.289837,
              3.083072,
              1.419337,
              1.575325,
              3.427791,
              2.726546,
              1.469319
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.894503,
              "min_abs": 0.002971,
              "max_abs": 4.421458,
              "positive": 134,
              "negative": 40,
              "zero": 0
            },
            "rank_score": 107.578012
          },
          {
            "name": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000011000011101000110000010100000101011000011011000110000000101101101000000000000000000000101000000110000011110110011110000011011000110011000011000110110000000",
            "hard_bits_sha256_16": "11a8af0598c33a55",
            "hard_weight_174": 54,
            "llr_full_174": [
              3.511245,
              3.086486,
              3.452473,
              4.14242,
              3.470833,
              3.489968,
              4.12139,
              3.45256,
              3.476142,
              4.11961,
              3.442433,
              3.466732,
              4.08862,
              3.398004,
              3.391909,
              3.003457,
              2.201863,
              2.085357,
              1.978199,
              -1.279105,
              -1.622839,
              1.080854,
              0.334781,
              0.584512,
              1.333744,
              -1.05028,
              -1.913077,
              -0.473047,
              0.070686,
              0.355787,
              1.942431,
              1.259168,
              1.465874,
              -2.926977,
              -1.593118,
              2.148484,
              2.678266,
              1.487633,
              1.631791,
              0.507303,
              -0.859382,
              -0.679046,
              -0.118003,
              0.304115,
              0.516186,
              1.87262,
              1.313865,
              1.8241,
              -1.599648,
              0.271605,
              -1.202946,
              1.748972,
              -1.317992,
              -2.000617,
              3.617447,
              2.74392,
              2.723053,
              1.719706,
              -0.827198,
              -0.99225,
              3.575036,
              -2.703961,
              -2.4347,
              1.361861,
              0.172804,
              0.253328,
              -0.477879,
              0.001731,
              0.009756,
              2.023583,
              0.708649,
              0.7793,
              1.473774,
              0.301313,
              0.322631,
              -1.264035,
              0.050637,
              -0.918917,
              -0.820746,
              0.005093,
              -0.745342,
              -1.732909,
              0.77557,
              -1.36693,
              1.694026,
              1.508338,
              2.877556,
              4.094062,
              3.433481,
              3.470682,
              4.073255,
              3.419835,
              3.467154,
              4.091336,
              3.435811,
              3.474034,
              3.8423,
              3.254487,
              3.422479,
              1.677122,
              1.562671,
              3.187851,
              2.01941,
              0.03456,
              0.042283,
              -1.807547,
              0.695554,
              -1.076662,
              2.065345,
              0.457348,
              0.516457,
              1.346997,
              1.160866,
              2.218749,
              -0.571842,
              -0.303721,
              2.037409,
              1.499097,
              0.774902,
              1.033145,
              3.593033,
              -2.856231,
              -2.750704,
              -3.635826,
              -0.246542,
              2.334924,
              -2.226011,
              -1.067205,
              2.051906,
              1.999342,
              -1.339671,
              -1.42718,
              -2.621792,
              -1.778059,
              2.926083,
              1.582817,
              0.351311,
              0.510044,
              3.223063,
              -2.58036,
              -2.612578,
              0.268492,
              -0.048807,
              -0.230927,
              1.48451,
              1.044958,
              1.07191,
              -0.280146,
              -0.027576,
              0.289654,
              1.008293,
              -0.546582,
              -0.562778,
              0.17487,
              0.316264,
              0.565054,
              2.750596,
              -1.882543,
              -1.726242,
              2.006609,
              0.656222,
              0.564689,
              -1.988459,
              -0.998732,
              2.436748,
              -1.598288,
              -0.555668,
              1.457999,
              1.642426,
              0.41283,
              0.604867,
              3.449224,
              2.824202,
              3.066087
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.733097,
              "min_abs": 0.001731,
              "max_abs": 4.14242,
              "positive": 121,
              "negative": 53,
              "zero": 0
            },
            "rank_score": 106.932388
          },
          {
            "name": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000100100001101000100100001101000000100000100110001100111101100000010000000001010011000010000000000011010001001000000001000101000001001000011111000010000110111000101001001001",
            "hard_bits_sha256_16": "cf6690c1042ed612",
            "hard_weight_174": 54,
            "llr_full_174": [
              3.511245,
              4.094062,
              0.516186,
              -1.42718,
              0.334781,
              0.457348,
              -0.477879,
              0.17487,
              3.466732,
              3.422479,
              2.74392,
              -0.048807,
              -2.926977,
              3.593033,
              -0.918917,
              2.436748,
              4.12139,
              4.091336,
              -1.202946,
              0.510044,
              0.070686,
              -0.303721,
              1.473774,
              2.006609,
              2.085357,
              0.042283,
              -2.703961,
              -0.027576,
              0.507303,
              -2.226011,
              0.77557,
              0.41283,
              4.14242,
              4.073255,
              1.8241,
              2.926083,
              -1.05028,
              1.160866,
              2.023583,
              2.750596,
              3.391909,
              3.187851,
              -0.827198,
              1.044958,
              2.678266,
              -3.635826,
              -0.745342,
              1.457999,
              4.11961,
              3.8423,
              -2.000617,
              -2.612578,
              1.259168,
              0.774902,
              -1.264035,
              -1.988459,
              -1.622839,
              -1.076662,
              0.172804,
              -0.546582,
              -0.118003,
              1.999342,
              1.508338,
              2.824202,
              3.452473,
              3.470682,
              1.313865,
              -1.778059,
              1.333744,
              1.346997,
              0.009756,
              0.565054,
              3.398004,
              1.562671,
              1.719706,
              1.48451,
              2.148484,
              -2.750704,
              0.005093,
              -0.555668,
              3.476142,
              3.474034,
              -1.317992,
              -2.58036,
              1.942431,
              1.499097,
              0.322631,
              0.564689,
              -1.279105,
              0.695554,
              1.361861,
              1.008293,
              -0.679046,
              2.051906,
              1.694026,
              3.449224,
              3.489968,
              3.467154,
              0.271605,
              0.351311,
              -0.473047,
              -0.571842,
              0.7793,
              -1.726242,
              2.201863,
              0.03456,
              3.575036,
              -0.280146,
              1.631791,
              2.334924,
              -1.732909,
              1.642426,
              3.442433,
              3.254487,
              3.617447,
              0.268492,
              1.465874,
              1.033145,
              0.050637,
              -0.998732,
              1.080854,
              2.065345,
              0.253328,
              -0.562778,
              0.304115,
              -1.339671,
              2.877556,
              3.066087,
              3.086486,
              3.433481,
              1.87262,
              -2.621792,
              0.584512,
              0.516457,
              0.001731,
              0.316264,
              4.08862,
              1.677122,
              2.723053,
              -0.230927,
              -1.593118,
              -2.856231,
              -0.820746,
              -1.598288,
              3.45256,
              3.435811,
              1.748972,
              3.223063,
              0.355787,
              2.037409,
              0.301313,
              0.656222,
              1.978199,
              -1.807547,
              -2.4347,
              0.289654,
              -0.859382,
              -1.067205,
              -1.36693,
              0.604867,
              3.470833,
              3.419835,
              -1.599648,
              1.582817,
              -1.913077,
              2.218749,
              0.708649,
              -1.882543,
              3.003457,
              2.01941,
              -0.99225,
              1.07191,
              1.487633,
              -0.246542
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.733097,
              "min_abs": 0.001731,
              "max_abs": 4.14242,
              "positive": 121,
              "negative": 53,
              "zero": 0
            },
            "rank_score": 106.932388
          },
          {
            "name": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_primary', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000001100001000100001000011010010000000010111100001100010010011000010000000110001011000100001000000011000101001000010001000110100110101110101100110011000000010000100000001",
            "hard_bits_sha256_16": "677c5f0295abfd3d",
            "hard_weight_174": 54,
            "llr_full_174": [
              3.511245,
              2.051906,
              0.172804,
              1.465874,
              0.656222,
              3.8423,
              2.201863,
              1.48451,
              -0.745342,
              -1.599648,
              1.160866,
              3.476142,
              0.351311,
              1.473774,
              -0.859382,
              1.642426,
              0.042283,
              1.333744,
              -0.562778,
              3.433481,
              2.723053,
              3.593033,
              3.470833,
              -2.621792,
              0.009756,
              2.678266,
              2.436748,
              1.562671,
              -1.622839,
              -0.027576,
              1.694026,
              -1.317992,
              2.037409,
              4.08862,
              -2.612578,
              0.050637,
              0.516186,
              2.824202,
              2.065345,
              0.070686,
              2.750596,
              3.467154,
              3.575036,
              -0.246542,
              3.452473,
              -1.339671,
              -0.477879,
              -1.593118,
              -1.988459,
              3.422479,
              1.978199,
              1.07191,
              0.77557,
              -1.202946,
              -0.571842,
              3.442433,
              3.223063,
              0.322631,
              -0.118003,
              0.604867,
              0.695554,
              -1.913077,
              0.316264,
              4.073255,
              -0.827198,
              -2.750704,
              4.12139,
              2.926083,
              0.708649,
              1.631791,
              -0.555668,
              2.01941,
              0.334781,
              1.008293,
              2.877556,
              3.617447,
              0.774902,
              3.391909,
              -0.048807,
              -0.820746,
              1.313865,
              0.516457,
              1.942431,
              -1.726242,
              3.435811,
              -2.4347,
              -2.226011,
              3.086486,
              1.999342,
              0.253328,
              -2.926977,
              0.564689,
              3.254487,
              2.085357,
              1.044958,
              -1.732909,
              0.271605,
              2.218749,
              4.11961,
              0.510044,
              0.301313,
              -0.679046,
              0.41283,
              -1.807547,
              -1.05028,
              0.17487,
              3.470682,
              1.719706,
              -2.856231,
              3.489968,
              -1.778059,
              2.023583,
              1.487633,
              -1.598288,
              3.187851,
              1.080854,
              0.289654,
              1.508338,
              -2.000617,
              1.499097,
              3.398004,
              0.268492,
              -0.918917,
              1.87262,
              3.066087,
              0.457348,
              0.355787,
              -1.882543,
              4.091336,
              -2.703961,
              2.334924,
              4.14242,
              -1.42718,
              0.001731,
              2.148484,
              -0.998732,
              1.677122,
              -1.279105,
              -0.280146,
              -1.36693,
              1.748972,
              -0.303721,
              3.466732,
              -2.58036,
              -1.264035,
              0.304115,
              3.449224,
              -1.076662,
              -0.473047,
              0.565054,
              3.419835,
              -0.99225,
              -3.635826,
              3.45256,
              1.582817,
              0.7793,
              0.507303,
              1.457999,
              0.03456,
              0.584512,
              -0.546582,
              4.094062,
              2.74392,
              1.033145,
              3.003457,
              -0.230927,
              0.005093,
              1.8241,
              1.346997,
              1.259168,
              2.006609,
              3.474034,
              1.361861,
              -1.067205
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.733097,
              "min_abs": 0.001731,
              "max_abs": 4.14242,
              "positive": 121,
              "negative": 53,
              "zero": 0
            },
            "rank_score": 106.932388
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'none'}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000000000000000011000011101000110000010111000101011000011011000110000000101101101000000000000000000000101000000110000011110110011110000011011000110011000011000110110000000",
            "hard_bits_sha256_16": "59ffe501f1e043cb",
            "hard_weight_174": 56,
            "llr_full_174": [
              3.511245,
              3.076058,
              3.437868,
              4.14242,
              3.463052,
              3.482047,
              4.12139,
              3.444662,
              3.468067,
              4.11961,
              3.4346,
              3.458719,
              4.08862,
              3.389547,
              3.383499,
              3.003457,
              2.174491,
              2.060361,
              1.978199,
              -1.253376,
              -1.591113,
              1.080854,
              0.31333,
              0.56185,
              1.333744,
              -1.011161,
              -1.847073,
              -0.473047,
              -0.107643,
              0.174324,
              1.942431,
              1.217867,
              1.419337,
              -2.926977,
              -1.786838,
              1.901332,
              2.678266,
              1.476712,
              1.619799,
              0.507303,
              -0.355267,
              -0.196181,
              -0.118003,
              -0.048096,
              0.155455,
              1.87262,
              1.289837,
              1.790739,
              -1.599648,
              0.827582,
              -0.578368,
              1.748972,
              -1.29335,
              -1.961803,
              3.617447,
              2.732275,
              2.711617,
              1.719706,
              -0.79266,
              -0.955261,
              3.575036,
              -2.684222,
              -2.418998,
              1.361861,
              0.165756,
              0.246221,
              -0.477879,
              -0.002971,
              0.005053,
              2.023583,
              0.690148,
              0.760335,
              1.473774,
              0.274437,
              0.29567,
              -1.264035,
              0.576942,
              -0.352049,
              -0.820746,
              0.336351,
              -0.389375,
              -1.732909,
              0.899911,
              -1.212139,
              1.694026,
              1.4931,
              2.833396,
              4.094062,
              3.42551,
              3.462428,
              4.073255,
              3.411796,
              3.458752,
              4.091336,
              3.427791,
              3.465722,
              3.8423,
              3.245894,
              3.412437,
              1.677122,
              1.545767,
              3.125681,
              2.01941,
              0.034236,
              0.04196,
              -1.807547,
              0.743729,
              -1.021437,
              2.065345,
              0.448774,
              0.507762,
              1.346997,
              1.118333,
              2.133428,
              -0.571842,
              -0.459934,
              1.711438,
              1.499097,
              0.73449,
              0.988211,
              3.593033,
              -2.840271,
              -2.736158,
              -3.635826,
              -2.186416,
              0.298316,
              -2.226011,
              -1.497835,
              1.469319,
              1.999342,
              -1.28627,
              -1.370996,
              -2.621792,
              -2.095502,
              2.364918,
              1.582817,
              0.346751,
              0.505329,
              3.223063,
              -2.560943,
              -2.59262,
              0.268492,
              -0.033375,
              -0.215309,
              1.48451,
              0.930803,
              0.95636,
              -0.280146,
              -0.0415,
              0.275455,
              1.008293,
              -0.417069,
              -0.432768,
              0.17487,
              0.07304,
              0.312353,
              2.750596,
              -1.847061,
              -1.69446,
              2.006609,
              0.620799,
              0.530183,
              -1.988459,
              -1.576503,
              1.527821,
              -1.598288,
              -0.932253,
              0.990283,
              1.642426,
              0.410424,
              0.602345,
              3.449224,
              2.814003,
              3.053424
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.700431,
              "min_abs": 0.002971,
              "max_abs": 4.14242,
              "positive": 118,
              "negative": 56,
              "zero": 0
            },
            "rank_score": 106.801724
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'ft8_bitrev', 'direction': 'deinterleave_rx_to_codeword', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "001100100001101000100100001101000000100000100110001100111101100000010000000001010011000010000000000011010001001000000001000111000001001000011111000010000110111000101001001001",
            "hard_bits_sha256_16": "ff8640fb5870e924",
            "hard_weight_174": 56,
            "llr_full_174": [
              3.511245,
              4.094062,
              0.155455,
              -1.370996,
              0.31333,
              0.448774,
              -0.477879,
              0.17487,
              3.458719,
              3.412437,
              2.732275,
              -0.033375,
              -2.926977,
              3.593033,
              -0.352049,
              1.527821,
              4.12139,
              4.091336,
              -0.578368,
              0.505329,
              -0.107643,
              -0.459934,
              1.473774,
              2.006609,
              2.060361,
              0.04196,
              -2.684222,
              -0.0415,
              0.507303,
              -2.226011,
              0.899911,
              0.410424,
              4.14242,
              4.073255,
              1.790739,
              2.364918,
              -1.011161,
              1.118333,
              2.023583,
              2.750596,
              3.383499,
              3.125681,
              -0.79266,
              0.930803,
              2.678266,
              -3.635826,
              -0.389375,
              0.990283,
              4.11961,
              3.8423,
              -1.961803,
              -2.59262,
              1.217867,
              0.73449,
              -1.264035,
              -1.988459,
              -1.591113,
              -1.021437,
              0.165756,
              -0.417069,
              -0.118003,
              1.999342,
              1.4931,
              2.814003,
              3.437868,
              3.462428,
              1.289837,
              -2.095502,
              1.333744,
              1.346997,
              0.005053,
              0.312353,
              3.389547,
              1.545767,
              1.719706,
              1.48451,
              1.901332,
              -2.736158,
              0.336351,
              -0.932253,
              3.468067,
              3.465722,
              -1.29335,
              -2.560943,
              1.942431,
              1.499097,
              0.29567,
              0.530183,
              -1.253376,
              0.743729,
              1.361861,
              1.008293,
              -0.196181,
              1.469319,
              1.694026,
              3.449224,
              3.482047,
              3.458752,
              0.827582,
              0.346751,
              -0.473047,
              -0.571842,
              0.760335,
              -1.69446,
              2.174491,
              0.034236,
              3.575036,
              -0.280146,
              1.619799,
              0.298316,
              -1.732909,
              1.642426,
              3.4346,
              3.245894,
              3.617447,
              0.268492,
              1.419337,
              0.988211,
              0.576942,
              -1.576503,
              1.080854,
              2.065345,
              0.246221,
              -0.432768,
              -0.048096,
              -1.28627,
              2.833396,
              3.053424,
              3.076058,
              3.42551,
              1.87262,
              -2.621792,
              0.56185,
              0.507762,
              -0.002971,
              0.07304,
              4.08862,
              1.677122,
              2.711617,
              -0.215309,
              -1.786838,
              -2.840271,
              -0.820746,
              -1.598288,
              3.444662,
              3.427791,
              1.748972,
              3.223063,
              0.174324,
              1.711438,
              0.274437,
              0.620799,
              1.978199,
              -1.807547,
              -2.418998,
              0.275455,
              -0.355267,
              -1.497835,
              -1.212139,
              0.602345,
              3.463052,
              3.411796,
              -1.599648,
              1.582817,
              -1.847073,
              2.133428,
              0.690148,
              -1.847061,
              3.003457,
              2.01941,
              -0.955261,
              0.95636,
              1.476712,
              -2.186416
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.700431,
              "min_abs": 0.002971,
              "max_abs": 4.14242,
              "positive": 118,
              "negative": 56,
              "zero": 0
            },
            "rank_score": 106.801724
          },
          {
            "name": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "description": "Step 51 mapped LDPC candidate: {'tone_mapping': 'ft8_gray_alt_high', 'gray_direction': 'inverse_observed_to_plain', 'reverse_bits_within_tone_before_gray': True, 'interleaver': 'ft8_bitrev', 'direction': 'interleave_codeword_to_rx_inverse', 'order_len': 174}",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "000000001100001000100001000011010010100000010111100001100010010011000010000000110001011000100001000000011000101001000010001000110100110101110101110110011000000010000100000001",
            "hard_bits_sha256_16": "bfb5977abc51e8a1",
            "hard_weight_174": 56,
            "llr_full_174": [
              3.511245,
              1.469319,
              0.165756,
              1.419337,
              0.620799,
              3.8423,
              2.174491,
              1.48451,
              -0.389375,
              -1.599648,
              1.118333,
              3.468067,
              0.346751,
              1.473774,
              -0.355267,
              1.642426,
              0.04196,
              1.333744,
              -0.432768,
              3.42551,
              2.711617,
              3.593033,
              3.463052,
              -2.621792,
              0.005053,
              2.678266,
              1.527821,
              1.545767,
              -1.591113,
              -0.0415,
              1.694026,
              -1.29335,
              1.711438,
              4.08862,
              -2.59262,
              0.576942,
              0.155455,
              2.814003,
              2.065345,
              -0.107643,
              2.750596,
              3.458752,
              3.575036,
              -2.186416,
              3.437868,
              -1.28627,
              -0.477879,
              -1.786838,
              -1.988459,
              3.412437,
              1.978199,
              0.95636,
              0.899911,
              -0.578368,
              -0.571842,
              3.4346,
              3.223063,
              0.29567,
              -0.118003,
              0.602345,
              0.743729,
              -1.847073,
              0.07304,
              4.073255,
              -0.79266,
              -2.736158,
              4.12139,
              2.364918,
              0.690148,
              1.619799,
              -0.932253,
              2.01941,
              0.31333,
              1.008293,
              2.833396,
              3.617447,
              0.73449,
              3.383499,
              -0.033375,
              -0.820746,
              1.289837,
              0.507762,
              1.942431,
              -1.69446,
              3.427791,
              -2.418998,
              -2.226011,
              3.076058,
              1.999342,
              0.246221,
              -2.926977,
              0.530183,
              3.245894,
              2.060361,
              0.930803,
              -1.732909,
              0.827582,
              2.133428,
              4.11961,
              0.505329,
              0.274437,
              -0.196181,
              0.410424,
              -1.807547,
              -1.011161,
              0.17487,
              3.462428,
              1.719706,
              -2.840271,
              3.482047,
              -2.095502,
              2.023583,
              1.476712,
              -1.598288,
              3.125681,
              1.080854,
              0.275455,
              1.4931,
              -1.961803,
              1.499097,
              3.389547,
              0.268492,
              -0.352049,
              1.87262,
              3.053424,
              0.448774,
              0.174324,
              -1.847061,
              4.091336,
              -2.684222,
              0.298316,
              4.14242,
              -1.370996,
              -0.002971,
              1.901332,
              -1.576503,
              1.677122,
              -1.253376,
              -0.280146,
              -1.212139,
              1.748972,
              -0.459934,
              3.458719,
              -2.560943,
              -1.264035,
              -0.048096,
              3.449224,
              -1.021437,
              -0.473047,
              0.312353,
              3.411796,
              -0.955261,
              -3.635826,
              3.444662,
              1.582817,
              0.760335,
              0.507303,
              0.990283,
              0.034236,
              0.56185,
              -0.417069,
              4.094062,
              2.732275,
              0.988211,
              3.003457,
              -0.215309,
              0.336351,
              1.790739,
              1.346997,
              1.217867,
              2.006609,
              3.465722,
              1.361861,
              -1.497835
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.700431,
              "min_abs": 0.002971,
              "max_abs": 4.14242,
              "positive": 118,
              "negative": 56,
              "zero": 0
            },
            "rank_score": 106.801724
          },
          {
            "name": "lab_mask_xor_preview",
            "description": "Deterministic lab-only XOR mask preview; not the real JS8 whitening polynomial.",
            "bit_count": 174,
            "llr_count": 174,
            "complete_174bit_candidate": true,
            "hard_bits_174": "100000110011010100101001101000010001101100010110111111000100101000110111100010101100100101100100100000010010001100011111000111111010010001111000011101101101111000011100011111",
            "hard_bits_sha256_16": "b1bb86c852f0f4ca",
            "hard_weight_174": 85,
            "llr_full_174": [
              4.145349,
              4.116374,
              3.511245,
              4.180269,
              4.169674,
              4.14242,
              4.168008,
              4.153984,
              4.12139,
              4.168076,
              4.135428,
              4.11961,
              4.07648,
              4.076237,
              4.08862,
              2.756476,
              2.742424,
              3.003457,
              2.955568,
              -1.875523,
              1.978199,
              2.658519,
              0.652185,
              1.080854,
              3.045159,
              -2.198749,
              1.333744,
              0.789541,
              0.471669,
              -0.473047,
              2.454295,
              1.837215,
              1.942431,
              3.352145,
              2.163158,
              -2.926977,
              3.300296,
              1.818615,
              2.678266,
              0.27805,
              -1.765651,
              0.507303,
              0.384955,
              0.866369,
              -0.118003,
              3.200765,
              2.063815,
              1.87262,
              1.0381,
              -1.355162,
              -1.599648,
              3.332469,
              -2.249717,
              1.748972,
              3.56793,
              3.262649,
              3.617447,
              2.319559,
              -1.211827,
              1.719706,
              3.019019,
              -3.210486,
              3.575036,
              2.726546,
              0.281133,
              1.361861,
              0.844266,
              0.012672,
              -0.477879,
              2.427052,
              0.927501,
              2.023583,
              1.640172,
              0.441842,
              1.473774,
              0.724531,
              -1.103418,
              -1.264035,
              0.966046,
              -0.916188,
              -0.820746,
              2.920695,
              -1.395798,
              -1.732909,
              4.123045,
              3.154533,
              1.694026,
              4.167475,
              4.14333,
              4.094062,
              4.166411,
              4.137106,
              4.073255,
              4.16641,
              4.1509,
              4.091336,
              4.16914,
              4.045318,
              3.8423,
              4.098287,
              3.599922,
              1.677122,
              3.447718,
              0.044719,
              2.01941,
              3.666068,
              -1.085865,
              -1.807547,
              2.689748,
              0.585744,
              2.065345,
              3.083072,
              2.617179,
              1.346997,
              2.548193,
              2.264806,
              -0.571842,
              2.351419,
              1.247615,
              1.499097,
              3.383096,
              -3.47555,
              3.593033,
              0.355702,
              2.45095,
              -3.635826,
              2.165497,
              2.132701,
              -2.226011,
              2.192378,
              -1.921746,
              1.999342,
              3.137893,
              2.980057,
              -2.621792,
              3.666644,
              0.533081,
              1.582817,
              3.285701,
              -3.283029,
              3.223063,
              2.568732,
              -0.251398,
              0.268492,
              1.534973,
              1.692448,
              1.48451,
              3.152828,
              0.300403,
              -0.280146,
              1.052121,
              -0.948727,
              1.008293,
              0.777135,
              0.891886,
              0.17487,
              2.402306,
              -2.356355,
              2.750596,
              1.575325,
              0.833633,
              2.006609,
              1.914037,
              2.633553,
              -1.988459,
              1.730599,
              1.570304,
              -1.598288,
              4.421458,
              0.617935,
              1.642426,
              3.964669,
              3.566732,
              3.449224
            ],
            "llr_stats": {
              "count": 174,
              "avg_abs": 2.298973,
              "min_abs": 0.012672,
              "max_abs": 4.421458,
              "positive": 141,
              "negative": 33,
              "zero": 0
            },
            "rank_score": 101.195892
          }
        ],
        "outputs": {
          "candidate_json": "/decoders/js8_decoder/runtime/fec_candidates/js8_quick_selected_window_fec_candidate_step17.json",
          "selected_bits_file": "/decoders/js8_decoder/runtime/fec_candidates/js8_quick_selected_window_fec_candidate_step17.bits"
        },
        "decodes": [],
        "warnings": [
          "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
          "Step 51 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 51 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 51 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."
        ],
        "next_action": "Run collect-logs and upload the JS8Lab bundle. If selected_variant.complete_174bit_candidate is true, proceed to LDPC/deinterleaver/message-unpack tuning."
      }
    },
    "timing_boundary_sweep": {
      "name": "20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "url": "/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 145265,
        "mtime_utc": "2026-05-27T11:11:09Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-timing-boundary-candidate-sweep",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
        "profile_scan_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
        "anchor_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_auto_ldpc_probe_output.json",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step51_source_aligned_timing_boundary_syndrome_sweep_no_message_unpack",
        "anchor_selection": {
          "source": "profile_scan_json",
          "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
          "selection": "profile_scan_selected_profile",
          "nsps": 6400,
          "start_seconds": 4.8,
          "base_freq_hz": 1025.0,
          "tone_spacing_hz": 1.875
        },
        "partial": false,
        "partial_reason": "complete",
        "sweep_elapsed_seconds": 158.007,
        "source_alignment": {
          "source_nsps": 6192,
          "source_tone_spacing_hz": 1.937984496124031,
          "effective_nsps": 6192,
          "effective_tone_spacing_base_hz": 1.937984496124031
        },
        "sweep_grid": {
          "start_offsets_s": [
            0.0,
            0.03,
            0.06,
            0.09,
            0.12
          ],
          "base_freq_offsets_hz": [
            1.5,
            2.0,
            2.5,
            3.0,
            3.5
          ],
          "tone_spacing_offsets_hz": [
            -0.03,
            0.0,
            0.03
          ],
          "max_combinations": 45,
          "actual_combinations": 45,
          "processed_combinations": 45,
          "time_budget_seconds": 210.0
        },
        "decode_found": false,
        "best_final_syndrome_weight": 22,
        "best_candidate": {
          "combination_index": 11,
          "offsets": {
            "start_offset_s": 0.0,
            "base_freq_offset_hz": 3.0,
            "tone_spacing_offset_hz": -0.03
          },
          "anchor_applied": {
            "start_seconds": 4.8,
            "base_freq_hz": 1028.0,
            "tone_spacing_hz": 1.9079844961240309,
            "nsps": 6192
          },
          "pipeline_ok": true,
          "fec_input_summary": {
            "soft_bit_count": 174,
            "missing_soft_bits": 0,
            "complete_ldpc_input_candidate": true,
            "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
          },
          "sync_candidate": {
            "start_sample": 57600,
            "start_seconds": 4.8,
            "base_freq_hz": 1028.0,
            "tone_spacing_hz": 1.9079844961240309,
            "nsps": 6192,
            "candidate_score": null,
            "costas_hits": null,
            "avg_margin_db": null,
            "anchor_source": "step51_source_aligned_timing_sweep:11"
          },
          "best_row": {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "bit_count": 174,
            "hard_weight_174": 36,
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            },
            "source_rank_score": 105.166392,
            "syndrome_weight": 22,
            "valid_codeword_hard_decision": false,
            "message91_sha256_16": "d4ca2a05f15dd009",
            "codeword174_sha256_16": "95a1e941fbdff6b2"
          },
          "top_rows": [
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.291598,
                "min_abs": 0.001433,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.166392,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.289323,
                "min_abs": 0.000933,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.157292,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 61,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.11433,
                "min_abs": 0.000187,
                "max_abs": 3.795489,
                "positive": 110,
                "negative": 64,
                "zero": 0
              },
              "source_rank_score": 104.45732,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 61,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.079292,
                "min_abs": 0.000226,
                "max_abs": 3.795489,
                "positive": 110,
                "negative": 64,
                "zero": 0
              },
              "source_rank_score": 104.317168,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            {
              "variant": "lab_mask_xor_preview",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 93,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.818736,
                "min_abs": 0.003108,
                "max_abs": 4.379379,
                "positive": 34,
                "negative": 140,
                "zero": 0
              },
              "source_rank_score": 99.274944,
              "syndrome_weight": 29,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "4439454e612f6636",
              "codeword174_sha256_16": "953e2bc596e8a67e"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.666423,
                "min_abs": 0.002022,
                "max_abs": 3.950111,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 106.665692,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.625634,
                "min_abs": 0.003108,
                "max_abs": 3.895705,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 106.502536,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.617209,
                "min_abs": 0.001539,
                "max_abs": 3.944456,
                "positive": 123,
                "negative": 51,
                "zero": 0
              },
              "source_rank_score": 106.468836,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "202d2650a31499d7",
              "codeword174_sha256_16": "6c43e3bd22022c79"
            }
          ],
          "warnings": [
            "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
            "Step 51 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 51 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."
          ]
        },
        "top_candidates": [
          {
            "combination_index": 11,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:11"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.291598,
                "min_abs": 0.001433,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.166392,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.291598,
                  "min_abs": 0.001433,
                  "max_abs": 3.895705,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 105.166392,
                "syndrome_weight": 22,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d4ca2a05f15dd009",
                "codeword174_sha256_16": "95a1e941fbdff6b2"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.289323,
                  "min_abs": 0.000933,
                  "max_abs": 3.895705,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 105.157292,
                "syndrome_weight": 22,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d4ca2a05f15dd009",
                "codeword174_sha256_16": "95a1e941fbdff6b2"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 61,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.11433,
                  "min_abs": 0.000187,
                  "max_abs": 3.795489,
                  "positive": 110,
                  "negative": 64,
                  "zero": 0
                },
                "source_rank_score": 104.45732,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bab866be6de1cc5a",
                "codeword174_sha256_16": "4b4b446b1e4f7aae"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 61,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.079292,
                  "min_abs": 0.000226,
                  "max_abs": 3.795489,
                  "positive": 110,
                  "negative": 64,
                  "zero": 0
                },
                "source_rank_score": 104.317168,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bab866be6de1cc5a",
                "codeword174_sha256_16": "4b4b446b1e4f7aae"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 93,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.818736,
                  "min_abs": 0.003108,
                  "max_abs": 4.379379,
                  "positive": 34,
                  "negative": 140,
                  "zero": 0
                },
                "source_rank_score": 99.274944,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4439454e612f6636",
                "codeword174_sha256_16": "953e2bc596e8a67e"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.666423,
                  "min_abs": 0.002022,
                  "max_abs": 3.950111,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 106.665692,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1bf4f3a7e6e5f651",
                "codeword174_sha256_16": "daeb23bbbdf896b0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.625634,
                  "min_abs": 0.003108,
                  "max_abs": 3.895705,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 106.502536,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1bf4f3a7e6e5f651",
                "codeword174_sha256_16": "daeb23bbbdf896b0"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.617209,
                  "min_abs": 0.001539,
                  "max_abs": 3.944456,
                  "positive": 123,
                  "negative": 51,
                  "zero": 0
                },
                "source_rank_score": 106.468836,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "202d2650a31499d7",
                "codeword174_sha256_16": "6c43e3bd22022c79"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 2,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 1.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:2"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 127,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.733511,
                "min_abs": 0.012055,
                "max_abs": 4.121456,
                "positive": 45,
                "negative": 129,
                "zero": 0
              },
              "source_rank_score": 106.934044,
              "syndrome_weight": 23,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "392cab12a34759b9",
              "codeword174_sha256_16": "5e40b5a83c672886"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 127,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.733511,
                  "min_abs": 0.012055,
                  "max_abs": 4.121456,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.934044,
                "syndrome_weight": 23,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "392cab12a34759b9",
                "codeword174_sha256_16": "5e40b5a83c672886"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.881544,
                  "min_abs": 0.008612,
                  "max_abs": 4.094064,
                  "positive": 115,
                  "negative": 59,
                  "zero": 0
                },
                "source_rank_score": 111.526176,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "128117b042d0d534",
                "codeword174_sha256_16": "b0809bdee52aa2eb"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.029253,
                  "min_abs": 0.008612,
                  "max_abs": 4.159387,
                  "positive": 134,
                  "negative": 40,
                  "zero": 0
                },
                "source_rank_score": 111.117012,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "128117b042d0d534",
                "codeword174_sha256_16": "b0809bdee52aa2eb"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 113,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.409152,
                  "min_abs": 0.001536,
                  "max_abs": 4.121456,
                  "positive": 53,
                  "negative": 121,
                  "zero": 0
                },
                "source_rank_score": 105.636608,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a7ec7573558f6d66",
                "codeword174_sha256_16": "fd238f7999c92f54"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 97,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.258287,
                  "min_abs": 0.00739,
                  "max_abs": 4.094064,
                  "positive": 73,
                  "negative": 101,
                  "zero": 0
                },
                "source_rank_score": 105.033148,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "10a0624085517fbb",
                "codeword174_sha256_16": "2e36371617234c9c"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.691846,
                  "min_abs": 3.9e-05,
                  "max_abs": 4.159387,
                  "positive": 139,
                  "negative": 35,
                  "zero": 0
                },
                "source_rank_score": 106.767384,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "fa72b5aad0016ab4",
                "codeword174_sha256_16": "9a4cfc262b798d41"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.342044,
                  "min_abs": 3.9e-05,
                  "max_abs": 3.408185,
                  "positive": 130,
                  "negative": 44,
                  "zero": 0
                },
                "source_rank_score": 105.368176,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "ff6f9fd31170e8ba",
                "codeword174_sha256_16": "1740cb3878bab5bf"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 109,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.807528,
                  "min_abs": 0.007795,
                  "max_abs": 4.094064,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 125.230112,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "07b13c8ed6906112",
                "codeword174_sha256_16": "00e44a669eea08bb"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 1,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 1.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:1"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 123,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.615244,
                "min_abs": 0.009081,
                "max_abs": 4.107793,
                "positive": 49,
                "negative": 125,
                "zero": 0
              },
              "source_rank_score": 106.460976,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "392cab12a34759b9",
              "codeword174_sha256_16": "5ae8d6b48d414f34"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 123,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.615244,
                  "min_abs": 0.009081,
                  "max_abs": 4.107793,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 106.460976,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "392cab12a34759b9",
                "codeword174_sha256_16": "5ae8d6b48d414f34"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 95,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.197035,
                  "min_abs": 0.00517,
                  "max_abs": 3.968945,
                  "positive": 71,
                  "negative": 103,
                  "zero": 0
                },
                "source_rank_score": 104.78814,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "92b10effeeeb19a8",
                "codeword174_sha256_16": "1c65597835257916"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.775836,
                  "min_abs": 0.021293,
                  "max_abs": 4.112074,
                  "positive": 117,
                  "negative": 57,
                  "zero": 0
                },
                "source_rank_score": 111.103344,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c94e2d2f80c7bd08",
                "codeword174_sha256_16": "746597535b28b3a5"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.924785,
                  "min_abs": 0.021293,
                  "max_abs": 4.127648,
                  "positive": 135,
                  "negative": 39,
                  "zero": 0
                },
                "source_rank_score": 110.69914,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c94e2d2f80c7bd08",
                "codeword174_sha256_16": "746597535b28b3a5"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.924785,
                  "min_abs": 0.021293,
                  "max_abs": 4.127648,
                  "positive": 135,
                  "negative": 39,
                  "zero": 0
                },
                "source_rank_score": 107.69914,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9a11ea1dd34fbb3d",
                "codeword174_sha256_16": "66658ed247b41bb0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.69607,
                  "min_abs": 0.003643,
                  "max_abs": 4.112074,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 106.78428,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "842583d1534d7dbc",
                "codeword174_sha256_16": "74a25cd15e35b3d5"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.69607,
                  "min_abs": 0.003643,
                  "max_abs": 4.112074,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 106.78428,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "62e51936630c641e",
                "codeword174_sha256_16": "c52150be96d8413f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 110,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.276774,
                  "min_abs": 0.005048,
                  "max_abs": 4.107793,
                  "positive": 53,
                  "negative": 121,
                  "zero": 0
                },
                "source_rank_score": 105.107096,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "effdee3cae80cf8e",
                "codeword174_sha256_16": "1bb03d72bab96f47"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 43,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 3.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:43"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 49,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.230206,
                "min_abs": 0.003136,
                "max_abs": 3.713292,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 104.920824,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "e20eaf42c9d5a080",
              "codeword174_sha256_16": "670a833d4cd80958"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 49,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.230206,
                  "min_abs": 0.003136,
                  "max_abs": 3.713292,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 104.920824,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "e20eaf42c9d5a080",
                "codeword174_sha256_16": "670a833d4cd80958"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 57,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.180522,
                  "min_abs": 7.3e-05,
                  "max_abs": 4.114918,
                  "positive": 116,
                  "negative": 58,
                  "zero": 0
                },
                "source_rank_score": 104.722088,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "08c336f0fdbd0b9d",
                "codeword174_sha256_16": "828c7698f0f759d6"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 113,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.000414,
                  "min_abs": 0.000314,
                  "max_abs": 3.722453,
                  "positive": 61,
                  "negative": 113,
                  "zero": 0
                },
                "source_rank_score": 104.001656,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "e9dab226fae4b28e",
                "codeword174_sha256_16": "6dde07ebf7b5f589"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 93,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.092034,
                  "min_abs": 0.019209,
                  "max_abs": 4.114918,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 100.368136,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "2cd135c17dd2b470",
                "codeword174_sha256_16": "fc7ab1ab87744044"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.221856,
                  "min_abs": 1.9e-05,
                  "max_abs": 4.114918,
                  "positive": 52,
                  "negative": 122,
                  "zero": 0
                },
                "source_rank_score": 104.887424,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "dccfb96fe1c80677",
                "codeword174_sha256_16": "29a87a46c7d870ae"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 35,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.753358,
                  "min_abs": 0.003136,
                  "max_abs": 4.114918,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 110.013432,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "510b5025f519b4a7",
                "codeword174_sha256_16": "d5e243f42868b95b"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 35,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.451951,
                  "min_abs": 0.003136,
                  "max_abs": 3.728632,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 109.807804,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "510b5025f519b4a7",
                "codeword174_sha256_16": "d5e243f42868b95b"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 47,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.057476,
                  "min_abs": 2.3e-05,
                  "max_abs": 3.114307,
                  "positive": 128,
                  "negative": 46,
                  "zero": 0
                },
                "source_rank_score": 104.229904,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4781b790b251315c",
                "codeword174_sha256_16": "777c0990b801d669"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 21,
            "offsets": {
              "start_offset_s": 0.03,
              "base_freq_offset_hz": 2.0,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.83,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57960,
              "start_seconds": 4.83,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:21"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 103,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.014755,
                "min_abs": 0.001418,
                "max_abs": 3.82154,
                "positive": 71,
                "negative": 103,
                "zero": 0
              },
              "source_rank_score": 104.05902,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "f6f9e2c65d361950",
              "codeword174_sha256_16": "a34f30514f1147be"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 103,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.014755,
                  "min_abs": 0.001418,
                  "max_abs": 3.82154,
                  "positive": 71,
                  "negative": 103,
                  "zero": 0
                },
                "source_rank_score": 104.05902,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f6f9e2c65d361950",
                "codeword174_sha256_16": "a34f30514f1147be"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 134,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.51667,
                  "min_abs": 1.8e-05,
                  "max_abs": 4.144111,
                  "positive": 40,
                  "negative": 134,
                  "zero": 0
                },
                "source_rank_score": 106.06668,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "daab820710a9a228",
                "codeword174_sha256_16": "16654f047cae3428"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.128579,
                  "min_abs": 1.8e-05,
                  "max_abs": 3.363492,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 104.514316,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d40791f46d2a4b11",
                "codeword174_sha256_16": "9dca28554c5a2316"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 58,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.225323,
                  "min_abs": 0.002329,
                  "max_abs": 3.956982,
                  "positive": 126,
                  "negative": 48,
                  "zero": 0
                },
                "source_rank_score": 104.901292,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a7c653e33db6db7c",
                "codeword174_sha256_16": "04e767b23e20bf0a"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 34,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.163748,
                  "min_abs": 0.014686,
                  "max_abs": 4.144111,
                  "positive": 141,
                  "negative": 33,
                  "zero": 0
                },
                "source_rank_score": 108.654992,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "cc61e58f86747a77",
                "codeword174_sha256_16": "71bebbfd08ed2f9a"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 122,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.636108,
                  "min_abs": 0.015006,
                  "max_abs": 3.82154,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 106.544432,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f6de0dff4166858e",
                "codeword174_sha256_16": "a8a90b25176d03db"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.159192,
                  "min_abs": 0.003014,
                  "max_abs": 3.956982,
                  "positive": 60,
                  "negative": 114,
                  "zero": 0
                },
                "source_rank_score": 104.636768,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "14fd4623952966b5",
                "codeword174_sha256_16": "fafeccfe3224ee30"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 49,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.750816,
                  "min_abs": 0.003492,
                  "max_abs": 4.144111,
                  "positive": 127,
                  "negative": 47,
                  "zero": 0
                },
                "source_rank_score": 125.003264,
                "syndrome_weight": 33,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "766a43ca41ee0172",
                "codeword174_sha256_16": "7d9bcf61433ea9fd"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 39,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:39"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 126,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.636445,
                "min_abs": 0.04144,
                "max_abs": 4.144109,
                "positive": 48,
                "negative": 126,
                "zero": 0
              },
              "source_rank_score": 106.54578,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "25788c17f810b7d5",
              "codeword174_sha256_16": "87afe3fe5c58aa69"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.636445,
                  "min_abs": 0.04144,
                  "max_abs": 4.144109,
                  "positive": 48,
                  "negative": 126,
                  "zero": 0
                },
                "source_rank_score": 106.54578,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "25788c17f810b7d5",
                "codeword174_sha256_16": "87afe3fe5c58aa69"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.29064,
                  "min_abs": 0.002158,
                  "max_abs": 4.085972,
                  "positive": 136,
                  "negative": 38,
                  "zero": 0
                },
                "source_rank_score": 105.16256,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d7fbffc39612c219",
                "codeword174_sha256_16": "b1faca9af1fcf29e"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 140,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.221352,
                  "min_abs": 0.057726,
                  "max_abs": 4.144109,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 108.885408,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0329e23109e06988",
                "codeword174_sha256_16": "cb10f2e95870a14d"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.549534,
                  "min_abs": 0.04144,
                  "max_abs": 4.085972,
                  "positive": 48,
                  "negative": 126,
                  "zero": 0
                },
                "source_rank_score": 106.198136,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c203e9dd4e290c80",
                "codeword174_sha256_16": "93022f63b6f5a179"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.647117,
                  "min_abs": 0.014093,
                  "max_abs": 4.109742,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 106.588468,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "ce0c8b98f36c5477",
                "codeword174_sha256_16": "0686743576218a8e"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 57,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.600836,
                  "min_abs": 0.007559,
                  "max_abs": 3.884246,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 106.403344,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bccfcf3a9d2d88f9",
                "codeword174_sha256_16": "789a455223ead9d0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 55,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.201724,
                  "min_abs": 4.7e-05,
                  "max_abs": 3.041852,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 104.806896,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1ba13df646b9fda8",
                "codeword174_sha256_16": "e6afe9485a3d19c5"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 140,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.221352,
                  "min_abs": 0.057726,
                  "max_abs": 4.144109,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 126.885408,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "064d4295f7c48336",
                "codeword174_sha256_16": "4b1f5a7ddad8966d"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 8,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:8"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 56,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.265569,
                "min_abs": 0.007883,
                "max_abs": 4.01973,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 105.062276,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "6548c013cab69e1e",
              "codeword174_sha256_16": "e4a052902783f611"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 56,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.265569,
                  "min_abs": 0.007883,
                  "max_abs": 4.01973,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 105.062276,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6548c013cab69e1e",
                "codeword174_sha256_16": "e4a052902783f611"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 135,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.595277,
                  "min_abs": 0.001058,
                  "max_abs": 4.048874,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 106.381108,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9e57d9fb308e6dee",
                "codeword174_sha256_16": "cc67285942c115ea"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.609719,
                  "min_abs": 0.001956,
                  "max_abs": 4.292074,
                  "positive": 27,
                  "negative": 147,
                  "zero": 0
                },
                "source_rank_score": 106.438876,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6b3d67c760fd57be",
                "codeword174_sha256_16": "732f86ed92cad209"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 135,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.595277,
                  "min_abs": 0.001058,
                  "max_abs": 4.048874,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 106.381108,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c481def080ab9cb5",
                "codeword174_sha256_16": "47ebcc4bfd1fb637"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 38,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.887501,
                  "min_abs": 0.018857,
                  "max_abs": 4.292074,
                  "positive": 143,
                  "negative": 31,
                  "zero": 0
                },
                "source_rank_score": 107.550004,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "937823f97ed0847f",
                "codeword174_sha256_16": "9e5b66bac1556b29"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 138,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.609717,
                  "min_abs": 0.003224,
                  "max_abs": 4.292074,
                  "positive": 31,
                  "negative": 143,
                  "zero": 0
                },
                "source_rank_score": 106.438868,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "46cc6ddc9712ac68",
                "codeword174_sha256_16": "4235701b167d47ee"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 138,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.585003,
                  "min_abs": 8.3e-05,
                  "max_abs": 4.292074,
                  "positive": 33,
                  "negative": 141,
                  "zero": 0
                },
                "source_rank_score": 106.340012,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "46cc6ddc9712ac68",
                "codeword174_sha256_16": "4235701b167d47ee"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 90,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.644885,
                  "min_abs": 0.001088,
                  "max_abs": 4.048874,
                  "positive": 40,
                  "negative": 134,
                  "zero": 0
                },
                "source_rank_score": 98.57954,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "2a5e5b0263df5195",
                "codeword174_sha256_16": "4f91b6dc101564e5"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 41,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:41"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 54,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.071337,
                "min_abs": 0.008389,
                "max_abs": 4.378399,
                "positive": 115,
                "negative": 59,
                "zero": 0
              },
              "source_rank_score": 104.285348,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "7db4ad98fe1e49ac",
              "codeword174_sha256_16": "7761891a2eaf0907"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 54,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.071337,
                  "min_abs": 0.008389,
                  "max_abs": 4.378399,
                  "positive": 115,
                  "negative": 59,
                  "zero": 0
                },
                "source_rank_score": 104.285348,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "7db4ad98fe1e49ac",
                "codeword174_sha256_16": "7761891a2eaf0907"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 54,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.152765,
                  "min_abs": 0.002806,
                  "max_abs": 4.378399,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 104.61106,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "7db4ad98fe1e49ac",
                "codeword174_sha256_16": "e0bef0ec308e802c"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 59,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 0.944583,
                  "min_abs": 0.000269,
                  "max_abs": 3.784521,
                  "positive": 114,
                  "negative": 60,
                  "zero": 0
                },
                "source_rank_score": 103.778332,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9f88e54e8b6a8ee7",
                "codeword174_sha256_16": "d7384dff1531e25f"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 85,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 41,
                  "negative": 133,
                  "zero": 0
                },
                "source_rank_score": 100.168252,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b66ebffa64074608",
                "codeword174_sha256_16": "43e29a9a3cd43903"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "raw_msb+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 42,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 112.168252,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "632654c49dc26f7e",
                "codeword174_sha256_16": "35185e117fcf4f1a"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "lsb_within_each_tone+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 42,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 111.168252,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "632654c49dc26f7e",
                "codeword174_sha256_16": "35185e117fcf4f1a"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 84,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.413691,
                  "min_abs": 0.000298,
                  "max_abs": 3.784521,
                  "positive": 119,
                  "negative": 55,
                  "zero": 0
                },
                "source_rank_score": 97.654764,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "02e61e7bdafc459a",
                "codeword174_sha256_16": "54ce9719c19c39cc"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 133,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.682332,
                  "min_abs": 0.011206,
                  "max_abs": 4.378399,
                  "positive": 41,
                  "negative": 133,
                  "zero": 0
                },
                "source_rank_score": 106.729328,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "39a87ca136a11c0a",
                "codeword174_sha256_16": "f1661db6a28115ad"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 14,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 3.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:14"
            },
            "best_row": {
              "variant": "lab_mask_xor_preview",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 84,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.811424,
                "min_abs": 0.004549,
                "max_abs": 4.160775,
                "positive": 28,
                "negative": 146,
                "zero": 0
              },
              "source_rank_score": 99.245696,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "6d4c90342d0cd9cf",
              "codeword174_sha256_16": "fcc1684905e18849"
            },
            "top_rows": [
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 84,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.811424,
                  "min_abs": 0.004549,
                  "max_abs": 4.160775,
                  "positive": 28,
                  "negative": 146,
                  "zero": 0
                },
                "source_rank_score": 99.245696,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6d4c90342d0cd9cf",
                "codeword174_sha256_16": "fcc1684905e18849"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 46,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.577969,
                  "min_abs": 0.032989,
                  "max_abs": 4.160775,
                  "positive": 132,
                  "negative": 42,
                  "zero": 0
                },
                "source_rank_score": 106.311876,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0d245b70feba1bf6",
                "codeword174_sha256_16": "f1b0e4aa08c03e19"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 124.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.485923,
                  "min_abs": 0.004549,
                  "max_abs": 3.91927,
                  "positive": 44,
                  "negative": 130,
                  "zero": 0
                },
                "source_rank_score": 123.943692,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "lsb_within_each_tone",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.853768,
                  "min_abs": 0.00871,
                  "max_abs": 4.160775,
                  "positive": 29,
                  "negative": 145,
                  "zero": 0
                },
                "source_rank_score": 117.415072,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "lsb_within_each_tone",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.811424,
                  "min_abs": 0.004549,
                  "max_abs": 4.160775,
                  "positive": 28,
                  "negative": 146,
                  "zero": 0
                },
                "source_rank_score": 117.245696,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 37,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:37"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 33,
              "llr_stats": {
                "count": 174,
                "avg_abs": 2.228872,
                "min_abs": 0.041868,
                "max_abs": 4.18324,
                "positive": 141,
                "negative": 33,
                "zero": 0
              },
              "source_rank_score": 108.915488,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "0259bb98617eb22e",
              "codeword174_sha256_16": "6c1338e037549e54"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 33,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.228872,
                  "min_abs": 0.041868,
                  "max_abs": 4.18324,
                  "positive": 141,
                  "negative": 33,
                  "zero": 0
                },
                "source_rank_score": 108.915488,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0259bb98617eb22e",
                "codeword174_sha256_16": "6c1338e037549e54"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.206909,
                  "min_abs": 9.8e-05,
                  "max_abs": 3.852127,
                  "positive": 54,
                  "negative": 120,
                  "zero": 0
                },
                "source_rank_score": 104.827636,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "8f42609d6f1fc182",
                "codeword174_sha256_16": "45fb5a75f115763f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.189499,
                  "min_abs": 0.000127,
                  "max_abs": 3.852127,
                  "positive": 50,
                  "negative": 124,
                  "zero": 0
                },
                "source_rank_score": 104.757996,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "8f42609d6f1fc182",
                "codeword174_sha256_16": "45fb5a75f115763f"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.624396,
                  "min_abs": 0.028992,
                  "max_abs": 4.045437,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 106.497584,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6f3b78f2a0789ec1",
                "codeword174_sha256_16": "10fa5f26d7f3c832"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 125,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.365276,
                  "min_abs": 0.001421,
                  "max_abs": 4.076297,
                  "positive": 44,
                  "negative": 130,
                  "zero": 0
                },
                "source_rank_score": 105.461104,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "50ee3ebb2853f49e",
                "codeword174_sha256_16": "d12d6e7fd563854d"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 125,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.324012,
                  "min_abs": 0.005023,
                  "max_abs": 4.076297,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 105.296048,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "50ee3ebb2853f49e",
                "codeword174_sha256_16": "d12d6e7fd563854d"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.718599,
                  "min_abs": 0.017042,
                  "max_abs": 4.076297,
                  "positive": 47,
                  "negative": 127,
                  "zero": 0
                },
                "source_rank_score": 106.874396,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "765c4ebc3707fdb0",
                "codeword174_sha256_16": "1fe0c66a7e9cf192"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 48,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.674076,
                  "min_abs": 0.017042,
                  "max_abs": 4.18324,
                  "positive": 127,
                  "negative": 47,
                  "zero": 0
                },
                "source_rank_score": 106.696304,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6057dbf97536ae1a",
                "codeword174_sha256_16": "0cbeded997791328"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 6,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 2.0,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:6"
            },
            "best_row": {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 41,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.742956,
                "min_abs": 0.016767,
                "max_abs": 4.307136,
                "positive": 132,
                "negative": 42,
                "zero": 0
              },
              "source_rank_score": 106.971824,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "04a04a473d9f4b8a",
              "codeword174_sha256_16": "bb9158f6426e5474"
            },
            "top_rows": [
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 41,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.742956,
                  "min_abs": 0.016767,
                  "max_abs": 4.307136,
                  "positive": 132,
                  "negative": 42,
                  "zero": 0
                },
                "source_rank_score": 106.971824,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "04a04a473d9f4b8a",
                "codeword174_sha256_16": "bb9158f6426e5474"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 112.978116,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4f116d0d2d97efad",
                "codeword174_sha256_16": "1ee0e2fbd4d51be6"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 111.978116,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4f116d0d2d97efad",
                "codeword174_sha256_16": "1ee0e2fbd4d51be6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 37,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.902489,
                  "min_abs": 0.041499,
                  "max_abs": 4.063879,
                  "positive": 137,
                  "negative": 37,
                  "zero": 0
                },
                "source_rank_score": 107.609956,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "5e2bcbbdc8cb3e2a",
                "codeword174_sha256_16": "ac458b913c953919"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 137,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.902489,
                  "min_abs": 0.041499,
                  "max_abs": 4.063879,
                  "positive": 37,
                  "negative": 137,
                  "zero": 0
                },
                "source_rank_score": 107.609956,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "5d363667677b4ebf",
                "codeword174_sha256_16": "5f395d3ae3d410f8"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 117,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.217101,
                  "min_abs": 0.010473,
                  "max_abs": 4.109301,
                  "positive": 55,
                  "negative": 119,
                  "zero": 0
                },
                "source_rank_score": 104.868404,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "00e0e71440a516c6",
                "codeword174_sha256_16": "6f3fc74324df2743"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 119,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.165809,
                  "min_abs": 0.003322,
                  "max_abs": 4.109301,
                  "positive": 58,
                  "negative": 116,
                  "zero": 0
                },
                "source_rank_score": 104.663236,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "aca78234d03d9e6e",
                "codeword174_sha256_16": "545b323981ac1f0b"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 126.978116,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "56db10214087a30c",
                "codeword174_sha256_16": "04161507fe78a98a"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 26,
            "offsets": {
              "start_offset_s": 0.03,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.83,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57960,
              "start_seconds": 4.83,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:26"
            },
            "best_row": {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 37,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.730043,
                "min_abs": 0.021616,
                "max_abs": 4.058353,
                "positive": 138,
                "negative": 36,
                "zero": 0
              },
              "source_rank_score": 106.920172,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "b85913e71a6e72e1",
              "codeword174_sha256_16": "e86c99d44140da4f"
            },
            "top_rows": [
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 37,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.730043,
                  "min_abs": 0.021616,
                  "max_abs": 4.058353,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 106.920172,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b85913e71a6e72e1",
                "codeword174_sha256_16": "e86c99d44140da4f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 109,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 0.947826,
                  "min_abs": 0.000717,
                  "max_abs": 3.411851,
                  "positive": 68,
                  "negative": 106,
                  "zero": 0
                },
                "source_rank_score": 103.791304,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "63d7de999dc28356",
                "codeword174_sha256_16": "2ad9b1a14cd85e5c"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 89,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.857069,
                  "min_abs": 0.01092,
                  "max_abs": 4.006713,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 99.428276,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f3209b00dbbed253",
                "codeword174_sha256_16": "135a8970b67957e7"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 81,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.51869,
                  "min_abs": 0.01092,
                  "max_abs": 3.732172,
                  "positive": 123,
                  "negative": 51,
                  "zero": 0
                },
                "source_rank_score": 98.07476,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4dc8b43767d57817",
                "codeword174_sha256_16": "78617f41a52a8853"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 130,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.736354,
                  "min_abs": 0.024218,
                  "max_abs": 4.151228,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.945416,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b514dccc3f8f2f30",
                "codeword174_sha256_16": "e7b301d31e50e275"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 130,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.686625,
                  "min_abs": 0.011664,
                  "max_abs": 4.151228,
                  "positive": 46,
                  "negative": 128,
                  "zero": 0
                },
                "source_rank_score": 106.7465,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b514dccc3f8f2f30",
                "codeword174_sha256_16": "e7b301d31e50e275"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.567434,
                  "min_abs": 0.000989,
                  "max_abs": 3.732172,
                  "positive": 51,
                  "negative": 123,
                  "zero": 0
                },
                "source_rank_score": 106.269736,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "810a0472f0698b8d",
                "codeword174_sha256_16": "4316a723d47fd8eb"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.34105,
                  "min_abs": 0.01092,
                  "max_abs": 4.006713,
                  "positive": 42,
                  "negative": 132,
                  "zero": 0
                },
                "source_rank_score": 105.3642,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9b97c830c0ad11f6",
                "codeword174_sha256_16": "06400af302ea8869"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          }
        ],
        "outputs": {
          "timing_boundary_sweep_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_timing_boundary_sweep.json",
          "timing_best_candidate_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_best_timing_fec_candidate.json",
          "checkpoint_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json"
        },
        "decodes": [],
        "warnings": [
          "Step 51 expands the Step36 edge hit and exports the best timing candidate for downstream LDPC soft-decode.",
          "No JS8 text unpack or CRC validation is performed yet.",
          "No valid LDPC codeword found is a diagnostic warning, not a hard command failure."
        ],
        "next_action": "Use outputs.timing_best_candidate_json for LDPC matrix/soft decode. If syndrome is still far from 0, continue interleaver/LLR and symbol-boundary tuning around the best_candidate."
      }
    },
    "real_run_timing_boundary_sweep": {
      "name": "20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "url": "/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 145265,
        "mtime_utc": "2026-05-27T11:11:09Z"
      },
      "json_preview": {
        "ok": true,
        "mode": "JS8",
        "tool": "webftr-js8-timing-boundary-candidate-sweep",
        "tool_version": "step51-source-aligned-tone-offset-cli-fix",
        "input_wav": "/decoders/js8_decoder/runtime/quick_prefilter_windows/js8_quick_selected_window.wav",
        "profile_scan_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
        "anchor_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_auto_ldpc_probe_output.json",
        "rx_only": true,
        "safety": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "implementation_stage": "step51_source_aligned_timing_boundary_syndrome_sweep_no_message_unpack",
        "anchor_selection": {
          "source": "profile_scan_json",
          "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_profile_scan_output.json",
          "selection": "profile_scan_selected_profile",
          "nsps": 6400,
          "start_seconds": 4.8,
          "base_freq_hz": 1025.0,
          "tone_spacing_hz": 1.875
        },
        "partial": false,
        "partial_reason": "complete",
        "sweep_elapsed_seconds": 158.007,
        "source_alignment": {
          "source_nsps": 6192,
          "source_tone_spacing_hz": 1.937984496124031,
          "effective_nsps": 6192,
          "effective_tone_spacing_base_hz": 1.937984496124031
        },
        "sweep_grid": {
          "start_offsets_s": [
            0.0,
            0.03,
            0.06,
            0.09,
            0.12
          ],
          "base_freq_offsets_hz": [
            1.5,
            2.0,
            2.5,
            3.0,
            3.5
          ],
          "tone_spacing_offsets_hz": [
            -0.03,
            0.0,
            0.03
          ],
          "max_combinations": 45,
          "actual_combinations": 45,
          "processed_combinations": 45,
          "time_budget_seconds": 210.0
        },
        "decode_found": false,
        "best_final_syndrome_weight": 22,
        "best_candidate": {
          "combination_index": 11,
          "offsets": {
            "start_offset_s": 0.0,
            "base_freq_offset_hz": 3.0,
            "tone_spacing_offset_hz": -0.03
          },
          "anchor_applied": {
            "start_seconds": 4.8,
            "base_freq_hz": 1028.0,
            "tone_spacing_hz": 1.9079844961240309,
            "nsps": 6192
          },
          "pipeline_ok": true,
          "fec_input_summary": {
            "soft_bit_count": 174,
            "missing_soft_bits": 0,
            "complete_ldpc_input_candidate": true,
            "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
          },
          "sync_candidate": {
            "start_sample": 57600,
            "start_seconds": 4.8,
            "base_freq_hz": 1028.0,
            "tone_spacing_hz": 1.9079844961240309,
            "nsps": 6192,
            "candidate_score": null,
            "costas_hits": null,
            "avg_margin_db": null,
            "anchor_source": "step51_source_aligned_timing_sweep:11"
          },
          "best_row": {
            "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
            "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
            "mapping_meta": {
              "tone_mapping": "ft8_gray_primary",
              "gray_direction": "inverse_observed_to_plain",
              "reverse_bits_within_tone_before_gray": false,
              "interleaver": "ft8_bitrev",
              "direction": "interleave_codeword_to_rx_inverse",
              "order_len": 174
            },
            "bit_count": 174,
            "hard_weight_174": 36,
            "llr_stats": {
              "count": 174,
              "avg_abs": 1.291598,
              "min_abs": 0.001433,
              "max_abs": 3.895705,
              "positive": 129,
              "negative": 45,
              "zero": 0
            },
            "source_rank_score": 105.166392,
            "syndrome_weight": 22,
            "valid_codeword_hard_decision": false,
            "message91_sha256_16": "d4ca2a05f15dd009",
            "codeword174_sha256_16": "95a1e941fbdff6b2"
          },
          "top_rows": [
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.291598,
                "min_abs": 0.001433,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.166392,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.289323,
                "min_abs": 0.000933,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.157292,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 61,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.11433,
                "min_abs": 0.000187,
                "max_abs": 3.795489,
                "positive": 110,
                "negative": 64,
                "zero": 0
              },
              "source_rank_score": 104.45732,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 61,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.079292,
                "min_abs": 0.000226,
                "max_abs": 3.795489,
                "positive": 110,
                "negative": 64,
                "zero": 0
              },
              "source_rank_score": 104.317168,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "bab866be6de1cc5a",
              "codeword174_sha256_16": "4b4b446b1e4f7aae"
            },
            {
              "variant": "lab_mask_xor_preview",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 93,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.818736,
                "min_abs": 0.003108,
                "max_abs": 4.379379,
                "positive": 34,
                "negative": 140,
                "zero": 0
              },
              "source_rank_score": 99.274944,
              "syndrome_weight": 29,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "4439454e612f6636",
              "codeword174_sha256_16": "953e2bc596e8a67e"
            },
            {
              "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.666423,
                "min_abs": 0.002022,
                "max_abs": 3.950111,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 106.665692,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.625634,
                "min_abs": 0.003108,
                "max_abs": 3.895705,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 106.502536,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "1bf4f3a7e6e5f651",
              "codeword174_sha256_16": "daeb23bbbdf896b0"
            },
            {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 45,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.617209,
                "min_abs": 0.001539,
                "max_abs": 3.944456,
                "positive": 123,
                "negative": 51,
                "zero": 0
              },
              "source_rank_score": 106.468836,
              "syndrome_weight": 31,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "202d2650a31499d7",
              "codeword174_sha256_16": "6c43e3bd22022c79"
            }
          ],
          "warnings": [
            "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
            "Step 51 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 51 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."
          ]
        },
        "top_candidates": [
          {
            "combination_index": 11,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:11"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 36,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.291598,
                "min_abs": 0.001433,
                "max_abs": 3.895705,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 105.166392,
              "syndrome_weight": 22,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "d4ca2a05f15dd009",
              "codeword174_sha256_16": "95a1e941fbdff6b2"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.291598,
                  "min_abs": 0.001433,
                  "max_abs": 3.895705,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 105.166392,
                "syndrome_weight": 22,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d4ca2a05f15dd009",
                "codeword174_sha256_16": "95a1e941fbdff6b2"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.289323,
                  "min_abs": 0.000933,
                  "max_abs": 3.895705,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 105.157292,
                "syndrome_weight": 22,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d4ca2a05f15dd009",
                "codeword174_sha256_16": "95a1e941fbdff6b2"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 61,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.11433,
                  "min_abs": 0.000187,
                  "max_abs": 3.795489,
                  "positive": 110,
                  "negative": 64,
                  "zero": 0
                },
                "source_rank_score": 104.45732,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bab866be6de1cc5a",
                "codeword174_sha256_16": "4b4b446b1e4f7aae"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 61,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.079292,
                  "min_abs": 0.000226,
                  "max_abs": 3.795489,
                  "positive": 110,
                  "negative": 64,
                  "zero": 0
                },
                "source_rank_score": 104.317168,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bab866be6de1cc5a",
                "codeword174_sha256_16": "4b4b446b1e4f7aae"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 93,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.818736,
                  "min_abs": 0.003108,
                  "max_abs": 4.379379,
                  "positive": 34,
                  "negative": 140,
                  "zero": 0
                },
                "source_rank_score": 99.274944,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4439454e612f6636",
                "codeword174_sha256_16": "953e2bc596e8a67e"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.666423,
                  "min_abs": 0.002022,
                  "max_abs": 3.950111,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 106.665692,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1bf4f3a7e6e5f651",
                "codeword174_sha256_16": "daeb23bbbdf896b0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.625634,
                  "min_abs": 0.003108,
                  "max_abs": 3.895705,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 106.502536,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1bf4f3a7e6e5f651",
                "codeword174_sha256_16": "daeb23bbbdf896b0"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.617209,
                  "min_abs": 0.001539,
                  "max_abs": 3.944456,
                  "positive": 123,
                  "negative": 51,
                  "zero": 0
                },
                "source_rank_score": 106.468836,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "202d2650a31499d7",
                "codeword174_sha256_16": "6c43e3bd22022c79"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 2,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 1.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:2"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 127,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.733511,
                "min_abs": 0.012055,
                "max_abs": 4.121456,
                "positive": 45,
                "negative": 129,
                "zero": 0
              },
              "source_rank_score": 106.934044,
              "syndrome_weight": 23,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "392cab12a34759b9",
              "codeword174_sha256_16": "5e40b5a83c672886"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 127,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.733511,
                  "min_abs": 0.012055,
                  "max_abs": 4.121456,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.934044,
                "syndrome_weight": 23,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "392cab12a34759b9",
                "codeword174_sha256_16": "5e40b5a83c672886"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.881544,
                  "min_abs": 0.008612,
                  "max_abs": 4.094064,
                  "positive": 115,
                  "negative": 59,
                  "zero": 0
                },
                "source_rank_score": 111.526176,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "128117b042d0d534",
                "codeword174_sha256_16": "b0809bdee52aa2eb"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.029253,
                  "min_abs": 0.008612,
                  "max_abs": 4.159387,
                  "positive": 134,
                  "negative": 40,
                  "zero": 0
                },
                "source_rank_score": 111.117012,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "128117b042d0d534",
                "codeword174_sha256_16": "b0809bdee52aa2eb"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 113,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.409152,
                  "min_abs": 0.001536,
                  "max_abs": 4.121456,
                  "positive": 53,
                  "negative": 121,
                  "zero": 0
                },
                "source_rank_score": 105.636608,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a7ec7573558f6d66",
                "codeword174_sha256_16": "fd238f7999c92f54"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 97,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.258287,
                  "min_abs": 0.00739,
                  "max_abs": 4.094064,
                  "positive": 73,
                  "negative": 101,
                  "zero": 0
                },
                "source_rank_score": 105.033148,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "10a0624085517fbb",
                "codeword174_sha256_16": "2e36371617234c9c"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 36,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.691846,
                  "min_abs": 3.9e-05,
                  "max_abs": 4.159387,
                  "positive": 139,
                  "negative": 35,
                  "zero": 0
                },
                "source_rank_score": 106.767384,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "fa72b5aad0016ab4",
                "codeword174_sha256_16": "9a4cfc262b798d41"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 44,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.342044,
                  "min_abs": 3.9e-05,
                  "max_abs": 3.408185,
                  "positive": 130,
                  "negative": 44,
                  "zero": 0
                },
                "source_rank_score": 105.368176,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "ff6f9fd31170e8ba",
                "codeword174_sha256_16": "1740cb3878bab5bf"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 109,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.807528,
                  "min_abs": 0.007795,
                  "max_abs": 4.094064,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 125.230112,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "07b13c8ed6906112",
                "codeword174_sha256_16": "00e44a669eea08bb"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 1,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 1.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1026.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:1"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 123,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.615244,
                "min_abs": 0.009081,
                "max_abs": 4.107793,
                "positive": 49,
                "negative": 125,
                "zero": 0
              },
              "source_rank_score": 106.460976,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "392cab12a34759b9",
              "codeword174_sha256_16": "5ae8d6b48d414f34"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 123,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.615244,
                  "min_abs": 0.009081,
                  "max_abs": 4.107793,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 106.460976,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "392cab12a34759b9",
                "codeword174_sha256_16": "5ae8d6b48d414f34"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 95,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.197035,
                  "min_abs": 0.00517,
                  "max_abs": 3.968945,
                  "positive": 71,
                  "negative": 103,
                  "zero": 0
                },
                "source_rank_score": 104.78814,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "92b10effeeeb19a8",
                "codeword174_sha256_16": "1c65597835257916"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.775836,
                  "min_abs": 0.021293,
                  "max_abs": 4.112074,
                  "positive": 117,
                  "negative": 57,
                  "zero": 0
                },
                "source_rank_score": 111.103344,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c94e2d2f80c7bd08",
                "codeword174_sha256_16": "746597535b28b3a5"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.924785,
                  "min_abs": 0.021293,
                  "max_abs": 4.127648,
                  "positive": 135,
                  "negative": 39,
                  "zero": 0
                },
                "source_rank_score": 110.69914,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c94e2d2f80c7bd08",
                "codeword174_sha256_16": "746597535b28b3a5"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.924785,
                  "min_abs": 0.021293,
                  "max_abs": 4.127648,
                  "positive": 135,
                  "negative": 39,
                  "zero": 0
                },
                "source_rank_score": 107.69914,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9a11ea1dd34fbb3d",
                "codeword174_sha256_16": "66658ed247b41bb0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.69607,
                  "min_abs": 0.003643,
                  "max_abs": 4.112074,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 106.78428,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "842583d1534d7dbc",
                "codeword174_sha256_16": "74a25cd15e35b3d5"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.69607,
                  "min_abs": 0.003643,
                  "max_abs": 4.112074,
                  "positive": 65,
                  "negative": 109,
                  "zero": 0
                },
                "source_rank_score": 106.78428,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "62e51936630c641e",
                "codeword174_sha256_16": "c52150be96d8413f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 110,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.276774,
                  "min_abs": 0.005048,
                  "max_abs": 4.107793,
                  "positive": 53,
                  "negative": 121,
                  "zero": 0
                },
                "source_rank_score": 105.107096,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "effdee3cae80cf8e",
                "codeword174_sha256_16": "1bb03d72bab96f47"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 43,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 3.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:43"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 49,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.230206,
                "min_abs": 0.003136,
                "max_abs": 3.713292,
                "positive": 129,
                "negative": 45,
                "zero": 0
              },
              "source_rank_score": 104.920824,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "e20eaf42c9d5a080",
              "codeword174_sha256_16": "670a833d4cd80958"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 49,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.230206,
                  "min_abs": 0.003136,
                  "max_abs": 3.713292,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 104.920824,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "e20eaf42c9d5a080",
                "codeword174_sha256_16": "670a833d4cd80958"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 57,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.180522,
                  "min_abs": 7.3e-05,
                  "max_abs": 4.114918,
                  "positive": 116,
                  "negative": 58,
                  "zero": 0
                },
                "source_rank_score": 104.722088,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "08c336f0fdbd0b9d",
                "codeword174_sha256_16": "828c7698f0f759d6"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 113,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.000414,
                  "min_abs": 0.000314,
                  "max_abs": 3.722453,
                  "positive": 61,
                  "negative": 113,
                  "zero": 0
                },
                "source_rank_score": 104.001656,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "e9dab226fae4b28e",
                "codeword174_sha256_16": "6dde07ebf7b5f589"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 93,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.092034,
                  "min_abs": 0.019209,
                  "max_abs": 4.114918,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 100.368136,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "2cd135c17dd2b470",
                "codeword174_sha256_16": "fc7ab1ab87744044"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.221856,
                  "min_abs": 1.9e-05,
                  "max_abs": 4.114918,
                  "positive": 52,
                  "negative": 122,
                  "zero": 0
                },
                "source_rank_score": 104.887424,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "dccfb96fe1c80677",
                "codeword174_sha256_16": "29a87a46c7d870ae"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 35,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.753358,
                  "min_abs": 0.003136,
                  "max_abs": 4.114918,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 110.013432,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "510b5025f519b4a7",
                "codeword174_sha256_16": "d5e243f42868b95b"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 35,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.451951,
                  "min_abs": 0.003136,
                  "max_abs": 3.728632,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 109.807804,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "510b5025f519b4a7",
                "codeword174_sha256_16": "d5e243f42868b95b"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 47,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.057476,
                  "min_abs": 2.3e-05,
                  "max_abs": 3.114307,
                  "positive": 128,
                  "negative": 46,
                  "zero": 0
                },
                "source_rank_score": 104.229904,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4781b790b251315c",
                "codeword174_sha256_16": "777c0990b801d669"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 21,
            "offsets": {
              "start_offset_s": 0.03,
              "base_freq_offset_hz": 2.0,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.83,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57960,
              "start_seconds": 4.83,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:21"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 103,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.014755,
                "min_abs": 0.001418,
                "max_abs": 3.82154,
                "positive": 71,
                "negative": 103,
                "zero": 0
              },
              "source_rank_score": 104.05902,
              "syndrome_weight": 25,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "f6f9e2c65d361950",
              "codeword174_sha256_16": "a34f30514f1147be"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 103,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.014755,
                  "min_abs": 0.001418,
                  "max_abs": 3.82154,
                  "positive": 71,
                  "negative": 103,
                  "zero": 0
                },
                "source_rank_score": 104.05902,
                "syndrome_weight": 25,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f6f9e2c65d361950",
                "codeword174_sha256_16": "a34f30514f1147be"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 134,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.51667,
                  "min_abs": 1.8e-05,
                  "max_abs": 4.144111,
                  "positive": 40,
                  "negative": 134,
                  "zero": 0
                },
                "source_rank_score": 106.06668,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "daab820710a9a228",
                "codeword174_sha256_16": "16654f047cae3428"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.128579,
                  "min_abs": 1.8e-05,
                  "max_abs": 3.363492,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 104.514316,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d40791f46d2a4b11",
                "codeword174_sha256_16": "9dca28554c5a2316"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 58,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.225323,
                  "min_abs": 0.002329,
                  "max_abs": 3.956982,
                  "positive": 126,
                  "negative": 48,
                  "zero": 0
                },
                "source_rank_score": 104.901292,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a7c653e33db6db7c",
                "codeword174_sha256_16": "04e767b23e20bf0a"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 34,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.163748,
                  "min_abs": 0.014686,
                  "max_abs": 4.144111,
                  "positive": 141,
                  "negative": 33,
                  "zero": 0
                },
                "source_rank_score": 108.654992,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "cc61e58f86747a77",
                "codeword174_sha256_16": "71bebbfd08ed2f9a"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 122,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.636108,
                  "min_abs": 0.015006,
                  "max_abs": 3.82154,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 106.544432,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f6de0dff4166858e",
                "codeword174_sha256_16": "a8a90b25176d03db"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 108,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.159192,
                  "min_abs": 0.003014,
                  "max_abs": 3.956982,
                  "positive": 60,
                  "negative": 114,
                  "zero": 0
                },
                "source_rank_score": 104.636768,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "14fd4623952966b5",
                "codeword174_sha256_16": "fafeccfe3224ee30"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 49,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.750816,
                  "min_abs": 0.003492,
                  "max_abs": 4.144111,
                  "positive": 127,
                  "negative": 47,
                  "zero": 0
                },
                "source_rank_score": 125.003264,
                "syndrome_weight": 33,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "766a43ca41ee0172",
                "codeword174_sha256_16": "7d9bcf61433ea9fd"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 39,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:39"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "none",
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 126,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.636445,
                "min_abs": 0.04144,
                "max_abs": 4.144109,
                "positive": 48,
                "negative": 126,
                "zero": 0
              },
              "source_rank_score": 106.54578,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "25788c17f810b7d5",
              "codeword174_sha256_16": "87afe3fe5c58aa69"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.636445,
                  "min_abs": 0.04144,
                  "max_abs": 4.144109,
                  "positive": 48,
                  "negative": 126,
                  "zero": 0
                },
                "source_rank_score": 106.54578,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "25788c17f810b7d5",
                "codeword174_sha256_16": "87afe3fe5c58aa69"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 43,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.29064,
                  "min_abs": 0.002158,
                  "max_abs": 4.085972,
                  "positive": 136,
                  "negative": 38,
                  "zero": 0
                },
                "source_rank_score": 105.16256,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "d7fbffc39612c219",
                "codeword174_sha256_16": "b1faca9af1fcf29e"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 140,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.221352,
                  "min_abs": 0.057726,
                  "max_abs": 4.144109,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 108.885408,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0329e23109e06988",
                "codeword174_sha256_16": "cb10f2e95870a14d"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.549534,
                  "min_abs": 0.04144,
                  "max_abs": 4.085972,
                  "positive": 48,
                  "negative": 126,
                  "zero": 0
                },
                "source_rank_score": 106.198136,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c203e9dd4e290c80",
                "codeword174_sha256_16": "93022f63b6f5a179"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.647117,
                  "min_abs": 0.014093,
                  "max_abs": 4.109742,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 106.588468,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "ce0c8b98f36c5477",
                "codeword174_sha256_16": "0686743576218a8e"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 57,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.600836,
                  "min_abs": 0.007559,
                  "max_abs": 3.884246,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 106.403344,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "bccfcf3a9d2d88f9",
                "codeword174_sha256_16": "789a455223ead9d0"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 55,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.201724,
                  "min_abs": 4.7e-05,
                  "max_abs": 3.041852,
                  "positive": 120,
                  "negative": 54,
                  "zero": 0
                },
                "source_rank_score": 104.806896,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "1ba13df646b9fda8",
                "codeword174_sha256_16": "e6afe9485a3d19c5"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 140,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.221352,
                  "min_abs": 0.057726,
                  "max_abs": 4.144109,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 126.885408,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "064d4295f7c48336",
                "codeword174_sha256_16": "4b1f5a7ddad8966d"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 8,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:8"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 56,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.265569,
                "min_abs": 0.007883,
                "max_abs": 4.01973,
                "positive": 124,
                "negative": 50,
                "zero": 0
              },
              "source_rank_score": 105.062276,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "6548c013cab69e1e",
              "codeword174_sha256_16": "e4a052902783f611"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 56,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.265569,
                  "min_abs": 0.007883,
                  "max_abs": 4.01973,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 105.062276,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6548c013cab69e1e",
                "codeword174_sha256_16": "e4a052902783f611"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 135,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.595277,
                  "min_abs": 0.001058,
                  "max_abs": 4.048874,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 106.381108,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9e57d9fb308e6dee",
                "codeword174_sha256_16": "cc67285942c115ea"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.609719,
                  "min_abs": 0.001956,
                  "max_abs": 4.292074,
                  "positive": 27,
                  "negative": 147,
                  "zero": 0
                },
                "source_rank_score": 106.438876,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6b3d67c760fd57be",
                "codeword174_sha256_16": "732f86ed92cad209"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 135,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.595277,
                  "min_abs": 0.001058,
                  "max_abs": 4.048874,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 106.381108,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "c481def080ab9cb5",
                "codeword174_sha256_16": "47ebcc4bfd1fb637"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "lsb_within_each_tone+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 38,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.887501,
                  "min_abs": 0.018857,
                  "max_abs": 4.292074,
                  "positive": 143,
                  "negative": 31,
                  "zero": 0
                },
                "source_rank_score": 107.550004,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "937823f97ed0847f",
                "codeword174_sha256_16": "9e5b66bac1556b29"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 138,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.609717,
                  "min_abs": 0.003224,
                  "max_abs": 4.292074,
                  "positive": 31,
                  "negative": 143,
                  "zero": 0
                },
                "source_rank_score": 106.438868,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "46cc6ddc9712ac68",
                "codeword174_sha256_16": "4235701b167d47ee"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 138,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.585003,
                  "min_abs": 8.3e-05,
                  "max_abs": 4.292074,
                  "positive": 33,
                  "negative": 141,
                  "zero": 0
                },
                "source_rank_score": 106.340012,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "46cc6ddc9712ac68",
                "codeword174_sha256_16": "4235701b167d47ee"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 90,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.644885,
                  "min_abs": 0.001088,
                  "max_abs": 4.048874,
                  "positive": 40,
                  "negative": 134,
                  "zero": 0
                },
                "source_rank_score": 98.57954,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "2a5e5b0263df5195",
                "codeword174_sha256_16": "4f91b6dc101564e5"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 41,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:41"
            },
            "best_row": {
              "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 54,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.071337,
                "min_abs": 0.008389,
                "max_abs": 4.378399,
                "positive": 115,
                "negative": 59,
                "zero": 0
              },
              "source_rank_score": 104.285348,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "7db4ad98fe1e49ac",
              "codeword174_sha256_16": "7761891a2eaf0907"
            },
            "top_rows": [
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 54,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.071337,
                  "min_abs": 0.008389,
                  "max_abs": 4.378399,
                  "positive": 115,
                  "negative": 59,
                  "zero": 0
                },
                "source_rank_score": 104.285348,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "7db4ad98fe1e49ac",
                "codeword174_sha256_16": "7761891a2eaf0907"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 54,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.152765,
                  "min_abs": 0.002806,
                  "max_abs": 4.378399,
                  "positive": 124,
                  "negative": 50,
                  "zero": 0
                },
                "source_rank_score": 104.61106,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "7db4ad98fe1e49ac",
                "codeword174_sha256_16": "e0bef0ec308e802c"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 59,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 0.944583,
                  "min_abs": 0.000269,
                  "max_abs": 3.784521,
                  "positive": 114,
                  "negative": 60,
                  "zero": 0
                },
                "source_rank_score": 103.778332,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9f88e54e8b6a8ee7",
                "codeword174_sha256_16": "d7384dff1531e25f"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 85,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 41,
                  "negative": 133,
                  "zero": 0
                },
                "source_rank_score": 100.168252,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b66ebffa64074608",
                "codeword174_sha256_16": "43e29a9a3cd43903"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "raw_msb+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 42,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 112.168252,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "632654c49dc26f7e",
                "codeword174_sha256_16": "35185e117fcf4f1a"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "lsb_within_each_tone+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 42,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.042063,
                  "min_abs": 0.027988,
                  "max_abs": 4.378399,
                  "positive": 133,
                  "negative": 41,
                  "zero": 0
                },
                "source_rank_score": 111.168252,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "632654c49dc26f7e",
                "codeword174_sha256_16": "35185e117fcf4f1a"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 84,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.413691,
                  "min_abs": 0.000298,
                  "max_abs": 3.784521,
                  "positive": 119,
                  "negative": 55,
                  "zero": 0
                },
                "source_rank_score": 97.654764,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "02e61e7bdafc459a",
                "codeword174_sha256_16": "54ce9719c19c39cc"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 133,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.682332,
                  "min_abs": 0.011206,
                  "max_abs": 4.378399,
                  "positive": 41,
                  "negative": 133,
                  "zero": 0
                },
                "source_rank_score": 106.729328,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "39a87ca136a11c0a",
                "codeword174_sha256_16": "f1661db6a28115ad"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 14,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 3.5,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1028.5,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:14"
            },
            "best_row": {
              "variant": "lab_mask_xor_preview",
              "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_alt_high",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "deinterleave_rx_to_codeword",
                "order_len": 174,
                "polarity": "inverted"
              },
              "bit_count": 174,
              "hard_weight_174": 84,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.811424,
                "min_abs": 0.004549,
                "max_abs": 4.160775,
                "positive": 28,
                "negative": 146,
                "zero": 0
              },
              "source_rank_score": 99.245696,
              "syndrome_weight": 26,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "6d4c90342d0cd9cf",
              "codeword174_sha256_16": "fcc1684905e18849"
            },
            "top_rows": [
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 84,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.811424,
                  "min_abs": 0.004549,
                  "max_abs": 4.160775,
                  "positive": 28,
                  "negative": 146,
                  "zero": 0
                },
                "source_rank_score": 99.245696,
                "syndrome_weight": 26,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6d4c90342d0cd9cf",
                "codeword174_sha256_16": "fcc1684905e18849"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 46,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.577969,
                  "min_abs": 0.032989,
                  "max_abs": 4.160775,
                  "positive": 132,
                  "negative": 42,
                  "zero": 0
                },
                "source_rank_score": 106.311876,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0d245b70feba1bf6",
                "codeword174_sha256_16": "f1b0e4aa08c03e19"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 124.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "ft8_gray_alt_high_demap_lsb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.485923,
                  "min_abs": 0.004549,
                  "max_abs": 3.91927,
                  "positive": 44,
                  "negative": 130,
                  "zero": 0
                },
                "source_rank_score": 123.943692,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "lsb_within_each_tone",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.853768,
                  "min_abs": 0.00871,
                  "max_abs": 4.160775,
                  "positive": 29,
                  "negative": 145,
                  "zero": 0
                },
                "source_rank_score": 117.415072,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "lsb_within_each_tone",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.811424,
                  "min_abs": 0.004549,
                  "max_abs": 4.160775,
                  "positive": 28,
                  "negative": 146,
                  "zero": 0
                },
                "source_rank_score": 117.245696,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "raw_msb+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.528267,
                  "min_abs": 0.00871,
                  "max_abs": 3.91927,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.113068,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "a1a97b2eec802f24",
                "codeword174_sha256_16": "5836d586f9603ce6"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 37,
            "offsets": {
              "start_offset_s": 0.06,
              "base_freq_offset_hz": 2.5,
              "tone_spacing_offset_hz": 0.0
            },
            "anchor_applied": {
              "start_seconds": 4.859999999999999,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 58320,
              "start_seconds": 4.86,
              "base_freq_hz": 1027.5,
              "tone_spacing_hz": 1.937984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:37"
            },
            "best_row": {
              "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "lsb_within_each_tone",
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 33,
              "llr_stats": {
                "count": 174,
                "avg_abs": 2.228872,
                "min_abs": 0.041868,
                "max_abs": 4.18324,
                "positive": 141,
                "negative": 33,
                "zero": 0
              },
              "source_rank_score": 108.915488,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "0259bb98617eb22e",
              "codeword174_sha256_16": "6c1338e037549e54"
            },
            "top_rows": [
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 33,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.228872,
                  "min_abs": 0.041868,
                  "max_abs": 4.18324,
                  "positive": 141,
                  "negative": 33,
                  "zero": 0
                },
                "source_rank_score": 108.915488,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "0259bb98617eb22e",
                "codeword174_sha256_16": "6c1338e037549e54"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.206909,
                  "min_abs": 9.8e-05,
                  "max_abs": 3.852127,
                  "positive": 54,
                  "negative": 120,
                  "zero": 0
                },
                "source_rank_score": 104.827636,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "8f42609d6f1fc182",
                "codeword174_sha256_16": "45fb5a75f115763f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+no_interleaver",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 120,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.189499,
                  "min_abs": 0.000127,
                  "max_abs": 3.852127,
                  "positive": 50,
                  "negative": 124,
                  "zero": 0
                },
                "source_rank_score": 104.757996,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "8f42609d6f1fc182",
                "codeword174_sha256_16": "45fb5a75f115763f"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 45,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.624396,
                  "min_abs": 0.028992,
                  "max_abs": 4.045437,
                  "positive": 129,
                  "negative": 45,
                  "zero": 0
                },
                "source_rank_score": 106.497584,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6f3b78f2a0789ec1",
                "codeword174_sha256_16": "10fa5f26d7f3c832"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 125,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.365276,
                  "min_abs": 0.001421,
                  "max_abs": 4.076297,
                  "positive": 44,
                  "negative": 130,
                  "zero": 0
                },
                "source_rank_score": 105.461104,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "50ee3ebb2853f49e",
                "codeword174_sha256_16": "d12d6e7fd563854d"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 125,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.324012,
                  "min_abs": 0.005023,
                  "max_abs": 4.076297,
                  "positive": 49,
                  "negative": 125,
                  "zero": 0
                },
                "source_rank_score": 105.296048,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "50ee3ebb2853f49e",
                "codeword174_sha256_16": "d12d6e7fd563854d"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.718599,
                  "min_abs": 0.017042,
                  "max_abs": 4.076297,
                  "positive": 47,
                  "negative": 127,
                  "zero": 0
                },
                "source_rank_score": 106.874396,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "765c4ebc3707fdb0",
                "codeword174_sha256_16": "1fe0c66a7e9cf192"
              },
              {
                "variant": "mapped_raw_msb+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 48,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.674076,
                  "min_abs": 0.017042,
                  "max_abs": 4.18324,
                  "positive": 127,
                  "negative": 47,
                  "zero": 0
                },
                "source_rank_score": 106.696304,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "6057dbf97536ae1a",
                "codeword174_sha256_16": "0cbeded997791328"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 6,
            "offsets": {
              "start_offset_s": 0.0,
              "base_freq_offset_hz": 2.0,
              "tone_spacing_offset_hz": 0.03
            },
            "anchor_applied": {
              "start_seconds": 4.8,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57600,
              "start_seconds": 4.8,
              "base_freq_hz": 1027.0,
              "tone_spacing_hz": 1.967984496124031,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:6"
            },
            "best_row": {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
              "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": true,
                "interleaver": "none"
              },
              "bit_count": 174,
              "hard_weight_174": 41,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.742956,
                "min_abs": 0.016767,
                "max_abs": 4.307136,
                "positive": 132,
                "negative": 42,
                "zero": 0
              },
              "source_rank_score": 106.971824,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "04a04a473d9f4b8a",
              "codeword174_sha256_16": "bb9158f6426e5474"
            },
            "top_rows": [
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+no_interleaver",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "none"
                },
                "bit_count": 174,
                "hard_weight_174": 41,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.742956,
                  "min_abs": 0.016767,
                  "max_abs": 4.307136,
                  "positive": 132,
                  "negative": 42,
                  "zero": 0
                },
                "source_rank_score": 106.971824,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "04a04a473d9f4b8a",
                "codeword174_sha256_16": "bb9158f6426e5474"
              },
              {
                "variant": "reverse_symbol_order",
                "transform": "raw_msb+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "raw_msb",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 112.978116,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4f116d0d2d97efad",
                "codeword174_sha256_16": "1ee0e2fbd4d51be6"
              },
              {
                "variant": "reverse_full_bitstream",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 111.978116,
                "syndrome_weight": 28,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4f116d0d2d97efad",
                "codeword174_sha256_16": "1ee0e2fbd4d51be6"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 37,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.902489,
                  "min_abs": 0.041499,
                  "max_abs": 4.063879,
                  "positive": 137,
                  "negative": 37,
                  "zero": 0
                },
                "source_rank_score": 107.609956,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "5e2bcbbdc8cb3e2a",
                "codeword174_sha256_16": "ac458b913c953919"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 137,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.902489,
                  "min_abs": 0.041499,
                  "max_abs": 4.063879,
                  "positive": 37,
                  "negative": 137,
                  "zero": 0
                },
                "source_rank_score": 107.609956,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "5d363667677b4ebf",
                "codeword174_sha256_16": "5f395d3ae3d410f8"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 117,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.217101,
                  "min_abs": 0.010473,
                  "max_abs": 4.109301,
                  "positive": 55,
                  "negative": 119,
                  "zero": 0
                },
                "source_rank_score": 104.868404,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "00e0e71440a516c6",
                "codeword174_sha256_16": "6f3fc74324df2743"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 119,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.165809,
                  "min_abs": 0.003322,
                  "max_abs": 4.109301,
                  "positive": 58,
                  "negative": 116,
                  "zero": 0
                },
                "source_rank_score": 104.663236,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "aca78234d03d9e6e",
                "codeword174_sha256_16": "545b323981ac1f0b"
              },
              {
                "variant": "raw_msb_symbol_order",
                "transform": "lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 142,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 2.244529,
                  "min_abs": 0.061415,
                  "max_abs": 4.307136,
                  "positive": 35,
                  "negative": 139,
                  "zero": 0
                },
                "source_rank_score": 126.978116,
                "syndrome_weight": 32,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "56db10214087a30c",
                "codeword174_sha256_16": "04161507fe78a98a"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          },
          {
            "combination_index": 26,
            "offsets": {
              "start_offset_s": 0.03,
              "base_freq_offset_hz": 3.0,
              "tone_spacing_offset_hz": -0.03
            },
            "anchor_applied": {
              "start_seconds": 4.83,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192
            },
            "pipeline_ok": true,
            "fec_input_summary": {
              "soft_bit_count": 174,
              "missing_soft_bits": 0,
              "complete_ldpc_input_candidate": true,
              "llr_convention": "positive=bit0_more_likely, negative=bit1_more_likely, MSB-first candidate"
            },
            "sync_candidate": {
              "start_sample": 57960,
              "start_seconds": 4.83,
              "base_freq_hz": 1028.0,
              "tone_spacing_hz": 1.9079844961240309,
              "nsps": 6192,
              "candidate_score": null,
              "costas_hits": null,
              "avg_margin_db": null,
              "anchor_source": "step51_source_aligned_timing_sweep:26"
            },
            "best_row": {
              "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
              "mapping_meta": {
                "tone_mapping": "ft8_gray_primary",
                "gray_direction": "inverse_observed_to_plain",
                "reverse_bits_within_tone_before_gray": false,
                "interleaver": "ft8_bitrev",
                "direction": "interleave_codeword_to_rx_inverse",
                "order_len": 174
              },
              "bit_count": 174,
              "hard_weight_174": 37,
              "llr_stats": {
                "count": 174,
                "avg_abs": 1.730043,
                "min_abs": 0.021616,
                "max_abs": 4.058353,
                "positive": 138,
                "negative": 36,
                "zero": 0
              },
              "source_rank_score": 106.920172,
              "syndrome_weight": 27,
              "valid_codeword_hard_decision": false,
              "message91_sha256_16": "b85913e71a6e72e1",
              "codeword174_sha256_16": "e86c99d44140da4f"
            },
            "top_rows": [
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 37,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.730043,
                  "min_abs": 0.021616,
                  "max_abs": 4.058353,
                  "positive": 138,
                  "negative": 36,
                  "zero": 0
                },
                "source_rank_score": 106.920172,
                "syndrome_weight": 27,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b85913e71a6e72e1",
                "codeword174_sha256_16": "e86c99d44140da4f"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 109,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 0.947826,
                  "min_abs": 0.000717,
                  "max_abs": 3.411851,
                  "positive": 68,
                  "negative": 106,
                  "zero": 0
                },
                "source_rank_score": 103.791304,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "63d7de999dc28356",
                "codeword174_sha256_16": "2ad9b1a14cd85e5c"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 89,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.857069,
                  "min_abs": 0.01092,
                  "max_abs": 4.006713,
                  "positive": 36,
                  "negative": 138,
                  "zero": 0
                },
                "source_rank_score": 99.428276,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "f3209b00dbbed253",
                "codeword174_sha256_16": "135a8970b67957e7"
              },
              {
                "variant": "lab_mask_xor_preview",
                "transform": "ft8_gray_alt_high_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174
                },
                "bit_count": 174,
                "hard_weight_174": 81,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.51869,
                  "min_abs": 0.01092,
                  "max_abs": 3.732172,
                  "positive": 123,
                  "negative": 51,
                  "zero": 0
                },
                "source_rank_score": 98.07476,
                "syndrome_weight": 29,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "4dc8b43767d57817",
                "codeword174_sha256_16": "78617f41a52a8853"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 130,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.736354,
                  "min_abs": 0.024218,
                  "max_abs": 4.151228,
                  "positive": 45,
                  "negative": 129,
                  "zero": 0
                },
                "source_rank_score": 106.945416,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b514dccc3f8f2f30",
                "codeword174_sha256_16": "e7b301d31e50e275"
              },
              {
                "variant": "mapped_lsb_within_each_tone+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_alt_high",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": false,
                  "interleaver": "ft8_bitrev",
                  "direction": "deinterleave_rx_to_codeword",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 130,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.686625,
                  "min_abs": 0.011664,
                  "max_abs": 4.151228,
                  "positive": 46,
                  "negative": 128,
                  "zero": 0
                },
                "source_rank_score": 106.7465,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "b514dccc3f8f2f30",
                "codeword174_sha256_16": "e7b301d31e50e275"
              },
              {
                "variant": "mapped_ft8_gray_primary_demap_lsb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "lsb_within_each_tone",
                  "interleaver": "none",
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 126,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.567434,
                  "min_abs": 0.000989,
                  "max_abs": 3.732172,
                  "positive": 51,
                  "negative": 123,
                  "zero": 0
                },
                "source_rank_score": 106.269736,
                "syndrome_weight": 30,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "810a0472f0698b8d",
                "codeword174_sha256_16": "4316a723d47fd8eb"
              },
              {
                "variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_deinterleave_rx_to_codeword",
                "transform": "ft8_gray_primary_demap_lsb_input+ft8_bitrev_interleave_codeword_to_rx_inverse+inverted_bits",
                "mapping_meta": {
                  "tone_mapping": "ft8_gray_primary",
                  "gray_direction": "inverse_observed_to_plain",
                  "reverse_bits_within_tone_before_gray": true,
                  "interleaver": "ft8_bitrev",
                  "direction": "interleave_codeword_to_rx_inverse",
                  "order_len": 174,
                  "polarity": "inverted"
                },
                "bit_count": 174,
                "hard_weight_174": 129,
                "llr_stats": {
                  "count": 174,
                  "avg_abs": 1.34105,
                  "min_abs": 0.01092,
                  "max_abs": 4.006713,
                  "positive": 42,
                  "negative": 132,
                  "zero": 0
                },
                "source_rank_score": 105.3642,
                "syndrome_weight": 31,
                "valid_codeword_hard_decision": false,
                "message91_sha256_16": "9b97c830c0ad11f6",
                "codeword174_sha256_16": "06400af302ea8869"
              }
            ],
            "warnings": [
              "Step 51 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 51 profile-anchor guard: FEC symbols were extracted from the selected profile sync anchor instead of re-running an independent sync search.",
              "Step 51 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 51 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."
            ]
          }
        ],
        "outputs": {
          "timing_boundary_sweep_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_timing_boundary_sweep.json",
          "timing_best_candidate_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step51_source_aligned_best_timing_fec_candidate.json",
          "checkpoint_json": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_timing_boundary_sweep_output.json"
        },
        "decodes": [],
        "warnings": [
          "Step 51 expands the Step36 edge hit and exports the best timing candidate for downstream LDPC soft-decode.",
          "No JS8 text unpack or CRC validation is performed yet.",
          "No valid LDPC codeword found is a diagnostic warning, not a hard command failure."
        ],
        "next_action": "Use outputs.timing_best_candidate_json for LDPC matrix/soft decode. If syndrome is still far from 0, continue interleaver/LLR and symbol-boundary tuning around the best_candidate."
      }
    },
    "real_fixture_intake_helper": {
      "name": "20260527T193942Z_real_fixture_intake_helper_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T193942Z_real_fixture_intake_helper_output.json",
      "url": "/logs/20260527T193942Z_real_fixture_intake_helper_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 3719,
        "mtime_utc": "2026-05-27T19:39:45Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-real-compressed-fixture-intake-helper",
        "tool_version": "step76-real-compressed-fixture-intake-helper",
        "schema": "webftr-js8-real-compressed-fixture-intake-helper-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",
        "state": "fixture_intake_ready_waiting_for_real_values",
        "intake_errors": [],
        "operator_input_seen": false,
        "normalized_message174": null,
        "target_fixture_file": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
        "fixture_write_result": null,
        "helper_files": {
          "readme": "/decoders/js8_decoder/runtime/fixtures/README_STEP76_REAL_FIXTURE_INTAKE.md",
          "shell_helper": "/decoders/js8_decoder/runtime/fixtures/add_real_js8_fixture_step76.sh"
        },
        "step75_summary": {
          "tool_version": "step75-real-compressed-fixture-capture-request",
          "state": "waiting_for_real_compressed_framedata_fixture",
          "next_action": "Fill runtime/fixtures/js8_compressed_frame_fixtures.json from the generated template, then rerun Step75.",
          "step74_gate_summary": {
            "tool_version": "step75-real-compressed-fixture-capture-request",
            "verdict": "fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture",
            "next_action": "Add a real fixture JSON under runtime/fixtures/js8_compressed_frame_fixtures.json or pass it as argument to Step74.",
            "source_found": true,
            "jsc_entry_count": 200000,
            "external_fixture_count": 0,
            "external_fixture_pass_count": 0,
            "external_source_comparison_pass_count": 0,
            "synthetic_selftest_fixture_count": 8,
            "synthetic_selftest_pass_count": 8,
            "synthetic_selftest_all_passed": true,
            "webftr_display_count": 0
          },
          "target_fixture_file": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
          "written_template": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.template.json"
        },
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true,
          "step76_intake_latest": "/logs/js8_real_fixture_intake_helper_latest.json",
          "step75_request_latest": "/logs/js8_real_compressed_fixture_request_latest.json",
          "step74_gate_latest": "/logs/js8_compressed_frame_fixture_gate_latest.json"
        },
        "one_command_examples": [
          "JS8LAB_FIXTURE_MESSAGE174='12CHARSxxxxx' JS8LAB_FIXTURE_EXPECTED_TEXT='HELLO' JS8LAB_FIXTURE_REFERENCE='JS8Call reference log line' JS8LAB_FIXTURE_CONFIRM_EXTERNAL=1 ./RUN_JS8_STEP76_REAL_FIXTURE_INTAKE_HELPER.sh",
          "runtime/fixtures/add_real_js8_fixture_step76.sh 12CHARSxxxxx 'HELLO' 'JS8Call reference log line' /decoders/js8_test.wav"
        ],
        "warnings": [
          "Step76 only imports and validates a real/reference compressed fixture; it does not release WebFTR chat text.",
          "A fixture must be externally confirmed against JS8Call/JS8Call-Improved or a trusted RF comparison before it can be used for a release gate.",
          "The package remains RX-only and never starts JS8Call GUI/runtime control or TX/PTT/Tune/Send actions."
        ],
        "next_action": "Use runtime/fixtures/add_real_js8_fixture_step76.sh or JS8LAB_FIXTURE_* environment variables to import one real JS8Call/RF comparison frame.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_real_fixture_intake_helper_latest.json"
      }
    },
    "real_compressed_fixture_request": {
      "name": "20260527T192543Z_real_compressed_fixture_request_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T192543Z_real_compressed_fixture_request_output.json",
      "url": "/logs/20260527T192543Z_real_compressed_fixture_request_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 5067,
        "mtime_utc": "2026-05-27T19:25:46Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-real-compressed-fixture-capture-request",
        "tool_version": "step75-real-compressed-fixture-capture-request",
        "schema": "webftr-js8-real-compressed-fixture-capture-request-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",
        "state": "waiting_for_real_compressed_framedata_fixture",
        "step74_gate_summary": {
          "tool_version": "step75-real-compressed-fixture-capture-request",
          "verdict": "fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture",
          "next_action": "Add a real fixture JSON under runtime/fixtures/js8_compressed_frame_fixtures.json or pass it as argument to Step74.",
          "source_found": true,
          "jsc_entry_count": 200000,
          "external_fixture_count": 0,
          "external_fixture_pass_count": 0,
          "external_source_comparison_pass_count": 0,
          "synthetic_selftest_fixture_count": 8,
          "synthetic_selftest_pass_count": 8,
          "synthetic_selftest_all_passed": true,
          "webftr_display_count": 0
        },
        "fixture_paths": [
          {
            "path": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
            "exists": false
          },
          {
            "path": "/decoders/js8_decoder/runtime/js8_compressed_frame_fixtures.json",
            "exists": false
          },
          {
            "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixtures.json",
            "exists": false
          },
          {
            "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_import.json",
            "exists": false
          }
        ],
        "written_template": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.template.json",
        "target_fixture_file": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
        "operator_short_checklist": [
          "Keep JS8Lab RX-only; do not start any TX/PTT/Tune/Send action from this package.",
          "Use JS8Call/JS8Call-Improved or a trusted external decoder to identify one exact compressed JS8 data frame and its decoded text.",
          "Copy the exact 12-character message174 payload and exact JS8Call-decoded text into runtime/fixtures/js8_compressed_frame_fixtures.json.",
          "Include reference metadata: WAV filename, UTC timestamp, JS8Call version/source, frequency/audio offset if known, and a short note.",
          "Rerun ./start.sh; Step75 will call the Step74 gate and report whether the external comparison passes."
        ],
        "fixture_template_preview": {
          "schema": "webftr-js8-compressed-frame-fixture-file-v1",
          "purpose": "Real JS8Call/RF comparison fixtures for FrameDataCompressed/JSC text validation. Do not use synthetic rows for release decisions.",
          "how_to_fill": [
            "Capture or otherwise obtain one exact 12-character message174 payload for a FrameDataCompressed JS8 data frame.",
            "Decode the same frame with JS8Call/JS8Call-Improved and copy the exact expected text into expected_text.",
            "Add reference metadata that explains how the expected text was obtained, for example JS8Call log line, WAV name, UTC timestamp, frequency and SNR.",
            "Place the filled file at runtime/fixtures/js8_compressed_frame_fixtures.json and rerun ./start.sh or RUN_JS8_STEP75_REAL_COMPRESSED_FIXTURE_REQUEST.sh."
          ],
          "fixtures": [
            {
              "message174_text_12chars": "REPLACE_ME12",
              "expected_text": "HELLO",
              "js8call_reference": "Exact JS8Call/JS8Call-Improved reference for this same frame; include log line, version, or screenshot note.",
              "rf_reference": {
                "wav": "/decoders/js8_test.wav",
                "utc": "2026-05-27T00:00:00Z",
                "dial_hz": null,
                "audio_offset_hz": null,
                "snr_db": null,
                "notes": "Replace with real capture metadata."
              },
              "external_comparison": true,
              "note": "Template row only. Remove or replace before using as evidence."
            }
          ]
        },
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true,
          "step74_gate_latest": "/logs/js8_compressed_frame_fixture_gate_latest.json",
          "step75_request_latest": "/logs/js8_real_compressed_fixture_request_latest.json"
        },
        "warnings": [
          "Step75 does not decode new RF data and does not release compressed free text to WebFTR.",
          "Synthetic JSC fixtures are only selftests; a release gate needs a real JS8Call/RF comparison fixture.",
          "The generated template contains placeholder values and must not be counted as evidence until edited with real data."
        ],
        "next_action": "Fill runtime/fixtures/js8_compressed_frame_fixtures.json from the generated template, then rerun Step75.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_real_compressed_fixture_request_latest.json"
      }
    },
    "compressed_frame_fixture_gate": {
      "name": "20260527T191502Z_compressed_frame_fixture_gate_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T191502Z_compressed_frame_fixture_gate_output.json",
      "url": "/logs/20260527T191502Z_compressed_frame_fixture_gate_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 28714,
        "mtime_utc": "2026-05-27T19:15:06Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-compressed-frame-fixture-validation-gate",
        "tool_version": "step74-compressed-frame-fixture-validation-gate",
        "schema": "webftr-js8-compressed-frame-fixture-validation-gate-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",
        "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_summary": {
          "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"
              ]
            }
          ]
        },
        "fixture_input_reports": [
          {
            "path": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json",
            "exists": false,
            "default_fixture_path": true
          },
          {
            "path": "/decoders/js8_decoder/runtime/js8_compressed_frame_fixtures.json",
            "exists": false,
            "default_fixture_path": true
          },
          {
            "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixtures.json",
            "exists": false,
            "default_fixture_path": true
          },
          {
            "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_import.json",
            "exists": false,
            "default_fixture_path": true
          }
        ],
        "external_fixture_count": 0,
        "external_fixture_pass_count": 0,
        "external_source_comparison_pass_count": 0,
        "external_fixture_rows": [],
        "synthetic_selftest_fixture_count": 8,
        "synthetic_selftest_pass_count": 8,
        "synthetic_selftest_all_passed": true,
        "synthetic_selftest_rows": [
          {
            "id": "js8-fixture74-2c0f622faffef7",
            "source_label": "synthetic:CQ",
            "source_index": 0,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tuZ+++++++++",
            "payload_bitvec": "0111111000100",
            "expected_text": "CQ",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tuZ+++++++++",
              "expected_text": "CQ",
              "payload_bitvec": "0111111000100",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tuZ+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "CQ",
              "decoded_text_preview": "CQ",
              "expected_text": "CQ",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tuZ+++++++++",
              "bridge": {
                "message_text_12chars": "tuZ+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111111000100011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "0111111000100",
                "payload_preview_bits": "0111111000100",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 121,
                    "word": "CQ",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "CQ",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "CQ",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "CQ"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-44a4267d6a021d",
            "source_label": "synthetic:CQ:sep",
            "source_index": 1,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tuh+++++++++",
            "payload_bitvec": "0111111000101",
            "expected_text": "CQ ",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tuh+++++++++",
              "expected_text": "CQ ",
              "payload_bitvec": "0111111000101",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tuh+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "CQ ",
              "decoded_text_preview": "CQ ",
              "expected_text": "CQ ",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tuh+++++++++",
              "bridge": {
                "message_text_12chars": "tuh+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111111000101011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "0111111000101",
                "payload_preview_bits": "0111111000101",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 121,
                    "word": "CQ",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "CQ ",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "CQ ",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "CQ"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-daad55339cfd4b",
            "source_label": "synthetic:TEST",
            "source_index": 2,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "vqZ+++++++++",
            "payload_bitvec": "1001110100100",
            "expected_text": "TEST",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "vqZ+++++++++",
              "expected_text": "TEST",
              "payload_bitvec": "1001110100100",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "vqZ+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "TEST",
              "decoded_text_preview": "TEST",
              "expected_text": "TEST",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "vqZ+++++++++",
              "bridge": {
                "message_text_12chars": "vqZ+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "111001110100100011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "1001110100100",
                "payload_preview_bits": "1001110100100",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 240,
                    "word": "TEST",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "TEST",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "TEST",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "TEST"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-ced618f95b1e25",
            "source_label": "synthetic:TEST:sep",
            "source_index": 3,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "vqh+++++++++",
            "payload_bitvec": "1001110100101",
            "expected_text": "TEST ",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "vqh+++++++++",
              "expected_text": "TEST ",
              "payload_bitvec": "1001110100101",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "vqh+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "TEST ",
              "decoded_text_preview": "TEST ",
              "expected_text": "TEST ",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "vqh+++++++++",
              "bridge": {
                "message_text_12chars": "vqh+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "111001110100101011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "1001110100101",
                "payload_preview_bits": "1001110100101",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 240,
                    "word": "TEST",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "TEST ",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "TEST ",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "TEST"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-1e784547ba0737",
            "source_label": "synthetic:HELLO",
            "source_index": 4,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tYuK++++++++",
            "payload_bitvec": "011110001011100001010",
            "expected_text": "HELLO",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tYuK++++++++",
              "expected_text": "HELLO",
              "payload_bitvec": "011110001011100001010",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tYuK++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "HELLO",
              "decoded_text_preview": "HELLO",
              "expected_text": "HELLO",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tYuK++++++++",
              "bridge": {
                "message_text_12chars": "tYuK++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111100010111000010100111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 23,
                "payload_bit_count": 21,
                "payload_bitvec": "011110001011100001010",
                "payload_preview_bits": "011110001011100001010",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 21,
                "nibble_count": 5,
                "consumed_nibbles": 5,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 6571,
                    "word": "HELLO",
                    "start": 0,
                    "k": 4
                  }
                ],
                "text": "HELLO",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "HELLO",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "HELLO"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-5edc31f5f5617a",
            "source_label": "synthetic:HELLO:sep",
            "source_index": 5,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tYuM++++++++",
            "payload_bitvec": "011110001011100001011",
            "expected_text": "HELLO ",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tYuM++++++++",
              "expected_text": "HELLO ",
              "payload_bitvec": "011110001011100001011",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tYuM++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "HELLO ",
              "decoded_text_preview": "HELLO ",
              "expected_text": "HELLO ",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tYuM++++++++",
              "bridge": {
                "message_text_12chars": "tYuM++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111100010111000010110111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 23,
                "payload_bit_count": 21,
                "payload_bitvec": "011110001011100001011",
                "payload_preview_bits": "011110001011100001011",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 21,
                "nibble_count": 5,
                "consumed_nibbles": 5,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 6571,
                    "word": "HELLO",
                    "start": 0,
                    "k": 4
                  }
                ],
                "text": "HELLO ",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "HELLO ",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "HELLO"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-56f8032b9e4466",
            "source_label": "synthetic:DE",
            "source_index": 6,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tvZ+++++++++",
            "payload_bitvec": "0111111001100",
            "expected_text": "DE",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tvZ+++++++++",
              "expected_text": "DE",
              "payload_bitvec": "0111111001100",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tvZ+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "DE",
              "decoded_text_preview": "DE",
              "expected_text": "DE",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tvZ+++++++++",
              "bridge": {
                "message_text_12chars": "tvZ+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111111001100011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "0111111001100",
                "payload_preview_bits": "0111111001100",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 125,
                    "word": "DE",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "DE",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "DE",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "DE"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          },
          {
            "id": "js8-fixture74-19ac88ade1546e",
            "source_label": "synthetic:DE:sep",
            "source_index": 7,
            "origin_kind": "synthetic_selftest",
            "message174_text_12chars": "tvh+++++++++",
            "payload_bitvec": "0111111001101",
            "expected_text": "DE ",
            "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.",
            "js8call_reference": null,
            "rf_reference": null,
            "external_comparison": false,
            "built_from_payload_bitvec": null,
            "raw_fixture": {
              "message174_text_12chars": "tvh+++++++++",
              "expected_text": "DE ",
              "payload_bitvec": "0111111001101",
              "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture."
            },
            "compressed_fixture_gate": {
              "attempted": true,
              "message174_text_12chars": "tvh+++++++++",
              "bridge_status": "compressed_payload_bitvec_ready",
              "jsc_complete": true,
              "decoded_text": "DE ",
              "decoded_text_preview": "DE ",
              "expected_text": "DE ",
              "expected_text_present": true,
              "expected_text_match": true,
              "diagnostic_text_plausible": true,
              "has_external_reference": false,
              "source_comparison_passed": false,
              "passes_fixture_gate": true,
              "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture"
            },
            "raw_decode": {
              "message_text_12chars": "tvh+++++++++",
              "bridge": {
                "message_text_12chars": "tvh+++++++++",
                "ok": true,
                "is_data": true,
                "compressed": true,
                "release_allowed": false,
                "release_guard": "step73_diagnostics_only_no_chat_release",
                "bits72_preview": "110111111001101011111111111111111111111111111111111111111111111111111111",
                "top2_bits": "11",
                "last_zero_index": 15,
                "payload_bit_count": 13,
                "payload_bitvec": "0111111001101",
                "payload_preview_bits": "0111111001101",
                "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
                "bridge_status": "compressed_payload_bitvec_ready"
              },
              "attempted_jsc_decompress": true,
              "webftr_display_release_allowed": false,
              "release_decision": "blocked_step73_diagnostics_only",
              "decompress_result": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "decoded_words": [
                  {
                    "index": 125,
                    "word": "DE",
                    "start": 0,
                    "k": 2
                  }
                ],
                "text": "DE ",
                "complete": true,
                "break_reason": null
              },
              "decoded_text_preview": "DE ",
              "diagnostic_text_plausible": true,
              "display_text_if_later_released": "DE"
            },
            "show_in_webftr_rx": false,
            "webftr_chat_release_allowed": false
          }
        ],
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true,
          "candidate_latest_file": "/logs/js8_compressed_frame_fixture_gate_latest.json"
        },
        "fixture_format_hint": {
          "path": "runtime/fixtures/js8_compressed_frame_fixtures.json",
          "example": {
            "fixtures": [
              {
                "message174_text_12chars": "tYuK++++++++",
                "expected_text": "HELLO",
                "js8call_reference": "JS8Call decoded this exact fixture as HELLO",
                "note": "Example format only; provide real RF/JS8Call comparison metadata for release-gate work."
              }
            ]
          }
        },
        "warnings": [
          "Step74 validates compressed single-frame fixtures, but still blocks WebFTR chat release.",
          "Synthetic fixtures prove the port harness only; they are not RF/JS8Call comparison evidence.",
          "Multi-frame assembly and final display-release plausibility remain future steps."
        ],
        "verdict": "fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture",
        "next_action": "Add a real fixture JSON under runtime/fixtures/js8_compressed_frame_fixtures.json or pass it as argument to Step74.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_gate_latest.json"
      }
    },
    "varicode_compressed_bitslice_jsc_bridge": {
      "name": "20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.json",
      "url": "/logs/20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 13508,
        "mtime_utc": "2026-05-27T19:05:36Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-varicode-compressed-bitslice-jsc-bridge-probe",
        "tool_version": "step73-varicode-compressed-bitslice-jsc-bridge-probe",
        "schema": "webftr-js8-varicode-compressed-bitslice-jsc-bridge-probe-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",
        "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_summary": {
          "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"
              ]
            }
          ]
        },
        "input_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T183918Z_data_frame_text_unpack_probe_output.json",
            "exists": true,
            "selected_latest": true,
            "input_kind": "step70_data_frame_probe"
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_varicode_frame_unpack_probe_output.json",
            "exists": true,
            "selected_latest": true,
            "input_kind": "step66_frame_unpack"
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
            "exists": true,
            "selected_latest": true,
            "input_kind": "step67_control_release"
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_confirmed_message174_decode_output.json",
            "exists": true,
            "selected_latest": true,
            "input_kind": "step64_message174"
          }
        ],
        "source_bridge_contract": {
          "message174_to_bits72": "unpack72bits(message174_text) -> 64-bit value + 8-bit remainder",
          "compressed_frame_requirement": "bits72[0]=1 and bits72[1]=1",
          "jsc_payload_bitvec": "bits72[2:last_zero] where last_zero is the final zero delimiter",
          "decompress_target": "Step72 jsc_decompress_bits/JSC::decompress port",
          "chat_release": "disabled in Step73; diagnostics and fixture validation only"
        },
        "current_fixture_has_compressed_data_frames": false,
        "compressed_candidate_count": 0,
        "compressed_candidate_rows": [],
        "synthetic_compressed_selftest_fixtures": [
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "CQ",
            "map_index": 121,
            "separate": false,
            "payload_bitvec": "0111111000100",
            "message174_text_12chars": "tuZ+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "CQ",
            "expected_text": "CQ",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tuZ+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111111000100011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "0111111000100",
              "payload_preview_bits": "0111111000100",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "CQ",
            "map_index": 121,
            "separate": true,
            "payload_bitvec": "0111111000101",
            "message174_text_12chars": "tuh+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "CQ ",
            "expected_text": "CQ ",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tuh+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111111000101011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "0111111000101",
              "payload_preview_bits": "0111111000101",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "TEST",
            "map_index": 240,
            "separate": false,
            "payload_bitvec": "1001110100100",
            "message174_text_12chars": "vqZ+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "TEST",
            "expected_text": "TEST",
            "passes": true,
            "bridge": {
              "message_text_12chars": "vqZ+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "111001110100100011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "1001110100100",
              "payload_preview_bits": "1001110100100",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "TEST",
            "map_index": 240,
            "separate": true,
            "payload_bitvec": "1001110100101",
            "message174_text_12chars": "vqh+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "TEST ",
            "expected_text": "TEST ",
            "passes": true,
            "bridge": {
              "message_text_12chars": "vqh+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "111001110100101011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "1001110100101",
              "payload_preview_bits": "1001110100101",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "HELLO",
            "map_index": 6571,
            "separate": false,
            "payload_bitvec": "011110001011100001010",
            "message174_text_12chars": "tYuK++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "HELLO",
            "expected_text": "HELLO",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tYuK++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111100010111000010100111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 23,
              "payload_bit_count": 21,
              "payload_bitvec": "011110001011100001010",
              "payload_preview_bits": "011110001011100001010",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "HELLO",
            "map_index": 6571,
            "separate": true,
            "payload_bitvec": "011110001011100001011",
            "message174_text_12chars": "tYuM++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "HELLO ",
            "expected_text": "HELLO ",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tYuM++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111100010111000010110111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 23,
              "payload_bit_count": 21,
              "payload_bitvec": "011110001011100001011",
              "payload_preview_bits": "011110001011100001011",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "DE",
            "map_index": 125,
            "separate": false,
            "payload_bitvec": "0111111001100",
            "message174_text_12chars": "tvZ+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "DE",
            "expected_text": "DE",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tvZ+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111111001100011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "0111111001100",
              "payload_preview_bits": "0111111001100",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          },
          {
            "fixture_kind": "synthetic_single_frame_FrameDataCompressed_JSC_word",
            "fixture_word": "DE",
            "map_index": 125,
            "separate": true,
            "payload_bitvec": "0111111001101",
            "message174_text_12chars": "tvh+++++++++",
            "frame_probe_type": "FrameDataCompressed",
            "decoded_text": "DE ",
            "expected_text": "DE ",
            "passes": true,
            "bridge": {
              "message_text_12chars": "tvh+++++++++",
              "ok": true,
              "is_data": true,
              "compressed": true,
              "release_allowed": false,
              "release_guard": "step73_diagnostics_only_no_chat_release",
              "bits72_preview": "110111111001101011111111111111111111111111111111111111111111111111111111",
              "top2_bits": "11",
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_bitvec": "0111111001101",
              "payload_preview_bits": "0111111001101",
              "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress",
              "bridge_status": "compressed_payload_bitvec_ready"
            }
          }
        ],
        "selftest_fixture_count": 8,
        "selftest_fixture_pass_count": 8,
        "selftest_all_passed": true,
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true,
          "candidate_latest_file": "/logs/js8_varicode_compressed_bitslice_jsc_bridge_latest.json"
        },
        "warnings": [
          "Step73 validates the Varicode compressed bit-slice bridge to the JSC decompressor, but keeps chat display blocked.",
          "Synthetic single-frame compressed fixtures are not a substitute for real RF/JS8Call comparison fixtures.",
          "Multi-frame assembly and final display-release plausibility are still future steps."
        ],
        "verdict": "compressed_bitslice_jsc_bridge_selftest_ready_no_current_compressed_frames",
        "next_action": "Capture or inject a real FrameDataCompressed row; then validate JSC text against JS8Call before any WebFTR chat release.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_varicode_compressed_bitslice_jsc_bridge_latest.json"
      }
    },
    "jsc_decompress_port_probe": {
      "name": "20260527T185247Z_jsc_decompress_port_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T185247Z_jsc_decompress_port_probe_output.json",
      "url": "/logs/20260527T185247Z_jsc_decompress_port_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 10108,
        "mtime_utc": "2026-05-27T18:52:55Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-jsc-decompress-guarded-port-probe",
        "tool_version": "step72-jsc-decompress-guarded-port-probe",
        "schema": "webftr-js8-jsc-decompress-guarded-port-probe-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",
        "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
            }
          ]
        },
        "step71_input": {
          "path": "/decoders/js8_decoder/logs/20260527T185247Z_jsc_table_extract_probe_output.json",
          "verdict": "jsc_table_payload_extracted_port_ready",
          "table_extract_ready": true
        },
        "jsc_source_algorithm_contract": {
          "bytesize_bits": 4,
          "small_terminal_symbol_count_s": 7,
          "large_symbol_base_c": 9,
          "separator_bit_after_terminal_symbol": true,
          "algorithm_status": "ported_from_source_shape_for_table_roundtrip"
        },
        "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"
              ]
            }
          ]
        },
        "decompress_roundtrip_fixtures": {
          "fixture_count": 16,
          "pass_count": 16,
          "all_passed": true,
          "rows": [
            {
              "index": 121,
              "word": "CQ",
              "separate": false,
              "bits": "0111111000100",
              "decoded_text": "CQ",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "CQ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 121,
              "word": "CQ",
              "separate": true,
              "bits": "0111111000101",
              "decoded_text": "CQ ",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "CQ ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 240,
              "word": "TEST",
              "separate": false,
              "bits": "1001110100100",
              "decoded_text": "TEST",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "TEST",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 240,
              "word": "TEST",
              "separate": true,
              "bits": "1001110100101",
              "decoded_text": "TEST ",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "TEST ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 6571,
              "word": "HELLO",
              "separate": false,
              "bits": "011110001011100001010",
              "decoded_text": "HELLO",
              "passes": true,
              "decode": {
                "input_bit_count": 21,
                "nibble_count": 5,
                "consumed_nibbles": 5,
                "decoded_word_count": 1,
                "text": "HELLO",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 6571,
              "word": "HELLO",
              "separate": true,
              "bits": "011110001011100001011",
              "decoded_text": "HELLO ",
              "passes": true,
              "decode": {
                "input_bit_count": 21,
                "nibble_count": 5,
                "consumed_nibbles": 5,
                "decoded_word_count": 1,
                "text": "HELLO ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 125,
              "word": "DE",
              "separate": false,
              "bits": "0111111001100",
              "decoded_text": "DE",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "DE",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 125,
              "word": "DE",
              "separate": true,
              "bits": "0111111001101",
              "decoded_text": "DE ",
              "passes": true,
              "decode": {
                "input_bit_count": 13,
                "nibble_count": 3,
                "consumed_nibbles": 3,
                "decoded_word_count": 1,
                "text": "DE ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 67,
              "word": " ",
              "separate": false,
              "bits": "111101000",
              "decoded_text": " ",
              "passes": true,
              "decode": {
                "input_bit_count": 9,
                "nibble_count": 2,
                "consumed_nibbles": 2,
                "decoded_word_count": 1,
                "text": " ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 67,
              "word": " ",
              "separate": true,
              "bits": "111101001",
              "decoded_text": "  ",
              "passes": true,
              "decode": {
                "input_bit_count": 9,
                "nibble_count": 2,
                "consumed_nibbles": 2,
                "decoded_word_count": 1,
                "text": "  ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 0,
              "word": "E",
              "separate": false,
              "bits": "00000",
              "decoded_text": "E",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "E",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 0,
              "word": "E",
              "separate": true,
              "bits": "00001",
              "decoded_text": "E ",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "E ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 1,
              "word": "T",
              "separate": false,
              "bits": "00010",
              "decoded_text": "T",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "T",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 1,
              "word": "T",
              "separate": true,
              "bits": "00011",
              "decoded_text": "T ",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "T ",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 2,
              "word": "A",
              "separate": false,
              "bits": "00100",
              "decoded_text": "A",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "A",
                "complete": true,
                "break_reason": null
              }
            },
            {
              "index": 2,
              "word": "A",
              "separate": true,
              "bits": "00101",
              "decoded_text": "A ",
              "passes": true,
              "decode": {
                "input_bit_count": 5,
                "nibble_count": 1,
                "consumed_nibbles": 1,
                "decoded_word_count": 1,
                "text": "A ",
                "complete": true,
                "break_reason": null
              }
            }
          ]
        },
        "compressed_frame_candidates": {
          "count": 0,
          "probes": [],
          "display_release_allowed": false
        },
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true,
          "candidate_latest_file": "/logs/js8_jsc_decompress_port_probe_latest.json"
        },
        "warnings": [
          "Step72 ports the JSC codeword/decompress mechanics and validates map order with local roundtrip fixtures only.",
          "It does not release FrameDataCompressed as JS8 chat text.",
          "A source-faithful Varicode compressed payload bit-slice export is still needed before real compressed frames can be decoded through this port."
        ],
        "verdict": "jsc_decompress_port_roundtrip_ready_no_current_compressed_frames",
        "next_action": "Capture or inject a real FrameDataCompressed fixture and export its post-unpack JSC bitvec; Step73 should connect Varicode bit-slice extraction to this port.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_decompress_port_probe_latest.json"
      }
    },
    "jsc_table_extract_probe": {
      "name": "20260527T185247Z_jsc_table_extract_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T185247Z_jsc_table_extract_probe_output.json",
      "url": "/logs/20260527T185247Z_jsc_table_extract_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 23855,
        "mtime_utc": "2026-05-27T18:52:52Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-jsc-table-extract-probe",
        "tool_version": "step71-jsc-table-extract-probe",
        "schema": "webftr-js8-jsc-table-extract-probe-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",
        "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
            }
          ]
        },
        "step69_audit_summary": {
          "verdict": "jsc_source_ready_no_data_frames_in_current_fixture",
          "has_jsc_decompress_reference": true,
          "has_unpack_fast_data_message": true,
          "has_unpack_legacy_data_message": true,
          "has_huff_fallback_evidence": true
        },
        "jsc_table_source_bundle": {
          "focused_files_present": [
            "JS8_JSC/JSC.cpp",
            "JS8_JSC/JSC.h",
            "JS8_JSC/JSC_map.cpp",
            "JS8_JSC/JSC_list.cpp",
            "JS8_Main/Varicode.cpp",
            "JS8_Main/Varicode.h"
          ],
          "focused_files_missing": [
            "JS8_JSC/jsc.cpp",
            "JS8_JSC/jsc.h"
          ],
          "focused_file_stats": [
            {
              "path": "JS8_JSC/JSC.cpp",
              "exists": true,
              "bytes": 7392,
              "line_count": 299,
              "sha256": "0f1c974a96fd65e043b1a4dbdb69a9ae43e42dafe81f5f22f196b09596dbcdeb"
            },
            {
              "path": "JS8_JSC/JSC.h",
              "exists": true,
              "bytes": 1232,
              "line_count": 48,
              "sha256": "3edfda65865dc4ede66730113c1c7250861253d78ed83f17626ce55c79b0f1d8"
            },
            {
              "path": "JS8_JSC/JSC_map.cpp",
              "exists": true,
              "bytes": 7082880,
              "line_count": 262172,
              "sha256": "ab2bd62ef594f4629a2c93b6de43f5469b1fd6fe67ebf4d24f915bd11ccef813"
            },
            {
              "path": "JS8_JSC/JSC_list.cpp",
              "exists": true,
              "bytes": 7085560,
              "line_count": 262278,
              "sha256": "993811813f1cd6e00e399f25352a34ae477b7e1b50745204c32d3df0058a0491"
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "exists": true,
              "bytes": 72661,
              "line_count": 2371,
              "sha256": "2b4a877e7dae1a3fdd9141f4dd8af422185977d2e9363ad23ef6bc1918eaf53a"
            },
            {
              "path": "JS8_Main/Varicode.h",
              "exists": true,
              "bytes": 8286,
              "line_count": 222,
              "sha256": "dd7b8bf50466d0d2dc42b8c9ec05a72126363b3cd02c7492c5e2dcc9c9abb99d"
            },
            {
              "path": "JS8_JSC/JSC_checker.h",
              "exists": true,
              "bytes": 477,
              "line_count": 27,
              "sha256": "7bcf0d7af4fcab0274dd8163e3c8273118dea3796dc1993c0eab1e88217156f4"
            },
            {
              "path": "JS8_JSC/JSC_checker.cpp",
              "exists": true,
              "bytes": 8715,
              "line_count": 310,
              "sha256": "274ff9504345d11c9dfdeccd8f8731f5207943a6ca29111f3af7ae922e70852b"
            }
          ],
          "file_payload_summaries": [
            {
              "path": "JS8_JSC/JSC.cpp",
              "token_hits": {
                "JSC::decompress": 1,
                "JSC::compress": 1,
                "QMap": 1,
                "QStringList": 2,
                "decompress": 2,
                "compress": 8
              },
              "quoted_payloads": {
                "count": 5,
                "sha1": "86f5f3914035b44a10590f65931e95744bc1fbe4",
                "preview": [
                  "JSC.h",
                  "JS8_Main/Varicode.h",
                  " ",
                  " ",
                  " "
                ],
                "longest_length": 19
              },
              "numeric_payloads": {
                "count": 54,
                "sha1": "fb4c05cb8238ab66e1bfa80b17bcec09deadefac",
                "preview": [
                  3,
                  2018,
                  1,
                  1,
                  0,
                  1,
                  4,
                  7,
                  2,
                  4,
                  0,
                  1,
                  1,
                  0,
                  4,
                  7,
                  2,
                  8,
                  0,
                  0,
                  1,
                  2,
                  1,
                  3,
                  2,
                  4,
                  3,
                  5,
                  4,
                  6,
                  5,
                  7,
                  6,
                  0,
                  4,
                  4,
                  4,
                  0,
                  1,
                  1
                ],
                "min": 0,
                "max": 2018
              },
              "table_block_candidate_count": 0
            },
            {
              "path": "JS8_JSC/JSC.h",
              "token_hits": {
                "QMap": 1,
                "QVector": 3,
                "QStringList": 1,
                "decompress": 1,
                "compress": 2
              },
              "quoted_payloads": {
                "count": 0,
                "sha1": null,
                "preview": [],
                "longest_length": 0
              },
              "numeric_payloads": {
                "count": 7,
                "sha1": "ea8c788ef4b3aaf44d94bb8032429b9d04c26370",
                "preview": [
                  2018,
                  0,
                  262144,
                  262144,
                  262144,
                  103,
                  103
                ],
                "min": 0,
                "max": 262144
              },
              "table_block_candidate_count": 0
            },
            {
              "path": "JS8_JSC/JSC_map.cpp",
              "token_hits": {
                "JSC_map": 1
              },
              "quoted_payloads": {
                "count": 10000,
                "sha1": "526769a40ad90e2d2c34287e98b746084c09f2f2",
                "preview": [
                  "JSC.h",
                  "E",
                  "T",
                  "A",
                  "O",
                  "I",
                  "N",
                  "S",
                  "H",
                  "R",
                  "D",
                  "L",
                  "C",
                  "U",
                  "M",
                  "W",
                  "F",
                  "G",
                  "Y",
                  "P",
                  "B",
                  ",",
                  ".",
                  "V",
                  "K",
                  "-",
                  "+",
                  "\"",
                  "?",
                  "!"
                ],
                "longest_length": 90
              },
              "numeric_payloads": {
                "count": 20000,
                "sha1": "0999e8706f8310753ed73308c79924be7059bcae",
                "preview": [
                  3,
                  2018,
                  262144,
                  1,
                  0,
                  1,
                  1,
                  1,
                  2,
                  1,
                  3,
                  1,
                  4,
                  1,
                  5,
                  1,
                  6,
                  1,
                  7,
                  1,
                  8,
                  1,
                  9,
                  1,
                  10,
                  1,
                  11,
                  1,
                  12,
                  1,
                  13,
                  1,
                  14,
                  1,
                  15,
                  1,
                  16,
                  1,
                  17,
                  1
                ],
                "min": 0,
                "max": 262144
              },
              "table_block_candidate_count": 0
            },
            {
              "path": "JS8_JSC/JSC_list.cpp",
              "token_hits": {
                "JSC_list": 1
              },
              "quoted_payloads": {
                "count": 10000,
                "sha1": "f0431a6771d806630866a7b704ee1c5504554fcd",
                "preview": [
                  "JSC.h",
                  "~",
                  "}",
                  "|",
                  "{",
                  "`",
                  "_",
                  "^",
                  "]",
                  " ",
                  "[",
                  "ZZZZ",
                  "ZZZ",
                  "ZZYY",
                  "ZZYW",
                  "ZZYT",
                  "ZZYS",
                  "ZZYP",
                  "ZZYO",
                  "ZZYL",
                  "ZZYI",
                  "ZZYH",
                  "ZZYG",
                  "ZZYF",
                  "ZZYD",
                  "ZZYC",
                  "ZZYB",
                  "ZZYA",
                  "ZZY",
                  "ZZWO"
                ],
                "longest_length": 22
              },
              "numeric_payloads": {
                "count": 20000,
                "sha1": "ce4b3ea12826f80b3a2dfe6628a53db1902c8d0c",
                "preview": [
                  3,
                  2018,
                  262144,
                  1,
                  66,
                  1,
                  61,
                  1,
                  62,
                  1,
                  60,
                  1,
                  65,
                  1,
                  48,
                  1,
                  64,
                  1,
                  59,
                  1,
                  67,
                  1,
                  58,
                  4,
                  91474,
                  3,
                  70901,
                  4,
                  171515,
                  4,
                  183602,
                  4,
                  195566,
                  4,
                  133423,
                  4,
                  253527,
                  4,
                  172771,
                  4
                ],
                "min": 1,
                "max": 262144
              },
              "table_block_candidate_count": 2
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "token_hits": {
                "JSC::decompress": 3,
                "JSC::compress": 1,
                "QMap": 12,
                "QVector": 19,
                "QStringList": 17,
                "decompress": 3,
                "compress": 30
              },
              "quoted_payloads": {
                "count": 335,
                "sha1": "5b618b61efcffa1dfb4a996a41c3763b30b3ebaf",
                "preview": [
                  "Varicode.h",
                  "JS8_JSC/JSC.h",
                  "JS8_Mode/DecodedText.h",
                  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?",
                  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+/?.",
                  "((?<grid>[A-X]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*)+)",
                  "((?<callsign>(\\d|[A-Z])+\\/?((\\d|[A-Z]){2,})(\\/(\\d|[A-Z])+)?(\\/(\\d|[A-Z])+)?))",
                  "((?<callsign>\\b(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?<portable>[/][P])?\\b))",
                  "((?<callsign>\\b(?<prefix>[A-Z0-9]{1,4}\\/)?(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?<suffix>\\/[A-Z0",
                  "((?<callsign>(?:[@]?|\\b)(?<extended>[A-Z0-9\\/@][A-Z0-9\\/]{0,2}[\\/]?[A-Z0-9\\/]{0,3}[\\/]?[A-Z0-9\\/]{0,3})\\b))",
                  "(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))",
                  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /@",
                  " HEARTBEAT",
                  " HB",
                  " CQ",
                  " SNR?",
                  "?",
                  " DIT DIT",
                  " HEARING?",
                  " GRID?",
                  ">",
                  " STATUS?",
                  " STATUS",
                  " HEARING",
                  " MSG",
                  " MSG TO:",
                  " QUERY",
                  " QUERY MSGS",
                  " QUERY MSGS?",
                  " QUERY CALL"
                ],
                "longest_length": 162
              },
              "numeric_payloads": {
                "count": 1192,
                "sha1": "ff0cbffa918ab131a36a79d6d1d25e6c88f86caa",
                "preview": [
                  2018,
                  41,
                  2,
                  0,
                  9,
                  2,
                  2,
                  0,
                  9,
                  2,
                  2,
                  0,
                  0,
                  0,
                  9,
                  9,
                  1,
                  4,
                  0,
                  0,
                  0,
                  9,
                  9,
                  1,
                  4,
                  9,
                  9,
                  0,
                  2,
                  9,
                  0,
                  3,
                  9,
                  0,
                  3,
                  0,
                  0,
                  0,
                  9,
                  1
                ],
                "min": 0,
                "max": 18446744069414584320
              },
              "table_block_candidate_count": 8
            },
            {
              "path": "JS8_Main/Varicode.h",
              "token_hits": {
                "QMap": 4,
                "QVector": 11,
                "QStringList": 6
              },
              "quoted_payloads": {
                "count": 8,
                "sha1": "7367de55acb564de81eebdd9813c1eaff7b97838",
                "preview": [
                  "FrameHeartbeat",
                  "FrameCompound",
                  "FrameCompoundDirected",
                  "FrameDirected",
                  "FrameData",
                  "FrameUnknown",
                  "FrameDataCompressed",
                  "FrameUnknown"
                ],
                "longest_length": 21
              },
              "numeric_payloads": {
                "count": 35,
                "sha1": "d738220eafa90f4a5dc6077ab67377f9a0bd532f",
                "preview": [
                  2018,
                  0,
                  1,
                  2,
                  4,
                  8,
                  0,
                  0,
                  1,
                  1,
                  2,
                  10,
                  4,
                  100,
                  0,
                  1,
                  10,
                  11,
                  255,
                  11111111,
                  0,
                  0,
                  1,
                  1,
                  2,
                  10,
                  3,
                  11,
                  4,
                  2,
                  6,
                  2,
                  6,
                  5,
                  0
                ],
                "min": 0,
                "max": 11111111
              },
              "table_block_candidate_count": 1
            },
            {
              "path": "JS8_JSC/JSC_checker.h",
              "token_hits": {
                "QStringList": 1
              },
              "quoted_payloads": {
                "count": 0,
                "sha1": null,
                "preview": [],
                "longest_length": 0
              },
              "numeric_payloads": {
                "count": 1,
                "sha1": "66efd9eefecf45dd64eff8e5cb2d13e005041925",
                "preview": [
                  2018
                ],
                "min": 2018,
                "max": 2018
              },
              "table_block_candidate_count": 0
            },
            {
              "path": "JS8_JSC/JSC_checker.cpp",
              "token_hits": {
                "QStringList": 3
              },
              "quoted_payloads": {
                "count": 15,
                "sha1": "9b2bf80a6353b9cb8b09e773feb295953e998aa4",
                "preview": [
                  "JSC_checker.h",
                  "JS8_Main/Varicode.h",
                  "JSC.h",
                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                  "^\\\\d+$",
                  "^\\\\w$",
                  "checking range ",
                  " - ",
                  "@",
                  "correct",
                  "word",
                  "correct",
                  "computing suggestions for word",
                  "suggest",
                  "jsc_checker.js8"
                ],
                "longest_length": 30
              },
              "numeric_payloads": {
                "count": 23,
                "sha1": "f0250c33ef66d223306f5b7bc0bf91b99a8c8389",
                "preview": [
                  3,
                  2018,
                  10,
                  1,
                  1,
                  0,
                  1,
                  4,
                  1,
                  0,
                  26,
                  1,
                  1,
                  0,
                  0,
                  1,
                  1,
                  1,
                  0,
                  0,
                  1,
                  1,
                  0
                ],
                "min": 0,
                "max": 2018
              },
              "table_block_candidate_count": 1
            }
          ],
          "table_block_candidates": [
            {
              "path": "JS8_JSC/JSC_list.cpp",
              "line": 25,
              "header_preview": "const Tuple JSC::list[262144]",
              "chars": 59,
              "sha256": "3eec4a2bc6458577c879e78f7207111bdc6a7ab330046e8ffd166fa6bfb2a944",
              "quoted_count": 2,
              "numeric_count": 4,
              "quoted_preview": [
                "~",
                "}"
              ],
              "numeric_preview": [
                1,
                66,
                1,
                61
              ]
            },
            {
              "path": "JS8_JSC/JSC_list.cpp",
              "line": 262173,
              "header_preview": "const Tuple JSC::prefix[103]",
              "chars": 2653,
              "sha256": "1569ed8197a2f077de22bffd3dc786f991984e2a5cff24a3ff4bb3647d29de57",
              "quoted_count": 103,
              "numeric_count": 216,
              "quoted_preview": [
                "!",
                "\"",
                "#",
                "$",
                "%",
                "&",
                "'",
                "(",
                ")",
                "*",
                "+",
                ","
              ],
              "numeric_preview": [
                1,
                262143,
                1,
                262142,
                1,
                262141,
                1,
                262140,
                1,
                262139,
                1,
                262138,
                8,
                262130,
                1,
                262129,
                1,
                262128,
                1,
                262127
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 48,
              "header_preview": "QMap<QString, int> directed_cmds",
              "chars": 2098,
              "sha256": "54c2ee30ebb5f60ef3cf547c16b803a935cf607e5f7a630e48701207d5f14cd7",
              "quoted_count": 39,
              "numeric_count": 44,
              "quoted_preview": [
                " HEARTBEAT",
                " HB",
                " CQ",
                " SNR?",
                "?",
                " DIT DIT",
                " HEARING?",
                " GRID?",
                ">",
                " STATUS?",
                " STATUS",
                " HEARING"
              ],
              "numeric_preview": [
                1,
                1,
                1,
                0,
                0,
                1,
                3,
                4,
                5,
                6,
                7,
                8,
                9,
                10,
                11,
                12,
                12,
                13,
                14,
                15
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 120,
              "header_preview": "int> allowed_cmds",
              "chars": 183,
              "sha256": "921b9fb284ec74ed27550d958b8232fc4562cfc26374671be18dc79b7cd44fe5",
              "quoted_count": 0,
              "numeric_count": 33,
              "quoted_preview": [],
              "numeric_preview": [
                1,
                0,
                1,
                2,
                3,
                4,
                5,
                6,
                7,
                8,
                9,
                10,
                11,
                12,
                13,
                14,
                15,
                16,
                17,
                18
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 125,
              "header_preview": "int> autoreply_cmds",
              "chars": 46,
              "sha256": "a0eceffe1f310810db3a69968d808b0bc08a9617311c71ccbfb89e1268159e90",
              "quoted_count": 0,
              "numeric_count": 13,
              "quoted_preview": [],
              "numeric_preview": [
                0,
                2,
                3,
                4,
                6,
                9,
                10,
                11,
                12,
                13,
                14,
                16,
                30
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 128,
              "header_preview": "int> buffered_cmds",
              "chars": 30,
              "sha256": "17ce3f628d245621b9a126abcf924416add4bfb37925df2ae73036935fe3d460",
              "quoted_count": 0,
              "numeric_count": 8,
              "quoted_preview": [],
              "numeric_preview": [
                5,
                9,
                10,
                11,
                12,
                13,
                15,
                24
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 134,
              "header_preview": "QMap<int, int> checksum_cmds",
              "chars": 112,
              "sha256": "8f554b3c0fbb86b5baac4fc4e75814fb8f0c166e200e1655300329e1e0420d6b",
              "quoted_count": 0,
              "numeric_count": 16,
              "quoted_preview": [],
              "numeric_preview": [
                5,
                16,
                9,
                16,
                10,
                16,
                11,
                16,
                12,
                16,
                13,
                16,
                15,
                0,
                24,
                16
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 162,
              "header_preview": "QMap<QString, QString> hufftable",
              "chars": 1766,
              "sha256": "0801e3084efe5d61bc4bc84d40cd23260d543c79cced73cdf3cd16e50508a196",
              "quoted_count": 88,
              "numeric_count": 142,
              "quoted_preview": [
                " ",
                "01",
                "E",
                "100",
                "T",
                "1101",
                "A",
                "0011",
                "O",
                "11111",
                "I",
                "11100"
              ],
              "numeric_preview": [
                1,
                1,
                0,
                100,
                0,
                5,
                1101,
                0,
                333333333333,
                11,
                0,
                25,
                11111,
                0,
                2,
                11100,
                0,
                166666666667,
                10111,
                0
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 218,
              "header_preview": "QMap<QString, quint32> basecalls",
              "chars": 2846,
              "sha256": "ecf17790db5faadd7958a64dcb9e8aeac79427ac61b390ae07e791615489eee4",
              "quoted_count": 54,
              "numeric_count": 75,
              "quoted_preview": [
                "<....>",
                "@ALLCALL",
                "@JS8NET",
                "@DX/NA",
                "@DX/SA",
                "@DX/EU",
                "@DX/AS",
                "@DX/AF",
                "@DX/OC",
                "@DX/AN",
                "@REGION/1",
                "@REGION/2"
              ],
              "numeric_preview": [
                1,
                2,
                3,
                4,
                5,
                6,
                7,
                8,
                9,
                10,
                1,
                11,
                1,
                2,
                12,
                2,
                3,
                13,
                3,
                0
              ]
            },
            {
              "path": "JS8_Main/Varicode.cpp",
              "line": 287,
              "header_preview": "QMap<quint32, QString> cqs",
              "chars": 133,
              "sha256": "faa00ed894e44ef5d1125aaf6e47012146124ac4376d3aad68619f80327b6a5e",
              "quoted_count": 8,
              "numeric_count": 8,
              "quoted_preview": [
                "CQ CQ CQ",
                "CQ DX",
                "CQ QRP",
                "CQ CONTEST",
                "CQ FIELD",
                "CQ FD",
                "CQ CQ",
                "CQ"
              ],
              "numeric_preview": [
                0,
                1,
                2,
                3,
                4,
                5,
                6,
                7
              ]
            },
            {
              "path": "JS8_Main/Varicode.h",
              "line": 63,
              "header_preview": "const char *FrameTypeStrings[]",
              "chars": 204,
              "sha256": "3441dcd80fd6f257f494645a7f0678cc0dc1b4fd4d570d067ae2fcf8534210c3",
              "quoted_count": 7,
              "numeric_count": 1,
              "quoted_preview": [
                "FrameHeartbeat",
                "FrameCompound",
                "FrameCompoundDirected",
                "FrameDirected",
                "FrameData",
                "FrameUnknown",
                "FrameDataCompressed"
              ],
              "numeric_preview": [
                5
              ]
            },
            {
              "path": "JS8_JSC/JSC_checker.cpp",
              "line": 37,
              "header_preview": "const QString ALPHABET",
              "chars": 30,
              "sha256": "a6aa5a9ec226235c107a7514939a75632d8f3ca405f0875660d8377ae7de8c32",
              "quoted_count": 1,
              "numeric_count": 0,
              "quoted_preview": [
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
              ],
              "numeric_preview": []
            }
          ],
          "payload_totals": {
            "quoted_payload_count": 20363,
            "numeric_literal_count": 41312,
            "table_block_candidate_count": 12
          },
          "bundle_fingerprint_sha256": "46ff5c2aab7d37a5c20755654d61598e07ed137a6a9bdf07a2425bcf343d95e0"
        },
        "port_readiness": {
          "has_jsc_cpp": true,
          "has_jsc_h": true,
          "has_jsc_map_cpp": true,
          "has_jsc_list_cpp": true,
          "has_payload_tables_or_literals": true,
          "has_decompress_path_evidence": true,
          "table_extract_ready": true,
          "compressed_frame_display_release_allowed": false
        },
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true
        },
        "warnings": [
          "Step71 is a source-table extraction/readiness probe only.",
          "It does not execute JSC::decompress and does not release compressed FrameData as chat text.",
          "Fingerprints/previews are meant to anchor the next guarded source-faithful port step."
        ],
        "verdict": "jsc_table_payload_extracted_port_ready",
        "next_action": "Implement the guarded JSC bitstream/table decoder against this extracted fingerprint bundle, then validate only with compressed FrameData fixtures.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_table_extract_probe_latest.json"
      }
    },
    "data_frame_text_unpack_probe": {
      "name": "20260527T183918Z_data_frame_text_unpack_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T183918Z_data_frame_text_unpack_probe_output.json",
      "url": "/logs/20260527T183918Z_data_frame_text_unpack_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 6092,
        "mtime_utc": "2026-05-27T18:39:20Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-data-frame-text-unpack-probe",
        "tool_version": "step70-data-frame-text-unpack-probe",
        "schema": "webftr-js8-data-frame-text-unpack-probe-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/20260527T183331Z_jsc_decompress_source_audit_output.json",
            "exists": true,
            "selected_latest": true,
            "input_kind": "step69_jsc_source_audit"
          }
        ],
        "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
            }
          ],
          "focused_files_present": [
            "JS8_Main/Varicode.cpp",
            "JS8_Main/Varicode.h",
            "JS8_JSC/JSC.cpp",
            "JS8_JSC/JSC.h",
            "JS8_JSC/JSC_map.cpp",
            "JS8_JSC/JSC_list.cpp",
            "JS8_Mode/JS8.cpp",
            "JS8_Mode/JS8.h"
          ],
          "focused_files_missing": [
            "JS8_JSC/jsc.cpp",
            "JS8_JSC/jsc.h"
          ]
        },
        "jsc_decode_path_evidence": {
          "has_jsc_decompress_reference": true,
          "has_unpack_fast_data_message": true,
          "has_unpack_legacy_data_message": true,
          "has_huff_fallback_evidence": true,
          "expected_source_flow": [
            "unpack72bits(message174_text) -> 72 bits",
            "FrameData/FrameDataCompressed bits are trimmed at the final zero padding marker",
            "compressed path calls JSC::decompress(bits)",
            "legacy non-compressed path uses Varicode::huffDecode(defaultHuffTable, bits)",
            "Step69 does not yet display free text; it only extracts and documents the source path for a safe Step70 port."
          ]
        },
        "source_trim_contract": {
          "message174_to_72_bits": "unpack72bits(message174_text) -> 64-bit value + 8-bit remainder",
          "legacy_data_flags": "bit0=data, bit1=compressed",
          "legacy_noncompressed_path": "payload bits between data/compressed flags and final zero delimiter -> Varicode::huffDecode(defaultHuffTable)",
          "compressed_path": "same trim family, then JSC::decompress(payload bits); still blocked in Step70",
          "chat_release": "disabled; this step is a guarded port/harness probe only"
        },
        "current_fixture_has_data_frames": false,
        "data_frame_candidate_count": 0,
        "data_frame_text_rows": [],
        "synthetic_selftest_fixtures": [
          {
            "fixture_kind": "legacy_noncompressed_huff_data_frame",
            "input_text": "TEST",
            "message174_text_12chars": "jbDV++++++++",
            "payload_bit_count": 16,
            "bits72_prefix": "1011011001010011010111111111111111111111",
            "unpack_result": {
              "message_text_12chars": "jbDV++++++++",
              "ok": true,
              "data_text_release_allowed": false,
              "release_guard": "step70_diagnostics_only_no_chat_release",
              "top2": 2,
              "top3": 5,
              "is_data_flag": true,
              "compressed_flag": false,
              "last_zero_index": 18,
              "payload_bit_count": 16,
              "payload_preview_bits": "1101100101001101",
              "source_trim_rule": "bits[2:last_zero] using final zero as padding delimiter for legacy data frames",
              "frame_text_path": "legacy_huff_noncompressed",
              "huff_decode": {
                "text": "TEST",
                "consumed_bits": 16,
                "remaining_bits": 0,
                "complete": true
              },
              "decoded_text": "TEST",
              "jsc_decompress_needed": false,
              "diagnostic_text_plausible": true,
              "warning": "Decoded only as a diagnostic legacy Huff data frame. It is not released to WebFTR chat rows in Step70."
            },
            "passes": true
          },
          {
            "fixture_kind": "legacy_noncompressed_huff_data_frame",
            "input_text": "CQ",
            "message174_text_12chars": "iI3+++++++++",
            "payload_bit_count": 13,
            "bits72_prefix": "1011000100100000111111111111111111111111",
            "unpack_result": {
              "message_text_12chars": "iI3+++++++++",
              "ok": true,
              "data_text_release_allowed": false,
              "release_guard": "step70_diagnostics_only_no_chat_release",
              "top2": 2,
              "top3": 5,
              "is_data_flag": true,
              "compressed_flag": false,
              "last_zero_index": 15,
              "payload_bit_count": 13,
              "payload_preview_bits": "1100010010000",
              "source_trim_rule": "bits[2:last_zero] using final zero as padding delimiter for legacy data frames",
              "frame_text_path": "legacy_huff_noncompressed",
              "huff_decode": {
                "text": "CQ",
                "consumed_bits": 13,
                "remaining_bits": 0,
                "complete": true
              },
              "decoded_text": "CQ",
              "jsc_decompress_needed": false,
              "diagnostic_text_plausible": true,
              "warning": "Decoded only as a diagnostic legacy Huff data frame. It is not released to WebFTR chat rows in Step70."
            },
            "passes": true
          }
        ],
        "selftest_fixture_pass_count": 2,
        "webftr_rx_rows": [],
        "webftr_display_count": 0,
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true
        },
        "verdict": "data_frame_trim_and_huff_harness_ready_no_current_data_frames",
        "warnings": [
          "Step70 remains RX-only and does not start JS8Call GUI/Qt.",
          "Step70 does not release decoded data text to WebFTR chat/RX rows.",
          "Compressed FrameData still needs a source-faithful JSC::decompress table port before free text can be considered displayable."
        ],
        "next_action": "Wait for or inject a real FrameData/FrameDataCompressed fixture, then run Step70 again; next implementation step is JSC table extraction/port for compressed frames.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_data_frame_text_unpack_probe_latest.json"
      }
    },
    "jsc_decompress_source_audit": {
      "name": "20260527T183331Z_jsc_decompress_source_audit_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T183331Z_jsc_decompress_source_audit_output.json",
      "url": "/logs/20260527T183331Z_jsc_decompress_source_audit_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 111479,
        "mtime_utc": "2026-05-27T18:33:33Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-jsc-decompress-source-audit-probe",
        "tool_version": "step69-jsc-decompress-source-audit-probe",
        "schema": "webftr-js8-jsc-decompress-source-audit-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",
        "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
            }
          ],
          "focused_files_present": [
            "JS8_Main/Varicode.cpp",
            "JS8_Main/Varicode.h",
            "JS8_JSC/JSC.cpp",
            "JS8_JSC/JSC.h",
            "JS8_JSC/JSC_map.cpp",
            "JS8_JSC/JSC_list.cpp",
            "JS8_Mode/JS8.cpp",
            "JS8_Mode/JS8.h"
          ],
          "focused_files_missing": [
            "JS8_JSC/jsc.cpp",
            "JS8_JSC/jsc.h"
          ]
        },
        "input_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T181644Z_webftr_rx_ui_contract_output.json",
            "exists": true,
            "selected_latest_step68": true
          }
        ],
        "frame_inventory": {
          "frame_type_counts": {
            "FrameHeartbeat": 2,
            "FrameDirected": 2
          },
          "data_frame_candidates": [],
          "data_frame_candidate_count": 0,
          "current_fixture_has_data_frames": false
        },
        "jsc_decode_path_evidence": {
          "has_jsc_decompress_reference": true,
          "has_unpack_fast_data_message": true,
          "has_unpack_legacy_data_message": true,
          "has_huff_fallback_evidence": true,
          "expected_source_flow": [
            "unpack72bits(message174_text) -> 72 bits",
            "FrameData/FrameDataCompressed bits are trimmed at the final zero padding marker",
            "compressed path calls JSC::decompress(bits)",
            "legacy non-compressed path uses Varicode::huffDecode(defaultHuffTable, bits)",
            "Step69 does not yet display free text; it only extracts and documents the source path for a safe Step70 port."
          ]
        },
        "source_snippets": [
          {
            "keyword": "JSC::decompress",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1938,
            "context": {
              "start_line": 1933,
              "end_line": 1943,
              "lines": [
                {
                  "line": 1933,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 1934,
                  "text": "    bits = bits.mid(1, n - 1);"
                },
                {
                  "line": 1935,
                  "text": ""
                },
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 1937,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 1938,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 1939,
                  "text": "    } else {"
                },
                {
                  "line": 1940,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 1941,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 1942,
                  "text": "    }"
                },
                {
                  "line": 1943,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "JSC::decompress",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2003,
            "context": {
              "start_line": 1998,
              "end_line": 2008,
              "lines": [
                {
                  "line": 1998,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 1999,
                  "text": "    bits = bits.mid(1, n - 1);"
                },
                {
                  "line": 2000,
                  "text": ""
                },
                {
                  "line": 2001,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 2002,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2003,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2004,
                  "text": "    } else {"
                },
                {
                  "line": 2005,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 2006,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 2007,
                  "text": "    }"
                },
                {
                  "line": 2008,
                  "text": "#else"
                }
              ]
            }
          },
          {
            "keyword": "JSC::decompress",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2015,
            "context": {
              "start_line": 2010,
              "end_line": 2020,
              "lines": [
                {
                  "line": 2010,
                  "text": ""
                },
                {
                  "line": 2011,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 2012,
                  "text": "    bits = bits.mid(0, n);"
                },
                {
                  "line": 2013,
                  "text": ""
                },
                {
                  "line": 2014,
                  "text": "    // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2015,
                  "text": "    unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2016,
                  "text": "#endif"
                },
                {
                  "line": 2017,
                  "text": ""
                },
                {
                  "line": 2018,
                  "text": "    return unpacked;"
                },
                {
                  "line": 2019,
                  "text": "}"
                },
                {
                  "line": 2020,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "JSC::compress",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1849,
            "context": {
              "start_line": 1844,
              "end_line": 1854,
              "lines": [
                {
                  "line": 1844,
                  "text": "    if (!prefix.isEmpty()) {"
                },
                {
                  "line": 1845,
                  "text": "        frameBits << prefix;"
                },
                {
                  "line": 1846,
                  "text": "    }"
                },
                {
                  "line": 1847,
                  "text": ""
                },
                {
                  "line": 1848,
                  "text": "    int i = 0;"
                },
                {
                  "line": 1849,
                  "text": "    foreach (auto pair, JSC::compress(input)) {"
                },
                {
                  "line": 1850,
                  "text": "        auto bits = pair.first;"
                },
                {
                  "line": 1851,
                  "text": "        auto chars = pair.second;"
                },
                {
                  "line": 1852,
                  "text": ""
                },
                {
                  "line": 1853,
                  "text": "        if (frameBits.length() + bits.length() < frameSize) {"
                },
                {
                  "line": 1854,
                  "text": "            frameBits.append(bits);"
                }
              ]
            }
          },
          {
            "keyword": "unpackDataMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1912,
            "context": {
              "start_line": 1907,
              "end_line": 1917,
              "lines": [
                {
                  "line": 1907,
                  "text": "}"
                },
                {
                  "line": 1908,
                  "text": ""
                },
                {
                  "line": 1909,
                  "text": "// TODO: DEPRECATED in 2.2 (still available for decoding legacy frames, but will"
                },
                {
                  "line": 1910,
                  "text": "// eventually no longer be decodable) unpack data message using 70 bits"
                },
                {
                  "line": 1911,
                  "text": "// available flagged as data by the first 2 bits"
                },
                {
                  "line": 1912,
                  "text": "QString Varicode::unpackDataMessage(const QString &text) {"
                },
                {
                  "line": 1913,
                  "text": "    QString unpacked;"
                },
                {
                  "line": 1914,
                  "text": ""
                },
                {
                  "line": 1915,
                  "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                },
                {
                  "line": 1916,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1917,
                  "text": "    }"
                }
              ]
            }
          },
          {
            "keyword": "unpackFastDataMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1983,
            "context": {
              "start_line": 1978,
              "end_line": 1988,
              "lines": [
                {
                  "line": 1978,
                  "text": "#endif"
                },
                {
                  "line": 1979,
                  "text": "}"
                },
                {
                  "line": 1980,
                  "text": ""
                },
                {
                  "line": 1981,
                  "text": "// unpack data message using the full 72 bits available (with the data flag in"
                },
                {
                  "line": 1982,
                  "text": "// the i3bit header)"
                },
                {
                  "line": 1983,
                  "text": "QString Varicode::unpackFastDataMessage(const QString &text) {"
                },
                {
                  "line": 1984,
                  "text": "    QString unpacked;"
                },
                {
                  "line": 1985,
                  "text": ""
                },
                {
                  "line": 1986,
                  "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                },
                {
                  "line": 1987,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1988,
                  "text": "    }"
                }
              ]
            }
          },
          {
            "keyword": "packCompressedMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1830,
            "context": {
              "start_line": 1825,
              "end_line": 1835,
              "lines": [
                {
                  "line": 1825,
                  "text": "        *n = i;"
                },
                {
                  "line": 1826,
                  "text": ""
                },
                {
                  "line": 1827,
                  "text": "    return frame;"
                },
                {
                  "line": 1828,
                  "text": "}"
                },
                {
                  "line": 1829,
                  "text": ""
                },
                {
                  "line": 1830,
                  "text": "QString packCompressedMessage(const QString &input, QVector<bool> prefix,"
                },
                {
                  "line": 1831,
                  "text": "                              int *n) {"
                },
                {
                  "line": 1832,
                  "text": "    static const int frameSize = 72;"
                },
                {
                  "line": 1833,
                  "text": ""
                },
                {
                  "line": 1834,
                  "text": "    QString frame;"
                },
                {
                  "line": 1835,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "packCompressedMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1896,
            "context": {
              "start_line": 1891,
              "end_line": 1901,
              "lines": [
                {
                  "line": 1891,
                  "text": "    huffFrame = packHuffMessage(input, {true, false}, &huffChars);"
                },
                {
                  "line": 1892,
                  "text": ""
                },
                {
                  "line": 1893,
                  "text": "    QString compressedFrame;"
                },
                {
                  "line": 1894,
                  "text": "    int compressedChars = 0;"
                },
                {
                  "line": 1895,
                  "text": "    compressedFrame ="
                },
                {
                  "line": 1896,
                  "text": "        packCompressedMessage(input, {true, true}, &compressedChars);"
                },
                {
                  "line": 1897,
                  "text": ""
                },
                {
                  "line": 1898,
                  "text": "    if (huffChars > compressedChars) {"
                },
                {
                  "line": 1899,
                  "text": "        if (n)"
                },
                {
                  "line": 1900,
                  "text": "            *n = huffChars;"
                },
                {
                  "line": 1901,
                  "text": "        return huffFrame;"
                }
              ]
            }
          },
          {
            "keyword": "packCompressedMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1959,
            "context": {
              "start_line": 1954,
              "end_line": 1964,
              "lines": [
                {
                  "line": 1954,
                  "text": "    int huffChars = 0;"
                },
                {
                  "line": 1955,
                  "text": "    huffFrame = packHuffMessage(input, {false}, &huffChars);"
                },
                {
                  "line": 1956,
                  "text": ""
                },
                {
                  "line": 1957,
                  "text": "    QString compressedFrame;"
                },
                {
                  "line": 1958,
                  "text": "    int compressedChars = 0;"
                },
                {
                  "line": 1959,
                  "text": "    compressedFrame = packCompressedMessage(input, {true}, &compressedChars);"
                },
                {
                  "line": 1960,
                  "text": ""
                },
                {
                  "line": 1961,
                  "text": "    if (huffChars > compressedChars) {"
                },
                {
                  "line": 1962,
                  "text": "        if (n)"
                },
                {
                  "line": 1963,
                  "text": "            *n = huffChars;"
                },
                {
                  "line": 1964,
                  "text": "        return huffFrame;"
                }
              ]
            }
          },
          {
            "keyword": "packCompressedMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1973,
            "context": {
              "start_line": 1968,
              "end_line": 1978,
              "lines": [
                {
                  "line": 1968,
                  "text": "        return compressedFrame;"
                },
                {
                  "line": 1969,
                  "text": "    }"
                },
                {
                  "line": 1970,
                  "text": "#else"
                },
                {
                  "line": 1971,
                  "text": "    QString compressedFrame;"
                },
                {
                  "line": 1972,
                  "text": "    int compressedChars = 0;"
                },
                {
                  "line": 1973,
                  "text": "    compressedFrame = packCompressedMessage(input, {}, &compressedChars);"
                },
                {
                  "line": 1974,
                  "text": ""
                },
                {
                  "line": 1975,
                  "text": "    if (n)"
                },
                {
                  "line": 1976,
                  "text": "        *n = compressedChars;"
                },
                {
                  "line": 1977,
                  "text": "    return compressedFrame;"
                },
                {
                  "line": 1978,
                  "text": "#endif"
                }
              ]
            }
          },
          {
            "keyword": "packHuffMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1762,
            "context": {
              "start_line": 1757,
              "end_line": 1767,
              "lines": [
                {
                  "line": 1757,
                  "text": "    if (pType)"
                },
                {
                  "line": 1758,
                  "text": "        *pType = packed_flag;"
                },
                {
                  "line": 1759,
                  "text": "    return unpacked;"
                },
                {
                  "line": 1760,
                  "text": "}"
                },
                {
                  "line": 1761,
                  "text": ""
                },
                {
                  "line": 1762,
                  "text": "QString packHuffMessage(const QString &input, const QVector<bool> prefix,"
                },
                {
                  "line": 1763,
                  "text": "                        int *n) {"
                },
                {
                  "line": 1764,
                  "text": "    static const int frameSize = 72;"
                },
                {
                  "line": 1765,
                  "text": ""
                },
                {
                  "line": 1766,
                  "text": "    QString frame;"
                },
                {
                  "line": 1767,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "packHuffMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1891,
            "context": {
              "start_line": 1886,
              "end_line": 1896,
              "lines": [
                {
                  "line": 1886,
                  "text": "// TODO: DEPRECATED in 2.2 (we will eventually stop transmitting these frames)"
                },
                {
                  "line": 1887,
                  "text": "// pack data message using 70 bits available flagged as data by the first 2 bits"
                },
                {
                  "line": 1888,
                  "text": "QString Varicode::packDataMessage(const QString &input, int *n) {"
                },
                {
                  "line": 1889,
                  "text": "    QString huffFrame;"
                },
                {
                  "line": 1890,
                  "text": "    int huffChars = 0;"
                },
                {
                  "line": 1891,
                  "text": "    huffFrame = packHuffMessage(input, {true, false}, &huffChars);"
                },
                {
                  "line": 1892,
                  "text": ""
                },
                {
                  "line": 1893,
                  "text": "    QString compressedFrame;"
                },
                {
                  "line": 1894,
                  "text": "    int compressedChars = 0;"
                },
                {
                  "line": 1895,
                  "text": "    compressedFrame ="
                },
                {
                  "line": 1896,
                  "text": "        packCompressedMessage(input, {true, true}, &compressedChars);"
                }
              ]
            }
          },
          {
            "keyword": "packHuffMessage",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1955,
            "context": {
              "start_line": 1950,
              "end_line": 1960,
              "lines": [
                {
                  "line": 1950,
                  "text": "// i3bit header)"
                },
                {
                  "line": 1951,
                  "text": "QString Varicode::packFastDataMessage(const QString &input, int *n) {"
                },
                {
                  "line": 1952,
                  "text": "#if JS8_FAST_DATA_CAN_USE_HUFF"
                },
                {
                  "line": 1953,
                  "text": "    QString huffFrame;"
                },
                {
                  "line": 1954,
                  "text": "    int huffChars = 0;"
                },
                {
                  "line": 1955,
                  "text": "    huffFrame = packHuffMessage(input, {false}, &huffChars);"
                },
                {
                  "line": 1956,
                  "text": ""
                },
                {
                  "line": 1957,
                  "text": "    QString compressedFrame;"
                },
                {
                  "line": 1958,
                  "text": "    int compressedChars = 0;"
                },
                {
                  "line": 1959,
                  "text": "    compressedFrame = packCompressedMessage(input, {true}, &compressedChars);"
                },
                {
                  "line": 1960,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "huffDecode",
            "path": "JS8_Main/Varicode.cpp",
            "line": 597,
            "context": {
              "start_line": 592,
              "end_line": 602,
              "lines": [
                {
                  "line": 592,
                  "text": "    }"
                },
                {
                  "line": 593,
                  "text": ""
                },
                {
                  "line": 594,
                  "text": "    return out;"
                },
                {
                  "line": 595,
                  "text": "}"
                },
                {
                  "line": 596,
                  "text": ""
                },
                {
                  "line": 597,
                  "text": "QString Varicode::huffDecode(QMap<QString, QString> const &huff,"
                },
                {
                  "line": 598,
                  "text": "                             QVector<bool> const &bitvec) {"
                },
                {
                  "line": 599,
                  "text": "    QString text;"
                },
                {
                  "line": 600,
                  "text": ""
                },
                {
                  "line": 601,
                  "text": "    QString bits = Varicode::bitsToStr(bitvec);"
                },
                {
                  "line": 602,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "huffDecode",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1941,
            "context": {
              "start_line": 1936,
              "end_line": 1946,
              "lines": [
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 1937,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 1938,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 1939,
                  "text": "    } else {"
                },
                {
                  "line": 1940,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 1941,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 1942,
                  "text": "    }"
                },
                {
                  "line": 1943,
                  "text": ""
                },
                {
                  "line": 1944,
                  "text": "    return unpacked;"
                },
                {
                  "line": 1945,
                  "text": "}"
                },
                {
                  "line": 1946,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "huffDecode",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2006,
            "context": {
              "start_line": 2001,
              "end_line": 2011,
              "lines": [
                {
                  "line": 2001,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 2002,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2003,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2004,
                  "text": "    } else {"
                },
                {
                  "line": 2005,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 2006,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 2007,
                  "text": "    }"
                },
                {
                  "line": 2008,
                  "text": "#else"
                },
                {
                  "line": 2009,
                  "text": "    int n = bits.lastIndexOf(0);"
                },
                {
                  "line": 2010,
                  "text": ""
                },
                {
                  "line": 2011,
                  "text": "    // trim off the pad bits"
                }
              ]
            }
          },
          {
            "keyword": "defaultHuffTable",
            "path": "JS8_Main/Varicode.cpp",
            "line": 438,
            "context": {
              "start_line": 433,
              "end_line": 443,
              "lines": [
                {
                  "line": 433,
                  "text": "}"
                },
                {
                  "line": 434,
                  "text": ""
                },
                {
                  "line": 435,
                  "text": "/*"
                },
                {
                  "line": 436,
                  "text": " * VARICODE"
                },
                {
                  "line": 437,
                  "text": " */"
                },
                {
                  "line": 438,
                  "text": "QMap<QString, QString> Varicode::defaultHuffTable() { return hufftable; }"
                },
                {
                  "line": 439,
                  "text": ""
                },
                {
                  "line": 440,
                  "text": "QString Varicode::cqString(int number) {"
                },
                {
                  "line": 441,
                  "text": "    if (!cqs.contains(number)) {"
                },
                {
                  "line": 442,
                  "text": "        return QString{};"
                },
                {
                  "line": 443,
                  "text": "    }"
                }
              ]
            }
          },
          {
            "keyword": "defaultHuffTable",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1784,
            "context": {
              "start_line": 1779,
              "end_line": 1789,
              "lines": [
                {
                  "line": 1779,
                  "text": "    int i = 0;"
                },
                {
                  "line": 1780,
                  "text": ""
                },
                {
                  "line": 1781,
                  "text": "    // only pack huff messages that only contain valid chars"
                },
                {
                  "line": 1782,
                  "text": "    QString::const_iterator it;"
                },
                {
                  "line": 1783,
                  "text": "    QSet<QString> validChars ="
                },
                {
                  "line": 1784,
                  "text": "        Varicode::huffValidChars(Varicode::defaultHuffTable());"
                },
                {
                  "line": 1785,
                  "text": "    for (it = input.constBegin(); it != input.constEnd(); it++) {"
                },
                {
                  "line": 1786,
                  "text": "        auto ch = (*it).toUpper();"
                },
                {
                  "line": 1787,
                  "text": "        if (!validChars.contains(ch)) {"
                },
                {
                  "line": 1788,
                  "text": "            if (n)"
                },
                {
                  "line": 1789,
                  "text": "                *n = 0;"
                }
              ]
            }
          },
          {
            "keyword": "defaultHuffTable",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1796,
            "context": {
              "start_line": 1791,
              "end_line": 1801,
              "lines": [
                {
                  "line": 1791,
                  "text": "        }"
                },
                {
                  "line": 1792,
                  "text": "    }"
                },
                {
                  "line": 1793,
                  "text": ""
                },
                {
                  "line": 1794,
                  "text": "    // pack using the default huff table"
                },
                {
                  "line": 1795,
                  "text": "    foreach (auto pair,"
                },
                {
                  "line": 1796,
                  "text": "             Varicode::huffEncode(Varicode::defaultHuffTable(), input)) {"
                },
                {
                  "line": 1797,
                  "text": "        auto charN = pair.first;"
                },
                {
                  "line": 1798,
                  "text": "        auto charBits = pair.second;"
                },
                {
                  "line": 1799,
                  "text": "        if (frameBits.length() + charBits.length() < frameSize) {"
                },
                {
                  "line": 1800,
                  "text": "            frameBits += charBits;"
                },
                {
                  "line": 1801,
                  "text": "            i += charN;"
                }
              ]
            }
          },
          {
            "keyword": "defaultHuffTable",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1941,
            "context": {
              "start_line": 1936,
              "end_line": 1946,
              "lines": [
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 1937,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 1938,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 1939,
                  "text": "    } else {"
                },
                {
                  "line": 1940,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 1941,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 1942,
                  "text": "    }"
                },
                {
                  "line": 1943,
                  "text": ""
                },
                {
                  "line": 1944,
                  "text": "    return unpacked;"
                },
                {
                  "line": 1945,
                  "text": "}"
                },
                {
                  "line": 1946,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1532,
            "context": {
              "start_line": 1527,
              "end_line": 1537,
              "lines": [
                {
                  "line": 1527,
                  "text": "QString Varicode::packCompoundFrame(const QString &callsign, quint8 type,"
                },
                {
                  "line": 1528,
                  "text": "                                    quint16 num, quint8 bits3) {"
                },
                {
                  "line": 1529,
                  "text": "    QString frame;"
                },
                {
                  "line": 1530,
                  "text": ""
                },
                {
                  "line": 1531,
                  "text": "    // needs to be a compound type..."
                },
                {
                  "line": 1532,
                  "text": "    if (type == Varicode::FrameData || type == Varicode::FrameDirected) {"
                },
                {
                  "line": 1533,
                  "text": "        return frame;"
                },
                {
                  "line": 1534,
                  "text": "    }"
                },
                {
                  "line": 1535,
                  "text": ""
                },
                {
                  "line": 1536,
                  "text": "    quint8 packed_flag = type;"
                },
                {
                  "line": 1537,
                  "text": "    quint64 packed_callsign = Varicode::packAlphaNumeric50(callsign);"
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1576,
            "context": {
              "start_line": 1571,
              "end_line": 1581,
              "lines": [
                {
                  "line": 1571,
                  "text": "    quint8 packed_3 = packed_8 & ((1 << 3) - 1);"
                },
                {
                  "line": 1572,
                  "text": ""
                },
                {
                  "line": 1573,
                  "text": "    quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));"
                },
                {
                  "line": 1574,
                  "text": ""
                },
                {
                  "line": 1575,
                  "text": "    // needs to be a ping type..."
                },
                {
                  "line": 1576,
                  "text": "    if (packed_flag == Varicode::FrameData ||"
                },
                {
                  "line": 1577,
                  "text": "        packed_flag == Varicode::FrameDirected) {"
                },
                {
                  "line": 1578,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1579,
                  "text": "    }"
                },
                {
                  "line": 1580,
                  "text": ""
                },
                {
                  "line": 1581,
                  "text": "    quint64 packed_callsign = Varicode::bitsToInt(bits.mid(3, 50));"
                }
              ]
            }
          },
          {
            "keyword": "JS8CallData",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1842,
            "context": {
              "start_line": 1837,
              "end_line": 1847,
              "lines": [
                {
                  "line": 1837,
                  "text": "    // The first bit is a flag that indicates this is a data frame, technically"
                },
                {
                  "line": 1838,
                  "text": "    // encoded as [100] but, since none of the other frame types start with a 1,"
                },
                {
                  "line": 1839,
                  "text": "    // we can drop the two zeros and use them for encoding the first two bits of"
                },
                {
                  "line": 1840,
                  "text": "    // the actuall data sent. boom! The second bit is a flag that indicates this"
                },
                {
                  "line": 1841,
                  "text": "    // is a compressed frame (dense coding) For fast modes, we don't use the"
                },
                {
                  "line": 1842,
                  "text": "    // prefix since it is indicated by the JS8CallData flag."
                },
                {
                  "line": 1843,
                  "text": "    QVector<bool> frameBits;"
                },
                {
                  "line": 1844,
                  "text": "    if (!prefix.isEmpty()) {"
                },
                {
                  "line": 1845,
                  "text": "        frameBits << prefix;"
                },
                {
                  "line": 1846,
                  "text": "    }"
                },
                {
                  "line": 1847,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "JS8CallData",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2307,
            "context": {
              "start_line": 2302,
              "end_line": 2312,
              "lines": [
                {
                  "line": 2302,
                  "text": "                }"
                },
                {
                  "line": 2303,
                  "text": "            }"
                },
                {
                  "line": 2304,
                  "text": ""
                },
                {
                  "line": 2305,
                  "text": "            if (useDat) {"
                },
                {
                  "line": 2306,
                  "text": "                // use the standard data frame"
                },
                {
                  "line": 2307,
                  "text": "                lineFrames.append({frame, fastDataFrame ? Varicode::JS8CallData"
                },
                {
                  "line": 2308,
                  "text": "                                                        : Varicode::JS8Call});"
                },
                {
                  "line": 2309,
                  "text": "                line = line.mid(m);"
                },
                {
                  "line": 2310,
                  "text": "            }"
                },
                {
                  "line": 2311,
                  "text": "        }"
                },
                {
                  "line": 2312,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "lastIndexOf(0)",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1931,
            "context": {
              "start_line": 1926,
              "end_line": 1936,
              "lines": [
                {
                  "line": 1926,
                  "text": "    }"
                },
                {
                  "line": 1927,
                  "text": ""
                },
                {
                  "line": 1928,
                  "text": "    bits = bits.mid(1);"
                },
                {
                  "line": 1929,
                  "text": ""
                },
                {
                  "line": 1930,
                  "text": "    bool compressed = bits.at(0);"
                },
                {
                  "line": 1931,
                  "text": "    int n = bits.lastIndexOf(0);"
                },
                {
                  "line": 1932,
                  "text": ""
                },
                {
                  "line": 1933,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 1934,
                  "text": "    bits = bits.mid(1, n - 1);"
                },
                {
                  "line": 1935,
                  "text": ""
                },
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                }
              ]
            }
          },
          {
            "keyword": "lastIndexOf(0)",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1996,
            "context": {
              "start_line": 1991,
              "end_line": 2001,
              "lines": [
                {
                  "line": 1991,
                  "text": "    quint64 value = Varicode::unpack72bits(text, &rem);"
                },
                {
                  "line": 1992,
                  "text": "    auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);"
                },
                {
                  "line": 1993,
                  "text": ""
                },
                {
                  "line": 1994,
                  "text": "#if JS8_FAST_DATA_CAN_USE_HUFF"
                },
                {
                  "line": 1995,
                  "text": "    bool compressed = bits.at(0);"
                },
                {
                  "line": 1996,
                  "text": "    int n = bits.lastIndexOf(0);"
                },
                {
                  "line": 1997,
                  "text": ""
                },
                {
                  "line": 1998,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 1999,
                  "text": "    bits = bits.mid(1, n - 1);"
                },
                {
                  "line": 2000,
                  "text": ""
                },
                {
                  "line": 2001,
                  "text": "    if (compressed) {"
                }
              ]
            }
          },
          {
            "keyword": "lastIndexOf(0)",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2009,
            "context": {
              "start_line": 2004,
              "end_line": 2014,
              "lines": [
                {
                  "line": 2004,
                  "text": "    } else {"
                },
                {
                  "line": 2005,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 2006,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                },
                {
                  "line": 2007,
                  "text": "    }"
                },
                {
                  "line": 2008,
                  "text": "#else"
                },
                {
                  "line": 2009,
                  "text": "    int n = bits.lastIndexOf(0);"
                },
                {
                  "line": 2010,
                  "text": ""
                },
                {
                  "line": 2011,
                  "text": "    // trim off the pad bits"
                },
                {
                  "line": 2012,
                  "text": "    bits = bits.mid(0, n);"
                },
                {
                  "line": 2013,
                  "text": ""
                },
                {
                  "line": 2014,
                  "text": "    // partial word (s,c)-dense coding with code tables"
                }
              ]
            }
          },
          {
            "keyword": "bits.mid",
            "path": "JS8_Main/Varicode.cpp",
            "line": 614,
            "context": {
              "start_line": 609,
              "end_line": 619,
              "lines": [
                {
                  "line": 609,
                  "text": "                    text.append(\" \");"
                },
                {
                  "line": 610,
                  "text": "                    found = false;"
                },
                {
                  "line": 611,
                  "text": "                    break;"
                },
                {
                  "line": 612,
                  "text": "                }"
                },
                {
                  "line": 613,
                  "text": "                text.append(key);"
                },
                {
                  "line": 614,
                  "text": "                bits = bits.mid(huff[key].length());"
                },
                {
                  "line": 615,
                  "text": "                found = true;"
                },
                {
                  "line": 616,
                  "text": "            }"
                },
                {
                  "line": 617,
                  "text": "        }"
                },
                {
                  "line": 618,
                  "text": "        if (!found) {"
                },
                {
                  "line": 619,
                  "text": "            break;"
                }
              ]
            }
          },
          {
            "keyword": "bits.mid",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1573,
            "context": {
              "start_line": 1568,
              "end_line": 1578,
              "lines": [
                {
                  "line": 1568,
                  "text": "        Varicode::intToBits(Varicode::unpack72bits(text, &packed_8), 64);"
                },
                {
                  "line": 1569,
                  "text": ""
                },
                {
                  "line": 1570,
                  "text": "    quint8 packed_5 = packed_8 >> 3;"
                },
                {
                  "line": 1571,
                  "text": "    quint8 packed_3 = packed_8 & ((1 << 3) - 1);"
                },
                {
                  "line": 1572,
                  "text": ""
                },
                {
                  "line": 1573,
                  "text": "    quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));"
                },
                {
                  "line": 1574,
                  "text": ""
                },
                {
                  "line": 1575,
                  "text": "    // needs to be a ping type..."
                },
                {
                  "line": 1576,
                  "text": "    if (packed_flag == Varicode::FrameData ||"
                },
                {
                  "line": 1577,
                  "text": "        packed_flag == Varicode::FrameDirected) {"
                },
                {
                  "line": 1578,
                  "text": "        return unpacked;"
                }
              ]
            }
          },
          {
            "keyword": "bits.mid",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1581,
            "context": {
              "start_line": 1576,
              "end_line": 1586,
              "lines": [
                {
                  "line": 1576,
                  "text": "    if (packed_flag == Varicode::FrameData ||"
                },
                {
                  "line": 1577,
                  "text": "        packed_flag == Varicode::FrameDirected) {"
                },
                {
                  "line": 1578,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1579,
                  "text": "    }"
                },
                {
                  "line": 1580,
                  "text": ""
                },
                {
                  "line": 1581,
                  "text": "    quint64 packed_callsign = Varicode::bitsToInt(bits.mid(3, 50));"
                },
                {
                  "line": 1582,
                  "text": "    quint16 packed_11 = Varicode::bitsToInt(bits.mid(53, 11));"
                },
                {
                  "line": 1583,
                  "text": ""
                },
                {
                  "line": 1584,
                  "text": "    QString callsign = Varicode::unpackAlphaNumeric50(packed_callsign);"
                },
                {
                  "line": 1585,
                  "text": ""
                },
                {
                  "line": 1586,
                  "text": "    quint16 num = (packed_11 << 5) | packed_5;"
                }
              ]
            }
          },
          {
            "keyword": "bits.mid",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1582,
            "context": {
              "start_line": 1577,
              "end_line": 1587,
              "lines": [
                {
                  "line": 1577,
                  "text": "        packed_flag == Varicode::FrameDirected) {"
                },
                {
                  "line": 1578,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1579,
                  "text": "    }"
                },
                {
                  "line": 1580,
                  "text": ""
                },
                {
                  "line": 1581,
                  "text": "    quint64 packed_callsign = Varicode::bitsToInt(bits.mid(3, 50));"
                },
                {
                  "line": 1582,
                  "text": "    quint16 packed_11 = Varicode::bitsToInt(bits.mid(53, 11));"
                },
                {
                  "line": 1583,
                  "text": ""
                },
                {
                  "line": 1584,
                  "text": "    QString callsign = Varicode::unpackAlphaNumeric50(packed_callsign);"
                },
                {
                  "line": 1585,
                  "text": ""
                },
                {
                  "line": 1586,
                  "text": "    quint16 num = (packed_11 << 5) | packed_5;"
                },
                {
                  "line": 1587,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 767,
            "context": {
              "start_line": 762,
              "end_line": 772,
              "lines": [
                {
                  "line": 762,
                  "text": "    quint32 b = packed & 0xFFFFFFFF;"
                },
                {
                  "line": 763,
                  "text": "    return pack32bits(a) + pack32bits(b);"
                },
                {
                  "line": 764,
                  "text": "}"
                },
                {
                  "line": 765,
                  "text": ""
                },
                {
                  "line": 766,
                  "text": "// returns the first 64 bits and sets the last 8 bits in pRem"
                },
                {
                  "line": 767,
                  "text": "quint64 Varicode::unpack72bits(QString const &text, quint8 *pRem) {"
                },
                {
                  "line": 768,
                  "text": "    quint64 value = 0;"
                },
                {
                  "line": 769,
                  "text": "    quint8 rem = 0;"
                },
                {
                  "line": 770,
                  "text": "    quint8 mask2 = ((1 << 2) - 1);"
                },
                {
                  "line": 771,
                  "text": ""
                },
                {
                  "line": 772,
                  "text": "    for (int i = 0; i < 10; i++) {"
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 787,
            "context": {
              "start_line": 782,
              "end_line": 792,
              "lines": [
                {
                  "line": 782,
                  "text": "    if (pRem)"
                },
                {
                  "line": 783,
                  "text": "        *pRem = rem;"
                },
                {
                  "line": 784,
                  "text": "    return value;"
                },
                {
                  "line": 785,
                  "text": "}"
                },
                {
                  "line": 786,
                  "text": ""
                },
                {
                  "line": 787,
                  "text": "QString Varicode::pack72bits(quint64 value, quint8 rem) {"
                },
                {
                  "line": 788,
                  "text": "    QChar packed[12]; // 12 x 6bit characters"
                },
                {
                  "line": 789,
                  "text": ""
                },
                {
                  "line": 790,
                  "text": "    quint8 mask4 = ((1 << 4) - 1);"
                },
                {
                  "line": 791,
                  "text": "    quint8 mask6 = ((1 << 6) - 1);"
                },
                {
                  "line": 792,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1554,
            "context": {
              "start_line": 1549,
              "end_line": 1559,
              "lines": [
                {
                  "line": 1549,
                  "text": "    // [3][50][11],[5][3] = 72"
                },
                {
                  "line": 1550,
                  "text": "    auto bits = (Varicode::intToBits(packed_flag, 3) +"
                },
                {
                  "line": 1551,
                  "text": "                 Varicode::intToBits(packed_callsign, 50) +"
                },
                {
                  "line": 1552,
                  "text": "                 Varicode::intToBits(packed_11, 11));"
                },
                {
                  "line": 1553,
                  "text": ""
                },
                {
                  "line": 1554,
                  "text": "    return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_8);"
                },
                {
                  "line": 1555,
                  "text": "}"
                },
                {
                  "line": 1556,
                  "text": ""
                },
                {
                  "line": 1557,
                  "text": "QStringList Varicode::unpackCompoundFrame(const QString &text, quint8 *pType,"
                },
                {
                  "line": 1558,
                  "text": "                                          quint16 *pNum, quint8 *pBits3) {"
                },
                {
                  "line": 1559,
                  "text": "    QStringList unpacked;"
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1568,
            "context": {
              "start_line": 1563,
              "end_line": 1573,
              "lines": [
                {
                  "line": 1563,
                  "text": "    }"
                },
                {
                  "line": 1564,
                  "text": ""
                },
                {
                  "line": 1565,
                  "text": "    // [3][50][11],[5][3] = 72"
                },
                {
                  "line": 1566,
                  "text": "    quint8 packed_8 = 0;"
                },
                {
                  "line": 1567,
                  "text": "    auto bits ="
                },
                {
                  "line": 1568,
                  "text": "        Varicode::intToBits(Varicode::unpack72bits(text, &packed_8), 64);"
                },
                {
                  "line": 1569,
                  "text": ""
                },
                {
                  "line": 1570,
                  "text": "    quint8 packed_5 = packed_8 >> 3;"
                },
                {
                  "line": 1571,
                  "text": "    quint8 packed_3 = packed_8 & ((1 << 3) - 1);"
                },
                {
                  "line": 1572,
                  "text": ""
                },
                {
                  "line": 1573,
                  "text": "    quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));"
                }
              ]
            }
          },
          {
            "keyword": "unpack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 767,
            "context": {
              "start_line": 762,
              "end_line": 772,
              "lines": [
                {
                  "line": 762,
                  "text": "    quint32 b = packed & 0xFFFFFFFF;"
                },
                {
                  "line": 763,
                  "text": "    return pack32bits(a) + pack32bits(b);"
                },
                {
                  "line": 764,
                  "text": "}"
                },
                {
                  "line": 765,
                  "text": ""
                },
                {
                  "line": 766,
                  "text": "// returns the first 64 bits and sets the last 8 bits in pRem"
                },
                {
                  "line": 767,
                  "text": "quint64 Varicode::unpack72bits(QString const &text, quint8 *pRem) {"
                },
                {
                  "line": 768,
                  "text": "    quint64 value = 0;"
                },
                {
                  "line": 769,
                  "text": "    quint8 rem = 0;"
                },
                {
                  "line": 770,
                  "text": "    quint8 mask2 = ((1 << 2) - 1);"
                },
                {
                  "line": 771,
                  "text": ""
                },
                {
                  "line": 772,
                  "text": "    for (int i = 0; i < 10; i++) {"
                }
              ]
            }
          },
          {
            "keyword": "unpack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1568,
            "context": {
              "start_line": 1563,
              "end_line": 1573,
              "lines": [
                {
                  "line": 1563,
                  "text": "    }"
                },
                {
                  "line": 1564,
                  "text": ""
                },
                {
                  "line": 1565,
                  "text": "    // [3][50][11],[5][3] = 72"
                },
                {
                  "line": 1566,
                  "text": "    quint8 packed_8 = 0;"
                },
                {
                  "line": 1567,
                  "text": "    auto bits ="
                },
                {
                  "line": 1568,
                  "text": "        Varicode::intToBits(Varicode::unpack72bits(text, &packed_8), 64);"
                },
                {
                  "line": 1569,
                  "text": ""
                },
                {
                  "line": 1570,
                  "text": "    quint8 packed_5 = packed_8 >> 3;"
                },
                {
                  "line": 1571,
                  "text": "    quint8 packed_3 = packed_8 & ((1 << 3) - 1);"
                },
                {
                  "line": 1572,
                  "text": ""
                },
                {
                  "line": 1573,
                  "text": "    quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));"
                }
              ]
            }
          },
          {
            "keyword": "unpack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1726,
            "context": {
              "start_line": 1721,
              "end_line": 1731,
              "lines": [
                {
                  "line": 1721,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1722,
                  "text": "    }"
                },
                {
                  "line": 1723,
                  "text": ""
                },
                {
                  "line": 1724,
                  "text": "    // [3][28][22][11],[2][6] = 72"
                },
                {
                  "line": 1725,
                  "text": "    quint8 extra = 0;"
                },
                {
                  "line": 1726,
                  "text": "    auto bits = Varicode::intToBits(Varicode::unpack72bits(text, &extra), 64);"
                },
                {
                  "line": 1727,
                  "text": ""
                },
                {
                  "line": 1728,
                  "text": "    quint8 packed_flag = Varicode::bitsToInt(bits.mid(0, 3));"
                },
                {
                  "line": 1729,
                  "text": "    if (packed_flag != Varicode::FrameDirected) {"
                },
                {
                  "line": 1730,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1731,
                  "text": "    }"
                }
              ]
            }
          },
          {
            "keyword": "unpack72bits",
            "path": "JS8_Main/Varicode.cpp",
            "line": 1920,
            "context": {
              "start_line": 1915,
              "end_line": 1925,
              "lines": [
                {
                  "line": 1915,
                  "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                },
                {
                  "line": 1916,
                  "text": "        return unpacked;"
                },
                {
                  "line": 1917,
                  "text": "    }"
                },
                {
                  "line": 1918,
                  "text": ""
                },
                {
                  "line": 1919,
                  "text": "    quint8 rem = 0;"
                },
                {
                  "line": 1920,
                  "text": "    quint64 value = Varicode::unpack72bits(text, &rem);"
                },
                {
                  "line": 1921,
                  "text": "    auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);"
                },
                {
                  "line": 1922,
                  "text": ""
                },
                {
                  "line": 1923,
                  "text": "    bool isData = bits.at(0);"
                },
                {
                  "line": 1924,
                  "text": "    if (!isData) {"
                },
                {
                  "line": 1925,
                  "text": "        return unpacked;"
                }
              ]
            }
          },
          {
            "keyword": "buildMessageFrames",
            "path": "JS8_Main/Varicode.cpp",
            "line": 159,
            "context": {
              "start_line": 154,
              "end_line": 164,
              "lines": [
                {
                  "line": 154,
                  "text": "    R\"(^\\s*(?<callsign>[@](?:ALLCALL|HB)\\s+)?(?<type>CQ CQ CQ|CQ DX|CQ QRP|CQ CONTEST|CQ FIELD|CQ FD|CQ CQ|CQ|HB|HEARTBEAT(?!\\s+SNR))(?:\\s(?<grid>[A-R]{2}[0-9]{2}))?\\b)\");"
                },
                {
                  "line": 155,
                  "text": ""
                },
                {
                  "line": 156,
                  "text": "QRegularExpression"
                },
                {
                  "line": 157,
                  "text": "    compound_re(\"^\\\\s*[`]\" + callsign_pattern + \"(?<extra>\" +"
                },
                {
                  "line": 158,
                  "text": "                optional_grid_pattern + // there's a reason this is first (see:"
                },
                {
                  "line": 159,
                  "text": "                                        // buildMessageFrames)"
                },
                {
                  "line": 160,
                  "text": "                optional_cmd_pattern + optional_num_pattern + \")\");"
                },
                {
                  "line": 161,
                  "text": ""
                },
                {
                  "line": 162,
                  "text": "QMap<QString, QString> hufftable = {"
                },
                {
                  "line": 163,
                  "text": "    // char   code                 weight"
                },
                {
                  "line": 164,
                  "text": "    {\" \", \"01\"},       // 1.0"
                }
              ]
            }
          },
          {
            "keyword": "buildMessageFrames",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2023,
            "context": {
              "start_line": 2018,
              "end_line": 2028,
              "lines": [
                {
                  "line": 2018,
                  "text": "    return unpacked;"
                },
                {
                  "line": 2019,
                  "text": "}"
                },
                {
                  "line": 2020,
                  "text": ""
                },
                {
                  "line": 2021,
                  "text": "// TODO: remove the dependence on providing all this data?"
                },
                {
                  "line": 2022,
                  "text": "QList<QPair<QString, int>>"
                },
                {
                  "line": 2023,
                  "text": "Varicode::buildMessageFrames(QString const &mycall, QString const &mygrid,"
                },
                {
                  "line": 2024,
                  "text": "                             QString const &selectedCall, QString const &text,"
                },
                {
                  "line": 2025,
                  "text": "                             bool forceIdentify, bool forceData, int submode,"
                },
                {
                  "line": 2026,
                  "text": "                             MessageInfo *pInfo) {"
                },
                {
                  "line": 2027,
                  "text": ""
                },
                {
                  "line": 2028,
                  "text": "#define ALLOW_SEND_COMPOUND 1"
                }
              ]
            }
          },
          {
            "keyword": "buildMessageFrames",
            "path": "JS8_Main/Varicode.cpp",
            "line": 2335,
            "context": {
              "start_line": 2330,
              "end_line": 2340,
              "lines": [
                {
                  "line": 2330,
                  "text": "      m_forceIdentify{forceIdentify}, m_forceData{forceData},"
                },
                {
                  "line": 2331,
                  "text": "      m_submode{submode} {}"
                },
                {
                  "line": 2332,
                  "text": ""
                },
                {
                  "line": 2333,
                  "text": "void BuildMessageFramesThread::run() {"
                },
                {
                  "line": 2334,
                  "text": "    auto results ="
                },
                {
                  "line": 2335,
                  "text": "        Varicode::buildMessageFrames(m_mycall, m_mygrid, m_selectedCall, m_text,"
                },
                {
                  "line": 2336,
                  "text": "                                     m_forceIdentify, m_forceData, m_submode);"
                },
                {
                  "line": 2337,
                  "text": ""
                },
                {
                  "line": 2338,
                  "text": "    // TODO: jsherer - we wouldn't normally use DecodedText.h here... but it's"
                },
                {
                  "line": 2339,
                  "text": "    // useful for computing the actual frames transmitted."
                },
                {
                  "line": 2340,
                  "text": "    QStringList textList;"
                }
              ]
            }
          },
          {
            "keyword": "unpackDataMessage",
            "path": "JS8_Main/Varicode.h",
            "line": 189,
            "context": {
              "start_line": 184,
              "end_line": 194,
              "lines": [
                {
                  "line": 184,
                  "text": "                                       QString *pNum, int *n);"
                },
                {
                  "line": 185,
                  "text": "    static QStringList unpackDirectedMessage(QString const &text,"
                },
                {
                  "line": 186,
                  "text": "                                             quint8 *pType);"
                },
                {
                  "line": 187,
                  "text": ""
                },
                {
                  "line": 188,
                  "text": "    static QString packDataMessage(QString const &text, int *n);"
                },
                {
                  "line": 189,
                  "text": "    static QString unpackDataMessage(QString const &text);"
                },
                {
                  "line": 190,
                  "text": ""
                },
                {
                  "line": 191,
                  "text": "    static QString packFastDataMessage(QString const &text, int *n);"
                },
                {
                  "line": 192,
                  "text": "    static QString unpackFastDataMessage(QString const &text);"
                },
                {
                  "line": 193,
                  "text": ""
                },
                {
                  "line": 194,
                  "text": "    static QList<QPair<QString, int>>"
                }
              ]
            }
          },
          {
            "keyword": "unpackFastDataMessage",
            "path": "JS8_Main/Varicode.h",
            "line": 192,
            "context": {
              "start_line": 187,
              "end_line": 197,
              "lines": [
                {
                  "line": 187,
                  "text": ""
                },
                {
                  "line": 188,
                  "text": "    static QString packDataMessage(QString const &text, int *n);"
                },
                {
                  "line": 189,
                  "text": "    static QString unpackDataMessage(QString const &text);"
                },
                {
                  "line": 190,
                  "text": ""
                },
                {
                  "line": 191,
                  "text": "    static QString packFastDataMessage(QString const &text, int *n);"
                },
                {
                  "line": 192,
                  "text": "    static QString unpackFastDataMessage(QString const &text);"
                },
                {
                  "line": 193,
                  "text": ""
                },
                {
                  "line": 194,
                  "text": "    static QList<QPair<QString, int>>"
                },
                {
                  "line": 195,
                  "text": "    buildMessageFrames(QString const &mycall, QString const &mygrid,"
                },
                {
                  "line": 196,
                  "text": "                       QString const &selectedCall, QString const &text,"
                },
                {
                  "line": 197,
                  "text": "                       bool forceIdentify, bool forceData, int submode,"
                }
              ]
            }
          },
          {
            "keyword": "huffDecode",
            "path": "JS8_Main/Varicode.h",
            "line": 107,
            "context": {
              "start_line": 102,
              "end_line": 112,
              "lines": [
                {
                  "line": 102,
                  "text": "    static QStringList parseCallsigns(QString const &input);"
                },
                {
                  "line": 103,
                  "text": "    static QStringList parseGrids(QString const &input);"
                },
                {
                  "line": 104,
                  "text": ""
                },
                {
                  "line": 105,
                  "text": "    static QList<QPair<int, QVector<bool>>>"
                },
                {
                  "line": 106,
                  "text": "    huffEncode(const QMap<QString, QString> &huff, QString const &text);"
                },
                {
                  "line": 107,
                  "text": "    static QString huffDecode(const QMap<QString, QString> &huff,"
                },
                {
                  "line": 108,
                  "text": "                              QVector<bool> const &bitvec);"
                },
                {
                  "line": 109,
                  "text": "    static QSet<QString> huffValidChars(const QMap<QString, QString> &huff);"
                },
                {
                  "line": 110,
                  "text": ""
                },
                {
                  "line": 111,
                  "text": "    static QVector<bool> bytesToBits(char *bitvec, int n);"
                },
                {
                  "line": 112,
                  "text": "    static QVector<bool> strToBits(QString const &bitvec);"
                }
              ]
            }
          },
          {
            "keyword": "defaultHuffTable",
            "path": "JS8_Main/Varicode.h",
            "line": 88,
            "context": {
              "start_line": 83,
              "end_line": 93,
              "lines": [
                {
                  "line": 83,
                  "text": "    static QString unescape(const QString &text);"
                },
                {
                  "line": 84,
                  "text": ""
                },
                {
                  "line": 85,
                  "text": "    static QString rstrip(const QString &str);"
                },
                {
                  "line": 86,
                  "text": "    static QString lstrip(const QString &str);"
                },
                {
                  "line": 87,
                  "text": ""
                },
                {
                  "line": 88,
                  "text": "    static QMap<QString, QString> defaultHuffTable();"
                },
                {
                  "line": 89,
                  "text": "    static QString cqString(int number);"
                },
                {
                  "line": 90,
                  "text": "    static QString hbString(int number);"
                },
                {
                  "line": 91,
                  "text": "    static bool startsWithCQ(QString text);"
                },
                {
                  "line": 92,
                  "text": "    static bool startsWithHB(QString text);"
                },
                {
                  "line": 93,
                  "text": "    static QString formatSNR(int snr);"
                }
              ]
            }
          },
          {
            "keyword": "FrameDataCompressed",
            "path": "JS8_Main/Varicode.h",
            "line": 56,
            "context": {
              "start_line": 51,
              "end_line": 61,
              "lines": [
                {
                  "line": 51,
                  "text": "        FrameCompound = 1,         // [001]"
                },
                {
                  "line": 52,
                  "text": "        FrameCompoundDirected = 2, // [010]"
                },
                {
                  "line": 53,
                  "text": "        FrameDirected = 3,         // [011]"
                },
                {
                  "line": 54,
                  "text": "        FrameData = 4, // [10X] // but this only encodes the first 2 msb bits"
                },
                {
                  "line": 55,
                  "text": "                       // and drops the lsb"
                },
                {
                  "line": 56,
                  "text": "        FrameDataCompressed = 6, // [11X] // but this only encodes the first 2"
                },
                {
                  "line": 57,
                  "text": "                                 // msb bits and drops the lsb"
                },
                {
                  "line": 58,
                  "text": "    };"
                },
                {
                  "line": 59,
                  "text": ""
                },
                {
                  "line": 60,
                  "text": "    static const quint8 FrameTypeMax = 6;"
                },
                {
                  "line": 61,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "FrameDataCompressed",
            "path": "JS8_Main/Varicode.h",
            "line": 67,
            "context": {
              "start_line": 62,
              "end_line": 72,
              "lines": [
                {
                  "line": 62,
                  "text": "    static QString frameTypeString(quint8 type) {"
                },
                {
                  "line": 63,
                  "text": "        const char *FrameTypeStrings[] = {"
                },
                {
                  "line": 64,
                  "text": "            \"FrameHeartbeat\",      \"FrameCompound\", \"FrameCompoundDirected\","
                },
                {
                  "line": 65,
                  "text": "            \"FrameDirected\",       \"FrameData\","
                },
                {
                  "line": 66,
                  "text": "            \"FrameUnknown\", // 5"
                },
                {
                  "line": 67,
                  "text": "            \"FrameDataCompressed\","
                },
                {
                  "line": 68,
                  "text": "        };"
                },
                {
                  "line": 69,
                  "text": ""
                },
                {
                  "line": 70,
                  "text": "        if (type > FrameTypeMax) {"
                },
                {
                  "line": 71,
                  "text": "            return \"FrameUnknown\";"
                },
                {
                  "line": 72,
                  "text": "        }"
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.h",
            "line": 54,
            "context": {
              "start_line": 49,
              "end_line": 59,
              "lines": [
                {
                  "line": 49,
                  "text": "        FrameUnknown = 255,        // [11111111] <- only used as a sentinel"
                },
                {
                  "line": 50,
                  "text": "        FrameHeartbeat = 0,        // [000]"
                },
                {
                  "line": 51,
                  "text": "        FrameCompound = 1,         // [001]"
                },
                {
                  "line": 52,
                  "text": "        FrameCompoundDirected = 2, // [010]"
                },
                {
                  "line": 53,
                  "text": "        FrameDirected = 3,         // [011]"
                },
                {
                  "line": 54,
                  "text": "        FrameData = 4, // [10X] // but this only encodes the first 2 msb bits"
                },
                {
                  "line": 55,
                  "text": "                       // and drops the lsb"
                },
                {
                  "line": 56,
                  "text": "        FrameDataCompressed = 6, // [11X] // but this only encodes the first 2"
                },
                {
                  "line": 57,
                  "text": "                                 // msb bits and drops the lsb"
                },
                {
                  "line": 58,
                  "text": "    };"
                },
                {
                  "line": 59,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.h",
            "line": 56,
            "context": {
              "start_line": 51,
              "end_line": 61,
              "lines": [
                {
                  "line": 51,
                  "text": "        FrameCompound = 1,         // [001]"
                },
                {
                  "line": 52,
                  "text": "        FrameCompoundDirected = 2, // [010]"
                },
                {
                  "line": 53,
                  "text": "        FrameDirected = 3,         // [011]"
                },
                {
                  "line": 54,
                  "text": "        FrameData = 4, // [10X] // but this only encodes the first 2 msb bits"
                },
                {
                  "line": 55,
                  "text": "                       // and drops the lsb"
                },
                {
                  "line": 56,
                  "text": "        FrameDataCompressed = 6, // [11X] // but this only encodes the first 2"
                },
                {
                  "line": 57,
                  "text": "                                 // msb bits and drops the lsb"
                },
                {
                  "line": 58,
                  "text": "    };"
                },
                {
                  "line": 59,
                  "text": ""
                },
                {
                  "line": 60,
                  "text": "    static const quint8 FrameTypeMax = 6;"
                },
                {
                  "line": 61,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.h",
            "line": 65,
            "context": {
              "start_line": 60,
              "end_line": 70,
              "lines": [
                {
                  "line": 60,
                  "text": "    static const quint8 FrameTypeMax = 6;"
                },
                {
                  "line": 61,
                  "text": ""
                },
                {
                  "line": 62,
                  "text": "    static QString frameTypeString(quint8 type) {"
                },
                {
                  "line": 63,
                  "text": "        const char *FrameTypeStrings[] = {"
                },
                {
                  "line": 64,
                  "text": "            \"FrameHeartbeat\",      \"FrameCompound\", \"FrameCompoundDirected\","
                },
                {
                  "line": 65,
                  "text": "            \"FrameDirected\",       \"FrameData\","
                },
                {
                  "line": 66,
                  "text": "            \"FrameUnknown\", // 5"
                },
                {
                  "line": 67,
                  "text": "            \"FrameDataCompressed\","
                },
                {
                  "line": 68,
                  "text": "        };"
                },
                {
                  "line": 69,
                  "text": ""
                },
                {
                  "line": 70,
                  "text": "        if (type > FrameTypeMax) {"
                }
              ]
            }
          },
          {
            "keyword": "FrameData",
            "path": "JS8_Main/Varicode.h",
            "line": 67,
            "context": {
              "start_line": 62,
              "end_line": 72,
              "lines": [
                {
                  "line": 62,
                  "text": "    static QString frameTypeString(quint8 type) {"
                },
                {
                  "line": 63,
                  "text": "        const char *FrameTypeStrings[] = {"
                },
                {
                  "line": 64,
                  "text": "            \"FrameHeartbeat\",      \"FrameCompound\", \"FrameCompoundDirected\","
                },
                {
                  "line": 65,
                  "text": "            \"FrameDirected\",       \"FrameData\","
                },
                {
                  "line": 66,
                  "text": "            \"FrameUnknown\", // 5"
                },
                {
                  "line": 67,
                  "text": "            \"FrameDataCompressed\","
                },
                {
                  "line": 68,
                  "text": "        };"
                },
                {
                  "line": 69,
                  "text": ""
                },
                {
                  "line": 70,
                  "text": "        if (type > FrameTypeMax) {"
                },
                {
                  "line": 71,
                  "text": "            return \"FrameUnknown\";"
                },
                {
                  "line": 72,
                  "text": "        }"
                }
              ]
            }
          },
          {
            "keyword": "JS8CallData",
            "path": "JS8_Main/Varicode.h",
            "line": 37,
            "context": {
              "start_line": 32,
              "end_line": 42,
              "lines": [
                {
                  "line": 32,
                  "text": "    // frame type transmitted via itype and decoded by the ft8 decoded"
                },
                {
                  "line": 33,
                  "text": "    enum TransmissionType {"
                },
                {
                  "line": 34,
                  "text": "        JS8Call = 0,      // [000] <- any other frame of the message"
                },
                {
                  "line": 35,
                  "text": "        JS8CallFirst = 1, // [001] <- the first frame of a message"
                },
                {
                  "line": 36,
                  "text": "        JS8CallLast = 2,  // [010] <- the last frame of a message"
                },
                {
                  "line": 37,
                  "text": "        JS8CallData = 4,  // [100] <- flagged frame (no frame type header)"
                },
                {
                  "line": 38,
                  "text": "    };"
                },
                {
                  "line": 39,
                  "text": ""
                },
                {
                  "line": 40,
                  "text": "    /*"
                },
                {
                  "line": 41,
                  "text": ""
                },
                {
                  "line": 42,
                  "text": "    000 = heartbeat"
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.h",
            "line": 135,
            "context": {
              "start_line": 130,
              "end_line": 140,
              "lines": [
                {
                  "line": 130,
                  "text": "    static QString pack32bits(quint32 packed);"
                },
                {
                  "line": 131,
                  "text": ""
                },
                {
                  "line": 132,
                  "text": "    static quint64 unpack64bits(QString const &value);"
                },
                {
                  "line": 133,
                  "text": "    static QString pack64bits(quint64 packed);"
                },
                {
                  "line": 134,
                  "text": ""
                },
                {
                  "line": 135,
                  "text": "    static quint64 unpack72bits(QString const &value, quint8 *pRem);"
                },
                {
                  "line": 136,
                  "text": "    static QString pack72bits(quint64 value, quint8 rem);"
                },
                {
                  "line": 137,
                  "text": ""
                },
                {
                  "line": 138,
                  "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                },
                {
                  "line": 139,
                  "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                },
                {
                  "line": 140,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "pack72bits",
            "path": "JS8_Main/Varicode.h",
            "line": 136,
            "context": {
              "start_line": 131,
              "end_line": 141,
              "lines": [
                {
                  "line": 131,
                  "text": ""
                },
                {
                  "line": 132,
                  "text": "    static quint64 unpack64bits(QString const &value);"
                },
                {
                  "line": 133,
                  "text": "    static QString pack64bits(quint64 packed);"
                },
                {
                  "line": 134,
                  "text": ""
                },
                {
                  "line": 135,
                  "text": "    static quint64 unpack72bits(QString const &value, quint8 *pRem);"
                },
                {
                  "line": 136,
                  "text": "    static QString pack72bits(quint64 value, quint8 rem);"
                },
                {
                  "line": 137,
                  "text": ""
                },
                {
                  "line": 138,
                  "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                },
                {
                  "line": 139,
                  "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                },
                {
                  "line": 140,
                  "text": ""
                },
                {
                  "line": 141,
                  "text": "    static quint64 packAlphaNumeric50(QString const &value);"
                }
              ]
            }
          },
          {
            "keyword": "unpack72bits",
            "path": "JS8_Main/Varicode.h",
            "line": 135,
            "context": {
              "start_line": 130,
              "end_line": 140,
              "lines": [
                {
                  "line": 130,
                  "text": "    static QString pack32bits(quint32 packed);"
                },
                {
                  "line": 131,
                  "text": ""
                },
                {
                  "line": 132,
                  "text": "    static quint64 unpack64bits(QString const &value);"
                },
                {
                  "line": 133,
                  "text": "    static QString pack64bits(quint64 packed);"
                },
                {
                  "line": 134,
                  "text": ""
                },
                {
                  "line": 135,
                  "text": "    static quint64 unpack72bits(QString const &value, quint8 *pRem);"
                },
                {
                  "line": 136,
                  "text": "    static QString pack72bits(quint64 value, quint8 rem);"
                },
                {
                  "line": 137,
                  "text": ""
                },
                {
                  "line": 138,
                  "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                },
                {
                  "line": 139,
                  "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                },
                {
                  "line": 140,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "buildMessageFrames",
            "path": "JS8_Main/Varicode.h",
            "line": 16,
            "context": {
              "start_line": 11,
              "end_line": 21,
              "lines": [
                {
                  "line": 11,
                  "text": "#include <QThread>"
                },
                {
                  "line": 12,
                  "text": "#include <QVector>"
                },
                {
                  "line": 13,
                  "text": ""
                },
                {
                  "line": 14,
                  "text": "class Varicode {"
                },
                {
                  "line": 15,
                  "text": "  public:"
                },
                {
                  "line": 16,
                  "text": "    // extra information out of buildMessageFrames"
                },
                {
                  "line": 17,
                  "text": "    struct MessageInfo {"
                },
                {
                  "line": 18,
                  "text": "        QString dirTo;"
                },
                {
                  "line": 19,
                  "text": "        QString dirCmd;"
                },
                {
                  "line": 20,
                  "text": "        QString dirNum;"
                },
                {
                  "line": 21,
                  "text": "    };"
                }
              ]
            }
          },
          {
            "keyword": "buildMessageFrames",
            "path": "JS8_Main/Varicode.h",
            "line": 195,
            "context": {
              "start_line": 190,
              "end_line": 200,
              "lines": [
                {
                  "line": 190,
                  "text": ""
                },
                {
                  "line": 191,
                  "text": "    static QString packFastDataMessage(QString const &text, int *n);"
                },
                {
                  "line": 192,
                  "text": "    static QString unpackFastDataMessage(QString const &text);"
                },
                {
                  "line": 193,
                  "text": ""
                },
                {
                  "line": 194,
                  "text": "    static QList<QPair<QString, int>>"
                },
                {
                  "line": 195,
                  "text": "    buildMessageFrames(QString const &mycall, QString const &mygrid,"
                },
                {
                  "line": 196,
                  "text": "                       QString const &selectedCall, QString const &text,"
                },
                {
                  "line": 197,
                  "text": "                       bool forceIdentify, bool forceData, int submode,"
                },
                {
                  "line": 198,
                  "text": "                       MessageInfo *pInfo = nullptr);"
                },
                {
                  "line": 199,
                  "text": "};"
                },
                {
                  "line": 200,
                  "text": ""
                }
              ]
            }
          },
          {
            "keyword": "JSC::decompress",
            "path": "JS8_JSC/JSC.cpp",
            "line": 127,
            "context": {
              "start_line": 122,
              "end_line": 132,
              "lines": [
                {
                  "line": 122,
                  "text": " * @brief Decompresses the given bit vector into a string."
                },
                {
                  "line": 123,
                  "text": " *"
                },
                {
                  "line": 124,
                  "text": " * @param bitvec"
                },
                {
                  "line": 125,
                  "text": " * @return QString"
                },
                {
                  "line": 126,
                  "text": " */"
                },
                {
                  "line": 127,
                  "text": "QString JSC::decompress(Codeword const &bitvec) {"
                },
                {
                  "line": 128,
                  "text": "    const quint32 b = 4;"
                },
                {
                  "line": 129,
                  "text": "    const quint32 s = 7;"
                },
                {
                  "line": 130,
                  "text": "    const quint32 c = pow(2, b) - s;"
                },
                {
                  "line": 131,
                  "text": ""
                },
                {
                  "line": 132,
                  "text": "    QStringList out;"
                }
              ]
            }
          },
          {
            "keyword": "JSC::compress",
            "path": "JS8_JSC/JSC.cpp",
            "line": 71,
            "context": {
              "start_line": 66,
              "end_line": 76,
              "lines": [
                {
                  "line": 66,
                  "text": " * @brief Compresses the given text into a list of codeword pairs."
                },
                {
                  "line": 67,
                  "text": " *"
                },
                {
                  "line": 68,
                  "text": " * @param text"
                },
                {
                  "line": 69,
                  "text": " * @return QList<CodewordPair>"
                },
                {
                  "line": 70,
                  "text": " */"
                },
                {
                  "line": 71,
                  "text": "QList<CodewordPair> JSC::compress(QString text) {"
                },
                {
                  "line": 72,
                  "text": "    QList<CodewordPair> out;"
                },
                {
                  "line": 73,
                  "text": ""
                },
                {
                  "line": 74,
                  "text": "    const quint32 b = 4;"
                },
                {
                  "line": 75,
                  "text": "    const quint32 s = 7;"
                },
                {
                  "line": 76,
                  "text": "    const quint32 c = pow(2, 4) - s;"
                }
              ]
            }
          }
        ],
        "function_body_previews": [
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1912,
            "pattern": "QString\\s+Varicode::unpackDataMessage\\s*\\(",
            "chars": 849,
            "context": {
              "start_line": 1909,
              "end_line": 1915,
              "lines": [
                {
                  "line": 1909,
                  "text": "// TODO: DEPRECATED in 2.2 (still available for decoding legacy frames, but will"
                },
                {
                  "line": 1910,
                  "text": "// eventually no longer be decodable) unpack data message using 70 bits"
                },
                {
                  "line": 1911,
                  "text": "// available flagged as data by the first 2 bits"
                },
                {
                  "line": 1912,
                  "text": "QString Varicode::unpackDataMessage(const QString &text) {"
                },
                {
                  "line": 1913,
                  "text": "    QString unpacked;"
                },
                {
                  "line": 1914,
                  "text": ""
                },
                {
                  "line": 1915,
                  "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                }
              ]
            },
            "body_preview": "QString Varicode::unpackDataMessage(const QString &text) {\n    QString unpacked;\n\n    if (text.length() < 12 || text.contains(\" \")) {\n        return unpacked;\n    }\n\n    quint8 rem = 0;\n    quint64 value = Varicode::unpack72bits(text, &rem);\n    auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);\n\n    bool isData = bits.at(0);\n    if (!isData) {\n        return unpacked;\n    }\n\n    bits = bits.mid(1);\n\n    bool compressed = bits.at(0);\n    int n = bits.lastIndexOf(0);\n\n    // trim off the pad bits\n    bits = bits.mid(1, n - 1);\n\n    if (compressed) {\n        // partial word (s,c)-dense coding with code tables\n        unpacked = JSC::decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }\n\n    return unpacked;\n}"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1983,
            "pattern": "QString\\s+Varicode::unpackFastDataMessage\\s*\\(",
            "chars": 976,
            "context": {
              "start_line": 1980,
              "end_line": 1986,
              "lines": [
                {
                  "line": 1980,
                  "text": ""
                },
                {
                  "line": 1981,
                  "text": "// unpack data message using the full 72 bits available (with the data flag in"
                },
                {
                  "line": 1982,
                  "text": "// the i3bit header)"
                },
                {
                  "line": 1983,
                  "text": "QString Varicode::unpackFastDataMessage(const QString &text) {"
                },
                {
                  "line": 1984,
                  "text": "    QString unpacked;"
                },
                {
                  "line": 1985,
                  "text": ""
                },
                {
                  "line": 1986,
                  "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                }
              ]
            },
            "body_preview": "QString Varicode::unpackFastDataMessage(const QString &text) {\n    QString unpacked;\n\n    if (text.length() < 12 || text.contains(\" \")) {\n        return unpacked;\n    }\n\n    quint8 rem = 0;\n    quint64 value = Varicode::unpack72bits(text, &rem);\n    auto bits = Varicode::intToBits(value, 64) + Varicode::intToBits(rem, 8);\n\n#if JS8_FAST_DATA_CAN_USE_HUFF\n    bool compressed = bits.at(0);\n    int n = bits.lastIndexOf(0);\n\n    // trim off the pad bits\n    bits = bits.mid(1, n - 1);\n\n    if (compressed) {\n        // partial word (s,c)-dense coding with code tables\n        unpacked = JSC::decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }\n#else\n    int n = bits.lastIndexOf(0);\n\n    // trim off the pad bits\n    bits = bits.mid(0, n);\n\n    // partial word (s,c)-dense coding with code tables\n    unpacked = JSC::decompress(bits);\n#endif\n\n    return unpacked;\n}"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1830,
            "pattern": "QString\\s+packCompressedMessage\\s*\\(",
            "chars": 1818,
            "context": {
              "start_line": 1827,
              "end_line": 1833,
              "lines": [
                {
                  "line": 1827,
                  "text": "    return frame;"
                },
                {
                  "line": 1828,
                  "text": "}"
                },
                {
                  "line": 1829,
                  "text": ""
                },
                {
                  "line": 1830,
                  "text": "QString packCompressedMessage(const QString &input, QVector<bool> prefix,"
                },
                {
                  "line": 1831,
                  "text": "                              int *n) {"
                },
                {
                  "line": 1832,
                  "text": "    static const int frameSize = 72;"
                },
                {
                  "line": 1833,
                  "text": ""
                }
              ]
            },
            "body_preview": "QString packCompressedMessage(const QString &input, QVector<bool> prefix,\n                              int *n) {\n    static const int frameSize = 72;\n\n    QString frame;\n\n    // [1][1][70] = 72\n    // The first bit is a flag that indicates this is a data frame, technically\n    // encoded as [100] but, since none of the other frame types start with a 1,\n    // we can drop the two zeros and use them for encoding the first two bits of\n    // the actuall data sent. boom! The second bit is a flag that indicates this\n    // is a compressed frame (dense coding) For fast modes, we don't use the\n    // prefix since it is indicated by the JS8CallData flag.\n    QVector<bool> frameBits;\n    if (!prefix.isEmpty()) {\n        frameBits << prefix;\n    }\n\n    int i = 0;\n    foreach (auto pair, JSC::compress(input)) {\n        auto bits = pair.first;\n        auto chars = pair.second;\n\n        if (frameBits.length() + bits.length() < frameSize) {\n            frameBits.append(bits);\n            i += chars;\n            continue;\n        }\n\n        break;\n    }\n\n    qCDebug(varicode_js8) << \"Compressed bits\" << frameBits.length() << \"chars\"\n                          << i;\n\n    int pad = frameSize - frameBits.length();\n    if (pad) {\n        // the way we will pad is this...\n        // set the bit after the frame to 0 and every bit after that a 1\n        // to unpad, seek from the end of the bits until you hit a zero... the\n        // rest is the actual frame.\n        for (int i = 0; i < pad; i++) {\n            frameBits.append(i == 0 ? (bool)0 : (bool)1);\n        }\n    }\n\n    quint64 value = Varicode::bitsToInt(frameBits.constBegin(), 64);\n    quint8 rem = (quint8)Varicode::bitsToInt(frameBits.constBegin() + 64, 8);\n    frame = Varicode::pack72bits(value, rem);\n\n    if (n)\n        *n = i;\n\n    return frame;\n}"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 597,
            "pattern": "QString\\s+Varicode::huffDecode\\s*\\(",
            "chars": 750,
            "context": {
              "start_line": 594,
              "end_line": 600,
              "lines": [
                {
                  "line": 594,
                  "text": "    return out;"
                },
                {
                  "line": 595,
                  "text": "}"
                },
                {
                  "line": 596,
                  "text": ""
                },
                {
                  "line": 597,
                  "text": "QString Varicode::huffDecode(QMap<QString, QString> const &huff,"
                },
                {
                  "line": 598,
                  "text": "                             QVector<bool> const &bitvec) {"
                },
                {
                  "line": 599,
                  "text": "    QString text;"
                },
                {
                  "line": 600,
                  "text": ""
                }
              ]
            },
            "body_preview": "QString Varicode::huffDecode(QMap<QString, QString> const &huff,\n                             QVector<bool> const &bitvec) {\n    QString text;\n\n    QString bits = Varicode::bitsToStr(bitvec);\n\n    // TODO: jsherer - this is naive...\n    while (bits.length() > 0) {\n        bool found = false;\n        foreach (auto key, huff.keys()) {\n            if (bits.startsWith(huff[key])) {\n                if (key == EOT) {\n                    text.append(\" \");\n                    found = false;\n                    break;\n                }\n                text.append(key);\n                bits = bits.mid(huff[key].length());\n                found = true;\n            }\n        }\n        if (!found) {\n            break;\n        }\n    }\n\n    return text;\n}"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 438,
            "pattern": "QMap<[^>]+>\\s+Varicode::defaultHuffTable\\s*\\(",
            "chars": 73,
            "context": {
              "start_line": 435,
              "end_line": 441,
              "lines": [
                {
                  "line": 435,
                  "text": "/*"
                },
                {
                  "line": 436,
                  "text": " * VARICODE"
                },
                {
                  "line": 437,
                  "text": " */"
                },
                {
                  "line": 438,
                  "text": "QMap<QString, QString> Varicode::defaultHuffTable() { return hufftable; }"
                },
                {
                  "line": 439,
                  "text": ""
                },
                {
                  "line": 440,
                  "text": "QString Varicode::cqString(int number) {"
                },
                {
                  "line": 441,
                  "text": "    if (!cqs.contains(number)) {"
                }
              ]
            },
            "body_preview": "QMap<QString, QString> Varicode::defaultHuffTable() { return hufftable; }"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1938,
            "pattern": "\\bJSC::decompress\\s*\\(",
            "chars": 168,
            "context": {
              "start_line": 1935,
              "end_line": 1941,
              "lines": [
                {
                  "line": 1935,
                  "text": ""
                },
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 1937,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 1938,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 1939,
                  "text": "    } else {"
                },
                {
                  "line": 1940,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 1941,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                }
              ]
            },
            "body_preview": "JSC::decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 2003,
            "pattern": "\\bJSC::decompress\\s*\\(",
            "chars": 168,
            "context": {
              "start_line": 2000,
              "end_line": 2006,
              "lines": [
                {
                  "line": 2000,
                  "text": ""
                },
                {
                  "line": 2001,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 2002,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2003,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2004,
                  "text": "    } else {"
                },
                {
                  "line": 2005,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 2006,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                }
              ]
            },
            "body_preview": "JSC::decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 2015,
            "pattern": "\\bJSC::decompress\\s*\\(",
            "chars": 422,
            "context": {
              "start_line": 2012,
              "end_line": 2018,
              "lines": [
                {
                  "line": 2012,
                  "text": "    bits = bits.mid(0, n);"
                },
                {
                  "line": 2013,
                  "text": ""
                },
                {
                  "line": 2014,
                  "text": "    // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2015,
                  "text": "    unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2016,
                  "text": "#endif"
                },
                {
                  "line": 2017,
                  "text": ""
                },
                {
                  "line": 2018,
                  "text": "    return unpacked;"
                }
              ]
            },
            "body_preview": "JSC::decompress(bits);\n#endif\n\n    return unpacked;\n}\n\n// TODO: remove the dependence on providing all this data?\nQList<QPair<QString, int>>\nVaricode::buildMessageFrames(QString const &mycall, QString const &mygrid,\n                             QString const &selectedCall, QString const &text,\n                             bool forceIdentify, bool forceData, int submode,\n                             MessageInfo *pInfo) "
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1938,
            "pattern": "\\bdecompress\\s*\\(",
            "chars": 163,
            "context": {
              "start_line": 1935,
              "end_line": 1941,
              "lines": [
                {
                  "line": 1935,
                  "text": ""
                },
                {
                  "line": 1936,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 1937,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 1938,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 1939,
                  "text": "    } else {"
                },
                {
                  "line": 1940,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 1941,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                }
              ]
            },
            "body_preview": "decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 2003,
            "pattern": "\\bdecompress\\s*\\(",
            "chars": 163,
            "context": {
              "start_line": 2000,
              "end_line": 2006,
              "lines": [
                {
                  "line": 2000,
                  "text": ""
                },
                {
                  "line": 2001,
                  "text": "    if (compressed) {"
                },
                {
                  "line": 2002,
                  "text": "        // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2003,
                  "text": "        unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2004,
                  "text": "    } else {"
                },
                {
                  "line": 2005,
                  "text": "        // huff decode the bits (without escapes)"
                },
                {
                  "line": 2006,
                  "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                }
              ]
            },
            "body_preview": "decompress(bits);\n    } else {\n        // huff decode the bits (without escapes)\n        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);\n    }"
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 2015,
            "pattern": "\\bdecompress\\s*\\(",
            "chars": 417,
            "context": {
              "start_line": 2012,
              "end_line": 2018,
              "lines": [
                {
                  "line": 2012,
                  "text": "    bits = bits.mid(0, n);"
                },
                {
                  "line": 2013,
                  "text": ""
                },
                {
                  "line": 2014,
                  "text": "    // partial word (s,c)-dense coding with code tables"
                },
                {
                  "line": 2015,
                  "text": "    unpacked = JSC::decompress(bits);"
                },
                {
                  "line": 2016,
                  "text": "#endif"
                },
                {
                  "line": 2017,
                  "text": ""
                },
                {
                  "line": 2018,
                  "text": "    return unpacked;"
                }
              ]
            },
            "body_preview": "decompress(bits);\n#endif\n\n    return unpacked;\n}\n\n// TODO: remove the dependence on providing all this data?\nQList<QPair<QString, int>>\nVaricode::buildMessageFrames(QString const &mycall, QString const &mygrid,\n                             QString const &selectedCall, QString const &text,\n                             bool forceIdentify, bool forceData, int submode,\n                             MessageInfo *pInfo) "
          },
          {
            "path": "JS8_Main/Varicode.cpp",
            "line": 1849,
            "pattern": "\\bcompress\\s*\\(",
            "chars": 261,
            "context": {
              "start_line": 1846,
              "end_line": 1852,
              "lines": [
                {
                  "line": 1846,
                  "text": "    }"
                },
                {
                  "line": 1847,
                  "text": ""
                },
                {
                  "line": 1848,
                  "text": "    int i = 0;"
                },
                {
                  "line": 1849,
                  "text": "    foreach (auto pair, JSC::compress(input)) {"
                },
                {
                  "line": 1850,
                  "text": "        auto bits = pair.first;"
                },
                {
                  "line": 1851,
                  "text": "        auto chars = pair.second;"
                },
                {
                  "line": 1852,
                  "text": ""
                }
              ]
            },
            "body_preview": "compress(input)) {\n        auto bits = pair.first;\n        auto chars = pair.second;\n\n        if (frameBits.length() + bits.length() < frameSize) {\n            frameBits.append(bits);\n            i += chars;\n            continue;\n        }\n\n        break;\n    }"
          },
          {
            "path": "JS8_JSC/JSC.cpp",
            "line": 127,
            "pattern": "\\bJSC::decompress\\s*\\(",
            "chars": 1810,
            "context": {
              "start_line": 124,
              "end_line": 130,
              "lines": [
                {
                  "line": 124,
                  "text": " * @param bitvec"
                },
                {
                  "line": 125,
                  "text": " * @return QString"
                },
                {
                  "line": 126,
                  "text": " */"
                },
                {
                  "line": 127,
                  "text": "QString JSC::decompress(Codeword const &bitvec) {"
                },
                {
                  "line": 128,
                  "text": "    const quint32 b = 4;"
                },
                {
                  "line": 129,
                  "text": "    const quint32 s = 7;"
                },
                {
                  "line": 130,
                  "text": "    const quint32 c = pow(2, b) - s;"
                }
              ]
            },
            "body_preview": "JSC::decompress(Codeword const &bitvec) {\n    const quint32 b = 4;\n    const quint32 s = 7;\n    const quint32 c = pow(2, b) - s;\n\n    QStringList out;\n\n    quint32 base[8];\n    base[0] = 0;\n    base[1] = s;\n    base[2] = base[1] + s * c;\n    base[3] = base[2] + s * c * c;\n    base[4] = base[3] + s * c * c * c;\n    base[5] = base[4] + s * c * c * c * c;\n    base[6] = base[5] + s * c * c * c * c * c;\n    base[7] = base[6] + s * c * c * c * c * c * c;\n\n    QList<quint64> bytes;\n    QList<quint32> separators;\n\n    int i = 0;\n    int count = bitvec.count();\n    while (i < count) {\n        auto b = bitvec.mid(i, 4);\n        if (b.length() != 4) {\n            break;\n        }\n        quint64 byte = Varicode::bitsToInt(b);\n        bytes.append(byte);\n        i += 4;\n\n        if (byte < s) {\n            if (count - i > 0 && bitvec.at(i)) {\n                separators.append(bytes.length() - 1);\n            }\n            i += 1;\n        }\n    }\n\n    quint32 start = 0;\n    while (start < (quint32)bytes.length()) {\n        quint32 k = 0;\n        quint32 j = 0;\n\n        while (start + k < (quint32)bytes.length() && bytes[start + k] >= s) {\n            j = j * c + (bytes[start + k] - s);\n            k++;\n        }\n        if (j >= JSC::size) {\n            break;\n        }\n\n        if (start + k >= (quint32)bytes.length()) {\n            break;\n        }\n        j = j * s + bytes[start + k] + base[k];\n\n        if (j >= JSC::size) {\n            break;\n        }\n\n        // map is in latin1 format, not utf-8\n        auto word = QLatin1String(JSC::map[j].str);\n\n        out.append(word);\n        if (!separators.isEmpty() && separators.first() == start + k) {\n            out.append(\" \");\n            separators.removeFirst();\n        }\n\n        start = start + (k + 1);\n    }\n\n    return out.join(\"\");\n}"
          },
          {
            "path": "JS8_JSC/JSC.cpp",
            "line": 127,
            "pattern": "\\bdecompress\\s*\\(",
            "chars": 1805,
            "context": {
              "start_line": 124,
              "end_line": 130,
              "lines": [
                {
                  "line": 124,
                  "text": " * @param bitvec"
                },
                {
                  "line": 125,
                  "text": " * @return QString"
                },
                {
                  "line": 126,
                  "text": " */"
                },
                {
                  "line": 127,
                  "text": "QString JSC::decompress(Codeword const &bitvec) {"
                },
                {
                  "line": 128,
                  "text": "    const quint32 b = 4;"
                },
                {
                  "line": 129,
                  "text": "    const quint32 s = 7;"
                },
                {
                  "line": 130,
                  "text": "    const quint32 c = pow(2, b) - s;"
                }
              ]
            },
            "body_preview": "decompress(Codeword const &bitvec) {\n    const quint32 b = 4;\n    const quint32 s = 7;\n    const quint32 c = pow(2, b) - s;\n\n    QStringList out;\n\n    quint32 base[8];\n    base[0] = 0;\n    base[1] = s;\n    base[2] = base[1] + s * c;\n    base[3] = base[2] + s * c * c;\n    base[4] = base[3] + s * c * c * c;\n    base[5] = base[4] + s * c * c * c * c;\n    base[6] = base[5] + s * c * c * c * c * c;\n    base[7] = base[6] + s * c * c * c * c * c * c;\n\n    QList<quint64> bytes;\n    QList<quint32> separators;\n\n    int i = 0;\n    int count = bitvec.count();\n    while (i < count) {\n        auto b = bitvec.mid(i, 4);\n        if (b.length() != 4) {\n            break;\n        }\n        quint64 byte = Varicode::bitsToInt(b);\n        bytes.append(byte);\n        i += 4;\n\n        if (byte < s) {\n            if (count - i > 0 && bitvec.at(i)) {\n                separators.append(bytes.length() - 1);\n            }\n            i += 1;\n        }\n    }\n\n    quint32 start = 0;\n    while (start < (quint32)bytes.length()) {\n        quint32 k = 0;\n        quint32 j = 0;\n\n        while (start + k < (quint32)bytes.length() && bytes[start + k] >= s) {\n            j = j * c + (bytes[start + k] - s);\n            k++;\n        }\n        if (j >= JSC::size) {\n            break;\n        }\n\n        if (start + k >= (quint32)bytes.length()) {\n            break;\n        }\n        j = j * s + bytes[start + k] + base[k];\n\n        if (j >= JSC::size) {\n            break;\n        }\n\n        // map is in latin1 format, not utf-8\n        auto word = QLatin1String(JSC::map[j].str);\n\n        out.append(word);\n        if (!separators.isEmpty() && separators.first() == start + k) {\n            out.append(\" \");\n            separators.removeFirst();\n        }\n\n        start = start + (k + 1);\n    }\n\n    return out.join(\"\");\n}"
          },
          {
            "path": "JS8_JSC/JSC.cpp",
            "line": 71,
            "pattern": "\\bcompress\\s*\\(",
            "chars": 1327,
            "context": {
              "start_line": 68,
              "end_line": 74,
              "lines": [
                {
                  "line": 68,
                  "text": " * @param text"
                },
                {
                  "line": 69,
                  "text": " * @return QList<CodewordPair>"
                },
                {
                  "line": 70,
                  "text": " */"
                },
                {
                  "line": 71,
                  "text": "QList<CodewordPair> JSC::compress(QString text) {"
                },
                {
                  "line": 72,
                  "text": "    QList<CodewordPair> out;"
                },
                {
                  "line": 73,
                  "text": ""
                },
                {
                  "line": 74,
                  "text": "    const quint32 b = 4;"
                }
              ]
            },
            "body_preview": "compress(QString text) {\n    QList<CodewordPair> out;\n\n    const quint32 b = 4;\n    const quint32 s = 7;\n    const quint32 c = pow(2, 4) - s;\n\n    QString space(\" \");\n\n    QStringList words = text.split(\" \", Qt::KeepEmptyParts);\n\n    for (int i = 0, len = words.length(); i < len; i++) {\n        QString w = words[i];\n\n        bool isLastWord = (i == len - 1);\n        bool ok = false;\n        bool isSpaceCharacter = false;\n\n        // if this is an empty part, it should be a space, unless its the last\n        // word.\n        if (w.isEmpty() && !isLastWord) {\n            w = space;\n            isSpaceCharacter = true;\n        }\n\n        while (!w.isEmpty()) {\n            // this does both prefix and full match lookup\n            auto index = lookup(w, &ok);\n            if (!ok) {\n                break;\n            }\n\n            auto t = JSC::map[index];\n\n            w = QString(w).mid(t.size);\n\n            bool isLast = w.isEmpty();\n            bool shouldAppendSpace = isLast && !isSpaceCharacter && !isLastWord;\n\n            out.append(\n                {codeword(index, shouldAppendSpace, b, s, c),\n                 (quint32)t.size + (shouldAppendSpace\n                                        ? 1\n                                        : 0) /* for the space that follows */});\n        }\n    }\n\n    return out;\n}"
          }
        ],
        "webftr_adapter_hint": {
          "safe_to_poll_read_only": true,
          "productive_integration": false,
          "do_not_merge_as_chat_text_yet": true,
          "step68_contract_remains_current_ui_source": true
        },
        "verdict": "jsc_source_ready_no_data_frames_in_current_fixture",
        "warnings": [
          "Step69 is research/audit only and remains RX-only.",
          "No JS8 free-text rows are released by this step.",
          "JSC::decompress must be ported with source fixtures before FrameData/FrameDataCompressed can be shown as chat text."
        ],
        "next_action": "Port JSC::decompress using the extracted source path, then wait for or inject a FrameData/FrameDataCompressed fixture to validate free text.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_decompress_source_audit_latest.json"
      }
    },
    "webftr_rx_ui_contract": {
      "name": "20260527T181644Z_webftr_rx_ui_contract_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T181644Z_webftr_rx_ui_contract_output.json",
      "url": "/logs/20260527T181644Z_webftr_rx_ui_contract_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 6031,
        "mtime_utc": "2026-05-27T18:16:44Z"
      },
      "json_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.",
        "stable_latest_written": "/decoders/js8_decoder/logs/js8_webftr_rx_ui_contract_latest.json"
      }
    },
    "source_confirmed_control_frame_rx_release": {
      "name": "20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
      "url": "/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 9765,
        "mtime_utc": "2026-05-27T18:07:10Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-source-confirmed-control-frame-rx-release",
        "tool_version": "step67-source-confirmed-control-frame-rx-release",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": 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_varicode_frame_unpack_probe_output.json",
            "exists": true,
            "selected_input": true,
            "input_kind": "step66_source_varicode_frame_unpack_probe"
          }
        ],
        "source_step66_version": "step66-source-varicode-frame-unpack-probe",
        "source_frame_probe_count": 2,
        "source_webftr_display_count_before_release": 0,
        "frame_type_counts": {
          "FrameHeartbeat": 1,
          "FrameDirected": 1
        },
        "release_contract": {
          "allowed_to_display": [
            "FrameCompound",
            "FrameCompoundDirected",
            "FrameDirected",
            "FrameHeartbeat"
          ],
          "blocked_until_future_steps": [
            "FrameData",
            "FrameDataCompressed"
          ],
          "minimum_conditions": [
            "valid_message174_crc12 == true",
            "crc12_distance == 0",
            "source Varicode frame unpack produced a supported fixed control frame",
            "frame_display_candidate == true"
          ],
          "data_text_rule": "FrameData and FrameDataCompressed stay hidden until JSC::decompress/multi-frame assembly is ported and tested."
        },
        "input_candidate_count": 2,
        "webftr_display_count": 2,
        "hidden_candidate_count": 0,
        "webftr_rx_rows": [
          {
            "id": "js8-rx67-de15d3110b0d",
            "source_candidate_id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "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/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
            },
            "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-369b0507",
            "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/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
            },
            "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
          }
        ],
        "candidate_rows": [
          {
            "id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "mode": "JS8",
            "text": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "001XqOA2iDZ0",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 107552465662168,
                "value_hex": "0x000061d18282b0d8",
                "rem": 192,
                "top3": 0,
                "top2": 0,
                "first_16_bits": "0000000000000000"
              },
              "frame_type": "FrameHeartbeat",
              "frame_type_bits": 0,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "packed_type": 0,
                "callsign": "004REY/0V4",
                "packed_callsign": 52515852374,
                "packed_num": 6936,
                "bits3": 0,
                "valid_callsign_hint": true,
                "kind": "heartbeat_or_cq",
                "is_cq_alt": false,
                "grid": "OJ16",
                "message_token": "HB",
                "valid_grid_hint": true
              },
              "plausibility": {
                "score": 6,
                "reasons": [
                  "valid_heartbeat_callsign",
                  "valid_heartbeat_grid"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "HB 004REY/0V4 OJ16"
            },
            "show_in_rx_list": false,
            "display_text": "HB 004REY/0V4 OJ16",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 0
          },
          {
            "id": "js8-frame66-66ab29ded46c",
            "source_decode_id": "js8-msg174-369b0507",
            "mode": "JS8",
            "text": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "Q0VsKWqfJ96x",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 7496230937050041489,
                "value_hex": "0x6807f6520d294c91",
                "rem": 187,
                "top3": 3,
                "top2": 1,
                "first_16_bits": "0110100000000111"
              },
              "frame_type": "FrameDirected",
              "frame_type_bits": 3,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "from": "9I2TZR/P",
                "to": "0Z0PMP",
                "cmd_id": 17,
                "cmd": " INFO",
                "extra": 59,
                "extra_value": {
                  "kind": "number",
                  "value": 28
                },
                "portable_from": true,
                "portable_to": false,
                "valid_from_hint": true,
                "valid_to_hint": true
              },
              "plausibility": {
                "score": 10,
                "reasons": [
                  "valid_directed_from",
                  "valid_directed_to",
                  "directed_command"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "9I2TZR/P 0Z0PMP INFO 28"
            },
            "show_in_rx_list": false,
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 1
          }
        ],
        "suppressed_candidates": [],
        "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": "source_confirmed_control_frames_ready_for_webftr_rx_rows",
        "warnings": [
          "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."
        ],
        "next_action": "Wire these guarded webftr_rx_rows into the JS8 RX display contract, then continue with JSC::decompress/multi-frame assembly for real JS8 chat text."
      }
    },
    "source_varicode_frame_unpack_probe": {
      "name": "20260527T180708Z_source_varicode_frame_unpack_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_varicode_frame_unpack_probe_output.json",
      "url": "/logs/20260527T180708Z_source_varicode_frame_unpack_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 60488,
        "mtime_utc": "2026-05-27T18:07:09Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-source-varicode-frame-unpack-probe",
        "tool_version": "step66-source-varicode-frame-unpack-probe",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": 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_message174_decode_output.json",
            "exists": true,
            "selected_input": true
          }
        ],
        "source_resolution": {
          "selected_source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
          "checked": [
            {
              "path": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
              "exists": true,
              "is_dir": true
            }
          ]
        },
        "source_snippets": {
          "source_available": true,
          "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
          "focused_files_present": [
            "JS8_Main/Varicode.cpp",
            "JS8_Main/Varicode.h",
            "JS8_JSC/JSC.cpp",
            "JS8_JSC/JSC.h",
            "JS8_JSC/JSC_map.cpp",
            "JS8_JSC/JSC_list.cpp",
            "JS8_Mode/JS8.cpp"
          ],
          "focused_files_missing": [],
          "snippets": [
            {
              "name": "unpack72bits",
              "path": "JS8_Main/Varicode.cpp",
              "line": 767,
              "context": {
                "start_line": 762,
                "end_line": 772,
                "lines": [
                  {
                    "line": 762,
                    "text": "    quint32 b = packed & 0xFFFFFFFF;"
                  },
                  {
                    "line": 763,
                    "text": "    return pack32bits(a) + pack32bits(b);"
                  },
                  {
                    "line": 764,
                    "text": "}"
                  },
                  {
                    "line": 765,
                    "text": ""
                  },
                  {
                    "line": 766,
                    "text": "// returns the first 64 bits and sets the last 8 bits in pRem"
                  },
                  {
                    "line": 767,
                    "text": "quint64 Varicode::unpack72bits(QString const &text, quint8 *pRem) {"
                  },
                  {
                    "line": 768,
                    "text": "    quint64 value = 0;"
                  },
                  {
                    "line": 769,
                    "text": "    quint8 rem = 0;"
                  },
                  {
                    "line": 770,
                    "text": "    quint8 mask2 = ((1 << 2) - 1);"
                  },
                  {
                    "line": 771,
                    "text": ""
                  },
                  {
                    "line": 772,
                    "text": "    for (int i = 0; i < 10; i++) {"
                  }
                ]
              }
            },
            {
              "name": "pack72bits",
              "path": "JS8_Main/Varicode.cpp",
              "line": 767,
              "context": {
                "start_line": 762,
                "end_line": 772,
                "lines": [
                  {
                    "line": 762,
                    "text": "    quint32 b = packed & 0xFFFFFFFF;"
                  },
                  {
                    "line": 763,
                    "text": "    return pack32bits(a) + pack32bits(b);"
                  },
                  {
                    "line": 764,
                    "text": "}"
                  },
                  {
                    "line": 765,
                    "text": ""
                  },
                  {
                    "line": 766,
                    "text": "// returns the first 64 bits and sets the last 8 bits in pRem"
                  },
                  {
                    "line": 767,
                    "text": "quint64 Varicode::unpack72bits(QString const &text, quint8 *pRem) {"
                  },
                  {
                    "line": 768,
                    "text": "    quint64 value = 0;"
                  },
                  {
                    "line": 769,
                    "text": "    quint8 rem = 0;"
                  },
                  {
                    "line": 770,
                    "text": "    quint8 mask2 = ((1 << 2) - 1);"
                  },
                  {
                    "line": 771,
                    "text": ""
                  },
                  {
                    "line": 772,
                    "text": "    for (int i = 0; i < 10; i++) {"
                  }
                ]
              }
            },
            {
              "name": "unpackDirectedMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1716,
              "context": {
                "start_line": 1711,
                "end_line": 1721,
                "lines": [
                  {
                    "line": 1711,
                    "text": "    if (n)"
                  },
                  {
                    "line": 1712,
                    "text": "        *n = match.captured(0).length();"
                  },
                  {
                    "line": 1713,
                    "text": "    return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_extra);"
                  },
                  {
                    "line": 1714,
                    "text": "}"
                  },
                  {
                    "line": 1715,
                    "text": ""
                  },
                  {
                    "line": 1716,
                    "text": "QStringList Varicode::unpackDirectedMessage(const QString &text,"
                  },
                  {
                    "line": 1717,
                    "text": "                                            quint8 *pType) {"
                  },
                  {
                    "line": 1718,
                    "text": "    QStringList unpacked;"
                  },
                  {
                    "line": 1719,
                    "text": ""
                  },
                  {
                    "line": 1720,
                    "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                  },
                  {
                    "line": 1721,
                    "text": "        return unpacked;"
                  }
                ]
              }
            },
            {
              "name": "packDirectedMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1605,
              "context": {
                "start_line": 1600,
                "end_line": 1610,
                "lines": [
                  {
                    "line": 1600,
                    "text": ""
                  },
                  {
                    "line": 1601,
                    "text": "// J1Y ACK"
                  },
                  {
                    "line": 1602,
                    "text": "// J1Y?"
                  },
                  {
                    "line": 1603,
                    "text": "// KN4CRD: J1Y$"
                  },
                  {
                    "line": 1604,
                    "text": "// KN4CRD: J1Y! HELLO WORLD"
                  },
                  {
                    "line": 1605,
                    "text": "QString Varicode::packDirectedMessage(const QString &text,"
                  },
                  {
                    "line": 1606,
                    "text": "                                      const QString &mycall, QString *pTo,"
                  },
                  {
                    "line": 1607,
                    "text": "                                      bool *pToCompound, QString *pCmd,"
                  },
                  {
                    "line": 1608,
                    "text": "                                      QString *pNum, int *n) {"
                  },
                  {
                    "line": 1609,
                    "text": "    QString frame;"
                  },
                  {
                    "line": 1610,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "unpackCompoundFrame",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1420,
              "context": {
                "start_line": 1415,
                "end_line": 1425,
                "lines": [
                  {
                    "line": 1415,
                    "text": "                                             bool *isAlt, quint8 *pBits3) {"
                  },
                  {
                    "line": 1416,
                    "text": "    quint8 type = Varicode::FrameHeartbeat;"
                  },
                  {
                    "line": 1417,
                    "text": "    quint16 num = nmaxgrid;"
                  },
                  {
                    "line": 1418,
                    "text": "    quint8 bits3 = 0;"
                  },
                  {
                    "line": 1419,
                    "text": ""
                  },
                  {
                    "line": 1420,
                    "text": "    QStringList unpacked = unpackCompoundFrame(text, &type, &num, &bits3);"
                  },
                  {
                    "line": 1421,
                    "text": "    if (unpacked.isEmpty() || type != Varicode::FrameHeartbeat) {"
                  },
                  {
                    "line": 1422,
                    "text": "        return QStringList{};"
                  },
                  {
                    "line": 1423,
                    "text": "    }"
                  },
                  {
                    "line": 1424,
                    "text": ""
                  },
                  {
                    "line": 1425,
                    "text": "    unpacked.append(Varicode::unpackGrid(num & ((1 << 15) - 1)));"
                  }
                ]
              }
            },
            {
              "name": "packCompoundFrame",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1401,
              "context": {
                "start_line": 1396,
                "end_line": 1406,
                "lines": [
                  {
                    "line": 1396,
                    "text": "    if (isAlt) {"
                  },
                  {
                    "line": 1397,
                    "text": "        packed_extra |= (1 << 15);"
                  },
                  {
                    "line": 1398,
                    "text": "        cqNumber = cqs.key(type, 0);"
                  },
                  {
                    "line": 1399,
                    "text": "    }"
                  },
                  {
                    "line": 1400,
                    "text": ""
                  },
                  {
                    "line": 1401,
                    "text": "    frame = packCompoundFrame(callsign, Varicode::FrameHeartbeat, packed_extra,"
                  },
                  {
                    "line": 1402,
                    "text": "                              cqNumber);"
                  },
                  {
                    "line": 1403,
                    "text": "    if (frame.isEmpty()) {"
                  },
                  {
                    "line": 1404,
                    "text": "        if (n)"
                  },
                  {
                    "line": 1405,
                    "text": "            *n = 0;"
                  },
                  {
                    "line": 1406,
                    "text": "        return frame;"
                  }
                ]
              }
            },
            {
              "name": "unpackCompoundMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1491,
              "context": {
                "start_line": 1486,
                "end_line": 1496,
                "lines": [
                  {
                    "line": 1486,
                    "text": "    if (n)"
                  },
                  {
                    "line": 1487,
                    "text": "        *n = parsedText.captured(0).length();"
                  },
                  {
                    "line": 1488,
                    "text": "    return frame;"
                  },
                  {
                    "line": 1489,
                    "text": "}"
                  },
                  {
                    "line": 1490,
                    "text": ""
                  },
                  {
                    "line": 1491,
                    "text": "QStringList Varicode::unpackCompoundMessage(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 1492,
                    "text": "                                            quint8 *pBits3) {"
                  },
                  {
                    "line": 1493,
                    "text": "    quint8 type = Varicode::FrameCompound;"
                  },
                  {
                    "line": 1494,
                    "text": "    quint16 extra = nmaxgrid;"
                  },
                  {
                    "line": 1495,
                    "text": "    quint8 bits3 = 0;"
                  },
                  {
                    "line": 1496,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "unpackHeartbeatMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1414,
              "context": {
                "start_line": 1409,
                "end_line": 1419,
                "lines": [
                  {
                    "line": 1409,
                    "text": "    if (n)"
                  },
                  {
                    "line": 1410,
                    "text": "        *n = parsedText.captured(0).length();"
                  },
                  {
                    "line": 1411,
                    "text": "    return frame;"
                  },
                  {
                    "line": 1412,
                    "text": "}"
                  },
                  {
                    "line": 1413,
                    "text": ""
                  },
                  {
                    "line": 1414,
                    "text": "QStringList Varicode::unpackHeartbeatMessage(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 1415,
                    "text": "                                             bool *isAlt, quint8 *pBits3) {"
                  },
                  {
                    "line": 1416,
                    "text": "    quint8 type = Varicode::FrameHeartbeat;"
                  },
                  {
                    "line": 1417,
                    "text": "    quint16 num = nmaxgrid;"
                  },
                  {
                    "line": 1418,
                    "text": "    quint8 bits3 = 0;"
                  },
                  {
                    "line": 1419,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "unpackDataMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1912,
              "context": {
                "start_line": 1907,
                "end_line": 1917,
                "lines": [
                  {
                    "line": 1907,
                    "text": "}"
                  },
                  {
                    "line": 1908,
                    "text": ""
                  },
                  {
                    "line": 1909,
                    "text": "// TODO: DEPRECATED in 2.2 (still available for decoding legacy frames, but will"
                  },
                  {
                    "line": 1910,
                    "text": "// eventually no longer be decodable) unpack data message using 70 bits"
                  },
                  {
                    "line": 1911,
                    "text": "// available flagged as data by the first 2 bits"
                  },
                  {
                    "line": 1912,
                    "text": "QString Varicode::unpackDataMessage(const QString &text) {"
                  },
                  {
                    "line": 1913,
                    "text": "    QString unpacked;"
                  },
                  {
                    "line": 1914,
                    "text": ""
                  },
                  {
                    "line": 1915,
                    "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                  },
                  {
                    "line": 1916,
                    "text": "        return unpacked;"
                  },
                  {
                    "line": 1917,
                    "text": "    }"
                  }
                ]
              }
            },
            {
              "name": "unpackFastDataMessage",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1983,
              "context": {
                "start_line": 1978,
                "end_line": 1988,
                "lines": [
                  {
                    "line": 1978,
                    "text": "#endif"
                  },
                  {
                    "line": 1979,
                    "text": "}"
                  },
                  {
                    "line": 1980,
                    "text": ""
                  },
                  {
                    "line": 1981,
                    "text": "// unpack data message using the full 72 bits available (with the data flag in"
                  },
                  {
                    "line": 1982,
                    "text": "// the i3bit header)"
                  },
                  {
                    "line": 1983,
                    "text": "QString Varicode::unpackFastDataMessage(const QString &text) {"
                  },
                  {
                    "line": 1984,
                    "text": "    QString unpacked;"
                  },
                  {
                    "line": 1985,
                    "text": ""
                  },
                  {
                    "line": 1986,
                    "text": "    if (text.length() < 12 || text.contains(\" \")) {"
                  },
                  {
                    "line": 1987,
                    "text": "        return unpacked;"
                  },
                  {
                    "line": 1988,
                    "text": "    }"
                  }
                ]
              }
            },
            {
              "name": "unpackCallsign",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1037,
              "context": {
                "start_line": 1032,
                "end_line": 1042,
                "lines": [
                  {
                    "line": 1032,
                    "text": "    packed = 27 * packed + alphanumeric.indexOf(matched.at(5)) - 10;"
                  },
                  {
                    "line": 1033,
                    "text": ""
                  },
                  {
                    "line": 1034,
                    "text": "    return packed;"
                  },
                  {
                    "line": 1035,
                    "text": "}"
                  },
                  {
                    "line": 1036,
                    "text": ""
                  },
                  {
                    "line": 1037,
                    "text": "QString Varicode::unpackCallsign(quint32 value, bool portable) {"
                  },
                  {
                    "line": 1038,
                    "text": "    foreach (auto key, basecalls.keys()) {"
                  },
                  {
                    "line": 1039,
                    "text": "        if (basecalls[key] == value) {"
                  },
                  {
                    "line": 1040,
                    "text": "            return key;"
                  },
                  {
                    "line": 1041,
                    "text": "        }"
                  },
                  {
                    "line": 1042,
                    "text": "    }"
                  }
                ]
              }
            },
            {
              "name": "unpackAlphaNumeric50",
              "path": "JS8_Main/Varicode.cpp",
              "line": 905,
              "context": {
                "start_line": 900,
                "end_line": 910,
                "lines": [
                  {
                    "line": 900,
                    "text": "    quint64 packed = a + b + c + d + e + f + g + h + i + j + k;"
                  },
                  {
                    "line": 901,
                    "text": ""
                  },
                  {
                    "line": 902,
                    "text": "    return packed;"
                  },
                  {
                    "line": 903,
                    "text": "}"
                  },
                  {
                    "line": 904,
                    "text": ""
                  },
                  {
                    "line": 905,
                    "text": "QString Varicode::unpackAlphaNumeric50(quint64 packed) {"
                  },
                  {
                    "line": 906,
                    "text": "    QChar word[11];"
                  },
                  {
                    "line": 907,
                    "text": ""
                  },
                  {
                    "line": 908,
                    "text": "    quint64 tmp = packed % 38;"
                  },
                  {
                    "line": 909,
                    "text": "    word[10] = alphanumeric.at(tmp);"
                  },
                  {
                    "line": 910,
                    "text": "    packed = packed / 38;"
                  }
                ]
              }
            },
            {
              "name": "unpackGrid",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1157,
              "context": {
                "start_line": 1152,
                "end_line": 1162,
                "lines": [
                  {
                    "line": 1152,
                    "text": "    int ilat = pair.second + 90;"
                  },
                  {
                    "line": 1153,
                    "text": ""
                  },
                  {
                    "line": 1154,
                    "text": "    return ((ilong + 180) / 2) * 180 + ilat;"
                  },
                  {
                    "line": 1155,
                    "text": "}"
                  },
                  {
                    "line": 1156,
                    "text": ""
                  },
                  {
                    "line": 1157,
                    "text": "QString Varicode::unpackGrid(quint16 value) {"
                  },
                  {
                    "line": 1158,
                    "text": "    if (value > nbasegrid) {"
                  },
                  {
                    "line": 1159,
                    "text": "        return \"\";"
                  },
                  {
                    "line": 1160,
                    "text": "    }"
                  },
                  {
                    "line": 1161,
                    "text": ""
                  },
                  {
                    "line": 1162,
                    "text": "    float dlat = value % 180 - 90;"
                  }
                ]
              }
            },
            {
              "name": "unpackCmd",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1207,
              "context": {
                "start_line": 1202,
                "end_line": 1212,
                "lines": [
                  {
                    "line": 1202,
                    "text": "    }"
                  },
                  {
                    "line": 1203,
                    "text": ""
                  },
                  {
                    "line": 1204,
                    "text": "    return value;"
                  },
                  {
                    "line": 1205,
                    "text": "}"
                  },
                  {
                    "line": 1206,
                    "text": ""
                  },
                  {
                    "line": 1207,
                    "text": "quint8 Varicode::unpackCmd(quint8 value, quint8 *pNum) {"
                  },
                  {
                    "line": 1208,
                    "text": "    // if the first bit is 1, this is an SNR with a number encoded in the lower"
                  },
                  {
                    "line": 1209,
                    "text": "    // 6 bits"
                  },
                  {
                    "line": 1210,
                    "text": "    if (value & (1 << 7)) {"
                  },
                  {
                    "line": 1211,
                    "text": "        if (pNum)"
                  },
                  {
                    "line": 1212,
                    "text": "            *pNum = value & ((1 << 6) - 1);"
                  }
                ]
              }
            },
            {
              "name": "huffDecode",
              "path": "JS8_Main/Varicode.cpp",
              "line": 597,
              "context": {
                "start_line": 592,
                "end_line": 602,
                "lines": [
                  {
                    "line": 592,
                    "text": "    }"
                  },
                  {
                    "line": 593,
                    "text": ""
                  },
                  {
                    "line": 594,
                    "text": "    return out;"
                  },
                  {
                    "line": 595,
                    "text": "}"
                  },
                  {
                    "line": 596,
                    "text": ""
                  },
                  {
                    "line": 597,
                    "text": "QString Varicode::huffDecode(QMap<QString, QString> const &huff,"
                  },
                  {
                    "line": 598,
                    "text": "                             QVector<bool> const &bitvec) {"
                  },
                  {
                    "line": 599,
                    "text": "    QString text;"
                  },
                  {
                    "line": 600,
                    "text": ""
                  },
                  {
                    "line": 601,
                    "text": "    QString bits = Varicode::bitsToStr(bitvec);"
                  },
                  {
                    "line": 602,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "JSC::decompress",
              "path": "JS8_Main/Varicode.cpp",
              "line": 1938,
              "context": {
                "start_line": 1933,
                "end_line": 1943,
                "lines": [
                  {
                    "line": 1933,
                    "text": "    // trim off the pad bits"
                  },
                  {
                    "line": 1934,
                    "text": "    bits = bits.mid(1, n - 1);"
                  },
                  {
                    "line": 1935,
                    "text": ""
                  },
                  {
                    "line": 1936,
                    "text": "    if (compressed) {"
                  },
                  {
                    "line": 1937,
                    "text": "        // partial word (s,c)-dense coding with code tables"
                  },
                  {
                    "line": 1938,
                    "text": "        unpacked = JSC::decompress(bits);"
                  },
                  {
                    "line": 1939,
                    "text": "    } else {"
                  },
                  {
                    "line": 1940,
                    "text": "        // huff decode the bits (without escapes)"
                  },
                  {
                    "line": 1941,
                    "text": "        unpacked = Varicode::huffDecode(Varicode::defaultHuffTable(), bits);"
                  },
                  {
                    "line": 1942,
                    "text": "    }"
                  },
                  {
                    "line": 1943,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "unpack72bits",
              "path": "JS8_Main/Varicode.h",
              "line": 135,
              "context": {
                "start_line": 130,
                "end_line": 140,
                "lines": [
                  {
                    "line": 130,
                    "text": "    static QString pack32bits(quint32 packed);"
                  },
                  {
                    "line": 131,
                    "text": ""
                  },
                  {
                    "line": 132,
                    "text": "    static quint64 unpack64bits(QString const &value);"
                  },
                  {
                    "line": 133,
                    "text": "    static QString pack64bits(quint64 packed);"
                  },
                  {
                    "line": 134,
                    "text": ""
                  },
                  {
                    "line": 135,
                    "text": "    static quint64 unpack72bits(QString const &value, quint8 *pRem);"
                  },
                  {
                    "line": 136,
                    "text": "    static QString pack72bits(quint64 value, quint8 rem);"
                  },
                  {
                    "line": 137,
                    "text": ""
                  },
                  {
                    "line": 138,
                    "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                  },
                  {
                    "line": 139,
                    "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                  },
                  {
                    "line": 140,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "pack72bits",
              "path": "JS8_Main/Varicode.h",
              "line": 135,
              "context": {
                "start_line": 130,
                "end_line": 140,
                "lines": [
                  {
                    "line": 130,
                    "text": "    static QString pack32bits(quint32 packed);"
                  },
                  {
                    "line": 131,
                    "text": ""
                  },
                  {
                    "line": 132,
                    "text": "    static quint64 unpack64bits(QString const &value);"
                  },
                  {
                    "line": 133,
                    "text": "    static QString pack64bits(quint64 packed);"
                  },
                  {
                    "line": 134,
                    "text": ""
                  },
                  {
                    "line": 135,
                    "text": "    static quint64 unpack72bits(QString const &value, quint8 *pRem);"
                  },
                  {
                    "line": 136,
                    "text": "    static QString pack72bits(quint64 value, quint8 rem);"
                  },
                  {
                    "line": 137,
                    "text": ""
                  },
                  {
                    "line": 138,
                    "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                  },
                  {
                    "line": 139,
                    "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                  },
                  {
                    "line": 140,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "unpackDirectedMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 185,
              "context": {
                "start_line": 180,
                "end_line": 190,
                "lines": [
                  {
                    "line": 180,
                    "text": ""
                  },
                  {
                    "line": 181,
                    "text": "    static QString packDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 182,
                    "text": "                                       QString const &mycall, QString *pTo,"
                  },
                  {
                    "line": 183,
                    "text": "                                       bool *pToCompound, QString *pCmd,"
                  },
                  {
                    "line": 184,
                    "text": "                                       QString *pNum, int *n);"
                  },
                  {
                    "line": 185,
                    "text": "    static QStringList unpackDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 186,
                    "text": "                                             quint8 *pType);"
                  },
                  {
                    "line": 187,
                    "text": ""
                  },
                  {
                    "line": 188,
                    "text": "    static QString packDataMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 189,
                    "text": "    static QString unpackDataMessage(QString const &text);"
                  },
                  {
                    "line": 190,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "packDirectedMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 181,
              "context": {
                "start_line": 176,
                "end_line": 186,
                "lines": [
                  {
                    "line": 176,
                    "text": "    static QString packCompoundFrame(const QString &callsign, quint8 type,"
                  },
                  {
                    "line": 177,
                    "text": "                                     quint16 num, quint8 bits3);"
                  },
                  {
                    "line": 178,
                    "text": "    static QStringList unpackCompoundFrame(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 179,
                    "text": "                                           quint16 *pNum, quint8 *pBits3);"
                  },
                  {
                    "line": 180,
                    "text": ""
                  },
                  {
                    "line": 181,
                    "text": "    static QString packDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 182,
                    "text": "                                       QString const &mycall, QString *pTo,"
                  },
                  {
                    "line": 183,
                    "text": "                                       bool *pToCompound, QString *pCmd,"
                  },
                  {
                    "line": 184,
                    "text": "                                       QString *pNum, int *n);"
                  },
                  {
                    "line": 185,
                    "text": "    static QStringList unpackDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 186,
                    "text": "                                             quint8 *pType);"
                  }
                ]
              }
            },
            {
              "name": "unpackCompoundFrame",
              "path": "JS8_Main/Varicode.h",
              "line": 178,
              "context": {
                "start_line": 173,
                "end_line": 183,
                "lines": [
                  {
                    "line": 173,
                    "text": "    static QStringList unpackCompoundMessage(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 174,
                    "text": "                                             quint8 *pBits3);"
                  },
                  {
                    "line": 175,
                    "text": ""
                  },
                  {
                    "line": 176,
                    "text": "    static QString packCompoundFrame(const QString &callsign, quint8 type,"
                  },
                  {
                    "line": 177,
                    "text": "                                     quint16 num, quint8 bits3);"
                  },
                  {
                    "line": 178,
                    "text": "    static QStringList unpackCompoundFrame(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 179,
                    "text": "                                           quint16 *pNum, quint8 *pBits3);"
                  },
                  {
                    "line": 180,
                    "text": ""
                  },
                  {
                    "line": 181,
                    "text": "    static QString packDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 182,
                    "text": "                                       QString const &mycall, QString *pTo,"
                  },
                  {
                    "line": 183,
                    "text": "                                       bool *pToCompound, QString *pCmd,"
                  }
                ]
              }
            },
            {
              "name": "packCompoundFrame",
              "path": "JS8_Main/Varicode.h",
              "line": 176,
              "context": {
                "start_line": 171,
                "end_line": 181,
                "lines": [
                  {
                    "line": 171,
                    "text": ""
                  },
                  {
                    "line": 172,
                    "text": "    static QString packCompoundMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 173,
                    "text": "    static QStringList unpackCompoundMessage(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 174,
                    "text": "                                             quint8 *pBits3);"
                  },
                  {
                    "line": 175,
                    "text": ""
                  },
                  {
                    "line": 176,
                    "text": "    static QString packCompoundFrame(const QString &callsign, quint8 type,"
                  },
                  {
                    "line": 177,
                    "text": "                                     quint16 num, quint8 bits3);"
                  },
                  {
                    "line": 178,
                    "text": "    static QStringList unpackCompoundFrame(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 179,
                    "text": "                                           quint16 *pNum, quint8 *pBits3);"
                  },
                  {
                    "line": 180,
                    "text": ""
                  },
                  {
                    "line": 181,
                    "text": "    static QString packDirectedMessage(QString const &text,"
                  }
                ]
              }
            },
            {
              "name": "unpackCompoundMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 173,
              "context": {
                "start_line": 168,
                "end_line": 178,
                "lines": [
                  {
                    "line": 168,
                    "text": "    static QStringList unpackHeartbeatMessage(const QString &text,"
                  },
                  {
                    "line": 169,
                    "text": "                                              quint8 *pType, bool *isAlt,"
                  },
                  {
                    "line": 170,
                    "text": "                                              quint8 *pBits3);"
                  },
                  {
                    "line": 171,
                    "text": ""
                  },
                  {
                    "line": 172,
                    "text": "    static QString packCompoundMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 173,
                    "text": "    static QStringList unpackCompoundMessage(const QString &text, quint8 *pType,"
                  },
                  {
                    "line": 174,
                    "text": "                                             quint8 *pBits3);"
                  },
                  {
                    "line": 175,
                    "text": ""
                  },
                  {
                    "line": 176,
                    "text": "    static QString packCompoundFrame(const QString &callsign, quint8 type,"
                  },
                  {
                    "line": 177,
                    "text": "                                     quint16 num, quint8 bits3);"
                  },
                  {
                    "line": 178,
                    "text": "    static QStringList unpackCompoundFrame(const QString &text, quint8 *pType,"
                  }
                ]
              }
            },
            {
              "name": "unpackHeartbeatMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 168,
              "context": {
                "start_line": 163,
                "end_line": 173,
                "lines": [
                  {
                    "line": 163,
                    "text": "    static bool isCompoundCallsign(const QString &callsign);"
                  },
                  {
                    "line": 164,
                    "text": "    static bool isGroupAllowed(const QString &group);"
                  },
                  {
                    "line": 165,
                    "text": ""
                  },
                  {
                    "line": 166,
                    "text": "    static QString packHeartbeatMessage(QString const &text,"
                  },
                  {
                    "line": 167,
                    "text": "                                        QString const &callsign, int *n);"
                  },
                  {
                    "line": 168,
                    "text": "    static QStringList unpackHeartbeatMessage(const QString &text,"
                  },
                  {
                    "line": 169,
                    "text": "                                              quint8 *pType, bool *isAlt,"
                  },
                  {
                    "line": 170,
                    "text": "                                              quint8 *pBits3);"
                  },
                  {
                    "line": 171,
                    "text": ""
                  },
                  {
                    "line": 172,
                    "text": "    static QString packCompoundMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 173,
                    "text": "    static QStringList unpackCompoundMessage(const QString &text, quint8 *pType,"
                  }
                ]
              }
            },
            {
              "name": "unpackDataMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 189,
              "context": {
                "start_line": 184,
                "end_line": 194,
                "lines": [
                  {
                    "line": 184,
                    "text": "                                       QString *pNum, int *n);"
                  },
                  {
                    "line": 185,
                    "text": "    static QStringList unpackDirectedMessage(QString const &text,"
                  },
                  {
                    "line": 186,
                    "text": "                                             quint8 *pType);"
                  },
                  {
                    "line": 187,
                    "text": ""
                  },
                  {
                    "line": 188,
                    "text": "    static QString packDataMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 189,
                    "text": "    static QString unpackDataMessage(QString const &text);"
                  },
                  {
                    "line": 190,
                    "text": ""
                  },
                  {
                    "line": 191,
                    "text": "    static QString packFastDataMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 192,
                    "text": "    static QString unpackFastDataMessage(QString const &text);"
                  },
                  {
                    "line": 193,
                    "text": ""
                  },
                  {
                    "line": 194,
                    "text": "    static QList<QPair<QString, int>>"
                  }
                ]
              }
            },
            {
              "name": "unpackFastDataMessage",
              "path": "JS8_Main/Varicode.h",
              "line": 192,
              "context": {
                "start_line": 187,
                "end_line": 197,
                "lines": [
                  {
                    "line": 187,
                    "text": ""
                  },
                  {
                    "line": 188,
                    "text": "    static QString packDataMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 189,
                    "text": "    static QString unpackDataMessage(QString const &text);"
                  },
                  {
                    "line": 190,
                    "text": ""
                  },
                  {
                    "line": 191,
                    "text": "    static QString packFastDataMessage(QString const &text, int *n);"
                  },
                  {
                    "line": 192,
                    "text": "    static QString unpackFastDataMessage(QString const &text);"
                  },
                  {
                    "line": 193,
                    "text": ""
                  },
                  {
                    "line": 194,
                    "text": "    static QList<QPair<QString, int>>"
                  },
                  {
                    "line": 195,
                    "text": "    buildMessageFrames(QString const &mycall, QString const &mygrid,"
                  },
                  {
                    "line": 196,
                    "text": "                       QString const &selectedCall, QString const &text,"
                  },
                  {
                    "line": 197,
                    "text": "                       bool forceIdentify, bool forceData, int submode,"
                  }
                ]
              }
            },
            {
              "name": "unpackCallsign",
              "path": "JS8_Main/Varicode.h",
              "line": 145,
              "context": {
                "start_line": 140,
                "end_line": 150,
                "lines": [
                  {
                    "line": 140,
                    "text": ""
                  },
                  {
                    "line": 141,
                    "text": "    static quint64 packAlphaNumeric50(QString const &value);"
                  },
                  {
                    "line": 142,
                    "text": "    static QString unpackAlphaNumeric50(quint64 packed);"
                  },
                  {
                    "line": 143,
                    "text": ""
                  },
                  {
                    "line": 144,
                    "text": "    static quint32 packCallsign(QString const &value, bool *pPortable);"
                  },
                  {
                    "line": 145,
                    "text": "    static QString unpackCallsign(quint32 value, bool portable);"
                  },
                  {
                    "line": 146,
                    "text": ""
                  },
                  {
                    "line": 147,
                    "text": "    static QString deg2grid(float dlong, float dlat);"
                  },
                  {
                    "line": 148,
                    "text": "    static QPair<float, float> grid2deg(QString const &grid);"
                  },
                  {
                    "line": 149,
                    "text": "    static quint16 packGrid(QString const &value);"
                  },
                  {
                    "line": 150,
                    "text": "    static QString unpackGrid(quint16 value);"
                  }
                ]
              }
            },
            {
              "name": "unpackAlphaNumeric50",
              "path": "JS8_Main/Varicode.h",
              "line": 142,
              "context": {
                "start_line": 137,
                "end_line": 147,
                "lines": [
                  {
                    "line": 137,
                    "text": ""
                  },
                  {
                    "line": 138,
                    "text": "    static quint32 packAlphaNumeric22(QString const &value, bool isFlag);"
                  },
                  {
                    "line": 139,
                    "text": "    static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);"
                  },
                  {
                    "line": 140,
                    "text": ""
                  },
                  {
                    "line": 141,
                    "text": "    static quint64 packAlphaNumeric50(QString const &value);"
                  },
                  {
                    "line": 142,
                    "text": "    static QString unpackAlphaNumeric50(quint64 packed);"
                  },
                  {
                    "line": 143,
                    "text": ""
                  },
                  {
                    "line": 144,
                    "text": "    static quint32 packCallsign(QString const &value, bool *pPortable);"
                  },
                  {
                    "line": 145,
                    "text": "    static QString unpackCallsign(quint32 value, bool portable);"
                  },
                  {
                    "line": 146,
                    "text": ""
                  },
                  {
                    "line": 147,
                    "text": "    static QString deg2grid(float dlong, float dlat);"
                  }
                ]
              }
            },
            {
              "name": "unpackGrid",
              "path": "JS8_Main/Varicode.h",
              "line": 150,
              "context": {
                "start_line": 145,
                "end_line": 155,
                "lines": [
                  {
                    "line": 145,
                    "text": "    static QString unpackCallsign(quint32 value, bool portable);"
                  },
                  {
                    "line": 146,
                    "text": ""
                  },
                  {
                    "line": 147,
                    "text": "    static QString deg2grid(float dlong, float dlat);"
                  },
                  {
                    "line": 148,
                    "text": "    static QPair<float, float> grid2deg(QString const &grid);"
                  },
                  {
                    "line": 149,
                    "text": "    static quint16 packGrid(QString const &value);"
                  },
                  {
                    "line": 150,
                    "text": "    static QString unpackGrid(quint16 value);"
                  },
                  {
                    "line": 151,
                    "text": ""
                  },
                  {
                    "line": 152,
                    "text": "    static quint8 packNum(QString const &num, bool *ok);"
                  },
                  {
                    "line": 153,
                    "text": "    static quint8 packPwr(QString const &pwr, bool *ok);"
                  },
                  {
                    "line": 154,
                    "text": "    static quint8 packCmd(quint8 cmd, quint8 num, bool *pPackedNum);"
                  },
                  {
                    "line": 155,
                    "text": "    static quint8 unpackCmd(quint8 value, quint8 *pNum);"
                  }
                ]
              }
            },
            {
              "name": "unpackCmd",
              "path": "JS8_Main/Varicode.h",
              "line": 155,
              "context": {
                "start_line": 150,
                "end_line": 160,
                "lines": [
                  {
                    "line": 150,
                    "text": "    static QString unpackGrid(quint16 value);"
                  },
                  {
                    "line": 151,
                    "text": ""
                  },
                  {
                    "line": 152,
                    "text": "    static quint8 packNum(QString const &num, bool *ok);"
                  },
                  {
                    "line": 153,
                    "text": "    static quint8 packPwr(QString const &pwr, bool *ok);"
                  },
                  {
                    "line": 154,
                    "text": "    static quint8 packCmd(quint8 cmd, quint8 num, bool *pPackedNum);"
                  },
                  {
                    "line": 155,
                    "text": "    static quint8 unpackCmd(quint8 value, quint8 *pNum);"
                  },
                  {
                    "line": 156,
                    "text": ""
                  },
                  {
                    "line": 157,
                    "text": "    static bool isSNRCommand(const QString &cmd);"
                  },
                  {
                    "line": 158,
                    "text": "    static bool isCommandAllowed(const QString &cmd);"
                  },
                  {
                    "line": 159,
                    "text": "    static bool isCommandBuffered(const QString &cmd);"
                  },
                  {
                    "line": 160,
                    "text": "    static int isCommandChecksumed(const QString &cmd);"
                  }
                ]
              }
            },
            {
              "name": "huffDecode",
              "path": "JS8_Main/Varicode.h",
              "line": 107,
              "context": {
                "start_line": 102,
                "end_line": 112,
                "lines": [
                  {
                    "line": 102,
                    "text": "    static QStringList parseCallsigns(QString const &input);"
                  },
                  {
                    "line": 103,
                    "text": "    static QStringList parseGrids(QString const &input);"
                  },
                  {
                    "line": 104,
                    "text": ""
                  },
                  {
                    "line": 105,
                    "text": "    static QList<QPair<int, QVector<bool>>>"
                  },
                  {
                    "line": 106,
                    "text": "    huffEncode(const QMap<QString, QString> &huff, QString const &text);"
                  },
                  {
                    "line": 107,
                    "text": "    static QString huffDecode(const QMap<QString, QString> &huff,"
                  },
                  {
                    "line": 108,
                    "text": "                              QVector<bool> const &bitvec);"
                  },
                  {
                    "line": 109,
                    "text": "    static QSet<QString> huffValidChars(const QMap<QString, QString> &huff);"
                  },
                  {
                    "line": 110,
                    "text": ""
                  },
                  {
                    "line": 111,
                    "text": "    static QVector<bool> bytesToBits(char *bitvec, int n);"
                  },
                  {
                    "line": 112,
                    "text": "    static QVector<bool> strToBits(QString const &bitvec);"
                  }
                ]
              }
            },
            {
              "name": "JSC::decompress",
              "path": "JS8_JSC/JSC.cpp",
              "line": 127,
              "context": {
                "start_line": 122,
                "end_line": 132,
                "lines": [
                  {
                    "line": 122,
                    "text": " * @brief Decompresses the given bit vector into a string."
                  },
                  {
                    "line": 123,
                    "text": " *"
                  },
                  {
                    "line": 124,
                    "text": " * @param bitvec"
                  },
                  {
                    "line": 125,
                    "text": " * @return QString"
                  },
                  {
                    "line": 126,
                    "text": " */"
                  },
                  {
                    "line": 127,
                    "text": "QString JSC::decompress(Codeword const &bitvec) {"
                  },
                  {
                    "line": 128,
                    "text": "    const quint32 b = 4;"
                  },
                  {
                    "line": 129,
                    "text": "    const quint32 s = 7;"
                  },
                  {
                    "line": 130,
                    "text": "    const quint32 c = pow(2, b) - s;"
                  },
                  {
                    "line": 131,
                    "text": ""
                  },
                  {
                    "line": 132,
                    "text": "    QStringList out;"
                  }
                ]
              }
            }
          ]
        },
        "source_contract": {
          "message174_alphabet": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+",
          "alphabet72": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+/?.",
          "frame_types": {
            "0": "FrameHeartbeat",
            "1": "FrameCompound",
            "2": "FrameCompoundDirected",
            "3": "FrameDirected",
            "4": "FrameData",
            "5": "FrameData",
            "6": "FrameDataCompressed",
            "7": "FrameDataCompressed"
          },
          "implemented_rx_unpack": [
            "unpack72bits",
            "frame_type",
            "directed",
            "heartbeat",
            "compound",
            "callsign",
            "grid",
            "legacy_huff_data_probe"
          ],
          "not_yet_ported": [
            "JSC::decompress full compressed text",
            "multi-frame buffer assembly",
            "WebFTR live integration"
          ]
        },
        "input_decode_count": 2,
        "frame_probe_count": 2,
        "webftr_display_count": 0,
        "hidden_candidate_count": 2,
        "frame_type_counts": {
          "FrameHeartbeat": 1,
          "FrameDirected": 1
        },
        "webftr_rx_rows": [],
        "candidate_rows": [
          {
            "id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "mode": "JS8",
            "text": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "001XqOA2iDZ0",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 107552465662168,
                "value_hex": "0x000061d18282b0d8",
                "rem": 192,
                "top3": 0,
                "top2": 0,
                "first_16_bits": "0000000000000000"
              },
              "frame_type": "FrameHeartbeat",
              "frame_type_bits": 0,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "packed_type": 0,
                "callsign": "004REY/0V4",
                "packed_callsign": 52515852374,
                "packed_num": 6936,
                "bits3": 0,
                "valid_callsign_hint": true,
                "kind": "heartbeat_or_cq",
                "is_cq_alt": false,
                "grid": "OJ16",
                "message_token": "HB",
                "valid_grid_hint": true
              },
              "plausibility": {
                "score": 6,
                "reasons": [
                  "valid_heartbeat_callsign",
                  "valid_heartbeat_grid"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "HB 004REY/0V4 OJ16"
            },
            "show_in_rx_list": false,
            "display_text": "HB 004REY/0V4 OJ16",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 0
          },
          {
            "id": "js8-frame66-66ab29ded46c",
            "source_decode_id": "js8-msg174-369b0507",
            "mode": "JS8",
            "text": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "Q0VsKWqfJ96x",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 7496230937050041489,
                "value_hex": "0x6807f6520d294c91",
                "rem": 187,
                "top3": 3,
                "top2": 1,
                "first_16_bits": "0110100000000111"
              },
              "frame_type": "FrameDirected",
              "frame_type_bits": 3,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "from": "9I2TZR/P",
                "to": "0Z0PMP",
                "cmd_id": 17,
                "cmd": " INFO",
                "extra": 59,
                "extra_value": {
                  "kind": "number",
                  "value": 28
                },
                "portable_from": true,
                "portable_to": false,
                "valid_from_hint": true,
                "valid_to_hint": true
              },
              "plausibility": {
                "score": 10,
                "reasons": [
                  "valid_directed_from",
                  "valid_directed_to",
                  "directed_command"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "9I2TZR/P 0Z0PMP INFO 28"
            },
            "show_in_rx_list": false,
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 1
          }
        ],
        "suppressed_candidates": [
          {
            "id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "mode": "JS8",
            "text": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "001XqOA2iDZ0",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 107552465662168,
                "value_hex": "0x000061d18282b0d8",
                "rem": 192,
                "top3": 0,
                "top2": 0,
                "first_16_bits": "0000000000000000"
              },
              "frame_type": "FrameHeartbeat",
              "frame_type_bits": 0,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "packed_type": 0,
                "callsign": "004REY/0V4",
                "packed_callsign": 52515852374,
                "packed_num": 6936,
                "bits3": 0,
                "valid_callsign_hint": true,
                "kind": "heartbeat_or_cq",
                "is_cq_alt": false,
                "grid": "OJ16",
                "message_token": "HB",
                "valid_grid_hint": true
              },
              "plausibility": {
                "score": 6,
                "reasons": [
                  "valid_heartbeat_callsign",
                  "valid_heartbeat_grid"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "HB 004REY/0V4 OJ16"
            },
            "show_in_rx_list": false,
            "display_text": "HB 004REY/0V4 OJ16",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 0
          },
          {
            "id": "js8-frame66-66ab29ded46c",
            "source_decode_id": "js8-msg174-369b0507",
            "mode": "JS8",
            "text": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "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
            },
            "frame_probe": {
              "message_text_12chars": "Q0VsKWqfJ96x",
              "length": 12,
              "source_alphabet72_compatible": true,
              "ok": true,
              "unpack72": {
                "value": 7496230937050041489,
                "value_hex": "0x6807f6520d294c91",
                "rem": 187,
                "top3": 3,
                "top2": 1,
                "first_16_bits": "0110100000000111"
              },
              "frame_type": "FrameDirected",
              "frame_type_bits": 3,
              "displayable_after_frame_unpack": false,
              "frame_fields": {
                "from": "9I2TZR/P",
                "to": "0Z0PMP",
                "cmd_id": 17,
                "cmd": " INFO",
                "extra": 59,
                "extra_value": {
                  "kind": "number",
                  "value": 28
                },
                "portable_from": true,
                "portable_to": false,
                "valid_from_hint": true,
                "valid_to_hint": true
              },
              "plausibility": {
                "score": 10,
                "reasons": [
                  "valid_directed_from",
                  "valid_directed_to",
                  "directed_command"
                ]
              },
              "frame_display_candidate": true,
              "display_guard_reason": "step66_annotation_only_pending_jsc_or_multiframe_text_confirmation",
              "candidate_class": "source_varicode_frame_candidate_guarded",
              "display_text_hint": "9I2TZR/P 0Z0PMP INFO 28"
            },
            "show_in_rx_list": false,
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "candidate_class": "source_varicode_frame_candidate_guarded",
            "sort_index": 1
          }
        ],
        "verdict": "source_varicode_frames_classified_but_not_displayable",
        "warnings": [
          "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."
        ],
        "next_action": "If frame types look plausible but hidden, port JSC::decompress and multi-frame assembly next; if a display row appears, wire webftr_rx_rows into the JS8 RX UI contract."
      }
    },
    "rx_display_contract": {
      "name": "20260527T163511Z_rx_display_contract_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T163511Z_rx_display_contract_output.json",
      "url": "/logs/20260527T163511Z_rx_display_contract_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 8654,
        "mtime_utc": "2026-05-27T16:35:12Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-rx-display-contract",
        "tool_version": "step65-rx-display-contract-message174-plausibility-guard",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "no_gui_runtime_started": true,
        "log_dir": "/decoders/js8_decoder/logs",
        "input_step64_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T163511Z_source_confirmed_message174_decode_output.json",
            "exists": true,
            "tool_version": "step64-source-confirmed-message174-decodes-output",
            "decode_count": 2,
            "selected": true
          }
        ],
        "source_step64_tool_version": "step64-source-confirmed-message174-decodes-output",
        "input_decode_count": 2,
        "webftr_display_count": 0,
        "hidden_candidate_count": 2,
        "verdict": "message174_candidates_but_no_plausible_js8_text_yet",
        "webftr_rx_contract": {
          "schema": "webftr-js8-rx-display-contract-v1",
          "display_policy": "Only show rows with show_in_rx_list=true in a normal RX table; keep other CRC-valid rows as candidate diagnostics.",
          "fields": [
            "mode",
            "status",
            "display_text",
            "show_in_rx_list",
            "candidate_class",
            "valid_message174_crc12",
            "crc12_distance",
            "received_crc12",
            "computed_crc12"
          ]
        },
        "webftr_rx_rows": [],
        "candidate_rows": [
          {
            "id": "js8-rx65-f55bc2ac28",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "mode": "JS8",
            "status": "CANDIDATE",
            "text": "001XqOA2iDZ0",
            "display_text": "001XQOA2IDZ0",
            "raw": "001XqOA2iDZ0",
            "show_in_rx_list": false,
            "candidate_class": "crc_candidate_unframed",
            "candidate_score": -3,
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "parsed": {
              "raw": "001XqOA2iDZ0",
              "normalized": "001XQOA2IDZ0",
              "message_type": "MESSAGE",
              "directed_to": null,
              "callsigns": [],
              "primary_callsign": null,
              "locators": [],
              "primary_locator": null,
              "body": "001XQOA2IDZ0"
            },
            "plausibility": {
              "score": -3,
              "classification": "crc_candidate_unframed",
              "displayable": false,
              "reasons": [
                "allowed_js8_display_chars",
                "compact_mixed_12char_payload"
              ],
              "known_tokens": [],
              "callsigns": [],
              "locators": [],
              "char_entropy": 3.189,
              "compact_random_payload_hint": true,
              "allowed_display_chars": true
            },
            "confidence": "crc12_zero_distance_but_unframed",
            "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
            },
            "sort_index": 0
          },
          {
            "id": "js8-rx65-c793e911ba",
            "source_decode_id": "js8-msg174-369b0507",
            "mode": "JS8",
            "status": "CANDIDATE",
            "text": "Q0VsKWqfJ96x",
            "display_text": "Q0VSKWQFJ96X",
            "raw": "Q0VsKWqfJ96x",
            "show_in_rx_list": false,
            "candidate_class": "crc_candidate_unframed",
            "candidate_score": -3,
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "parsed": {
              "raw": "Q0VsKWqfJ96x",
              "normalized": "Q0VSKWQFJ96X",
              "message_type": "MESSAGE",
              "directed_to": null,
              "callsigns": [],
              "primary_callsign": null,
              "locators": [],
              "primary_locator": null,
              "body": "Q0VSKWQFJ96X"
            },
            "plausibility": {
              "score": -3,
              "classification": "crc_candidate_unframed",
              "displayable": false,
              "reasons": [
                "allowed_js8_display_chars",
                "compact_mixed_12char_payload"
              ],
              "known_tokens": [],
              "callsigns": [],
              "locators": [],
              "char_entropy": 3.585,
              "compact_random_payload_hint": true,
              "allowed_display_chars": true
            },
            "confidence": "crc12_zero_distance_but_unframed",
            "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
            },
            "sort_index": 1
          }
        ],
        "suppressed_candidates": [
          {
            "id": "js8-rx65-f55bc2ac28",
            "source_decode_id": "js8-msg174-2b7db8e6",
            "mode": "JS8",
            "status": "CANDIDATE",
            "text": "001XqOA2iDZ0",
            "display_text": "001XQOA2IDZ0",
            "raw": "001XqOA2iDZ0",
            "show_in_rx_list": false,
            "candidate_class": "crc_candidate_unframed",
            "candidate_score": -3,
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "parsed": {
              "raw": "001XqOA2iDZ0",
              "normalized": "001XQOA2IDZ0",
              "message_type": "MESSAGE",
              "directed_to": null,
              "callsigns": [],
              "primary_callsign": null,
              "locators": [],
              "primary_locator": null,
              "body": "001XQOA2IDZ0"
            },
            "plausibility": {
              "score": -3,
              "classification": "crc_candidate_unframed",
              "displayable": false,
              "reasons": [
                "allowed_js8_display_chars",
                "compact_mixed_12char_payload"
              ],
              "known_tokens": [],
              "callsigns": [],
              "locators": [],
              "char_entropy": 3.189,
              "compact_random_payload_hint": true,
              "allowed_display_chars": true
            },
            "confidence": "crc12_zero_distance_but_unframed",
            "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
            },
            "sort_index": 0
          },
          {
            "id": "js8-rx65-c793e911ba",
            "source_decode_id": "js8-msg174-369b0507",
            "mode": "JS8",
            "status": "CANDIDATE",
            "text": "Q0VsKWqfJ96x",
            "display_text": "Q0VSKWQFJ96X",
            "raw": "Q0VsKWqfJ96x",
            "show_in_rx_list": false,
            "candidate_class": "crc_candidate_unframed",
            "candidate_score": -3,
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "parsed": {
              "raw": "Q0VsKWqfJ96x",
              "normalized": "Q0VSKWQFJ96X",
              "message_type": "MESSAGE",
              "directed_to": null,
              "callsigns": [],
              "primary_callsign": null,
              "locators": [],
              "primary_locator": null,
              "body": "Q0VSKWQFJ96X"
            },
            "plausibility": {
              "score": -3,
              "classification": "crc_candidate_unframed",
              "displayable": false,
              "reasons": [
                "allowed_js8_display_chars",
                "compact_mixed_12char_payload"
              ],
              "known_tokens": [],
              "callsigns": [],
              "locators": [],
              "char_entropy": 3.585,
              "compact_random_payload_hint": true,
              "allowed_display_chars": true
            },
            "confidence": "crc12_zero_distance_but_unframed",
            "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
            },
            "sort_index": 1
          }
        ],
        "summary": {
          "display_ready": 0,
          "candidate_only": 2,
          "class_counts": {
            "crc_candidate_unframed": 2
          }
        },
        "warnings": [
          "Step65 is a safety/display-contract layer: CRC12-zero message174 candidates are not automatically treated as real user-visible JS8 chat lines.",
          "Random-looking compact 12-character payloads remain preserved as diagnostics but are hidden from normal WebFTR RX rows until source text/framing is connected.",
          "No JS8Call GUI/Qt process is started and no TX/PTT/Tune/Send action is performed."
        ],
        "next_action": "If webftr_display_count is 0, continue with source extraction around JS8 text/framing/callsign packing before WebFTR UI integration; if >0, wire webftr_rx_rows into the JS8 RX table contract."
      }
    },
    "source_confirmed_message174_decode": {
      "name": "20260527T180708Z_source_confirmed_message174_decode_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T180708Z_source_confirmed_message174_decode_output.json",
      "url": "/logs/20260527T180708Z_source_confirmed_message174_decode_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 6061,
        "mtime_utc": "2026-05-27T18:07:08Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-source-confirmed-message174-decode",
        "tool_version": "step64-source-confirmed-message174-decodes-output",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "no_gui_runtime_started": true,
        "log_dir": "/decoders/js8_decoder/logs",
        "source_contract": {
          "source": "JS8Call-Improved JS8_Mode/JS8.cpp extractmessage174/checkCRC12",
          "alphabet": "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+",
          "crc_width": 12,
          "crc_poly_hex": "0xc06",
          "crc_xor_decimal": 42,
          "message_bits": "first 72 data bits as 12 x 6-bit words",
          "crc_gate": "Only zero-distance CRC12 candidates are emitted as decodes[]."
        },
        "step63_source_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T150600Z_source_exact_map_probe_output.json",
            "exists": true,
            "zero_distance_candidates_extracted": 33,
            "tool_version": "step63-source-exact-interleaver-whitening-index-extract"
          }
        ],
        "runtime_fallback_reports": [],
        "candidate_source": "step63_source_exact_map_probe",
        "zero_distance_candidate_count": 2,
        "decode_count": 2,
        "top_candidates": [
          {
            "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,
            "distance": 0,
            "crc_match": true,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "message_text_12chars": "001XqOA2iDZ0",
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "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,
            "distance": 0,
            "crc_match": true,
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "message_text_12chars": "Q0VsKWqfJ96x",
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          }
        ],
        "decodes": [
          {
            "id": "js8-msg174-2b7db8e6",
            "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/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
            },
            "confidence": "crc12_zero_distance_source_extractmessage174",
            "rx_only": true,
            "sort_index": 0
          },
          {
            "id": "js8-msg174-369b0507",
            "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/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
            },
            "confidence": "crc12_zero_distance_source_extractmessage174",
            "rx_only": true,
            "sort_index": 1
          }
        ],
        "warnings": [
          "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."
        ],
        "next_action": "Use Step64 decodes[] as the contract for the next step: connect source-confirmed message174 output into a richer JS8 text/Varicode/framing interpretation and then feed WebFTR RX display fields."
      }
    },
    "source_exact_map_probe": {
      "name": "20260527T150600Z_source_exact_map_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T150600Z_source_exact_map_probe_output.json",
      "url": "/logs/20260527T150600Z_source_exact_map_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 141641,
        "mtime_utc": "2026-05-27T15:06:03Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-source-exact-map-probe",
        "tool_version": "step63-source-exact-interleaver-whitening-index-extract",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "no_gui_runtime_started": true,
        "root": "/decoders/js8_decoder",
        "log_dir": "/decoders/js8_decoder/logs",
        "source_checked": [
          {
            "path": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
            "exists": true,
            "is_dir": true
          }
        ],
        "source": {
          "source_available": true,
          "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
          "files_scanned": 16,
          "focused_files_present": [
            "JS8_Mode/JS8.cpp",
            "JS8_Mode/JS8.h",
            "JS8_Mode/Decoder.cpp",
            "JS8_Mode/Decoder.h",
            "JS8_Mode/DecodedText.cpp",
            "JS8_Mode/DecodedText.h",
            "JS8_Mode/JS8Submode.cpp",
            "JS8_Mode/JS8Submode.h",
            "JS8_Mode/soft_combiner.h",
            "JS8_Mode/ldpc_feedback.h",
            "JS8_Mode/whitening_processor.h",
            "JS8_Include/commons.h",
            "JS8_Main/Varicode.cpp",
            "JS8_Main/Varicode.h",
            "JS8_JSC/JSC_map.cpp",
            "JS8_JSC/JSC_list.cpp"
          ],
          "focused_files_missing": [],
          "exact_maps": [],
          "source_evidence": [
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 11,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten"
              ],
              "context": {
                "start_line": 8,
                "end_line": 14,
                "lines": [
                  {
                    "line": 8,
                    "text": "#include \"JS8.h\""
                  },
                  {
                    "line": 9,
                    "text": "#include \"JS8_Include/commons.h\""
                  },
                  {
                    "line": 10,
                    "text": "#include \"JS8_Mode/FrequencyTracker.h\""
                  },
                  {
                    "line": 11,
                    "text": "#include \"JS8_Mode/whitening_processor.h\""
                  },
                  {
                    "line": 12,
                    "text": "#include \"ldpc_feedback.h\""
                  },
                  {
                    "line": 13,
                    "text": "#include \"soft_combiner.h\""
                  },
                  {
                    "line": 14,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 12,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 9,
                "end_line": 15,
                "lines": [
                  {
                    "line": 9,
                    "text": "#include \"JS8_Include/commons.h\""
                  },
                  {
                    "line": 10,
                    "text": "#include \"JS8_Mode/FrequencyTracker.h\""
                  },
                  {
                    "line": 11,
                    "text": "#include \"JS8_Mode/whitening_processor.h\""
                  },
                  {
                    "line": 12,
                    "text": "#include \"ldpc_feedback.h\""
                  },
                  {
                    "line": 13,
                    "text": "#include \"soft_combiner.h\""
                  },
                  {
                    "line": 14,
                    "text": ""
                  },
                  {
                    "line": 15,
                    "text": "#include <QDebug>"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 729,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 726,
                "end_line": 732,
                "lines": [
                  {
                    "line": 726,
                    "text": ""
                  },
                  {
                    "line": 727,
                    "text": "// Belief Propagation Decoder"
                  },
                  {
                    "line": 728,
                    "text": ""
                  },
                  {
                    "line": 729,
                    "text": "int bpdecode174(std::array<float, N> const &llr, std::array<int8_t, K> &decoded,"
                  },
                  {
                    "line": 730,
                    "text": "                std::array<int8_t, N> &cw) {"
                  },
                  {
                    "line": 731,
                    "text": "    // Initialize messages and variables"
                  },
                  {
                    "line": 732,
                    "text": "    std::array<std::array<float, BP_MAX_CHECKS>, N> tov ="
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 748,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 745,
                "end_line": 751,
                "lines": [
                  {
                    "line": 745,
                    "text": "    // Initialize toc (messages from bits to checks)"
                  },
                  {
                    "line": 746,
                    "text": "    for (int i = 0; i < M; ++i) {"
                  },
                  {
                    "line": 747,
                    "text": "        for (int j = 0; j < Nm[i].valid_neighbors; ++j) {"
                  },
                  {
                    "line": 748,
                    "text": "            toc[i][j] = llr[Nm[i].neighbors[j]];"
                  },
                  {
                    "line": 749,
                    "text": "        }"
                  },
                  {
                    "line": 750,
                    "text": "    }"
                  },
                  {
                    "line": 751,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 757,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 754,
                "end_line": 760,
                "lines": [
                  {
                    "line": 754,
                    "text": "        // Update bit log likelihood ratios"
                  },
                  {
                    "line": 755,
                    "text": "        for (int i = 0; i < N; ++i) {"
                  },
                  {
                    "line": 756,
                    "text": "            zn[i] ="
                  },
                  {
                    "line": 757,
                    "text": "                llr[i] + std::accumulate(tov[i].begin(),"
                  },
                  {
                    "line": 758,
                    "text": "                                         tov[i].begin() + BP_MAX_CHECKS, 0.0f);"
                  },
                  {
                    "line": 759,
                    "text": "        }"
                  },
                  {
                    "line": 760,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 782,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 779,
                "end_line": 785,
                "lines": [
                  {
                    "line": 779,
                    "text": "            // Count errors"
                  },
                  {
                    "line": 780,
                    "text": "            int nerr = 0;"
                  },
                  {
                    "line": 781,
                    "text": "            for (int i = 0; i < N; ++i) {"
                  },
                  {
                    "line": 782,
                    "text": "                if ((2 * cw[i] - 1) * llr[i] < 0.0f) {"
                  },
                  {
                    "line": 783,
                    "text": "                    ++nerr;"
                  },
                  {
                    "line": 784,
                    "text": "                }"
                  },
                  {
                    "line": 785,
                    "text": "            }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 895,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "checkCRC12"
              ],
              "context": {
                "start_line": 892,
                "end_line": 898,
                "lines": [
                  {
                    "line": 892,
                    "text": "    return boost::augmented_crc<12, 0xc06>(range.data(), range.size()) ^ 42;"
                  },
                  {
                    "line": 893,
                    "text": "}"
                  },
                  {
                    "line": 894,
                    "text": ""
                  },
                  {
                    "line": 895,
                    "text": "bool checkCRC12(std::array<std::int8_t, KK> const &decoded) {"
                  },
                  {
                    "line": 896,
                    "text": "    std::array<uint8_t, 11> bits = {};"
                  },
                  {
                    "line": 897,
                    "text": ""
                  },
                  {
                    "line": 898,
                    "text": "    for (std::size_t i = 0; i < decoded.size(); ++i) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 918,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "message174",
                "extractmessage174"
              ],
              "context": {
                "start_line": 915,
                "end_line": 921,
                "lines": [
                  {
                    "line": 915,
                    "text": "    return crc == CRC12(bits);"
                  },
                  {
                    "line": 916,
                    "text": "}"
                  },
                  {
                    "line": 917,
                    "text": ""
                  },
                  {
                    "line": 918,
                    "text": "std::string extractmessage174(std::array<int8_t, KK> const &decoded) {"
                  },
                  {
                    "line": 919,
                    "text": "    std::string message;"
                  },
                  {
                    "line": 920,
                    "text": ""
                  },
                  {
                    "line": 921,
                    "text": "    // Ensure received CRC matches computed CRC."
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 923,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "checkCRC12"
              ],
              "context": {
                "start_line": 920,
                "end_line": 926,
                "lines": [
                  {
                    "line": 920,
                    "text": ""
                  },
                  {
                    "line": 921,
                    "text": "    // Ensure received CRC matches computed CRC."
                  },
                  {
                    "line": 922,
                    "text": ""
                  },
                  {
                    "line": 923,
                    "text": "    if (checkCRC12(decoded)) {"
                  },
                  {
                    "line": 924,
                    "text": "        message.reserve(12);"
                  },
                  {
                    "line": 925,
                    "text": ""
                  },
                  {
                    "line": 926,
                    "text": "        // Decode the message from the 72 data bits"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 950,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 947,
                "end_line": 953,
                "lines": [
                  {
                    "line": 947,
                    "text": "// This should be 952 bytes in size; to store an 87x87 matrix of bits,"
                  },
                  {
                    "line": 948,
                    "text": "// you need 7569 bits, which requires 119 64-bit values, or 952 bytes."
                  },
                  {
                    "line": 949,
                    "text": "//"
                  },
                  {
                    "line": 950,
                    "text": "// Background here is that this is a low-density parity check code (LDPC),"
                  },
                  {
                    "line": 951,
                    "text": "// generated using the PEG algorithm. In short, true values in a row i of"
                  },
                  {
                    "line": 952,
                    "text": "// the matrix define which of the 87 message bits must be summed, modulo"
                  },
                  {
                    "line": 953,
                    "text": "// 2, to produce the ith parity check bit. Decent references on this are:"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 959,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 956,
                "end_line": 962,
                "lines": [
                  {
                    "line": 956,
                    "text": "//   2. https://inference.org.uk/mackay/PEG_ECC.html"
                  },
                  {
                    "line": 957,
                    "text": "//   3. https://github.com/Lcrypto/classic-PEG-"
                  },
                  {
                    "line": 958,
                    "text": "//"
                  },
                  {
                    "line": 959,
                    "text": "// The data used was harvested from the original 'ldpc_174_87_params.f90',"
                  },
                  {
                    "line": 960,
                    "text": "// but you'll note that the rows have been reordered here, because this"
                  },
                  {
                    "line": 961,
                    "text": "// isn't Fortran; C++ is row-major, not column-major."
                  },
                  {
                    "line": 962,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1084,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1081,
                "end_line": 1087,
                "lines": [
                  {
                    "line": 1081,
                    "text": "    js8::SoftCombiner<N> m_softCombiner;"
                  },
                  {
                    "line": 1082,
                    "text": "    bool m_enableFreqTracking = true;"
                  },
                  {
                    "line": 1083,
                    "text": "    bool m_enableTimingTracking = true;"
                  },
                  {
                    "line": 1084,
                    "text": "    float m_llrErasureThreshold = js8::llrErasureThreshold();"
                  },
                  {
                    "line": 1085,
                    "text": "    bool m_enableLdpcFeedback = js8::ldpcFeedbackEnabled();"
                  },
                  {
                    "line": 1086,
                    "text": "    int m_maxLdpcPasses = js8::ldpcFeedbackMaxPasses();"
                  },
                  {
                    "line": 1087,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1085,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1082,
                "end_line": 1088,
                "lines": [
                  {
                    "line": 1082,
                    "text": "    bool m_enableFreqTracking = true;"
                  },
                  {
                    "line": 1083,
                    "text": "    bool m_enableTimingTracking = true;"
                  },
                  {
                    "line": 1084,
                    "text": "    float m_llrErasureThreshold = js8::llrErasureThreshold();"
                  },
                  {
                    "line": 1085,
                    "text": "    bool m_enableLdpcFeedback = js8::ldpcFeedbackEnabled();"
                  },
                  {
                    "line": 1086,
                    "text": "    int m_maxLdpcPasses = js8::ldpcFeedbackMaxPasses();"
                  },
                  {
                    "line": 1087,
                    "text": ""
                  },
                  {
                    "line": 1088,
                    "text": "    using Plan = FFTWPlanManager::Type;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1086,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1083,
                "end_line": 1089,
                "lines": [
                  {
                    "line": 1083,
                    "text": "    bool m_enableTimingTracking = true;"
                  },
                  {
                    "line": 1084,
                    "text": "    float m_llrErasureThreshold = js8::llrErasureThreshold();"
                  },
                  {
                    "line": 1085,
                    "text": "    bool m_enableLdpcFeedback = js8::ldpcFeedbackEnabled();"
                  },
                  {
                    "line": 1086,
                    "text": "    int m_maxLdpcPasses = js8::ldpcFeedbackMaxPasses();"
                  },
                  {
                    "line": 1087,
                    "text": ""
                  },
                  {
                    "line": 1088,
                    "text": "    using Plan = FFTWPlanManager::Type;"
                  },
                  {
                    "line": 1089,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1473,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten"
              ],
              "context": {
                "start_line": 1470,
                "end_line": 1476,
                "lines": [
                  {
                    "line": 1470,
                    "text": "            symbolWinners[j] = winner;"
                  },
                  {
                    "line": 1471,
                    "text": "        }"
                  },
                  {
                    "line": 1472,
                    "text": ""
                  },
                  {
                    "line": 1473,
                    "text": "        auto const whitening = js8::WhiteningProcessor<NROWS, ND, N>::process("
                  },
                  {
                    "line": 1474,
                    "text": "            s1, symbolWinners, m_llrErasureThreshold,"
                  },
                  {
                    "line": 1475,
                    "text": "            decoder_js8().isDebugEnabled());"
                  },
                  {
                    "line": 1476,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1474,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1471,
                "end_line": 1477,
                "lines": [
                  {
                    "line": 1471,
                    "text": "        }"
                  },
                  {
                    "line": 1472,
                    "text": ""
                  },
                  {
                    "line": 1473,
                    "text": "        auto const whitening = js8::WhiteningProcessor<NROWS, ND, N>::process("
                  },
                  {
                    "line": 1474,
                    "text": "            s1, symbolWinners, m_llrErasureThreshold,"
                  },
                  {
                    "line": 1475,
                    "text": "            decoder_js8().isDebugEnabled());"
                  },
                  {
                    "line": 1476,
                    "text": ""
                  },
                  {
                    "line": 1477,
                    "text": "        auto llr0 = whitening.llr0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1477,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten",
                "llr"
              ],
              "context": {
                "start_line": 1474,
                "end_line": 1480,
                "lines": [
                  {
                    "line": 1474,
                    "text": "            s1, symbolWinners, m_llrErasureThreshold,"
                  },
                  {
                    "line": 1475,
                    "text": "            decoder_js8().isDebugEnabled());"
                  },
                  {
                    "line": 1476,
                    "text": ""
                  },
                  {
                    "line": 1477,
                    "text": "        auto llr0 = whitening.llr0;"
                  },
                  {
                    "line": 1478,
                    "text": "        auto llr1 = whitening.llr1;"
                  },
                  {
                    "line": 1479,
                    "text": ""
                  },
                  {
                    "line": 1480,
                    "text": "        // Only apply a second erasure threshold pass if whitening didn't"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1478,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten",
                "llr"
              ],
              "context": {
                "start_line": 1475,
                "end_line": 1481,
                "lines": [
                  {
                    "line": 1475,
                    "text": "            decoder_js8().isDebugEnabled());"
                  },
                  {
                    "line": 1476,
                    "text": ""
                  },
                  {
                    "line": 1477,
                    "text": "        auto llr0 = whitening.llr0;"
                  },
                  {
                    "line": 1478,
                    "text": "        auto llr1 = whitening.llr1;"
                  },
                  {
                    "line": 1479,
                    "text": ""
                  },
                  {
                    "line": 1480,
                    "text": "        // Only apply a second erasure threshold pass if whitening didn't"
                  },
                  {
                    "line": 1481,
                    "text": "        // already zero low-magnitude LLRs using the configured threshold."
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1480,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten"
              ],
              "context": {
                "start_line": 1477,
                "end_line": 1483,
                "lines": [
                  {
                    "line": 1477,
                    "text": "        auto llr0 = whitening.llr0;"
                  },
                  {
                    "line": 1478,
                    "text": "        auto llr1 = whitening.llr1;"
                  },
                  {
                    "line": 1479,
                    "text": ""
                  },
                  {
                    "line": 1480,
                    "text": "        // Only apply a second erasure threshold pass if whitening didn't"
                  },
                  {
                    "line": 1481,
                    "text": "        // already zero low-magnitude LLRs using the configured threshold."
                  },
                  {
                    "line": 1482,
                    "text": "        if (!whitening.erasureApplied) {"
                  },
                  {
                    "line": 1483,
                    "text": "            std::size_t erasuresAfterThreshold = 0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1481,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1478,
                "end_line": 1484,
                "lines": [
                  {
                    "line": 1478,
                    "text": "        auto llr1 = whitening.llr1;"
                  },
                  {
                    "line": 1479,
                    "text": ""
                  },
                  {
                    "line": 1480,
                    "text": "        // Only apply a second erasure threshold pass if whitening didn't"
                  },
                  {
                    "line": 1481,
                    "text": "        // already zero low-magnitude LLRs using the configured threshold."
                  },
                  {
                    "line": 1482,
                    "text": "        if (!whitening.erasureApplied) {"
                  },
                  {
                    "line": 1483,
                    "text": "            std::size_t erasuresAfterThreshold = 0;"
                  },
                  {
                    "line": 1484,
                    "text": "            double sumAbsPreErasure = 0.0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1482,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "whiten"
              ],
              "context": {
                "start_line": 1479,
                "end_line": 1485,
                "lines": [
                  {
                    "line": 1479,
                    "text": ""
                  },
                  {
                    "line": 1480,
                    "text": "        // Only apply a second erasure threshold pass if whitening didn't"
                  },
                  {
                    "line": 1481,
                    "text": "        // already zero low-magnitude LLRs using the configured threshold."
                  },
                  {
                    "line": 1482,
                    "text": "        if (!whitening.erasureApplied) {"
                  },
                  {
                    "line": 1483,
                    "text": "            std::size_t erasuresAfterThreshold = 0;"
                  },
                  {
                    "line": 1484,
                    "text": "            double sumAbsPreErasure = 0.0;"
                  },
                  {
                    "line": 1485,
                    "text": "            double sumAbsPostErasure = 0.0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1487,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1484,
                "end_line": 1490,
                "lines": [
                  {
                    "line": 1484,
                    "text": "            double sumAbsPreErasure = 0.0;"
                  },
                  {
                    "line": 1485,
                    "text": "            double sumAbsPostErasure = 0.0;"
                  },
                  {
                    "line": 1486,
                    "text": ""
                  },
                  {
                    "line": 1487,
                    "text": "            auto const applyErasureThreshold = [&](auto &llr) {"
                  },
                  {
                    "line": 1488,
                    "text": "                for (auto const value : llr)"
                  },
                  {
                    "line": 1489,
                    "text": "                    sumAbsPreErasure += std::abs(value);"
                  },
                  {
                    "line": 1490,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1488,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1485,
                "end_line": 1491,
                "lines": [
                  {
                    "line": 1485,
                    "text": "            double sumAbsPostErasure = 0.0;"
                  },
                  {
                    "line": 1486,
                    "text": ""
                  },
                  {
                    "line": 1487,
                    "text": "            auto const applyErasureThreshold = [&](auto &llr) {"
                  },
                  {
                    "line": 1488,
                    "text": "                for (auto const value : llr)"
                  },
                  {
                    "line": 1489,
                    "text": "                    sumAbsPreErasure += std::abs(value);"
                  },
                  {
                    "line": 1490,
                    "text": ""
                  },
                  {
                    "line": 1491,
                    "text": "                if (m_llrErasureThreshold > 0.0f) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1491,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1488,
                "end_line": 1494,
                "lines": [
                  {
                    "line": 1488,
                    "text": "                for (auto const value : llr)"
                  },
                  {
                    "line": 1489,
                    "text": "                    sumAbsPreErasure += std::abs(value);"
                  },
                  {
                    "line": 1490,
                    "text": ""
                  },
                  {
                    "line": 1491,
                    "text": "                if (m_llrErasureThreshold > 0.0f) {"
                  },
                  {
                    "line": 1492,
                    "text": "                    for (auto &value : llr) {"
                  },
                  {
                    "line": 1493,
                    "text": "                        if (std::abs(value) < m_llrErasureThreshold) {"
                  },
                  {
                    "line": 1494,
                    "text": "                            value = 0.0f;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1492,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1489,
                "end_line": 1495,
                "lines": [
                  {
                    "line": 1489,
                    "text": "                    sumAbsPreErasure += std::abs(value);"
                  },
                  {
                    "line": 1490,
                    "text": ""
                  },
                  {
                    "line": 1491,
                    "text": "                if (m_llrErasureThreshold > 0.0f) {"
                  },
                  {
                    "line": 1492,
                    "text": "                    for (auto &value : llr) {"
                  },
                  {
                    "line": 1493,
                    "text": "                        if (std::abs(value) < m_llrErasureThreshold) {"
                  },
                  {
                    "line": 1494,
                    "text": "                            value = 0.0f;"
                  },
                  {
                    "line": 1495,
                    "text": "                            ++erasuresAfterThreshold;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1493,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1490,
                "end_line": 1496,
                "lines": [
                  {
                    "line": 1490,
                    "text": ""
                  },
                  {
                    "line": 1491,
                    "text": "                if (m_llrErasureThreshold > 0.0f) {"
                  },
                  {
                    "line": 1492,
                    "text": "                    for (auto &value : llr) {"
                  },
                  {
                    "line": 1493,
                    "text": "                        if (std::abs(value) < m_llrErasureThreshold) {"
                  },
                  {
                    "line": 1494,
                    "text": "                            value = 0.0f;"
                  },
                  {
                    "line": 1495,
                    "text": "                            ++erasuresAfterThreshold;"
                  },
                  {
                    "line": 1496,
                    "text": "                        }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1501,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1498,
                "end_line": 1504,
                "lines": [
                  {
                    "line": 1498,
                    "text": "                        sumAbsPostErasure += std::abs(value);"
                  },
                  {
                    "line": 1499,
                    "text": "                    }"
                  },
                  {
                    "line": 1500,
                    "text": "                } else {"
                  },
                  {
                    "line": 1501,
                    "text": "                    for (auto const value : llr)"
                  },
                  {
                    "line": 1502,
                    "text": "                        sumAbsPostErasure += std::abs(value);"
                  },
                  {
                    "line": 1503,
                    "text": "                }"
                  },
                  {
                    "line": 1504,
                    "text": "            };"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1506,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1503,
                "end_line": 1509,
                "lines": [
                  {
                    "line": 1503,
                    "text": "                }"
                  },
                  {
                    "line": 1504,
                    "text": "            };"
                  },
                  {
                    "line": 1505,
                    "text": ""
                  },
                  {
                    "line": 1506,
                    "text": "            applyErasureThreshold(llr0);"
                  },
                  {
                    "line": 1507,
                    "text": "            applyErasureThreshold(llr1);"
                  },
                  {
                    "line": 1508,
                    "text": ""
                  },
                  {
                    "line": 1509,
                    "text": "            if (decoder_js8().isDebugEnabled()) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1507,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1504,
                "end_line": 1510,
                "lines": [
                  {
                    "line": 1504,
                    "text": "            };"
                  },
                  {
                    "line": 1505,
                    "text": ""
                  },
                  {
                    "line": 1506,
                    "text": "            applyErasureThreshold(llr0);"
                  },
                  {
                    "line": 1507,
                    "text": "            applyErasureThreshold(llr1);"
                  },
                  {
                    "line": 1508,
                    "text": ""
                  },
                  {
                    "line": 1509,
                    "text": "            if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1510,
                    "text": "                auto const total ="
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1511,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1508,
                "end_line": 1514,
                "lines": [
                  {
                    "line": 1508,
                    "text": ""
                  },
                  {
                    "line": 1509,
                    "text": "            if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1510,
                    "text": "                auto const total ="
                  },
                  {
                    "line": 1511,
                    "text": "                    static_cast<double>(llr0.size() + llr1.size());"
                  },
                  {
                    "line": 1512,
                    "text": "                double const avgPre ="
                  },
                  {
                    "line": 1513,
                    "text": "                    total > 0.0 ? sumAbsPreErasure / total : 0.0;"
                  },
                  {
                    "line": 1514,
                    "text": "                double const avgPost ="
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1518,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1515,
                "end_line": 1521,
                "lines": [
                  {
                    "line": 1515,
                    "text": "                    total > 0.0 ? sumAbsPostErasure / total : 0.0;"
                  },
                  {
                    "line": 1516,
                    "text": ""
                  },
                  {
                    "line": 1517,
                    "text": "                qCDebug(decoder_js8)"
                  },
                  {
                    "line": 1518,
                    "text": "                    << \"LLR erasure threshold\" << m_llrErasureThreshold"
                  },
                  {
                    "line": 1519,
                    "text": "                    << \"erasures:\" << erasuresAfterThreshold"
                  },
                  {
                    "line": 1520,
                    "text": "                    << \"avg|LLR| pre/post:\" << avgPre << avgPost;"
                  },
                  {
                    "line": 1521,
                    "text": "            }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1520,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1517,
                "end_line": 1523,
                "lines": [
                  {
                    "line": 1517,
                    "text": "                qCDebug(decoder_js8)"
                  },
                  {
                    "line": 1518,
                    "text": "                    << \"LLR erasure threshold\" << m_llrErasureThreshold"
                  },
                  {
                    "line": 1519,
                    "text": "                    << \"erasures:\" << erasuresAfterThreshold"
                  },
                  {
                    "line": 1520,
                    "text": "                    << \"avg|LLR| pre/post:\" << avgPre << avgPost;"
                  },
                  {
                    "line": 1521,
                    "text": "            }"
                  },
                  {
                    "line": 1522,
                    "text": "        }"
                  },
                  {
                    "line": 1523,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1529,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1526,
                "end_line": 1532,
                "lines": [
                  {
                    "line": 1526,
                    "text": "        m_softCombiner.flush(ttl);"
                  },
                  {
                    "line": 1527,
                    "text": ""
                  },
                  {
                    "line": 1528,
                    "text": "        auto const key ="
                  },
                  {
                    "line": 1529,
                    "text": "            m_softCombiner.makeKey(Mode::NSUBMODE, f1, xdt, llr0, llr1);"
                  },
                  {
                    "line": 1530,
                    "text": "        auto combined = m_softCombiner.combine(key, llr0, llr1, ttl);"
                  },
                  {
                    "line": 1531,
                    "text": ""
                  },
                  {
                    "line": 1532,
                    "text": "        auto llr0Combined = combined.llr0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1530,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1527,
                "end_line": 1533,
                "lines": [
                  {
                    "line": 1527,
                    "text": ""
                  },
                  {
                    "line": 1528,
                    "text": "        auto const key ="
                  },
                  {
                    "line": 1529,
                    "text": "            m_softCombiner.makeKey(Mode::NSUBMODE, f1, xdt, llr0, llr1);"
                  },
                  {
                    "line": 1530,
                    "text": "        auto combined = m_softCombiner.combine(key, llr0, llr1, ttl);"
                  },
                  {
                    "line": 1531,
                    "text": ""
                  },
                  {
                    "line": 1532,
                    "text": "        auto llr0Combined = combined.llr0;"
                  },
                  {
                    "line": 1533,
                    "text": "        auto llr1Combined = combined.llr1;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1532,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1529,
                "end_line": 1535,
                "lines": [
                  {
                    "line": 1529,
                    "text": "            m_softCombiner.makeKey(Mode::NSUBMODE, f1, xdt, llr0, llr1);"
                  },
                  {
                    "line": 1530,
                    "text": "        auto combined = m_softCombiner.combine(key, llr0, llr1, ttl);"
                  },
                  {
                    "line": 1531,
                    "text": ""
                  },
                  {
                    "line": 1532,
                    "text": "        auto llr0Combined = combined.llr0;"
                  },
                  {
                    "line": 1533,
                    "text": "        auto llr1Combined = combined.llr1;"
                  },
                  {
                    "line": 1534,
                    "text": ""
                  },
                  {
                    "line": 1535,
                    "text": "        std::array<int8_t, K> decoded;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1533,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1530,
                "end_line": 1536,
                "lines": [
                  {
                    "line": 1530,
                    "text": "        auto combined = m_softCombiner.combine(key, llr0, llr1, ttl);"
                  },
                  {
                    "line": 1531,
                    "text": ""
                  },
                  {
                    "line": 1532,
                    "text": "        auto llr0Combined = combined.llr0;"
                  },
                  {
                    "line": 1533,
                    "text": "        auto llr1Combined = combined.llr1;"
                  },
                  {
                    "line": 1534,
                    "text": ""
                  },
                  {
                    "line": 1535,
                    "text": "        std::array<int8_t, K> decoded;"
                  },
                  {
                    "line": 1536,
                    "text": "        std::array<int8_t, N> cw;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1538,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1535,
                "end_line": 1541,
                "lines": [
                  {
                    "line": 1535,
                    "text": "        std::array<int8_t, K> decoded;"
                  },
                  {
                    "line": 1536,
                    "text": "        std::array<int8_t, N> cw;"
                  },
                  {
                    "line": 1537,
                    "text": ""
                  },
                  {
                    "line": 1538,
                    "text": "        int totalLdpcPasses = 0;"
                  },
                  {
                    "line": 1539,
                    "text": "        bool usedFeedbackPass = false;"
                  },
                  {
                    "line": 1540,
                    "text": "        bool feedbackTurnedSuccess = false;"
                  },
                  {
                    "line": 1541,
                    "text": "        int feedbackConfident = 0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1544,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1541,
                "end_line": 1547,
                "lines": [
                  {
                    "line": 1541,
                    "text": "        int feedbackConfident = 0;"
                  },
                  {
                    "line": 1542,
                    "text": "        int feedbackUncertain = 0;"
                  },
                  {
                    "line": 1543,
                    "text": ""
                  },
                  {
                    "line": 1544,
                    "text": "        auto const tryDecode = [&](std::array<float, N> const &llrInput,"
                  },
                  {
                    "line": 1545,
                    "text": "                                   int ipass) -> std::optional<Decode> {"
                  },
                  {
                    "line": 1546,
                    "text": "            nharderrors = bpdecode174(llrInput, decoded, cw);"
                  },
                  {
                    "line": 1547,
                    "text": "            xsnr = -99.0f;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1546,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1543,
                "end_line": 1549,
                "lines": [
                  {
                    "line": 1543,
                    "text": ""
                  },
                  {
                    "line": 1544,
                    "text": "        auto const tryDecode = [&](std::array<float, N> const &llrInput,"
                  },
                  {
                    "line": 1545,
                    "text": "                                   int ipass) -> std::optional<Decode> {"
                  },
                  {
                    "line": 1546,
                    "text": "            nharderrors = bpdecode174(llrInput, decoded, cw);"
                  },
                  {
                    "line": 1547,
                    "text": "            xsnr = -99.0f;"
                  },
                  {
                    "line": 1548,
                    "text": ""
                  },
                  {
                    "line": 1549,
                    "text": "            if (std::all_of(cw.begin(), cw.end(),"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1558,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "checkCRC12"
              ],
              "context": {
                "start_line": 1555,
                "end_line": 1561,
                "lines": [
                  {
                    "line": 1555,
                    "text": "                !(sync < 2.0f && nharderrors > 35) &&"
                  },
                  {
                    "line": 1556,
                    "text": "                !(ipass > 2 && nharderrors > 39) &&"
                  },
                  {
                    "line": 1557,
                    "text": "                !(ipass == 4 && nharderrors > 30)) {"
                  },
                  {
                    "line": 1558,
                    "text": "                if (checkCRC12(decoded)) {"
                  },
                  {
                    "line": 1559,
                    "text": "                    if (syncStats)"
                  },
                  {
                    "line": 1560,
                    "text": "                        emitEvent(JS8::Event::SyncState{"
                  },
                  {
                    "line": 1561,
                    "text": "                            JS8::Event::SyncState::Type::DECODED,"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1567,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "message174",
                "extractmessage174"
              ],
              "context": {
                "start_line": 1564,
                "end_line": 1570,
                "lines": [
                  {
                    "line": 1564,
                    "text": "                            xdt2,"
                  },
                  {
                    "line": 1565,
                    "text": "                            {.decoded = sync}});"
                  },
                  {
                    "line": 1566,
                    "text": ""
                  },
                  {
                    "line": 1567,
                    "text": "                    auto message = extractmessage174(decoded);"
                  },
                  {
                    "line": 1568,
                    "text": ""
                  },
                  {
                    "line": 1569,
                    "text": "                    int const i3bit ="
                  },
                  {
                    "line": 1570,
                    "text": "                        (decoded[72] << 2) | (decoded[73] << 1) | decoded[74];"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1604,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1601,
                "end_line": 1607,
                "lines": [
                  {
                    "line": 1601,
                    "text": "        };"
                  },
                  {
                    "line": 1602,
                    "text": ""
                  },
                  {
                    "line": 1603,
                    "text": "        // Loop over decoding passes"
                  },
                  {
                    "line": 1604,
                    "text": "        for (int ipass = 1; ipass <= 4 && totalLdpcPasses < m_maxLdpcPasses;"
                  },
                  {
                    "line": 1605,
                    "text": "             ++ipass) {"
                  },
                  {
                    "line": 1606,
                    "text": "            auto &llr = ipass == 2 ? llr1Combined : llr0Combined;"
                  },
                  {
                    "line": 1607,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1606,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1603,
                "end_line": 1609,
                "lines": [
                  {
                    "line": 1603,
                    "text": "        // Loop over decoding passes"
                  },
                  {
                    "line": 1604,
                    "text": "        for (int ipass = 1; ipass <= 4 && totalLdpcPasses < m_maxLdpcPasses;"
                  },
                  {
                    "line": 1605,
                    "text": "             ++ipass) {"
                  },
                  {
                    "line": 1606,
                    "text": "            auto &llr = ipass == 2 ? llr1Combined : llr0Combined;"
                  },
                  {
                    "line": 1607,
                    "text": ""
                  },
                  {
                    "line": 1608,
                    "text": "            // Zero ranges for certain passes to mirror legacy behavior."
                  },
                  {
                    "line": 1609,
                    "text": "            if (ipass == 3)"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1610,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1607,
                "end_line": 1613,
                "lines": [
                  {
                    "line": 1607,
                    "text": ""
                  },
                  {
                    "line": 1608,
                    "text": "            // Zero ranges for certain passes to mirror legacy behavior."
                  },
                  {
                    "line": 1609,
                    "text": "            if (ipass == 3)"
                  },
                  {
                    "line": 1610,
                    "text": "                std::fill(llr0Combined.begin(), llr0Combined.begin() + 24,"
                  },
                  {
                    "line": 1611,
                    "text": "                          0.0f);"
                  },
                  {
                    "line": 1612,
                    "text": "            else if (ipass == 4)"
                  },
                  {
                    "line": 1613,
                    "text": "                std::fill(llr0Combined.begin() + 24, llr0Combined.begin() + 48,"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1613,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1610,
                "end_line": 1616,
                "lines": [
                  {
                    "line": 1610,
                    "text": "                std::fill(llr0Combined.begin(), llr0Combined.begin() + 24,"
                  },
                  {
                    "line": 1611,
                    "text": "                          0.0f);"
                  },
                  {
                    "line": 1612,
                    "text": "            else if (ipass == 4)"
                  },
                  {
                    "line": 1613,
                    "text": "                std::fill(llr0Combined.begin() + 24, llr0Combined.begin() + 48,"
                  },
                  {
                    "line": 1614,
                    "text": "                          0.0f);"
                  },
                  {
                    "line": 1615,
                    "text": ""
                  },
                  {
                    "line": 1616,
                    "text": "            std::array<float, N> llrPrimary = llr;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1616,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1613,
                "end_line": 1619,
                "lines": [
                  {
                    "line": 1613,
                    "text": "                std::fill(llr0Combined.begin() + 24, llr0Combined.begin() + 48,"
                  },
                  {
                    "line": 1614,
                    "text": "                          0.0f);"
                  },
                  {
                    "line": 1615,
                    "text": ""
                  },
                  {
                    "line": 1616,
                    "text": "            std::array<float, N> llrPrimary = llr;"
                  },
                  {
                    "line": 1617,
                    "text": "            if (auto result = tryDecode(llrPrimary, ipass)) {"
                  },
                  {
                    "line": 1618,
                    "text": "                ++totalLdpcPasses;"
                  },
                  {
                    "line": 1619,
                    "text": "                return result;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1617,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1614,
                "end_line": 1620,
                "lines": [
                  {
                    "line": 1614,
                    "text": "                          0.0f);"
                  },
                  {
                    "line": 1615,
                    "text": ""
                  },
                  {
                    "line": 1616,
                    "text": "            std::array<float, N> llrPrimary = llr;"
                  },
                  {
                    "line": 1617,
                    "text": "            if (auto result = tryDecode(llrPrimary, ipass)) {"
                  },
                  {
                    "line": 1618,
                    "text": "                ++totalLdpcPasses;"
                  },
                  {
                    "line": 1619,
                    "text": "                return result;"
                  },
                  {
                    "line": 1620,
                    "text": "            }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1618,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1615,
                "end_line": 1621,
                "lines": [
                  {
                    "line": 1615,
                    "text": ""
                  },
                  {
                    "line": 1616,
                    "text": "            std::array<float, N> llrPrimary = llr;"
                  },
                  {
                    "line": 1617,
                    "text": "            if (auto result = tryDecode(llrPrimary, ipass)) {"
                  },
                  {
                    "line": 1618,
                    "text": "                ++totalLdpcPasses;"
                  },
                  {
                    "line": 1619,
                    "text": "                return result;"
                  },
                  {
                    "line": 1620,
                    "text": "            }"
                  },
                  {
                    "line": 1621,
                    "text": "            ++totalLdpcPasses;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1621,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1618,
                "end_line": 1624,
                "lines": [
                  {
                    "line": 1618,
                    "text": "                ++totalLdpcPasses;"
                  },
                  {
                    "line": 1619,
                    "text": "                return result;"
                  },
                  {
                    "line": 1620,
                    "text": "            }"
                  },
                  {
                    "line": 1621,
                    "text": "            ++totalLdpcPasses;"
                  },
                  {
                    "line": 1622,
                    "text": ""
                  },
                  {
                    "line": 1623,
                    "text": "            // Feedback refinement and second attempt, if enabled and budget"
                  },
                  {
                    "line": 1624,
                    "text": "            // allows."
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1625,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1622,
                "end_line": 1628,
                "lines": [
                  {
                    "line": 1622,
                    "text": ""
                  },
                  {
                    "line": 1623,
                    "text": "            // Feedback refinement and second attempt, if enabled and budget"
                  },
                  {
                    "line": 1624,
                    "text": "            // allows."
                  },
                  {
                    "line": 1625,
                    "text": "            if (m_enableLdpcFeedback && totalLdpcPasses < m_maxLdpcPasses) {"
                  },
                  {
                    "line": 1626,
                    "text": "                std::array<float, N> llrRefined;"
                  },
                  {
                    "line": 1627,
                    "text": "                int confident = 0;"
                  },
                  {
                    "line": 1628,
                    "text": "                int uncertain = 0;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1626,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1623,
                "end_line": 1629,
                "lines": [
                  {
                    "line": 1623,
                    "text": "            // Feedback refinement and second attempt, if enabled and budget"
                  },
                  {
                    "line": 1624,
                    "text": "            // allows."
                  },
                  {
                    "line": 1625,
                    "text": "            if (m_enableLdpcFeedback && totalLdpcPasses < m_maxLdpcPasses) {"
                  },
                  {
                    "line": 1626,
                    "text": "                std::array<float, N> llrRefined;"
                  },
                  {
                    "line": 1627,
                    "text": "                int confident = 0;"
                  },
                  {
                    "line": 1628,
                    "text": "                int uncertain = 0;"
                  },
                  {
                    "line": 1629,
                    "text": "                js8::refineLlrsWithLdpcFeedback("
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1629,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr",
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1626,
                "end_line": 1632,
                "lines": [
                  {
                    "line": 1626,
                    "text": "                std::array<float, N> llrRefined;"
                  },
                  {
                    "line": 1627,
                    "text": "                int confident = 0;"
                  },
                  {
                    "line": 1628,
                    "text": "                int uncertain = 0;"
                  },
                  {
                    "line": 1629,
                    "text": "                js8::refineLlrsWithLdpcFeedback("
                  },
                  {
                    "line": 1630,
                    "text": "                    llrPrimary, cw, m_llrErasureThreshold, llrRefined,"
                  },
                  {
                    "line": 1631,
                    "text": "                    confident, uncertain);"
                  },
                  {
                    "line": 1632,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1630,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1627,
                "end_line": 1633,
                "lines": [
                  {
                    "line": 1627,
                    "text": "                int confident = 0;"
                  },
                  {
                    "line": 1628,
                    "text": "                int uncertain = 0;"
                  },
                  {
                    "line": 1629,
                    "text": "                js8::refineLlrsWithLdpcFeedback("
                  },
                  {
                    "line": 1630,
                    "text": "                    llrPrimary, cw, m_llrErasureThreshold, llrRefined,"
                  },
                  {
                    "line": 1631,
                    "text": "                    confident, uncertain);"
                  },
                  {
                    "line": 1632,
                    "text": ""
                  },
                  {
                    "line": 1633,
                    "text": "                if (decoder_js8().isDebugEnabled()) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1635,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1632,
                "end_line": 1638,
                "lines": [
                  {
                    "line": 1632,
                    "text": ""
                  },
                  {
                    "line": 1633,
                    "text": "                if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1634,
                    "text": "                    qCDebug(decoder_js8)"
                  },
                  {
                    "line": 1635,
                    "text": "                        << \"LDPC feedback pass\""
                  },
                  {
                    "line": 1636,
                    "text": "                        << \"ipass\" << ipass << \"confident\" << confident"
                  },
                  {
                    "line": 1637,
                    "text": "                        << \"uncertain\" << uncertain;"
                  },
                  {
                    "line": 1638,
                    "text": "                }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1644,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 1641,
                "end_line": 1647,
                "lines": [
                  {
                    "line": 1641,
                    "text": "                feedbackConfident += confident;"
                  },
                  {
                    "line": 1642,
                    "text": "                feedbackUncertain += uncertain;"
                  },
                  {
                    "line": 1643,
                    "text": ""
                  },
                  {
                    "line": 1644,
                    "text": "                if (auto result = tryDecode(llrRefined, ipass)) {"
                  },
                  {
                    "line": 1645,
                    "text": "                    ++totalLdpcPasses;"
                  },
                  {
                    "line": 1646,
                    "text": "                    feedbackTurnedSuccess = true;"
                  },
                  {
                    "line": 1647,
                    "text": "                    if (decoder_js8().isDebugEnabled()) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1645,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1642,
                "end_line": 1648,
                "lines": [
                  {
                    "line": 1642,
                    "text": "                feedbackUncertain += uncertain;"
                  },
                  {
                    "line": 1643,
                    "text": ""
                  },
                  {
                    "line": 1644,
                    "text": "                if (auto result = tryDecode(llrRefined, ipass)) {"
                  },
                  {
                    "line": 1645,
                    "text": "                    ++totalLdpcPasses;"
                  },
                  {
                    "line": 1646,
                    "text": "                    feedbackTurnedSuccess = true;"
                  },
                  {
                    "line": 1647,
                    "text": "                    if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1648,
                    "text": "                        qCDebug(decoder_js8)"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1649,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1646,
                "end_line": 1652,
                "lines": [
                  {
                    "line": 1646,
                    "text": "                    feedbackTurnedSuccess = true;"
                  },
                  {
                    "line": 1647,
                    "text": "                    if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1648,
                    "text": "                        qCDebug(decoder_js8)"
                  },
                  {
                    "line": 1649,
                    "text": "                            << \"LDPC feedback succeeded on second pass\""
                  },
                  {
                    "line": 1650,
                    "text": "                            << \"ipass\" << ipass << \"confident\""
                  },
                  {
                    "line": 1651,
                    "text": "                            << feedbackConfident << \"uncertain\""
                  },
                  {
                    "line": 1652,
                    "text": "                            << feedbackUncertain << \"passes\" << totalLdpcPasses;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1652,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1649,
                "end_line": 1655,
                "lines": [
                  {
                    "line": 1649,
                    "text": "                            << \"LDPC feedback succeeded on second pass\""
                  },
                  {
                    "line": 1650,
                    "text": "                            << \"ipass\" << ipass << \"confident\""
                  },
                  {
                    "line": 1651,
                    "text": "                            << feedbackConfident << \"uncertain\""
                  },
                  {
                    "line": 1652,
                    "text": "                            << feedbackUncertain << \"passes\" << totalLdpcPasses;"
                  },
                  {
                    "line": 1653,
                    "text": "                    }"
                  },
                  {
                    "line": 1654,
                    "text": "                    return result;"
                  },
                  {
                    "line": 1655,
                    "text": "                }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1657,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1654,
                "end_line": 1660,
                "lines": [
                  {
                    "line": 1654,
                    "text": "                    return result;"
                  },
                  {
                    "line": 1655,
                    "text": "                }"
                  },
                  {
                    "line": 1656,
                    "text": ""
                  },
                  {
                    "line": 1657,
                    "text": "                ++totalLdpcPasses;"
                  },
                  {
                    "line": 1658,
                    "text": "            }"
                  },
                  {
                    "line": 1659,
                    "text": "        }"
                  },
                  {
                    "line": 1660,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1663,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1660,
                "end_line": 1666,
                "lines": [
                  {
                    "line": 1660,
                    "text": ""
                  },
                  {
                    "line": 1661,
                    "text": "        if (decoder_js8().isDebugEnabled()) {"
                  },
                  {
                    "line": 1662,
                    "text": "            qCDebug(decoder_js8)"
                  },
                  {
                    "line": 1663,
                    "text": "                << \"LDPC feedback summary\""
                  },
                  {
                    "line": 1664,
                    "text": "                << \"used\" << usedFeedbackPass << \"success\""
                  },
                  {
                    "line": 1665,
                    "text": "                << feedbackTurnedSuccess << \"confident\" << feedbackConfident"
                  },
                  {
                    "line": 1666,
                    "text": "                << \"uncertain\" << feedbackUncertain << \"passes\""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/JS8.cpp",
              "line": 1667,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "LDPC",
                "ldpc"
              ],
              "context": {
                "start_line": 1664,
                "end_line": 1670,
                "lines": [
                  {
                    "line": 1664,
                    "text": "                << \"used\" << usedFeedbackPass << \"success\""
                  },
                  {
                    "line": 1665,
                    "text": "                << feedbackTurnedSuccess << \"confident\" << feedbackConfident"
                  },
                  {
                    "line": 1666,
                    "text": "                << \"uncertain\" << feedbackUncertain << \"passes\""
                  },
                  {
                    "line": 1667,
                    "text": "                << totalLdpcPasses;"
                  },
                  {
                    "line": 1668,
                    "text": "        }"
                  },
                  {
                    "line": 1669,
                    "text": ""
                  },
                  {
                    "line": 1670,
                    "text": "        logTracker(\"fail\");"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 22,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 19,
                "end_line": 25,
                "lines": [
                  {
                    "line": 19,
                    "text": ""
                  },
                  {
                    "line": 20,
                    "text": "namespace js8 {"
                  },
                  {
                    "line": 21,
                    "text": "/**"
                  },
                  {
                    "line": 22,
                    "text": " * @brief Cache and combine repeated LLR frames for the same decode candidate."
                  },
                  {
                    "line": 23,
                    "text": " *"
                  },
                  {
                    "line": 24,
                    "text": " * Uses a coarse freq/dt bin and a small LLR signature as the key; repeated"
                  },
                  {
                    "line": 25,
                    "text": " * receptions accumulate LLRs to improve decode probability without changing"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 24,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 21,
                "end_line": 27,
                "lines": [
                  {
                    "line": 21,
                    "text": "/**"
                  },
                  {
                    "line": 22,
                    "text": " * @brief Cache and combine repeated LLR frames for the same decode candidate."
                  },
                  {
                    "line": 23,
                    "text": " *"
                  },
                  {
                    "line": 24,
                    "text": " * Uses a coarse freq/dt bin and a small LLR signature as the key; repeated"
                  },
                  {
                    "line": 25,
                    "text": " * receptions accumulate LLRs to improve decode probability without changing"
                  },
                  {
                    "line": 26,
                    "text": " * over-the-air behavior. Templated on the LLR length so the caller binds it"
                  },
                  {
                    "line": 27,
                    "text": " * to the decoder's bit count."
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 25,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 22,
                "end_line": 28,
                "lines": [
                  {
                    "line": 22,
                    "text": " * @brief Cache and combine repeated LLR frames for the same decode candidate."
                  },
                  {
                    "line": 23,
                    "text": " *"
                  },
                  {
                    "line": 24,
                    "text": " * Uses a coarse freq/dt bin and a small LLR signature as the key; repeated"
                  },
                  {
                    "line": 25,
                    "text": " * receptions accumulate LLRs to improve decode probability without changing"
                  },
                  {
                    "line": 26,
                    "text": " * over-the-air behavior. Templated on the LLR length so the caller binds it"
                  },
                  {
                    "line": 27,
                    "text": " * to the decoder's bit count."
                  },
                  {
                    "line": 28,
                    "text": " */"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 26,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 23,
                "end_line": 29,
                "lines": [
                  {
                    "line": 23,
                    "text": " *"
                  },
                  {
                    "line": 24,
                    "text": " * Uses a coarse freq/dt bin and a small LLR signature as the key; repeated"
                  },
                  {
                    "line": 25,
                    "text": " * receptions accumulate LLRs to improve decode probability without changing"
                  },
                  {
                    "line": 26,
                    "text": " * over-the-air behavior. Templated on the LLR length so the caller binds it"
                  },
                  {
                    "line": 27,
                    "text": " * to the decoder's bit count."
                  },
                  {
                    "line": 28,
                    "text": " */"
                  },
                  {
                    "line": 29,
                    "text": "template <std::size_t N> class SoftCombiner {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 47,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 44,
                "end_line": 50,
                "lines": [
                  {
                    "line": 44,
                    "text": ""
                  },
                  {
                    "line": 45,
                    "text": "    struct Combined {"
                  },
                  {
                    "line": 46,
                    "text": "        Key key;"
                  },
                  {
                    "line": 47,
                    "text": "        std::array<float, N> llr0;"
                  },
                  {
                    "line": 48,
                    "text": "        std::array<float, N> llr1;"
                  },
                  {
                    "line": 49,
                    "text": "        int repeats;"
                  },
                  {
                    "line": 50,
                    "text": "        bool combined;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 48,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 45,
                "end_line": 51,
                "lines": [
                  {
                    "line": 45,
                    "text": "    struct Combined {"
                  },
                  {
                    "line": 46,
                    "text": "        Key key;"
                  },
                  {
                    "line": 47,
                    "text": "        std::array<float, N> llr0;"
                  },
                  {
                    "line": 48,
                    "text": "        std::array<float, N> llr1;"
                  },
                  {
                    "line": 49,
                    "text": "        int repeats;"
                  },
                  {
                    "line": 50,
                    "text": "        bool combined;"
                  },
                  {
                    "line": 51,
                    "text": "    };"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 65,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 62,
                "end_line": 68,
                "lines": [
                  {
                    "line": 62,
                    "text": "            maybeRunSelfTest();"
                  },
                  {
                    "line": 63,
                    "text": "    }"
                  },
                  {
                    "line": 64,
                    "text": ""
                  },
                  {
                    "line": 65,
                    "text": "    Key makeKey(int mode, float f1, float dt, std::array<float, N> const &llr0,"
                  },
                  {
                    "line": 66,
                    "text": "                std::array<float, N> const &llr1) const {"
                  },
                  {
                    "line": 67,
                    "text": "        return Key{mode, static_cast<int>(std::lround(f1)),"
                  },
                  {
                    "line": 68,
                    "text": "                   static_cast<int>(std::lround(dt * 10.0f)), // 100 ms bins"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 66,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 63,
                "end_line": 69,
                "lines": [
                  {
                    "line": 63,
                    "text": "    }"
                  },
                  {
                    "line": 64,
                    "text": ""
                  },
                  {
                    "line": 65,
                    "text": "    Key makeKey(int mode, float f1, float dt, std::array<float, N> const &llr0,"
                  },
                  {
                    "line": 66,
                    "text": "                std::array<float, N> const &llr1) const {"
                  },
                  {
                    "line": 67,
                    "text": "        return Key{mode, static_cast<int>(std::lround(f1)),"
                  },
                  {
                    "line": 68,
                    "text": "                   static_cast<int>(std::lround(dt * 10.0f)), // 100 ms bins"
                  },
                  {
                    "line": 69,
                    "text": "                   signature(llr0, llr1)};"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 69,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 66,
                "end_line": 72,
                "lines": [
                  {
                    "line": 66,
                    "text": "                std::array<float, N> const &llr1) const {"
                  },
                  {
                    "line": 67,
                    "text": "        return Key{mode, static_cast<int>(std::lround(f1)),"
                  },
                  {
                    "line": 68,
                    "text": "                   static_cast<int>(std::lround(dt * 10.0f)), // 100 ms bins"
                  },
                  {
                    "line": 69,
                    "text": "                   signature(llr0, llr1)};"
                  },
                  {
                    "line": 70,
                    "text": "    }"
                  },
                  {
                    "line": 71,
                    "text": ""
                  },
                  {
                    "line": 72,
                    "text": "    Combined combine(Key const &key, std::array<float, N> const &llr0,"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 72,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 69,
                "end_line": 75,
                "lines": [
                  {
                    "line": 69,
                    "text": "                   signature(llr0, llr1)};"
                  },
                  {
                    "line": 70,
                    "text": "    }"
                  },
                  {
                    "line": 71,
                    "text": ""
                  },
                  {
                    "line": 72,
                    "text": "    Combined combine(Key const &key, std::array<float, N> const &llr0,"
                  },
                  {
                    "line": 73,
                    "text": "                     std::array<float, N> const &llr1,"
                  },
                  {
                    "line": 74,
                    "text": "                     std::chrono::seconds ttl) {"
                  },
                  {
                    "line": 75,
                    "text": "        flush(ttl);"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 73,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 70,
                "end_line": 76,
                "lines": [
                  {
                    "line": 70,
                    "text": "    }"
                  },
                  {
                    "line": 71,
                    "text": ""
                  },
                  {
                    "line": 72,
                    "text": "    Combined combine(Key const &key, std::array<float, N> const &llr0,"
                  },
                  {
                    "line": 73,
                    "text": "                     std::array<float, N> const &llr1,"
                  },
                  {
                    "line": 74,
                    "text": "                     std::chrono::seconds ttl) {"
                  },
                  {
                    "line": 75,
                    "text": "        flush(ttl);"
                  },
                  {
                    "line": 76,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 78,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 75,
                "end_line": 81,
                "lines": [
                  {
                    "line": 75,
                    "text": "        flush(ttl);"
                  },
                  {
                    "line": 76,
                    "text": ""
                  },
                  {
                    "line": 77,
                    "text": "        if (!m_enabled) {"
                  },
                  {
                    "line": 78,
                    "text": "            return Combined{key, llr0, llr1, 1, false};"
                  },
                  {
                    "line": 79,
                    "text": "        }"
                  },
                  {
                    "line": 80,
                    "text": ""
                  },
                  {
                    "line": 81,
                    "text": "        auto &bucket = m_entries[keyForLookup(key)];"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 85,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 82,
                "end_line": 88,
                "lines": [
                  {
                    "line": 82,
                    "text": "        auto it = findEntry(bucket, key.signature);"
                  },
                  {
                    "line": 83,
                    "text": ""
                  },
                  {
                    "line": 84,
                    "text": "        if (it == bucket.end()) {"
                  },
                  {
                    "line": 85,
                    "text": "            bucket.push_back(makeEntry(key.signature, llr0, llr1));"
                  },
                  {
                    "line": 86,
                    "text": "            return Combined{key, llr0, llr1, 1, false};"
                  },
                  {
                    "line": 87,
                    "text": "        }"
                  },
                  {
                    "line": 88,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 86,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 83,
                "end_line": 89,
                "lines": [
                  {
                    "line": 83,
                    "text": ""
                  },
                  {
                    "line": 84,
                    "text": "        if (it == bucket.end()) {"
                  },
                  {
                    "line": 85,
                    "text": "            bucket.push_back(makeEntry(key.signature, llr0, llr1));"
                  },
                  {
                    "line": 86,
                    "text": "            return Combined{key, llr0, llr1, 1, false};"
                  },
                  {
                    "line": 87,
                    "text": "        }"
                  },
                  {
                    "line": 88,
                    "text": ""
                  },
                  {
                    "line": 89,
                    "text": "        for (std::size_t i = 0; i < llr0.size(); ++i) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 89,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 86,
                "end_line": 92,
                "lines": [
                  {
                    "line": 86,
                    "text": "            return Combined{key, llr0, llr1, 1, false};"
                  },
                  {
                    "line": 87,
                    "text": "        }"
                  },
                  {
                    "line": 88,
                    "text": ""
                  },
                  {
                    "line": 89,
                    "text": "        for (std::size_t i = 0; i < llr0.size(); ++i) {"
                  },
                  {
                    "line": 90,
                    "text": "            it->llr0[i] += llr0[i];"
                  },
                  {
                    "line": 91,
                    "text": "            it->llr1[i] += llr1[i];"
                  },
                  {
                    "line": 92,
                    "text": "        }"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 90,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 87,
                "end_line": 93,
                "lines": [
                  {
                    "line": 87,
                    "text": "        }"
                  },
                  {
                    "line": 88,
                    "text": ""
                  },
                  {
                    "line": 89,
                    "text": "        for (std::size_t i = 0; i < llr0.size(); ++i) {"
                  },
                  {
                    "line": 90,
                    "text": "            it->llr0[i] += llr0[i];"
                  },
                  {
                    "line": 91,
                    "text": "            it->llr1[i] += llr1[i];"
                  },
                  {
                    "line": 92,
                    "text": "        }"
                  },
                  {
                    "line": 93,
                    "text": ""
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 91,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 88,
                "end_line": 94,
                "lines": [
                  {
                    "line": 88,
                    "text": ""
                  },
                  {
                    "line": 89,
                    "text": "        for (std::size_t i = 0; i < llr0.size(); ++i) {"
                  },
                  {
                    "line": 90,
                    "text": "            it->llr0[i] += llr0[i];"
                  },
                  {
                    "line": 91,
                    "text": "            it->llr1[i] += llr1[i];"
                  },
                  {
                    "line": 92,
                    "text": "        }"
                  },
                  {
                    "line": 93,
                    "text": ""
                  },
                  {
                    "line": 94,
                    "text": "        ++it->repeats;"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 101,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 98,
                "end_line": 104,
                "lines": [
                  {
                    "line": 98,
                    "text": "            << \"soft-combining repeats\" << it->repeats << \"mode\" << key.mode"
                  },
                  {
                    "line": 99,
                    "text": "            << \"freq\" << key.freqBin << \"dtbin\" << key.dtBin;"
                  },
                  {
                    "line": 100,
                    "text": ""
                  },
                  {
                    "line": 101,
                    "text": "        return Combined{key, it->llr0, it->llr1, it->repeats, true};"
                  },
                  {
                    "line": 102,
                    "text": "    }"
                  },
                  {
                    "line": 103,
                    "text": ""
                  },
                  {
                    "line": 104,
                    "text": "    void markDecoded(Key const &key) {"
                  }
                ]
              }
            },
            {
              "name": "keyword_context",
              "path": "JS8_Mode/soft_combiner.h",
              "line": 170,
              "kind": "source_snippet",
              "confidence": "source_evidence",
              "matched_keywords": [
                "llr"
              ],
              "context": {
                "start_line": 167,
                "end_line": 173,
                "lines": [
                  {
                    "line": 167,
                    "text": ""
                  },
                  {
                    "line": 168,
                    "text": "    struct Entry {"
                  },
                  {
                    "line": 169,
                    "text": "        uint32_t signature;"
                  },
                  {
                    "line": 170,
                    "text": "        std::array<float, N> llr0;"
                  },
                  {
                    "line": 171,
                    "text": "        std::array<float, N> llr1;"
                  },
                  {
                    "line": 172,
                    "text": "        int repeats;"
                  },
                  {
                    "line": 173,
                    "text": "        Clock::time_point lastSeen;"
                  }
                ]
              }
            }
          ]
        },
        "info87_rows_found": 319,
        "source_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T145731Z_info87-source-map-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T145731Z_info87_source_map_probe_output.json",
            "exists": true,
            "info87_row_count": 25,
            "row_paths_preview": [
              "$.best_candidate.info87_bitstring",
              "$.top_candidates[0].info87_bitstring",
              "$.top_candidates[1].info87_bitstring",
              "$.top_candidates[2].info87_bitstring",
              "$.top_candidates[3].info87_bitstring",
              "$.top_candidates[4].info87_bitstring",
              "$.top_candidates[5].info87_bitstring",
              "$.top_candidates[6].info87_bitstring"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T144602Z_info87-source-map-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T144602Z_post_ldpc_info87_runtime_export_output.json",
            "exists": true,
            "info87_row_count": 25,
            "row_paths_preview": [
              "$.best_runtime_info87_row.info87_bits",
              "$.runtime_info87_rows_preview[0].info87_bits",
              "$.runtime_info87_rows_preview[1].info87_bits",
              "$.runtime_info87_rows_preview[2].info87_bits",
              "$.runtime_info87_rows_preview[3].info87_bits",
              "$.runtime_info87_rows_preview[4].info87_bits",
              "$.runtime_info87_rows_preview[5].info87_bits",
              "$.runtime_info87_rows_preview[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T143645Z_post-ldpc-info87-runtime-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T143645Z_post_ldpc_info87_runtime_export_output.json",
            "exists": true,
            "info87_row_count": 25,
            "row_paths_preview": [
              "$.best_runtime_info87_row.info87_bits",
              "$.runtime_info87_rows_preview[0].info87_bits",
              "$.runtime_info87_rows_preview[1].info87_bits",
              "$.runtime_info87_rows_preview[2].info87_bits",
              "$.runtime_info87_rows_preview[3].info87_bits",
              "$.runtime_info87_rows_preview[4].info87_bits",
              "$.runtime_info87_rows_preview[5].info87_bits",
              "$.runtime_info87_rows_preview[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T142247Z_info87-llr-row-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "exists": true,
            "info87_row_count": 121,
            "row_paths_preview": [
              "$.best_overall_candidate.info87_bits",
              "$.top_llr_row_exports[0].hard_bits",
              "$.top_llr_row_exports[1].hard_bits",
              "$.top_llr_row_exports[2].hard_bits",
              "$.top_llr_row_exports[3].hard_bits",
              "$.top_llr_row_exports[4].hard_bits",
              "$.top_llr_row_exports[5].hard_bits",
              "$.top_llr_row_exports[6].hard_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141941Z_info87-ldpc-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141941Z_info87_ldpc_export_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_info87_export.info87_bits",
              "$.top_info87_exports[0].info87_bits",
              "$.top_info87_exports[1].info87_bits",
              "$.top_info87_exports[2].info87_bits",
              "$.top_info87_exports[3].info87_bits",
              "$.top_info87_exports[4].info87_bits",
              "$.top_info87_exports[5].info87_bits",
              "$.top_info87_exports[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141520Z_info87-reorder-dewhiten_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_candidate.candidate_bits",
              "$.top_candidates[0].candidate_bits",
              "$.top_candidates[1].candidate_bits",
              "$.top_candidates[2].candidate_bits",
              "$.top_candidates[3].candidate_bits",
              "$.top_candidates[4].candidate_bits",
              "$.top_candidates[5].candidate_bits",
              "$.top_candidates[6].candidate_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T140319Z_info87-ldpc-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T140319Z_info87_ldpc_export_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_info87_export.info87_bits",
              "$.top_info87_exports[0].info87_bits",
              "$.top_info87_exports[1].info87_bits",
              "$.top_info87_exports[2].info87_bits",
              "$.top_info87_exports[3].info87_bits",
              "$.top_info87_exports[4].info87_bits",
              "$.top_info87_exports[5].info87_bits",
              "$.top_info87_exports[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T134516Z_message174-crc12-onebit-repair_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T134516Z_message174_crc12_onebit_repair_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T133332Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T133332Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T132423Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T132423Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T131546Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T131546Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T125938Z_source-message174-crc12-contract_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T125938Z_source_message174_crc12_contract_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/step55_source_message174_crc12_contract.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111112Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111112Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111109Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111109Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104839Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104839Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104836Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104836Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104133Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104133Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083033Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083033Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083030Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083030Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T082046Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T082046Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081203Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081203Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081200Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081200Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T080216Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T080216Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074601Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074601Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074558Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074558Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073615Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073615Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073629Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073629Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073626Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073626Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T072638Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T072638Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071643Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071643Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071640Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071640Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T070658Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T070658Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065456Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065456Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065453Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065453Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T064500Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T064500Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063119Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063119Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063116Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063116Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T062127Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T062127Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060652Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060652Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060649Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060649Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T055654Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T055654Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T053939Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T053939Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T053936Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T053936Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T052959Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          }
        ],
        "source_exact_map_count": 0,
        "map_tests": 240,
        "zero_distance_candidate_count": 76,
        "best_distance": 0,
        "best_candidate": {
          "source_file": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
          "json_path": "$.best_candidate.candidate_bits",
          "row_index": 237,
          "source_kind": "generic_bit_list",
          "map_name": "raw",
          "map_source": null,
          "distance": 0,
          "crc_match": true,
          "message_preview_12chars": "001XqOA2iDZ0",
          "received_crc12": 2920,
          "computed_crc12": 2920,
          "message_words_6bit": [
            0,
            0,
            1,
            33,
            52,
            24,
            10,
            2,
            44,
            13,
            35,
            0
          ],
          "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
        },
        "top_candidates": [
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
            "json_path": "$.best_candidate.candidate_bits",
            "row_index": 237,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
            "json_path": "$.top_candidates[0].candidate_bits",
            "row_index": 238,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
            "json_path": "$.top_candidates[1].candidate_bits",
            "row_index": 239,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[0].hard_bits",
            "row_index": 76,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[2].hard_bits",
            "row_index": 78,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[3].hard_bits",
            "row_index": 79,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[5].hard_bits",
            "row_index": 81,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[6].hard_bits",
            "row_index": 82,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[8].hard_bits",
            "row_index": 84,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[9].hard_bits",
            "row_index": 85,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[11].hard_bits",
            "row_index": 87,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[12].hard_bits",
            "row_index": 88,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[14].hard_bits",
            "row_index": 90,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[15].hard_bits",
            "row_index": 91,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[17].hard_bits",
            "row_index": 93,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[18].hard_bits",
            "row_index": 94,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[20].hard_bits",
            "row_index": 96,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[21].hard_bits",
            "row_index": 97,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[23].hard_bits",
            "row_index": 99,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[24].hard_bits",
            "row_index": 100,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[26].hard_bits",
            "row_index": 102,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[27].hard_bits",
            "row_index": 103,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[29].hard_bits",
            "row_index": 105,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[30].hard_bits",
            "row_index": 106,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[32].hard_bits",
            "row_index": 108,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[33].hard_bits",
            "row_index": 109,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[35].hard_bits",
            "row_index": 111,
            "source_kind": "generic_bit_list",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_bit_row_exports[9].info87_bits",
            "row_index": 145,
            "source_kind": "info87_bits",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_bit_row_exports[10].info87_bits",
            "row_index": 146,
            "source_kind": "info87_bits",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_bit_row_exports[11].info87_bits",
            "row_index": 147,
            "source_kind": "info87_bits",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_bit_row_exports[12].info87_bits",
            "row_index": 148,
            "source_kind": "info87_bits",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_bit_row_exports[13].info87_bits",
            "row_index": 149,
            "source_kind": "info87_bits",
            "map_name": "raw",
            "map_source": null,
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          }
        ],
        "decodes": [],
        "warnings": [
          "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."
        ],
        "next_action": "Zero-distance message174/CRC12 candidate found: build Step64 source-confirmed message174 text unpack and WebFTR-style decodes[] output."
      }
    },
    "info87_source_map_probe": {
      "name": "20260527T145731Z_info87_source_map_probe_output.json",
      "path": "/decoders/js8_decoder/logs/20260527T145731Z_info87_source_map_probe_output.json",
      "url": "/logs/20260527T145731Z_info87_source_map_probe_output.json",
      "stat": {
        "exists": true,
        "is_file": true,
        "is_dir": false,
        "size": 35860,
        "mtime_utc": "2026-05-27T14:57:32Z"
      },
      "json_preview": {
        "ok": true,
        "tool": "webftr-js8-info87-source-map-probe",
        "tool_version": "step62-source-derived-deinterleaver-whitening-map-probe",
        "rx_only_guard": {
          "tx": false,
          "ptt": false,
          "tune": false,
          "send": false,
          "js8call_runtime_control": false
        },
        "no_gui_runtime_started": true,
        "log_dir": "/decoders/js8_decoder/logs",
        "sources_scanned": 80,
        "info87_rows_found": 294,
        "map_tests": 4998,
        "zero_distance_candidate_count": 94,
        "best_distance": 0,
        "best_candidate": {
          "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
          "json_path": "$.top_llr_row_exports[1].hard_bits",
          "row_index": 2,
          "map_name": "invert_all87",
          "distance": 0,
          "crc_match": true,
          "message_preview_12chars": "001XqOA2iDZ0",
          "received_crc12": 2920,
          "computed_crc12": 2920,
          "message_words_6bit": [
            0,
            0,
            1,
            33,
            52,
            24,
            10,
            2,
            44,
            13,
            35,
            0
          ],
          "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
        },
        "top_candidates": [
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[1].hard_bits",
            "row_index": 2,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[4].hard_bits",
            "row_index": 5,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[7].hard_bits",
            "row_index": 8,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[10].hard_bits",
            "row_index": 11,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[13].hard_bits",
            "row_index": 14,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[16].hard_bits",
            "row_index": 17,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[19].hard_bits",
            "row_index": 20,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[22].hard_bits",
            "row_index": 23,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[25].hard_bits",
            "row_index": 26,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[28].hard_bits",
            "row_index": 29,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[31].hard_bits",
            "row_index": 32,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[34].hard_bits",
            "row_index": 35,
            "map_name": "invert_all87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[1].hard_bits",
            "row_index": 2,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[4].hard_bits",
            "row_index": 5,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[7].hard_bits",
            "row_index": 8,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[10].hard_bits",
            "row_index": 11,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[13].hard_bits",
            "row_index": 14,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[16].hard_bits",
            "row_index": 17,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[19].hard_bits",
            "row_index": 20,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[22].hard_bits",
            "row_index": 23,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "001XqOA2iDZ0",
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "message_words_6bit": [
              0,
              0,
              1,
              33,
              52,
              24,
              10,
              2,
              44,
              13,
              35,
              0
            ],
            "info87_bitstring": "000000000000000001100001110100011000001010000010101100001101100011000000000101101101000"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[25].hard_bits",
            "row_index": 26,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[28].hard_bits",
            "row_index": 29,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[31].hard_bits",
            "row_index": 32,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          },
          {
            "source_file": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "json_path": "$.top_llr_row_exports[34].hard_bits",
            "row_index": 35,
            "map_name": "invert_first_87",
            "distance": 0,
            "crc_match": true,
            "message_preview_12chars": "Q0VsKWqfJ96x",
            "received_crc12": 980,
            "computed_crc12": 980,
            "message_words_6bit": [
              26,
              0,
              31,
              54,
              20,
              32,
              52,
              41,
              19,
              9,
              6,
              59
            ],
            "info87_bitstring": "011010000000011111110110010100100000110100101001010011001001000110111011101001111010100"
          }
        ],
        "source_reports": [
          {
            "path": "/decoders/js8_decoder/logs/20260527T145731Z_info87_source_map_probe_output.json",
            "exists": true,
            "error": "json_load_failed: Expecting value: line 1 column 1 (char 0)"
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T144602Z_info87-source-map-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T144602Z_post_ldpc_info87_runtime_export_output.json",
            "exists": true,
            "info87_row_count": 25,
            "row_paths_preview": [
              "$.best_runtime_info87_row.info87_bits",
              "$.runtime_info87_rows_preview[0].info87_bits",
              "$.runtime_info87_rows_preview[1].info87_bits",
              "$.runtime_info87_rows_preview[2].info87_bits",
              "$.runtime_info87_rows_preview[3].info87_bits",
              "$.runtime_info87_rows_preview[4].info87_bits",
              "$.runtime_info87_rows_preview[5].info87_bits",
              "$.runtime_info87_rows_preview[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T143645Z_post-ldpc-info87-runtime-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T143645Z_post_ldpc_info87_runtime_export_output.json",
            "exists": true,
            "info87_row_count": 25,
            "row_paths_preview": [
              "$.best_runtime_info87_row.info87_bits",
              "$.runtime_info87_rows_preview[0].info87_bits",
              "$.runtime_info87_rows_preview[1].info87_bits",
              "$.runtime_info87_rows_preview[2].info87_bits",
              "$.runtime_info87_rows_preview[3].info87_bits",
              "$.runtime_info87_rows_preview[4].info87_bits",
              "$.runtime_info87_rows_preview[5].info87_bits",
              "$.runtime_info87_rows_preview[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T142247Z_info87-llr-row-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T142247Z_info87_llr_row_export_output.json",
            "exists": true,
            "info87_row_count": 121,
            "row_paths_preview": [
              "$.best_overall_candidate.info87_bits",
              "$.top_llr_row_exports[0].hard_bits",
              "$.top_llr_row_exports[1].hard_bits",
              "$.top_llr_row_exports[2].hard_bits",
              "$.top_llr_row_exports[3].hard_bits",
              "$.top_llr_row_exports[4].hard_bits",
              "$.top_llr_row_exports[5].hard_bits",
              "$.top_llr_row_exports[6].hard_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141941Z_info87-ldpc-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141941Z_info87_ldpc_export_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_info87_export.info87_bits",
              "$.top_info87_exports[0].info87_bits",
              "$.top_info87_exports[1].info87_bits",
              "$.top_info87_exports[2].info87_bits",
              "$.top_info87_exports[3].info87_bits",
              "$.top_info87_exports[4].info87_bits",
              "$.top_info87_exports[5].info87_bits",
              "$.top_info87_exports[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141520Z_info87-reorder-dewhiten_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T141520Z_info87_reorder_dewhiten_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_candidate.candidate_bits",
              "$.top_candidates[0].candidate_bits",
              "$.top_candidates[1].candidate_bits",
              "$.top_candidates[2].candidate_bits",
              "$.top_candidates[3].candidate_bits",
              "$.top_candidates[4].candidate_bits",
              "$.top_candidates[5].candidate_bits",
              "$.top_candidates[6].candidate_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T140319Z_info87-ldpc-export_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T140319Z_info87_ldpc_export_output.json",
            "exists": true,
            "info87_row_count": 41,
            "row_paths_preview": [
              "$.best_info87_export.info87_bits",
              "$.top_info87_exports[0].info87_bits",
              "$.top_info87_exports[1].info87_bits",
              "$.top_info87_exports[2].info87_bits",
              "$.top_info87_exports[3].info87_bits",
              "$.top_info87_exports[4].info87_bits",
              "$.top_info87_exports[5].info87_bits",
              "$.top_info87_exports[6].info87_bits"
            ]
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T134516Z_message174-crc12-onebit-repair_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T134516Z_message174_crc12_onebit_repair_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T133332Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T133332Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T132423Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T132423Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T131546Z_message174-crc12-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T131546Z_message174_crc12_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T125938Z_source-message174-crc12-contract_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T125938Z_source_message174_crc12_contract_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/step55_source_message174_crc12_contract.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111112Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111112Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111109Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T111109Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T110128Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104839Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104839Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104836Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104836Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104133Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T104133Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083033Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083033Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083030Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T083030Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T082046Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T082046Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081203Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081203Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081200Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T081200Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T080216Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T080216Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074601Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074601Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074558Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T074558Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073615Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073615Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073629Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073629Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073626Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T073626Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T072638Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T072638Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071643Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071643Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071640Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T071640Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T070658Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T070658Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065456Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065456Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065453Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T065453Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T064500Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T064500Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063119Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063119Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063116Z_ldpc-matrix-probe_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T063116Z_ldpc_matrix_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T062127Z_real_run_candidate_export_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T062127Z_real_run_auto_ldpc_probe_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060652Z_ldpc-soft-decode_manifest.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          },
          {
            "path": "/decoders/js8_decoder/logs/20260527T060652Z_ldpc_soft_decode_output.json",
            "exists": true,
            "info87_row_count": 0,
            "row_paths_preview": []
          }
        ],
        "maps_tested": [
          "raw",
          "invert_all87",
          "reverse_all87",
          "reverse_each_6bit_word",
          "reverse_12_word_order",
          "reverse_each_byte_like_8",
          "invert_first_72/75/87",
          "rotate +/-1..3"
        ],
        "decodes": [],
        "warnings": [
          "This is a bounded source-map/dewhitening diagnostic against existing runtime rows, not a final text decoder.",
          "If no zero-distance candidate appears, the next step should export source-derived interleaver/whitening indices directly from JS8Call-Improved source snippets and apply them before LDPC/message validation."
        ],
        "next_action": "If best_distance reaches 0, implement source-confirmed message174 text unpack. If not, build Step63 to extract exact JS8Call-Improved interleaver/whitening index arrays and apply them before post-LDPC Info87 export."
      }
    }
  },
  "bundles": [
    {
      "name": "js8_decoder_lab_real_run_20260527T110128Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T110128Z.zip",
      "size": 5270021,
      "mtime_utc": "2026-05-27T11:12:34Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T104133Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T104133Z.zip",
      "size": 4699383,
      "mtime_utc": "2026-05-27T10:50:00Z"
    },
    {
      "name": "js8_decoder_lab_full_audit_20260527T100315Z.zip",
      "url": "/logs/js8_decoder_lab_full_audit_20260527T100315Z.zip",
      "size": 4129065,
      "mtime_utc": "2026-05-27T10:03:35Z"
    },
    {
      "name": "js8_decoder_lab_full_audit_20260527T084305Z.zip",
      "url": "/logs/js8_decoder_lab_full_audit_20260527T084305Z.zip",
      "size": 4007964,
      "mtime_utc": "2026-05-27T08:51:47Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T082046Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T082046Z.zip",
      "size": 4028163,
      "mtime_utc": "2026-05-27T08:31:54Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T080216Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T080216Z.zip",
      "size": 3541087,
      "mtime_utc": "2026-05-27T08:12:23Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T073615Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T073615Z.zip",
      "size": 3065595,
      "mtime_utc": "2026-05-27T07:46:16Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T072638Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T072638Z.zip",
      "size": 2615145,
      "mtime_utc": "2026-05-27T07:36:45Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T070658Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T070658Z.zip",
      "size": 2232505,
      "mtime_utc": "2026-05-27T07:16:58Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T064500Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T064500Z.zip",
      "size": 1771764,
      "mtime_utc": "2026-05-27T06:55:08Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T062127Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T062127Z.zip",
      "size": 1595958,
      "mtime_utc": "2026-05-27T06:31:30Z"
    },
    {
      "name": "js8_decoder_lab_real_run_20260527T055654Z.zip",
      "url": "/logs/js8_decoder_lab_real_run_20260527T055654Z.zip",
      "size": 1408988,
      "mtime_utc": "2026-05-27T06:07:00Z"
    }
  ],
  "stable_latest_links": {
    "browser_report": "/logs/js8_browser_report_latest.json",
    "input_check": "/logs/js8_server_input_check_latest.json",
    "quick_window_scan": "/logs/js8_server_quick_window_scan_latest.json",
    "sync_probe": "/logs/js8_server_sync_probe_latest.json",
    "latest_log": "/logs/latest.log",
    "webftr_rx_ui_contract_latest": "/logs/js8_webftr_rx_ui_contract_latest.json",
    "jsc_decompress_source_audit_latest": "/logs/js8_jsc_decompress_source_audit_latest.json",
    "data_frame_text_unpack_probe_latest": "/logs/js8_data_frame_text_unpack_probe_latest.json",
    "jsc_table_extract_probe_latest": "/logs/js8_jsc_table_extract_probe_latest.json",
    "jsc_decompress_port_probe_latest": "/logs/js8_jsc_decompress_port_probe_latest.json",
    "real_fixture_intake_helper_latest": "/logs/js8_real_fixture_intake_helper_latest.json",
    "real_compressed_fixture_request_latest": "/logs/js8_real_compressed_fixture_request_latest.json",
    "compressed_frame_fixture_gate_latest": "/logs/js8_compressed_frame_fixture_gate_latest.json",
    "varicode_compressed_bitslice_jsc_bridge_latest": "/logs/js8_varicode_compressed_bitslice_jsc_bridge_latest.json"
  },
  "recent_files": [
    {
      "name": "js8_browser_report_latest.json",
      "size": 1296033,
      "mtime_utc": "2026-05-27T23:11:44Z",
      "url": "/logs/js8_browser_report_latest.json"
    },
    {
      "name": "js8_browser_server.log",
      "size": 24396,
      "mtime_utc": "2026-05-27T23:11:44Z",
      "url": "/logs/js8_browser_server.log"
    },
    {
      "name": "js8_start_diagnostics_latest.log",
      "size": 5113,
      "mtime_utc": "2026-05-27T19:39:47Z",
      "url": "/logs/js8_start_diagnostics_latest.log"
    },
    {
      "name": "20260527T193942Z_real-compressed-fixture-intake-helper.log",
      "size": 4770,
      "mtime_utc": "2026-05-27T19:39:47Z",
      "url": "/logs/20260527T193942Z_real-compressed-fixture-intake-helper.log"
    },
    {
      "name": "latest.log",
      "size": 4770,
      "mtime_utc": "2026-05-27T19:39:47Z",
      "url": "/logs/latest.log"
    },
    {
      "name": "20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json",
      "size": 1474,
      "mtime_utc": "2026-05-27T19:39:45Z",
      "url": "/logs/20260527T193942Z_real-compressed-fixture-intake-helper_manifest.json"
    },
    {
      "name": "js8_real_fixture_intake_helper_latest.json",
      "size": 3719,
      "mtime_utc": "2026-05-27T19:39:45Z",
      "url": "/logs/js8_real_fixture_intake_helper_latest.json"
    },
    {
      "name": "20260527T193942Z_real_fixture_intake_helper_output.json",
      "size": 3719,
      "mtime_utc": "2026-05-27T19:39:45Z",
      "url": "/logs/20260527T193942Z_real_fixture_intake_helper_output.json"
    },
    {
      "name": "js8_real_compressed_fixture_request_latest.json",
      "size": 4961,
      "mtime_utc": "2026-05-27T19:39:45Z",
      "url": "/logs/js8_real_compressed_fixture_request_latest.json"
    },
    {
      "name": "js8_compressed_frame_fixture_gate_latest.json",
      "size": 28609,
      "mtime_utc": "2026-05-27T19:39:45Z",
      "url": "/logs/js8_compressed_frame_fixture_gate_latest.json"
    },
    {
      "name": "20260527T193942Z_real_fixture_intake_helper_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T19:39:42Z",
      "url": "/logs/20260527T193942Z_real_fixture_intake_helper_output.stderr.log"
    },
    {
      "name": "20260527T192543Z_real-compressed-fixture-request.log",
      "size": 6072,
      "mtime_utc": "2026-05-27T19:25:48Z",
      "url": "/logs/20260527T192543Z_real-compressed-fixture-request.log"
    },
    {
      "name": "20260527T192543Z_real-compressed-fixture-request_manifest.json",
      "size": 1326,
      "mtime_utc": "2026-05-27T19:25:46Z",
      "url": "/logs/20260527T192543Z_real-compressed-fixture-request_manifest.json"
    },
    {
      "name": "20260527T192543Z_real_compressed_fixture_request_output.json",
      "size": 5067,
      "mtime_utc": "2026-05-27T19:25:46Z",
      "url": "/logs/20260527T192543Z_real_compressed_fixture_request_output.json"
    },
    {
      "name": "20260527T192543Z_real_compressed_fixture_request_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T19:25:43Z",
      "url": "/logs/20260527T192543Z_real_compressed_fixture_request_output.stderr.log"
    },
    {
      "name": "20260527T191502Z_compressed-frame-fixture-gate-probe.log",
      "size": 29732,
      "mtime_utc": "2026-05-27T19:15:07Z",
      "url": "/logs/20260527T191502Z_compressed-frame-fixture-gate-probe.log"
    },
    {
      "name": "20260527T191502Z_compressed-frame-fixture-gate-probe_manifest.json",
      "size": 1224,
      "mtime_utc": "2026-05-27T19:15:06Z",
      "url": "/logs/20260527T191502Z_compressed-frame-fixture-gate-probe_manifest.json"
    },
    {
      "name": "20260527T191502Z_compressed_frame_fixture_gate_output.json",
      "size": 28714,
      "mtime_utc": "2026-05-27T19:15:06Z",
      "url": "/logs/20260527T191502Z_compressed_frame_fixture_gate_output.json"
    },
    {
      "name": "20260527T191502Z_compressed_frame_fixture_gate_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T19:15:03Z",
      "url": "/logs/20260527T191502Z_compressed_frame_fixture_gate_output.stderr.log"
    },
    {
      "name": "20260527T191357Z_compressed-frame-fixture-gate-probe.log",
      "size": 29732,
      "mtime_utc": "2026-05-27T19:14:01Z",
      "url": "/logs/20260527T191357Z_compressed-frame-fixture-gate-probe.log"
    },
    {
      "name": "20260527T191357Z_compressed-frame-fixture-gate-probe_manifest.json",
      "size": 1224,
      "mtime_utc": "2026-05-27T19:14:00Z",
      "url": "/logs/20260527T191357Z_compressed-frame-fixture-gate-probe_manifest.json"
    },
    {
      "name": "20260527T191357Z_compressed_frame_fixture_gate_output.json",
      "size": 28714,
      "mtime_utc": "2026-05-27T19:14:00Z",
      "url": "/logs/20260527T191357Z_compressed_frame_fixture_gate_output.json"
    },
    {
      "name": "20260527T191357Z_compressed_frame_fixture_gate_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T19:13:57Z",
      "url": "/logs/20260527T191357Z_compressed_frame_fixture_gate_output.stderr.log"
    },
    {
      "name": "20260527T190533Z_varicode-compressed-bitslice-jsc-bridge-probe.log",
      "size": 14593,
      "mtime_utc": "2026-05-27T19:05:38Z",
      "url": "/logs/20260527T190533Z_varicode-compressed-bitslice-jsc-bridge-probe.log"
    },
    {
      "name": "20260527T190533Z_varicode-compressed-bitslice-jsc-bridge-probe_manifest.json",
      "size": 1275,
      "mtime_utc": "2026-05-27T19:05:37Z",
      "url": "/logs/20260527T190533Z_varicode-compressed-bitslice-jsc-bridge-probe_manifest.json"
    },
    {
      "name": "js8_varicode_compressed_bitslice_jsc_bridge_latest.json",
      "size": 13508,
      "mtime_utc": "2026-05-27T19:05:36Z",
      "url": "/logs/js8_varicode_compressed_bitslice_jsc_bridge_latest.json"
    },
    {
      "name": "20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.json",
      "size": 13508,
      "mtime_utc": "2026-05-27T19:05:36Z",
      "url": "/logs/20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.json"
    },
    {
      "name": "20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T19:05:33Z",
      "url": "/logs/20260527T190533Z_varicode_compressed_bitslice_jsc_bridge_output.stderr.log"
    },
    {
      "name": "20260527T185247Z_jsc-decompress-port-probe.log",
      "size": 35070,
      "mtime_utc": "2026-05-27T18:52:57Z",
      "url": "/logs/20260527T185247Z_jsc-decompress-port-probe.log"
    },
    {
      "name": "20260527T185247Z_jsc-decompress-port-probe_manifest.json",
      "size": 1295,
      "mtime_utc": "2026-05-27T18:52:55Z",
      "url": "/logs/20260527T185247Z_jsc-decompress-port-probe_manifest.json"
    },
    {
      "name": "js8_jsc_decompress_port_probe_latest.json",
      "size": 10108,
      "mtime_utc": "2026-05-27T18:52:55Z",
      "url": "/logs/js8_jsc_decompress_port_probe_latest.json"
    },
    {
      "name": "20260527T185247Z_jsc_decompress_port_probe_output.json",
      "size": 10108,
      "mtime_utc": "2026-05-27T18:52:55Z",
      "url": "/logs/20260527T185247Z_jsc_decompress_port_probe_output.json"
    },
    {
      "name": "20260527T185247Z_jsc_decompress_port_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:52:52Z",
      "url": "/logs/20260527T185247Z_jsc_decompress_port_probe_output.stderr.log"
    },
    {
      "name": "20260527T185247Z_jsc_table_extract_probe_output.json",
      "size": 23855,
      "mtime_utc": "2026-05-27T18:52:52Z",
      "url": "/logs/20260527T185247Z_jsc_table_extract_probe_output.json"
    },
    {
      "name": "js8_jsc_table_extract_probe_latest.json",
      "size": 23757,
      "mtime_utc": "2026-05-27T18:52:52Z",
      "url": "/logs/js8_jsc_table_extract_probe_latest.json"
    },
    {
      "name": "20260527T185247Z_jsc_table_extract_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:52:47Z",
      "url": "/logs/20260527T185247Z_jsc_table_extract_probe_output.stderr.log"
    },
    {
      "name": "20260527T183918Z_jsc-table-extract-probe.log",
      "size": 31052,
      "mtime_utc": "2026-05-27T18:39:26Z",
      "url": "/logs/20260527T183918Z_jsc-table-extract-probe.log"
    },
    {
      "name": "20260527T183918Z_jsc-table-extract-probe_manifest.json",
      "size": 1286,
      "mtime_utc": "2026-05-27T18:39:25Z",
      "url": "/logs/20260527T183918Z_jsc-table-extract-probe_manifest.json"
    },
    {
      "name": "20260527T183918Z_jsc_table_extract_probe_output.json",
      "size": 23855,
      "mtime_utc": "2026-05-27T18:39:25Z",
      "url": "/logs/20260527T183918Z_jsc_table_extract_probe_output.json"
    },
    {
      "name": "20260527T183918Z_jsc_table_extract_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:39:20Z",
      "url": "/logs/20260527T183918Z_jsc_table_extract_probe_output.stderr.log"
    },
    {
      "name": "20260527T183918Z_data_frame_text_unpack_probe_output.json",
      "size": 6092,
      "mtime_utc": "2026-05-27T18:39:20Z",
      "url": "/logs/20260527T183918Z_data_frame_text_unpack_probe_output.json"
    },
    {
      "name": "js8_data_frame_text_unpack_probe_latest.json",
      "size": 5989,
      "mtime_utc": "2026-05-27T18:39:20Z",
      "url": "/logs/js8_data_frame_text_unpack_probe_latest.json"
    },
    {
      "name": "20260527T183918Z_data_frame_text_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:39:18Z",
      "url": "/logs/20260527T183918Z_data_frame_text_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260527T183331Z_data-frame-text-unpack-probe.log",
      "size": 118659,
      "mtime_utc": "2026-05-27T18:33:37Z",
      "url": "/logs/20260527T183331Z_data-frame-text-unpack-probe.log"
    },
    {
      "name": "20260527T183331Z_data-frame-text-unpack-probe_manifest.json",
      "size": 1298,
      "mtime_utc": "2026-05-27T18:33:36Z",
      "url": "/logs/20260527T183331Z_data-frame-text-unpack-probe_manifest.json"
    },
    {
      "name": "20260527T183331Z_data_frame_text_unpack_probe_output.json",
      "size": 6044,
      "mtime_utc": "2026-05-27T18:33:36Z",
      "url": "/logs/20260527T183331Z_data_frame_text_unpack_probe_output.json"
    },
    {
      "name": "20260527T183331Z_data_frame_text_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:33:33Z",
      "url": "/logs/20260527T183331Z_data_frame_text_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260527T183331Z_jsc_decompress_source_audit_output.json",
      "size": 111479,
      "mtime_utc": "2026-05-27T18:33:33Z",
      "url": "/logs/20260527T183331Z_jsc_decompress_source_audit_output.json"
    },
    {
      "name": "js8_jsc_decompress_source_audit_latest.json",
      "size": 111377,
      "mtime_utc": "2026-05-27T18:33:33Z",
      "url": "/logs/js8_jsc_decompress_source_audit_latest.json"
    },
    {
      "name": "20260527T183331Z_jsc_decompress_source_audit_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:33:31Z",
      "url": "/logs/20260527T183331Z_jsc_decompress_source_audit_output.stderr.log"
    },
    {
      "name": "20260527T182458Z_data-frame-text-unpack-probe.log",
      "size": 118659,
      "mtime_utc": "2026-05-27T18:25:04Z",
      "url": "/logs/20260527T182458Z_data-frame-text-unpack-probe.log"
    },
    {
      "name": "20260527T182458Z_data-frame-text-unpack-probe_manifest.json",
      "size": 1298,
      "mtime_utc": "2026-05-27T18:25:03Z",
      "url": "/logs/20260527T182458Z_data-frame-text-unpack-probe_manifest.json"
    },
    {
      "name": "20260527T182458Z_data_frame_text_unpack_probe_output.json",
      "size": 6044,
      "mtime_utc": "2026-05-27T18:25:03Z",
      "url": "/logs/20260527T182458Z_data_frame_text_unpack_probe_output.json"
    },
    {
      "name": "20260527T182458Z_data_frame_text_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:25:00Z",
      "url": "/logs/20260527T182458Z_data_frame_text_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260527T182458Z_jsc_decompress_source_audit_output.json",
      "size": 111479,
      "mtime_utc": "2026-05-27T18:25:00Z",
      "url": "/logs/20260527T182458Z_jsc_decompress_source_audit_output.json"
    },
    {
      "name": "20260527T182458Z_jsc_decompress_source_audit_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:24:58Z",
      "url": "/logs/20260527T182458Z_jsc_decompress_source_audit_output.stderr.log"
    },
    {
      "name": "20260527T181644Z_jsc-decompress-source-audit.log",
      "size": 118619,
      "mtime_utc": "2026-05-27T18:16:48Z",
      "url": "/logs/20260527T181644Z_jsc-decompress-source-audit.log"
    },
    {
      "name": "20260527T181644Z_jsc-decompress-source-audit_manifest.json",
      "size": 1315,
      "mtime_utc": "2026-05-27T18:16:47Z",
      "url": "/logs/20260527T181644Z_jsc-decompress-source-audit_manifest.json"
    },
    {
      "name": "20260527T181644Z_jsc_decompress_source_audit_output.json",
      "size": 111471,
      "mtime_utc": "2026-05-27T18:16:46Z",
      "url": "/logs/20260527T181644Z_jsc_decompress_source_audit_output.json"
    },
    {
      "name": "20260527T181644Z_jsc_decompress_source_audit_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:16:44Z",
      "url": "/logs/20260527T181644Z_jsc_decompress_source_audit_output.stderr.log"
    },
    {
      "name": "js8_webftr_rx_ui_contract_latest.json",
      "size": 5935,
      "mtime_utc": "2026-05-27T18:16:44Z",
      "url": "/logs/js8_webftr_rx_ui_contract_latest.json"
    },
    {
      "name": "20260527T181644Z_webftr_rx_ui_contract_output.json",
      "size": 6031,
      "mtime_utc": "2026-05-27T18:16:44Z",
      "url": "/logs/20260527T181644Z_webftr_rx_ui_contract_output.json"
    },
    {
      "name": "20260527T181644Z_webftr_rx_ui_contract_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:16:44Z",
      "url": "/logs/20260527T181644Z_webftr_rx_ui_contract_output.stderr.log"
    },
    {
      "name": "20260527T180708Z_webftr-rx-ui-contract-export.log",
      "size": 83835,
      "mtime_utc": "2026-05-27T18:07:13Z",
      "url": "/logs/20260527T180708Z_webftr-rx-ui-contract-export.log"
    },
    {
      "name": "20260527T180708Z_webftr-rx-ui-contract-export_manifest.json",
      "size": 1562,
      "mtime_utc": "2026-05-27T18:07:12Z",
      "url": "/logs/20260527T180708Z_webftr-rx-ui-contract-export_manifest.json"
    },
    {
      "name": "20260527T180708Z_webftr_rx_ui_contract_output.json",
      "size": 6057,
      "mtime_utc": "2026-05-27T18:07:11Z",
      "url": "/logs/20260527T180708Z_webftr_rx_ui_contract_output.json"
    },
    {
      "name": "20260527T180708Z_webftr_rx_ui_contract_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:07:11Z",
      "url": "/logs/20260527T180708Z_webftr_rx_ui_contract_output.stderr.log"
    },
    {
      "name": "20260527T180708Z_source_confirmed_control_frame_rx_release_output.json",
      "size": 9765,
      "mtime_utc": "2026-05-27T18:07:10Z",
      "url": "/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.json"
    },
    {
      "name": "20260527T180708Z_source_confirmed_control_frame_rx_release_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:07:10Z",
      "url": "/logs/20260527T180708Z_source_confirmed_control_frame_rx_release_output.stderr.log"
    },
    {
      "name": "20260527T180708Z_source_varicode_frame_unpack_probe_output.json",
      "size": 60488,
      "mtime_utc": "2026-05-27T18:07:09Z",
      "url": "/logs/20260527T180708Z_source_varicode_frame_unpack_probe_output.json"
    },
    {
      "name": "20260527T180708Z_source_varicode_frame_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:07:08Z",
      "url": "/logs/20260527T180708Z_source_varicode_frame_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260527T180708Z_source_confirmed_message174_decode_output.json",
      "size": 6061,
      "mtime_utc": "2026-05-27T18:07:08Z",
      "url": "/logs/20260527T180708Z_source_confirmed_message174_decode_output.json"
    },
    {
      "name": "20260527T180708Z_source_confirmed_message174_decode_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T18:07:08Z",
      "url": "/logs/20260527T180708Z_source_confirmed_message174_decode_output.stderr.log"
    },
    {
      "name": "20260527T174048Z_source-confirmed-control-frame-rx-release.log",
      "size": 77705,
      "mtime_utc": "2026-05-27T17:40:50Z",
      "url": "/logs/20260527T174048Z_source-confirmed-control-frame-rx-release.log"
    },
    {
      "name": "20260527T174048Z_source-confirmed-control-frame-rx-release_manifest.json",
      "size": 1375,
      "mtime_utc": "2026-05-27T17:40:49Z",
      "url": "/logs/20260527T174048Z_source-confirmed-control-frame-rx-release_manifest.json"
    },
    {
      "name": "20260527T174048Z_source_confirmed_control_frame_rx_release_output.json",
      "size": 9765,
      "mtime_utc": "2026-05-27T17:40:49Z",
      "url": "/logs/20260527T174048Z_source_confirmed_control_frame_rx_release_output.json"
    },
    {
      "name": "20260527T174048Z_source_confirmed_control_frame_rx_release_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T17:40:49Z",
      "url": "/logs/20260527T174048Z_source_confirmed_control_frame_rx_release_output.stderr.log"
    },
    {
      "name": "20260527T174048Z_source_varicode_frame_unpack_probe_output.json",
      "size": 60488,
      "mtime_utc": "2026-05-27T17:40:49Z",
      "url": "/logs/20260527T174048Z_source_varicode_frame_unpack_probe_output.json"
    },
    {
      "name": "20260527T174048Z_source_varicode_frame_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-27T17:40:48Z",
      "url": "/logs/20260527T174048Z_source_varicode_frame_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260527T174048Z_source_confirmed_message174_decode_output.json",
      "size": 6061,
      "mtime_utc": "2026-05-27T17:40:48Z",
      "url": "/logs/20260527T174048Z_source_confirmed_message174_decode_output.json"
    }
  ],
  "browser_links": {
    "home": "/",
    "api_report": "/api/report",
    "logs": "/logs/"
  },
  "note": "Read-only browser report for JS8 Decoder Lab logs. It does not start TX/PTT/Tune/Send or control JS8Call runtime."
}