{
  "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."
}
