{
  "ok": true,
  "tool": "webftr-js8-jsc-decompress-guarded-port-probe",
  "tool_version": "step72-jsc-decompress-guarded-port-probe",
  "schema": "webftr-js8-jsc-decompress-guarded-port-probe-v1",
  "rx_only_guard": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false,
    "webftr_productive_integration": false
  },
  "no_gui_runtime_started": true,
  "root": "/decoders/js8_decoder",
  "log_dir": "/decoders/js8_decoder/logs",
  "source_resolution": {
    "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
    "source_found": true,
    "checked": [
      {
        "path": "/decoders/js8_decoder/runtime/src/JS8Call-improved",
        "exists": true,
        "is_dir": true
      }
    ]
  },
  "step71_input": {
    "path": "/decoders/js8_decoder/logs/20260527T185247Z_jsc_table_extract_probe_output.json",
    "verdict": "jsc_table_payload_extracted_port_ready",
    "table_extract_ready": true
  },
  "jsc_source_algorithm_contract": {
    "bytesize_bits": 4,
    "small_terminal_symbol_count_s": 7,
    "large_symbol_base_c": 9,
    "separator_bit_after_terminal_symbol": true,
    "algorithm_status": "ported_from_source_shape_for_table_roundtrip"
  },
  "jsc_map": {
    "ok": true,
    "source_file": "JS8_JSC/JSC_map.cpp",
    "entry_count": 200000,
    "declared_size": 262144,
    "declared_size_matches": false,
    "map_fingerprint_sha256": "edbc4c529a809c0e900f2ad443aefe6cca271f1f6df52f6e651b4997b3d4d949",
    "sample_entries": [
      "E",
      "T",
      "A",
      "O",
      "I",
      "N",
      "S",
      "H",
      "R",
      "D",
      "L",
      "C",
      "U",
      "M",
      "W",
      "F",
      "G",
      "Y",
      "P",
      "B"
    ],
    "attempts": [
      {
        "path": "JS8_JSC/JSC_map.cpp",
        "bytes": 7082880,
        "sha256": "ab2bd62ef594f4629a2c93b6de43f5469b1fd6fe67ebf4d24f915bd11ccef813",
        "declared_size": 262144,
        "parsed_entry_count": 200000,
        "sample": [
          "E",
          "T",
          "A",
          "O",
          "I",
          "N",
          "S",
          "H",
          "R",
          "D",
          "L",
          "C"
        ]
      }
    ]
  },
  "decompress_roundtrip_fixtures": {
    "fixture_count": 16,
    "pass_count": 16,
    "all_passed": true,
    "rows": [
      {
        "index": 121,
        "word": "CQ",
        "separate": false,
        "bits": "0111111000100",
        "decoded_text": "CQ",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "CQ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 121,
        "word": "CQ",
        "separate": true,
        "bits": "0111111000101",
        "decoded_text": "CQ ",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "CQ ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 240,
        "word": "TEST",
        "separate": false,
        "bits": "1001110100100",
        "decoded_text": "TEST",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "TEST",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 240,
        "word": "TEST",
        "separate": true,
        "bits": "1001110100101",
        "decoded_text": "TEST ",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "TEST ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 6571,
        "word": "HELLO",
        "separate": false,
        "bits": "011110001011100001010",
        "decoded_text": "HELLO",
        "passes": true,
        "decode": {
          "input_bit_count": 21,
          "nibble_count": 5,
          "consumed_nibbles": 5,
          "decoded_word_count": 1,
          "text": "HELLO",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 6571,
        "word": "HELLO",
        "separate": true,
        "bits": "011110001011100001011",
        "decoded_text": "HELLO ",
        "passes": true,
        "decode": {
          "input_bit_count": 21,
          "nibble_count": 5,
          "consumed_nibbles": 5,
          "decoded_word_count": 1,
          "text": "HELLO ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 125,
        "word": "DE",
        "separate": false,
        "bits": "0111111001100",
        "decoded_text": "DE",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "DE",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 125,
        "word": "DE",
        "separate": true,
        "bits": "0111111001101",
        "decoded_text": "DE ",
        "passes": true,
        "decode": {
          "input_bit_count": 13,
          "nibble_count": 3,
          "consumed_nibbles": 3,
          "decoded_word_count": 1,
          "text": "DE ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 67,
        "word": " ",
        "separate": false,
        "bits": "111101000",
        "decoded_text": " ",
        "passes": true,
        "decode": {
          "input_bit_count": 9,
          "nibble_count": 2,
          "consumed_nibbles": 2,
          "decoded_word_count": 1,
          "text": " ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 67,
        "word": " ",
        "separate": true,
        "bits": "111101001",
        "decoded_text": "  ",
        "passes": true,
        "decode": {
          "input_bit_count": 9,
          "nibble_count": 2,
          "consumed_nibbles": 2,
          "decoded_word_count": 1,
          "text": "  ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 0,
        "word": "E",
        "separate": false,
        "bits": "00000",
        "decoded_text": "E",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "E",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 0,
        "word": "E",
        "separate": true,
        "bits": "00001",
        "decoded_text": "E ",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "E ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 1,
        "word": "T",
        "separate": false,
        "bits": "00010",
        "decoded_text": "T",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "T",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 1,
        "word": "T",
        "separate": true,
        "bits": "00011",
        "decoded_text": "T ",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "T ",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 2,
        "word": "A",
        "separate": false,
        "bits": "00100",
        "decoded_text": "A",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "A",
          "complete": true,
          "break_reason": null
        }
      },
      {
        "index": 2,
        "word": "A",
        "separate": true,
        "bits": "00101",
        "decoded_text": "A ",
        "passes": true,
        "decode": {
          "input_bit_count": 5,
          "nibble_count": 1,
          "consumed_nibbles": 1,
          "decoded_word_count": 1,
          "text": "A ",
          "complete": true,
          "break_reason": null
        }
      }
    ]
  },
  "compressed_frame_candidates": {
    "count": 0,
    "probes": [],
    "display_release_allowed": false
  },
  "webftr_adapter_hint": {
    "safe_to_poll_read_only": true,
    "productive_integration": false,
    "do_not_merge_as_chat_text_yet": true,
    "step68_contract_remains_current_ui_source": true,
    "candidate_latest_file": "/logs/js8_jsc_decompress_port_probe_latest.json"
  },
  "warnings": [
    "Step72 ports the JSC codeword/decompress mechanics and validates map order with local roundtrip fixtures only.",
    "It does not release FrameDataCompressed as JS8 chat text.",
    "A source-faithful Varicode compressed payload bit-slice export is still needed before real compressed frames can be decoded through this port."
  ],
  "verdict": "jsc_decompress_port_roundtrip_ready_no_current_compressed_frames",
  "next_action": "Capture or inject a real FrameDataCompressed fixture and export its post-unpack JSC bitvec; Step73 should connect Varicode bit-slice extraction to this port.",
  "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_decompress_port_probe_latest.json"
}
