{
  "ok": true,
  "mode": "JS8",
  "tool": "webftr-js8-profile-scan",
  "tool_version": "step34-ft8-gray-interleaver-llr-tuning",
  "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": "step34_fast_profile_scan_guard_no_message_unpack",
  "wav": {
    "sample_rate": 12000,
    "duration_seconds": 60.0,
    "frames": 720000
  },
  "profile_count": 4,
  "scan_limits": {
    "max_seconds": 60.0,
    "max_starts": 12,
    "max_base_candidates": 8,
    "deep": false
  },
  "profiles": [
    {
      "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": "js8_normal_6192",
      "nsps": 6192,
      "symbol_duration_seconds": 0.516,
      "tone_spacing_hz": 1.937984,
      "note": "0.516 s symbols, 1.938 Hz spacing candidate used in earlier lab steps",
      "ok": true,
      "sync": {
        "start_seconds": 38.184,
        "base_freq_hz": 1012.5,
        "candidate_score": 44.78,
        "costas_hits": 3,
        "avg_margin_db": 4.05,
        "candidate_count": 12
      },
      "frame": {
        "symbols_available_after_start": 42,
        "data_symbol_count_estimate": 35,
        "expected_data_symbols_candidate": 58
      },
      "fec": {
        "soft_bit_count_estimate": 105,
        "missing_soft_bits_estimate": 69,
        "complete_ldpc_input_candidate_estimate": false
      },
      "rank_score": 131.617793
    },
    {
      "profile": "mid_3840",
      "nsps": 3840,
      "symbol_duration_seconds": 0.32,
      "tone_spacing_hz": 3.125,
      "note": "0.320 s symbols, 3.125 Hz spacing candidate",
      "ok": true,
      "sync": {
        "start_seconds": 48.8,
        "base_freq_hz": 1015.0,
        "candidate_score": 47.2,
        "costas_hits": 3,
        "avg_margin_db": 3.8,
        "candidate_count": 12
      },
      "frame": {
        "symbols_available_after_start": 35,
        "data_symbol_count_estimate": 28,
        "expected_data_symbols_candidate": 58
      },
      "fec": {
        "soft_bit_count_estimate": 84,
        "missing_soft_bits_estimate": 90,
        "complete_ldpc_input_candidate_estimate": false
      },
      "rank_score": 116.341034
    },
    {
      "profile": "js8_near_6000",
      "nsps": 6000,
      "symbol_duration_seconds": 0.5,
      "tone_spacing_hz": 2.0,
      "note": "0.500 s timing guard candidate",
      "ok": true,
      "sync": {
        "start_seconds": 52.25,
        "base_freq_hz": 1010.0,
        "candidate_score": 38.27,
        "costas_hits": 2,
        "avg_margin_db": 5.7,
        "candidate_count": 12
      },
      "frame": {
        "symbols_available_after_start": 15,
        "data_symbol_count_estimate": 8,
        "expected_data_symbols_candidate": 58
      },
      "fec": {
        "soft_bit_count_estimate": 24,
        "missing_soft_bits_estimate": 150,
        "complete_ldpc_input_candidate_estimate": false
      },
      "rank_score": 61.900224
    }
  ],
  "selected_profile": {
    "profile": "js8_near_6400",
    "nsps": 6400,
    "rank_score": 225.085,
    "complete_ldpc_input_candidate_estimate": true,
    "soft_bit_count_estimate": 174,
    "missing_soft_bits_estimate": 0
  },
  "decodes": [],
  "warnings": [
    "Step 34 selects the best timing/profile candidate only. It still does not decode final JS8 text."
  ],
  "next_action": "Run auto-ldpc-probe on the same WAV so the selected timing profile is fed into the LDPC probe harness."
}
