{
  "ok": true,
  "mode": "JS8",
  "tool": "webftr-js8-soft-ldpc-minsum-probe",
  "tool_version": "step42-direct-primary-bounded-repair",
  "input_wav": null,
  "candidate_json": "/decoders/js8_decoder/runtime/timing_boundary_sweep/step42_best_timing_fec_candidate.json",
  "rx_only": true,
  "safety": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false
  },
  "implementation_stage": "step42_bounded_gray_interleaver_llr_minsum_probe_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": 6400,
    "nsps_is_js8_realistic": true,
    "selected_profile": null,
    "selected_variant": {
      "name": "step42_timing_sweep_best_syndrome_row",
      "rank_score": 1107.311136,
      "complete_174bit_candidate": true,
      "hard_bits_sha256_16": "0228efbd612c9092",
      "hard_weight_174": 140,
      "llr_stats": {
        "count": 174,
        "avg_abs": 1.827784,
        "min_abs": 0.008053,
        "max_abs": 4.126624,
        "positive": 36,
        "negative": 138,
        "zero": 0
      }
    }
  },
  "candidate_mapping_rows": 865,
  "probe_count": 2,
  "best_soft_decode": {
    "variant": "step42_timing_sweep_best_syndrome_row",
    "transform": "direct_timing_sweep_primary",
    "mapping_meta": {
      "direct_timing_sweep_primary": true,
      "source_mapping_meta": {
        "tone_mapping": "lsb_within_each_tone",
        "interleaver": "none",
        "polarity": "inverted"
      },
      "source_transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
      "source_variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse"
    },
    "decoder_trial": {
      "llr_scale": 0.75,
      "alpha": 0.7
    },
    "source_rank_score": 3107.3111360000003,
    "source_llr_stats": {
      "count": 174,
      "avg_abs": 1.827784,
      "min_abs": 0.008053,
      "max_abs": 4.126624,
      "positive": 36,
      "negative": 138,
      "zero": 0
    },
    "success": false,
    "iterations_used": 32,
    "final_syndrome_weight": 30,
    "message91": null,
    "message91_sha256_16": "95cb11678c7a80df",
    "codeword174_sha256_16": "57946ed9075f03b0",
    "trace": [
      {
        "iteration": 0,
        "syndrome_weight": 42
      },
      {
        "iteration": 1,
        "syndrome_weight": 39
      },
      {
        "iteration": 2,
        "syndrome_weight": 43
      },
      {
        "iteration": 3,
        "syndrome_weight": 41
      },
      {
        "iteration": 4,
        "syndrome_weight": 38
      },
      {
        "iteration": 5,
        "syndrome_weight": 45
      },
      {
        "iteration": 6,
        "syndrome_weight": 39
      },
      {
        "iteration": 7,
        "syndrome_weight": 46
      },
      {
        "iteration": 8,
        "syndrome_weight": 45
      },
      {
        "iteration": 9,
        "syndrome_weight": 40
      },
      {
        "iteration": 10,
        "syndrome_weight": 42
      },
      {
        "iteration": 15,
        "syndrome_weight": 44
      },
      {
        "iteration": 20,
        "syndrome_weight": 50
      },
      {
        "iteration": 25,
        "syndrome_weight": 40
      },
      {
        "iteration": 30,
        "syndrome_weight": 40
      }
    ],
    "hard_repair_probe": {
      "ok": true,
      "initial_syndrome_weight": 22,
      "best_syndrome_weight": 20,
      "best_flip_indices": [
        128,
        156
      ],
      "best_flip_count": 2,
      "pool_size": 18,
      "max_depth": 2,
      "probes": 171,
      "valid_codeword_hard_decision": false,
      "message91_sha256_16": "67b59638aa8882d6",
      "codeword174_sha256_16": "3e21661e33a987a7"
    }
  },
  "best_hard_repair_probe": {
    "ok": true,
    "initial_syndrome_weight": 22,
    "best_syndrome_weight": 20,
    "best_flip_indices": [
      128,
      156
    ],
    "best_flip_count": 2,
    "pool_size": 18,
    "max_depth": 2,
    "probes": 171,
    "valid_codeword_hard_decision": false,
    "message91_sha256_16": "67b59638aa8882d6",
    "codeword174_sha256_16": "3e21661e33a987a7"
  },
  "soft_decode_results": [
    {
      "variant": "step42_timing_sweep_best_syndrome_row",
      "transform": "direct_timing_sweep_primary",
      "mapping_meta": {
        "direct_timing_sweep_primary": true,
        "source_mapping_meta": {
          "tone_mapping": "lsb_within_each_tone",
          "interleaver": "none",
          "polarity": "inverted"
        },
        "source_transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
        "source_variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse"
      },
      "decoder_trial": {
        "llr_scale": 0.75,
        "alpha": 0.7
      },
      "source_rank_score": 3107.3111360000003,
      "source_llr_stats": {
        "count": 174,
        "avg_abs": 1.827784,
        "min_abs": 0.008053,
        "max_abs": 4.126624,
        "positive": 36,
        "negative": 138,
        "zero": 0
      },
      "success": false,
      "iterations_used": 32,
      "final_syndrome_weight": 30,
      "message91": null,
      "message91_sha256_16": "95cb11678c7a80df",
      "codeword174_sha256_16": "57946ed9075f03b0",
      "trace": [
        {
          "iteration": 0,
          "syndrome_weight": 42
        },
        {
          "iteration": 1,
          "syndrome_weight": 39
        },
        {
          "iteration": 2,
          "syndrome_weight": 43
        },
        {
          "iteration": 3,
          "syndrome_weight": 41
        },
        {
          "iteration": 4,
          "syndrome_weight": 38
        },
        {
          "iteration": 5,
          "syndrome_weight": 45
        },
        {
          "iteration": 6,
          "syndrome_weight": 39
        },
        {
          "iteration": 7,
          "syndrome_weight": 46
        },
        {
          "iteration": 8,
          "syndrome_weight": 45
        },
        {
          "iteration": 9,
          "syndrome_weight": 40
        },
        {
          "iteration": 10,
          "syndrome_weight": 42
        },
        {
          "iteration": 15,
          "syndrome_weight": 44
        },
        {
          "iteration": 20,
          "syndrome_weight": 50
        },
        {
          "iteration": 25,
          "syndrome_weight": 40
        },
        {
          "iteration": 30,
          "syndrome_weight": 40
        }
      ],
      "hard_repair_probe": {
        "ok": true,
        "initial_syndrome_weight": 22,
        "best_syndrome_weight": 20,
        "best_flip_indices": [
          128,
          156
        ],
        "best_flip_count": 2,
        "pool_size": 18,
        "max_depth": 2,
        "probes": 171,
        "valid_codeword_hard_decision": false,
        "message91_sha256_16": "67b59638aa8882d6",
        "codeword174_sha256_16": "3e21661e33a987a7"
      }
    },
    {
      "variant": "step42_timing_sweep_best_syndrome_row",
      "transform": "direct_timing_sweep_primary",
      "mapping_meta": {
        "direct_timing_sweep_primary": true,
        "source_mapping_meta": {
          "tone_mapping": "lsb_within_each_tone",
          "interleaver": "none",
          "polarity": "inverted"
        },
        "source_transform": "lsb_within_each_tone+no_interleaver+inverted_bits",
        "source_variant": "mapped_ft8_gray_alt_high_demap_msb_input+ft8_bitrev_interleave_codeword_to_rx_inverse"
      },
      "decoder_trial": {
        "llr_scale": 1.0,
        "alpha": 0.8
      },
      "source_rank_score": 3107.3111360000003,
      "source_llr_stats": {
        "count": 174,
        "avg_abs": 1.827784,
        "min_abs": 0.008053,
        "max_abs": 4.126624,
        "positive": 36,
        "negative": 138,
        "zero": 0
      },
      "success": false,
      "iterations_used": 32,
      "final_syndrome_weight": 36,
      "message91": null,
      "message91_sha256_16": "0e9ed1e0ca0159a7",
      "codeword174_sha256_16": "750e03954c49c465",
      "trace": [
        {
          "iteration": 0,
          "syndrome_weight": 42
        },
        {
          "iteration": 1,
          "syndrome_weight": 39
        },
        {
          "iteration": 2,
          "syndrome_weight": 41
        },
        {
          "iteration": 3,
          "syndrome_weight": 41
        },
        {
          "iteration": 4,
          "syndrome_weight": 45
        },
        {
          "iteration": 5,
          "syndrome_weight": 37
        },
        {
          "iteration": 6,
          "syndrome_weight": 48
        },
        {
          "iteration": 7,
          "syndrome_weight": 48
        },
        {
          "iteration": 8,
          "syndrome_weight": 42
        },
        {
          "iteration": 9,
          "syndrome_weight": 47
        },
        {
          "iteration": 10,
          "syndrome_weight": 44
        },
        {
          "iteration": 15,
          "syndrome_weight": 38
        },
        {
          "iteration": 20,
          "syndrome_weight": 42
        },
        {
          "iteration": 25,
          "syndrome_weight": 42
        },
        {
          "iteration": 30,
          "syndrome_weight": 48
        }
      ],
      "hard_repair_probe": {
        "ok": true,
        "initial_syndrome_weight": 22,
        "best_syndrome_weight": 20,
        "best_flip_indices": [
          128,
          156
        ],
        "best_flip_count": 2,
        "pool_size": 18,
        "max_depth": 2,
        "probes": 171,
        "valid_codeword_hard_decision": false,
        "message91_sha256_16": "67b59638aa8882d6",
        "codeword174_sha256_16": "3e21661e33a987a7"
      }
    }
  ],
  "decodes": [],
  "outputs": {
    "ldpc_soft_decode_json": "/decoders/js8_decoder/runtime/ldpc_soft_decode/step42_ldpc_soft_decode.json"
  },
  "warnings": [
    "Step 42 keeps the direct timing-sweep primary row first and runs a deliberately small bounded soft/repair probe to avoid Raspberry Pi timeouts.",
    "Step 42 runs bounded normalized-min-sum soft LDPC plus a small low-reliability hard-repair probe over the best-ranked rows against the public (174,91) matrix contract.",
    "This still does not unpack JS8 text or validate CRC/message payloads.",
    "If success is true and syndrome_weight is 0, the next step can unpack the 91-bit message. Otherwise more timing, Costas/data-symbol boundary, deinterleaver/order or LLR tuning is required."
  ],
  "next_action": "Upload Step35 logs. If no valid codeword, inspect best mapping_meta/final_syndrome_weight and continue timing/interleaver/LLR tuning; if valid, add JS8 message unpack/CRC."
}
