{
  "ok": true,
  "mode": "JS8",
  "tool": "webftr-js8-auto-ldpc-probe",
  "tool_version": "step32-anchored-candidate-fast-export-guard",
  "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": "step32_auto_profile_to_ldpc_probe_no_message_unpack",
  "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
  },
  "profile_scan": {
    "ok": true,
    "mode": "JS8",
    "tool": "webftr-js8-profile-scan",
    "tool_version": "step32-anchored-candidate-fast-export-guard",
    "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": "step32_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 32 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."
  },
  "ldpc_probe": {
    "expected_bits": 174,
    "matrix": {
      "provided": false,
      "real_protocol_matrix": false,
      "status": "no_external_h_matrix_supplied",
      "note": "No JS8/FT8 LDPC H matrix was supplied. Step 32 therefore reports readiness/LLR quality and a prototype parity probe only; it does not claim real FEC decode."
    },
    "prototype_parity_rows_used": true,
    "prototype_row_count": 32,
    "variant_count": 5,
    "variants": [
      {
        "name": "raw_msb_symbol_order",
        "description": "Current Step7/8 FEC bridge: Costas-stripped symbols, MSB-first tone bits.",
        "bit_count": 174,
        "complete_174bit_candidate": true,
        "preview_bits_available": 174,
        "hard_weight_preview": 36,
        "hard_zero_preview": 138,
        "llr_stats": {
          "count": 174,
          "avg_abs": 2.298973,
          "min_abs": 0.012672,
          "max_abs": 4.421458,
          "positive_llr_count": 141,
          "negative_llr_count": 33,
          "zero_llr_count": 0,
          "sign_balance": 0.62069
        },
        "syndrome_probe": {
          "available": true,
          "row_count": 32,
          "unsatisfied_rows": 19,
          "satisfied_rows": 13,
          "unsatisfied_ratio": 0.59375,
          "syndrome_preview": [
            1,
            1,
            0,
            1,
            1,
            1,
            1,
            0,
            0,
            1,
            1,
            0,
            1,
            1,
            1,
            1
          ]
        },
        "real_ldpc_decode_attempted": false,
        "real_ldpc_decode_success": false,
        "rank_score": 94.352142
      },
      {
        "name": "lsb_within_each_tone",
        "description": "Same symbols, but each 3-bit tone value reversed for bit-order comparison.",
        "bit_count": 174,
        "complete_174bit_candidate": true,
        "preview_bits_available": 174,
        "hard_weight_preview": 36,
        "hard_zero_preview": 138,
        "llr_stats": {
          "count": 174,
          "avg_abs": 2.298973,
          "min_abs": 0.012672,
          "max_abs": 4.421458,
          "positive_llr_count": 141,
          "negative_llr_count": 33,
          "zero_llr_count": 0,
          "sign_balance": 0.62069
        },
        "syndrome_probe": {
          "available": true,
          "row_count": 32,
          "unsatisfied_rows": 17,
          "satisfied_rows": 15,
          "unsatisfied_ratio": 0.53125,
          "syndrome_preview": [
            1,
            0,
            1,
            1,
            1,
            1,
            1,
            0,
            1,
            1,
            0,
            1,
            0,
            1,
            0,
            1
          ]
        },
        "real_ldpc_decode_attempted": false,
        "real_ldpc_decode_success": false,
        "rank_score": 95.914642
      },
      {
        "name": "reverse_symbol_order",
        "description": "Same 3-bit symbols in reverse order; diagnostic only.",
        "bit_count": 174,
        "complete_174bit_candidate": true,
        "preview_bits_available": 174,
        "hard_weight_preview": 36,
        "hard_zero_preview": 138,
        "llr_stats": {
          "count": 174,
          "avg_abs": 2.298973,
          "min_abs": 0.012672,
          "max_abs": 4.421458,
          "positive_llr_count": 141,
          "negative_llr_count": 33,
          "zero_llr_count": 0,
          "sign_balance": 0.62069
        },
        "syndrome_probe": {
          "available": true,
          "row_count": 32,
          "unsatisfied_rows": 18,
          "satisfied_rows": 14,
          "unsatisfied_ratio": 0.5625,
          "syndrome_preview": [
            1,
            1,
            0,
            0,
            1,
            0,
            0,
            0,
            1,
            0,
            1,
            1,
            1,
            1,
            0,
            1
          ]
        },
        "real_ldpc_decode_attempted": false,
        "real_ldpc_decode_success": false,
        "rank_score": 95.133392
      },
      {
        "name": "reverse_full_bitstream",
        "description": "Full hard-bit stream reversed; diagnostic only.",
        "bit_count": 174,
        "complete_174bit_candidate": true,
        "preview_bits_available": 174,
        "hard_weight_preview": 36,
        "hard_zero_preview": 138,
        "llr_stats": {
          "count": 174,
          "avg_abs": 2.298973,
          "min_abs": 0.012672,
          "max_abs": 4.421458,
          "positive_llr_count": 141,
          "negative_llr_count": 33,
          "zero_llr_count": 0,
          "sign_balance": 0.62069
        },
        "syndrome_probe": {
          "available": true,
          "row_count": 32,
          "unsatisfied_rows": 16,
          "satisfied_rows": 16,
          "unsatisfied_ratio": 0.5,
          "syndrome_preview": [
            0,
            0,
            1,
            1,
            1,
            0,
            0,
            0,
            1,
            0,
            1,
            0,
            1,
            1,
            1,
            0
          ]
        },
        "real_ldpc_decode_attempted": false,
        "real_ldpc_decode_success": false,
        "rank_score": 96.695892
      },
      {
        "name": "lab_mask_xor_preview",
        "description": "Deterministic lab-only XOR mask preview; not the real JS8 whitening polynomial.",
        "bit_count": 174,
        "complete_174bit_candidate": true,
        "preview_bits_available": 174,
        "hard_weight_preview": 85,
        "hard_zero_preview": 89,
        "llr_stats": {
          "count": 174,
          "avg_abs": 2.298973,
          "min_abs": 0.012672,
          "max_abs": 4.421458,
          "positive_llr_count": 141,
          "negative_llr_count": 33,
          "zero_llr_count": 0,
          "sign_balance": 0.62069
        },
        "syndrome_probe": {
          "available": true,
          "row_count": 32,
          "unsatisfied_rows": 14,
          "satisfied_rows": 18,
          "unsatisfied_ratio": 0.4375,
          "syndrome_preview": [
            0,
            1,
            0,
            0,
            0,
            1,
            1,
            1,
            0,
            0,
            1,
            0,
            1,
            1,
            1,
            0
          ]
        },
        "real_ldpc_decode_attempted": false,
        "real_ldpc_decode_success": false,
        "rank_score": 98.258392
      }
    ],
    "selected_variant": "lab_mask_xor_preview",
    "selected_variant_rank_score": 98.258392,
    "ready_for_real_ldpc_matrix": true,
    "real_ldpc_decode": false,
    "message_unpack": false
  },
  "sync_candidate": {
    "start_sample": 57600,
    "start_seconds": 4.8,
    "base_freq_hz": 1025.0,
    "tone_spacing_hz": 1.875,
    "nsps": 6400,
    "candidate_score": 47.4,
    "costas_hits": 2,
    "avg_margin_db": 8.01
  },
  "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"
  },
  "soft_symbol_summary": {
    "symbol_count": 96,
    "avg_confidence_db": 3.08,
    "min_confidence_db": 0.01,
    "strong_symbol_count": 28,
    "weak_symbol_count": 29,
    "tone_histogram": {
      "0": 48,
      "1": 22,
      "2": 14,
      "3": 6,
      "4": 4,
      "5": 1,
      "6": 1,
      "7": 0
    }
  },
  "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"
  },
  "decodes": [],
  "warnings": [
    "Step 32 selects the best timing/profile candidate only. It still does not decode final JS8 text.",
    "No JS8 text decode is expected in Step 32. 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.",
    "No JS8 text decode is expected in Step 32. Final real LDPC/FEC and Varicode/message unpack are still not implemented.",
    "hard_bits_msb_candidate is a lab preview only; real JS8 requires deinterleaving, whitening and LDPC/FEC.",
    "Step 32 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 32 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 32 does not decode JS8 text yet. It probes bit-order/interleaver/whitening candidates for future real LDPC/FEC integration.",
    "lab_mask_xor_preview is only a repeatable diagnostic mask, not a confirmed JS8 whitening implementation.",
    "Step 32 LDPC probe harness is wired, but no real JS8/FT8 H matrix is supplied yet; prototype parity rows are diagnostic only.",
    "No JS8 message text is decoded in Step 32. Next step must connect/extract the real LDPC matrix/decoder and then the JS8 message unpacker."
  ],
  "next_action": "Next step should connect a confirmed JS8/FT8 LDPC matrix/decoder and then message unpacking after the timing profile is stable."
}
