[webftr-js8-lab] command=jsc-table-extract-probe [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T183918Z_jsc-table-extract-probe.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T183918Z_jsc-table-extract-probe_manifest.json [webftr-js8-lab] utc=20260527T183918Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] Step71 source-faithful JSC table extraction/readiness probe [webftr-js8-lab] input Step70 JSON or source-dir argument: auto-detect latest logs/source [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T183918Z_data_frame_text_unpack_probe_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "tool": "webftr-js8-data-frame-text-unpack-probe", "tool_version": "step70-data-frame-text-unpack-probe", "schema": "webftr-js8-data-frame-text-unpack-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", "input_reports": [ { "path": "/decoders/js8_decoder/logs/20260527T183331Z_jsc_decompress_source_audit_output.json", "exists": true, "selected_latest": true, "input_kind": "step69_jsc_source_audit" } ], "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 } ], "focused_files_present": [ "JS8_Main/Varicode.cpp", "JS8_Main/Varicode.h", "JS8_JSC/JSC.cpp", "JS8_JSC/JSC.h", "JS8_JSC/JSC_map.cpp", "JS8_JSC/JSC_list.cpp", "JS8_Mode/JS8.cpp", "JS8_Mode/JS8.h" ], "focused_files_missing": [ "JS8_JSC/jsc.cpp", "JS8_JSC/jsc.h" ] }, "jsc_decode_path_evidence": { "has_jsc_decompress_reference": true, "has_unpack_fast_data_message": true, "has_unpack_legacy_data_message": true, "has_huff_fallback_evidence": true, "expected_source_flow": [ "unpack72bits(message174_text) -> 72 bits", "FrameData/FrameDataCompressed bits are trimmed at the final zero padding marker", "compressed path calls JSC::decompress(bits)", "legacy non-compressed path uses Varicode::huffDecode(defaultHuffTable, bits)", "Step69 does not yet display free text; it only extracts and documents the source path for a safe Step70 port." ] }, "source_trim_contract": { "message174_to_72_bits": "unpack72bits(message174_text) -> 64-bit value + 8-bit remainder", "legacy_data_flags": "bit0=data, bit1=compressed", "legacy_noncompressed_path": "payload bits between data/compressed flags and final zero delimiter -> Varicode::huffDecode(defaultHuffTable)", "compressed_path": "same trim family, then JSC::decompress(payload bits); still blocked in Step70", "chat_release": "disabled; this step is a guarded port/harness probe only" }, "current_fixture_has_data_frames": false, "data_frame_candidate_count": 0, "data_frame_text_rows": [], "synthetic_selftest_fixtures": [ { "fixture_kind": "legacy_noncompressed_huff_data_frame", "input_text": "TEST", "message174_text_12chars": "jbDV++++++++", "payload_bit_count": 16, "bits72_prefix": "1011011001010011010111111111111111111111", "unpack_result": { "message_text_12chars": "jbDV++++++++", "ok": true, "data_text_release_allowed": false, "release_guard": "step70_diagnostics_only_no_chat_release", "top2": 2, "top3": 5, "is_data_flag": true, "compressed_flag": false, "last_zero_index": 18, "payload_bit_count": 16, "payload_preview_bits": "1101100101001101", "source_trim_rule": "bits[2:last_zero] using final zero as padding delimiter for legacy data frames", "frame_text_path": "legacy_huff_noncompressed", "huff_decode": { "text": "TEST", "consumed_bits": 16, "remaining_bits": 0, "complete": true }, "decoded_text": "TEST", "jsc_decompress_needed": false, "diagnostic_text_plausible": true, "warning": "Decoded only as a diagnostic legacy Huff data frame. It is not released to WebFTR chat rows in Step70." }, "passes": true }, { "fixture_kind": "legacy_noncompressed_huff_data_frame", "input_text": "CQ", "message174_text_12chars": "iI3+++++++++", "payload_bit_count": 13, "bits72_prefix": "1011000100100000111111111111111111111111", "unpack_result": { "message_text_12chars": "iI3+++++++++", "ok": true, "data_text_release_allowed": false, "release_guard": "step70_diagnostics_only_no_chat_release", "top2": 2, "top3": 5, "is_data_flag": true, "compressed_flag": false, "last_zero_index": 15, "payload_bit_count": 13, "payload_preview_bits": "1100010010000", "source_trim_rule": "bits[2:last_zero] using final zero as padding delimiter for legacy data frames", "frame_text_path": "legacy_huff_noncompressed", "huff_decode": { "text": "CQ", "consumed_bits": 13, "remaining_bits": 0, "complete": true }, "decoded_text": "CQ", "jsc_decompress_needed": false, "diagnostic_text_plausible": true, "warning": "Decoded only as a diagnostic legacy Huff data frame. It is not released to WebFTR chat rows in Step70." }, "passes": true } ], "selftest_fixture_pass_count": 2, "webftr_rx_rows": [], "webftr_display_count": 0, "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 }, "verdict": "data_frame_trim_and_huff_harness_ready_no_current_data_frames", "warnings": [ "Step70 remains RX-only and does not start JS8Call GUI/Qt.", "Step70 does not release decoded data text to WebFTR chat/RX rows.", "Compressed FrameData still needs a source-faithful JSC::decompress table port before free text can be considered displayable." ], "next_action": "Wait for or inject a real FrameData/FrameDataCompressed fixture, then run Step70 again; next implementation step is JSC table extraction/port for compressed frames.", "stable_latest_written": "/decoders/js8_decoder/logs/js8_data_frame_text_unpack_probe_latest.json" } [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T183918Z_jsc_table_extract_probe_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "tool": "webftr-js8-jsc-table-extract-probe", "tool_version": "step71-jsc-table-extract-probe", "schema": "webftr-js8-jsc-table-extract-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 } ] }, "step69_audit_summary": { "verdict": "jsc_source_ready_no_data_frames_in_current_fixture", "has_jsc_decompress_reference": true, "has_unpack_fast_data_message": true, "has_unpack_legacy_data_message": true, "has_huff_fallback_evidence": true }, "jsc_table_source_bundle": { "focused_files_present": [ "JS8_JSC/JSC.cpp", "JS8_JSC/JSC.h", "JS8_JSC/JSC_map.cpp", "JS8_JSC/JSC_list.cpp", "JS8_Main/Varicode.cpp", "JS8_Main/Varicode.h" ], "focused_files_missing": [ "JS8_JSC/jsc.cpp", "JS8_JSC/jsc.h" ], "focused_file_stats": [ { "path": "JS8_JSC/JSC.cpp", "exists": true, "bytes": 7392, "line_count": 299, "sha256": "0f1c974a96fd65e043b1a4dbdb69a9ae43e42dafe81f5f22f196b09596dbcdeb" }, { "path": "JS8_JSC/JSC.h", "exists": true, "bytes": 1232, "line_count": 48, "sha256": "3edfda65865dc4ede66730113c1c7250861253d78ed83f17626ce55c79b0f1d8" }, { "path": "JS8_JSC/JSC_map.cpp", "exists": true, "bytes": 7082880, "line_count": 262172, "sha256": "ab2bd62ef594f4629a2c93b6de43f5469b1fd6fe67ebf4d24f915bd11ccef813" }, { "path": "JS8_JSC/JSC_list.cpp", "exists": true, "bytes": 7085560, "line_count": 262278, "sha256": "993811813f1cd6e00e399f25352a34ae477b7e1b50745204c32d3df0058a0491" }, { "path": "JS8_Main/Varicode.cpp", "exists": true, "bytes": 72661, "line_count": 2371, "sha256": "2b4a877e7dae1a3fdd9141f4dd8af422185977d2e9363ad23ef6bc1918eaf53a" }, { "path": "JS8_Main/Varicode.h", "exists": true, "bytes": 8286, "line_count": 222, "sha256": "dd7b8bf50466d0d2dc42b8c9ec05a72126363b3cd02c7492c5e2dcc9c9abb99d" }, { "path": "JS8_JSC/JSC_checker.h", "exists": true, "bytes": 477, "line_count": 27, "sha256": "7bcf0d7af4fcab0274dd8163e3c8273118dea3796dc1993c0eab1e88217156f4" }, { "path": "JS8_JSC/JSC_checker.cpp", "exists": true, "bytes": 8715, "line_count": 310, "sha256": "274ff9504345d11c9dfdeccd8f8731f5207943a6ca29111f3af7ae922e70852b" } ], "file_payload_summaries": [ { "path": "JS8_JSC/JSC.cpp", "token_hits": { "JSC::decompress": 1, "JSC::compress": 1, "QMap": 1, "QStringList": 2, "decompress": 2, "compress": 8 }, "quoted_payloads": { "count": 5, "sha1": "86f5f3914035b44a10590f65931e95744bc1fbe4", "preview": [ "JSC.h", "JS8_Main/Varicode.h", " ", " ", " " ], "longest_length": 19 }, "numeric_payloads": { "count": 54, "sha1": "fb4c05cb8238ab66e1bfa80b17bcec09deadefac", "preview": [ 3, 2018, 1, 1, 0, 1, 4, 7, 2, 4, 0, 1, 1, 0, 4, 7, 2, 8, 0, 0, 1, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5, 7, 6, 0, 4, 4, 4, 0, 1, 1 ], "min": 0, "max": 2018 }, "table_block_candidate_count": 0 }, { "path": "JS8_JSC/JSC.h", "token_hits": { "QMap": 1, "QVector": 3, "QStringList": 1, "decompress": 1, "compress": 2 }, "quoted_payloads": { "count": 0, "sha1": null, "preview": [], "longest_length": 0 }, "numeric_payloads": { "count": 7, "sha1": "ea8c788ef4b3aaf44d94bb8032429b9d04c26370", "preview": [ 2018, 0, 262144, 262144, 262144, 103, 103 ], "min": 0, "max": 262144 }, "table_block_candidate_count": 0 }, { "path": "JS8_JSC/JSC_map.cpp", "token_hits": { "JSC_map": 1 }, "quoted_payloads": { "count": 10000, "sha1": "526769a40ad90e2d2c34287e98b746084c09f2f2", "preview": [ "JSC.h", "E", "T", "A", "O", "I", "N", "S", "H", "R", "D", "L", "C", "U", "M", "W", "F", "G", "Y", "P", "B", ",", ".", "V", "K", "-", "+", "\"", "?", "!" ], "longest_length": 90 }, "numeric_payloads": { "count": 20000, "sha1": "0999e8706f8310753ed73308c79924be7059bcae", "preview": [ 3, 2018, 262144, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, 16, 1, 17, 1 ], "min": 0, "max": 262144 }, "table_block_candidate_count": 0 }, { "path": "JS8_JSC/JSC_list.cpp", "token_hits": { "JSC_list": 1 }, "quoted_payloads": { "count": 10000, "sha1": "f0431a6771d806630866a7b704ee1c5504554fcd", "preview": [ "JSC.h", "~", "}", "|", "{", "`", "_", "^", "]", " ", "[", "ZZZZ", "ZZZ", "ZZYY", "ZZYW", "ZZYT", "ZZYS", "ZZYP", "ZZYO", "ZZYL", "ZZYI", "ZZYH", "ZZYG", "ZZYF", "ZZYD", "ZZYC", "ZZYB", "ZZYA", "ZZY", "ZZWO" ], "longest_length": 22 }, "numeric_payloads": { "count": 20000, "sha1": "ce4b3ea12826f80b3a2dfe6628a53db1902c8d0c", "preview": [ 3, 2018, 262144, 1, 66, 1, 61, 1, 62, 1, 60, 1, 65, 1, 48, 1, 64, 1, 59, 1, 67, 1, 58, 4, 91474, 3, 70901, 4, 171515, 4, 183602, 4, 195566, 4, 133423, 4, 253527, 4, 172771, 4 ], "min": 1, "max": 262144 }, "table_block_candidate_count": 2 }, { "path": "JS8_Main/Varicode.cpp", "token_hits": { "JSC::decompress": 3, "JSC::compress": 1, "QMap": 12, "QVector": 19, "QStringList": 17, "decompress": 3, "compress": 30 }, "quoted_payloads": { "count": 335, "sha1": "5b618b61efcffa1dfb4a996a41c3763b30b3ebaf", "preview": [ "Varicode.h", "JS8_JSC/JSC.h", "JS8_Mode/DecodedText.h", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+/?.", "((?[A-X]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*)+)", "((?(\\d|[A-Z])+\\/?((\\d|[A-Z]){2,})(\\/(\\d|[A-Z])+)?(\\/(\\d|[A-Z])+)?))", "((?\\b(?([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?[/][P])?\\b))", "((?\\b(?[A-Z0-9]{1,4}\\/)?(?([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?\\/[A-Z0", "((?(?:[@]?|\\b)(?[A-Z0-9\\/@][A-Z0-9\\/]{0,2}[\\/]?[A-Z0-9\\/]{0,3}[\\/]?[A-Z0-9\\/]{0,3})\\b))", "(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ /@", " HEARTBEAT", " HB", " CQ", " SNR?", "?", " DIT DIT", " HEARING?", " GRID?", ">", " STATUS?", " STATUS", " HEARING", " MSG", " MSG TO:", " QUERY", " QUERY MSGS", " QUERY MSGS?", " QUERY CALL" ], "longest_length": 162 }, "numeric_payloads": { "count": 1192, "sha1": "ff0cbffa918ab131a36a79d6d1d25e6c88f86caa", "preview": [ 2018, 41, 2, 0, 9, 2, 2, 0, 9, 2, 2, 0, 0, 0, 9, 9, 1, 4, 0, 0, 0, 9, 9, 1, 4, 9, 9, 0, 2, 9, 0, 3, 9, 0, 3, 0, 0, 0, 9, 1 ], "min": 0, "max": 18446744069414584320 }, "table_block_candidate_count": 8 }, { "path": "JS8_Main/Varicode.h", "token_hits": { "QMap": 4, "QVector": 11, "QStringList": 6 }, "quoted_payloads": { "count": 8, "sha1": "7367de55acb564de81eebdd9813c1eaff7b97838", "preview": [ "FrameHeartbeat", "FrameCompound", "FrameCompoundDirected", "FrameDirected", "FrameData", "FrameUnknown", "FrameDataCompressed", "FrameUnknown" ], "longest_length": 21 }, "numeric_payloads": { "count": 35, "sha1": "d738220eafa90f4a5dc6077ab67377f9a0bd532f", "preview": [ 2018, 0, 1, 2, 4, 8, 0, 0, 1, 1, 2, 10, 4, 100, 0, 1, 10, 11, 255, 11111111, 0, 0, 1, 1, 2, 10, 3, 11, 4, 2, 6, 2, 6, 5, 0 ], "min": 0, "max": 11111111 }, "table_block_candidate_count": 1 }, { "path": "JS8_JSC/JSC_checker.h", "token_hits": { "QStringList": 1 }, "quoted_payloads": { "count": 0, "sha1": null, "preview": [], "longest_length": 0 }, "numeric_payloads": { "count": 1, "sha1": "66efd9eefecf45dd64eff8e5cb2d13e005041925", "preview": [ 2018 ], "min": 2018, "max": 2018 }, "table_block_candidate_count": 0 }, { "path": "JS8_JSC/JSC_checker.cpp", "token_hits": { "QStringList": 3 }, "quoted_payloads": { "count": 15, "sha1": "9b2bf80a6353b9cb8b09e773feb295953e998aa4", "preview": [ "JSC_checker.h", "JS8_Main/Varicode.h", "JSC.h", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "^\\\\d+$", "^\\\\w$", "checking range ", " - ", "@", "correct", "word", "correct", "computing suggestions for word", "suggest", "jsc_checker.js8" ], "longest_length": 30 }, "numeric_payloads": { "count": 23, "sha1": "f0250c33ef66d223306f5b7bc0bf91b99a8c8389", "preview": [ 3, 2018, 10, 1, 1, 0, 1, 4, 1, 0, 26, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0 ], "min": 0, "max": 2018 }, "table_block_candidate_count": 1 } ], "table_block_candidates": [ { "path": "JS8_JSC/JSC_list.cpp", "line": 25, "header_preview": "const Tuple JSC::list[262144]", "chars": 59, "sha256": "3eec4a2bc6458577c879e78f7207111bdc6a7ab330046e8ffd166fa6bfb2a944", "quoted_count": 2, "numeric_count": 4, "quoted_preview": [ "~", "}" ], "numeric_preview": [ 1, 66, 1, 61 ] }, { "path": "JS8_JSC/JSC_list.cpp", "line": 262173, "header_preview": "const Tuple JSC::prefix[103]", "chars": 2653, "sha256": "1569ed8197a2f077de22bffd3dc786f991984e2a5cff24a3ff4bb3647d29de57", "quoted_count": 103, "numeric_count": 216, "quoted_preview": [ "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", "," ], "numeric_preview": [ 1, 262143, 1, 262142, 1, 262141, 1, 262140, 1, 262139, 1, 262138, 8, 262130, 1, 262129, 1, 262128, 1, 262127 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 48, "header_preview": "QMap directed_cmds", "chars": 2098, "sha256": "54c2ee30ebb5f60ef3cf547c16b803a935cf607e5f7a630e48701207d5f14cd7", "quoted_count": 39, "numeric_count": 44, "quoted_preview": [ " HEARTBEAT", " HB", " CQ", " SNR?", "?", " DIT DIT", " HEARING?", " GRID?", ">", " STATUS?", " STATUS", " HEARING" ], "numeric_preview": [ 1, 1, 1, 0, 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 120, "header_preview": "int> allowed_cmds", "chars": 183, "sha256": "921b9fb284ec74ed27550d958b8232fc4562cfc26374671be18dc79b7cd44fe5", "quoted_count": 0, "numeric_count": 33, "quoted_preview": [], "numeric_preview": [ 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 125, "header_preview": "int> autoreply_cmds", "chars": 46, "sha256": "a0eceffe1f310810db3a69968d808b0bc08a9617311c71ccbfb89e1268159e90", "quoted_count": 0, "numeric_count": 13, "quoted_preview": [], "numeric_preview": [ 0, 2, 3, 4, 6, 9, 10, 11, 12, 13, 14, 16, 30 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 128, "header_preview": "int> buffered_cmds", "chars": 30, "sha256": "17ce3f628d245621b9a126abcf924416add4bfb37925df2ae73036935fe3d460", "quoted_count": 0, "numeric_count": 8, "quoted_preview": [], "numeric_preview": [ 5, 9, 10, 11, 12, 13, 15, 24 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 134, "header_preview": "QMap checksum_cmds", "chars": 112, "sha256": "8f554b3c0fbb86b5baac4fc4e75814fb8f0c166e200e1655300329e1e0420d6b", "quoted_count": 0, "numeric_count": 16, "quoted_preview": [], "numeric_preview": [ 5, 16, 9, 16, 10, 16, 11, 16, 12, 16, 13, 16, 15, 0, 24, 16 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 162, "header_preview": "QMap hufftable", "chars": 1766, "sha256": "0801e3084efe5d61bc4bc84d40cd23260d543c79cced73cdf3cd16e50508a196", "quoted_count": 88, "numeric_count": 142, "quoted_preview": [ " ", "01", "E", "100", "T", "1101", "A", "0011", "O", "11111", "I", "11100" ], "numeric_preview": [ 1, 1, 0, 100, 0, 5, 1101, 0, 333333333333, 11, 0, 25, 11111, 0, 2, 11100, 0, 166666666667, 10111, 0 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 218, "header_preview": "QMap basecalls", "chars": 2846, "sha256": "ecf17790db5faadd7958a64dcb9e8aeac79427ac61b390ae07e791615489eee4", "quoted_count": 54, "numeric_count": 75, "quoted_preview": [ "<....>", "@ALLCALL", "@JS8NET", "@DX/NA", "@DX/SA", "@DX/EU", "@DX/AS", "@DX/AF", "@DX/OC", "@DX/AN", "@REGION/1", "@REGION/2" ], "numeric_preview": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 11, 1, 2, 12, 2, 3, 13, 3, 0 ] }, { "path": "JS8_Main/Varicode.cpp", "line": 287, "header_preview": "QMap cqs", "chars": 133, "sha256": "faa00ed894e44ef5d1125aaf6e47012146124ac4376d3aad68619f80327b6a5e", "quoted_count": 8, "numeric_count": 8, "quoted_preview": [ "CQ CQ CQ", "CQ DX", "CQ QRP", "CQ CONTEST", "CQ FIELD", "CQ FD", "CQ CQ", "CQ" ], "numeric_preview": [ 0, 1, 2, 3, 4, 5, 6, 7 ] }, { "path": "JS8_Main/Varicode.h", "line": 63, "header_preview": "const char *FrameTypeStrings[]", "chars": 204, "sha256": "3441dcd80fd6f257f494645a7f0678cc0dc1b4fd4d570d067ae2fcf8534210c3", "quoted_count": 7, "numeric_count": 1, "quoted_preview": [ "FrameHeartbeat", "FrameCompound", "FrameCompoundDirected", "FrameDirected", "FrameData", "FrameUnknown", "FrameDataCompressed" ], "numeric_preview": [ 5 ] }, { "path": "JS8_JSC/JSC_checker.cpp", "line": 37, "header_preview": "const QString ALPHABET", "chars": 30, "sha256": "a6aa5a9ec226235c107a7514939a75632d8f3ca405f0875660d8377ae7de8c32", "quoted_count": 1, "numeric_count": 0, "quoted_preview": [ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ], "numeric_preview": [] } ], "payload_totals": { "quoted_payload_count": 20363, "numeric_literal_count": 41312, "table_block_candidate_count": 12 }, "bundle_fingerprint_sha256": "46ff5c2aab7d37a5c20755654d61598e07ed137a6a9bdf07a2425bcf343d95e0" }, "port_readiness": { "has_jsc_cpp": true, "has_jsc_h": true, "has_jsc_map_cpp": true, "has_jsc_list_cpp": true, "has_payload_tables_or_literals": true, "has_decompress_path_evidence": true, "table_extract_ready": true, "compressed_frame_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 }, "warnings": [ "Step71 is a source-table extraction/readiness probe only.", "It does not execute JSC::decompress and does not release compressed FrameData as chat text.", "Fingerprints/previews are meant to anchor the next guarded source-faithful port step." ], "verdict": "jsc_table_payload_extracted_port_ready", "next_action": "Implement the guarded JSC bitstream/table decoder against this extracted fingerprint bundle, then validate only with compressed FrameData fixtures.", "stable_latest_written": "/decoders/js8_decoder/logs/js8_jsc_table_extract_probe_latest.json" } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T183918Z_jsc-table-extract-probe.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T183918Z_jsc-table-extract-probe_manifest.json