[webftr-js8-lab] command=auto-ldpc-probe [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260526T115459Z_auto-ldpc-probe.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260526T115459Z_auto-ldpc-probe_manifest.json [webftr-js8-lab] utc=20260526T115459Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260526T115459Z_auto_ldpc_probe_output.json [webftr-js8-lab] JSON timeout guard: 180s { "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." } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260526T115459Z_auto-ldpc-probe.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260526T115459Z_auto-ldpc-probe_manifest.json