[webftr-js8-lab] command=compressed-frame-fixture-gate-probe [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T191502Z_compressed-frame-fixture-gate-probe.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T191502Z_compressed-frame-fixture-gate-probe_manifest.json [webftr-js8-lab] utc=20260527T191502Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] Step74 compressed FrameDataCompressed fixture validation gate [webftr-js8-lab] fixture JSON or source-dir argument: auto-detect runtime/fixtures + source [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T191502Z_compressed_frame_fixture_gate_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "tool": "webftr-js8-compressed-frame-fixture-validation-gate", "tool_version": "step74-compressed-frame-fixture-validation-gate", "schema": "webftr-js8-compressed-frame-fixture-validation-gate-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 } ] }, "jsc_map_summary": { "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" ] } ] }, "fixture_input_reports": [ { "path": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json", "exists": false, "default_fixture_path": true }, { "path": "/decoders/js8_decoder/runtime/js8_compressed_frame_fixtures.json", "exists": false, "default_fixture_path": true }, { "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixtures.json", "exists": false, "default_fixture_path": true }, { "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_import.json", "exists": false, "default_fixture_path": true } ], "external_fixture_count": 0, "external_fixture_pass_count": 0, "external_source_comparison_pass_count": 0, "external_fixture_rows": [], "synthetic_selftest_fixture_count": 8, "synthetic_selftest_pass_count": 8, "synthetic_selftest_all_passed": true, "synthetic_selftest_rows": [ { "id": "js8-fixture74-2c0f622faffef7", "source_label": "synthetic:CQ", "source_index": 0, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tuZ+++++++++", "payload_bitvec": "0111111000100", "expected_text": "CQ", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tuZ+++++++++", "expected_text": "CQ", "payload_bitvec": "0111111000100", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tuZ+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "CQ", "decoded_text_preview": "CQ", "expected_text": "CQ", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tuZ+++++++++", "bridge": { "message_text_12chars": "tuZ+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111111000100011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "0111111000100", "payload_preview_bits": "0111111000100", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 121, "word": "CQ", "start": 0, "k": 2 } ], "text": "CQ", "complete": true, "break_reason": null }, "decoded_text_preview": "CQ", "diagnostic_text_plausible": true, "display_text_if_later_released": "CQ" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-44a4267d6a021d", "source_label": "synthetic:CQ:sep", "source_index": 1, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tuh+++++++++", "payload_bitvec": "0111111000101", "expected_text": "CQ ", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tuh+++++++++", "expected_text": "CQ ", "payload_bitvec": "0111111000101", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tuh+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "CQ ", "decoded_text_preview": "CQ ", "expected_text": "CQ ", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tuh+++++++++", "bridge": { "message_text_12chars": "tuh+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111111000101011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "0111111000101", "payload_preview_bits": "0111111000101", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 121, "word": "CQ", "start": 0, "k": 2 } ], "text": "CQ ", "complete": true, "break_reason": null }, "decoded_text_preview": "CQ ", "diagnostic_text_plausible": true, "display_text_if_later_released": "CQ" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-daad55339cfd4b", "source_label": "synthetic:TEST", "source_index": 2, "origin_kind": "synthetic_selftest", "message174_text_12chars": "vqZ+++++++++", "payload_bitvec": "1001110100100", "expected_text": "TEST", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "vqZ+++++++++", "expected_text": "TEST", "payload_bitvec": "1001110100100", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "vqZ+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "TEST", "decoded_text_preview": "TEST", "expected_text": "TEST", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "vqZ+++++++++", "bridge": { "message_text_12chars": "vqZ+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "111001110100100011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "1001110100100", "payload_preview_bits": "1001110100100", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 240, "word": "TEST", "start": 0, "k": 2 } ], "text": "TEST", "complete": true, "break_reason": null }, "decoded_text_preview": "TEST", "diagnostic_text_plausible": true, "display_text_if_later_released": "TEST" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-ced618f95b1e25", "source_label": "synthetic:TEST:sep", "source_index": 3, "origin_kind": "synthetic_selftest", "message174_text_12chars": "vqh+++++++++", "payload_bitvec": "1001110100101", "expected_text": "TEST ", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "vqh+++++++++", "expected_text": "TEST ", "payload_bitvec": "1001110100101", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "vqh+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "TEST ", "decoded_text_preview": "TEST ", "expected_text": "TEST ", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "vqh+++++++++", "bridge": { "message_text_12chars": "vqh+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "111001110100101011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "1001110100101", "payload_preview_bits": "1001110100101", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 240, "word": "TEST", "start": 0, "k": 2 } ], "text": "TEST ", "complete": true, "break_reason": null }, "decoded_text_preview": "TEST ", "diagnostic_text_plausible": true, "display_text_if_later_released": "TEST" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-1e784547ba0737", "source_label": "synthetic:HELLO", "source_index": 4, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tYuK++++++++", "payload_bitvec": "011110001011100001010", "expected_text": "HELLO", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tYuK++++++++", "expected_text": "HELLO", "payload_bitvec": "011110001011100001010", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tYuK++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "HELLO", "decoded_text_preview": "HELLO", "expected_text": "HELLO", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tYuK++++++++", "bridge": { "message_text_12chars": "tYuK++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111100010111000010100111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 23, "payload_bit_count": 21, "payload_bitvec": "011110001011100001010", "payload_preview_bits": "011110001011100001010", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 21, "nibble_count": 5, "consumed_nibbles": 5, "decoded_word_count": 1, "decoded_words": [ { "index": 6571, "word": "HELLO", "start": 0, "k": 4 } ], "text": "HELLO", "complete": true, "break_reason": null }, "decoded_text_preview": "HELLO", "diagnostic_text_plausible": true, "display_text_if_later_released": "HELLO" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-5edc31f5f5617a", "source_label": "synthetic:HELLO:sep", "source_index": 5, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tYuM++++++++", "payload_bitvec": "011110001011100001011", "expected_text": "HELLO ", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tYuM++++++++", "expected_text": "HELLO ", "payload_bitvec": "011110001011100001011", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tYuM++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "HELLO ", "decoded_text_preview": "HELLO ", "expected_text": "HELLO ", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tYuM++++++++", "bridge": { "message_text_12chars": "tYuM++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111100010111000010110111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 23, "payload_bit_count": 21, "payload_bitvec": "011110001011100001011", "payload_preview_bits": "011110001011100001011", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 21, "nibble_count": 5, "consumed_nibbles": 5, "decoded_word_count": 1, "decoded_words": [ { "index": 6571, "word": "HELLO", "start": 0, "k": 4 } ], "text": "HELLO ", "complete": true, "break_reason": null }, "decoded_text_preview": "HELLO ", "diagnostic_text_plausible": true, "display_text_if_later_released": "HELLO" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-56f8032b9e4466", "source_label": "synthetic:DE", "source_index": 6, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tvZ+++++++++", "payload_bitvec": "0111111001100", "expected_text": "DE", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tvZ+++++++++", "expected_text": "DE", "payload_bitvec": "0111111001100", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tvZ+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "DE", "decoded_text_preview": "DE", "expected_text": "DE", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tvZ+++++++++", "bridge": { "message_text_12chars": "tvZ+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111111001100011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "0111111001100", "payload_preview_bits": "0111111001100", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 125, "word": "DE", "start": 0, "k": 2 } ], "text": "DE", "complete": true, "break_reason": null }, "decoded_text_preview": "DE", "diagnostic_text_plausible": true, "display_text_if_later_released": "DE" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false }, { "id": "js8-fixture74-19ac88ade1546e", "source_label": "synthetic:DE:sep", "source_index": 7, "origin_kind": "synthetic_selftest", "message174_text_12chars": "tvh+++++++++", "payload_bitvec": "0111111001101", "expected_text": "DE ", "fixture_note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture.", "js8call_reference": null, "rf_reference": null, "external_comparison": false, "built_from_payload_bitvec": null, "raw_fixture": { "message174_text_12chars": "tvh+++++++++", "expected_text": "DE ", "payload_bitvec": "0111111001101", "note": "Step74 internal synthetic gate selftest; not an RF/JS8Call comparison fixture." }, "compressed_fixture_gate": { "attempted": true, "message174_text_12chars": "tvh+++++++++", "bridge_status": "compressed_payload_bitvec_ready", "jsc_complete": true, "decoded_text": "DE ", "decoded_text_preview": "DE ", "expected_text": "DE ", "expected_text_present": true, "expected_text_match": true, "diagnostic_text_plausible": true, "has_external_reference": false, "source_comparison_passed": false, "passes_fixture_gate": true, "release_decision": "diagnostic_only_synthetic_or_unreferenced_fixture" }, "raw_decode": { "message_text_12chars": "tvh+++++++++", "bridge": { "message_text_12chars": "tvh+++++++++", "ok": true, "is_data": true, "compressed": true, "release_allowed": false, "release_guard": "step73_diagnostics_only_no_chat_release", "bits72_preview": "110111111001101011111111111111111111111111111111111111111111111111111111", "top2_bits": "11", "last_zero_index": 15, "payload_bit_count": 13, "payload_bitvec": "0111111001101", "payload_preview_bits": "0111111001101", "source_bridge_contract": "unpack72bits -> bits72; require bit0=data and bit1=compressed; pass bits[2:last_zero] to JSC::decompress", "bridge_status": "compressed_payload_bitvec_ready" }, "attempted_jsc_decompress": true, "webftr_display_release_allowed": false, "release_decision": "blocked_step73_diagnostics_only", "decompress_result": { "input_bit_count": 13, "nibble_count": 3, "consumed_nibbles": 3, "decoded_word_count": 1, "decoded_words": [ { "index": 125, "word": "DE", "start": 0, "k": 2 } ], "text": "DE ", "complete": true, "break_reason": null }, "decoded_text_preview": "DE ", "diagnostic_text_plausible": true, "display_text_if_later_released": "DE" }, "show_in_webftr_rx": false, "webftr_chat_release_allowed": false } ], "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, "candidate_latest_file": "/logs/js8_compressed_frame_fixture_gate_latest.json" }, "fixture_format_hint": { "path": "runtime/fixtures/js8_compressed_frame_fixtures.json", "example": { "fixtures": [ { "message174_text_12chars": "tYuK++++++++", "expected_text": "HELLO", "js8call_reference": "JS8Call decoded this exact fixture as HELLO", "note": "Example format only; provide real RF/JS8Call comparison metadata for release-gate work." } ] } }, "warnings": [ "Step74 validates compressed single-frame fixtures, but still blocks WebFTR chat release.", "Synthetic fixtures prove the port harness only; they are not RF/JS8Call comparison evidence.", "Multi-frame assembly and final display-release plausibility remain future steps." ], "verdict": "fixture_gate_selftest_ready_waiting_for_real_compressed_frame_fixture", "next_action": "Add a real fixture JSON under runtime/fixtures/js8_compressed_frame_fixtures.json or pass it as argument to Step74.", "stable_latest_written": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_gate_latest.json" } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T191502Z_compressed-frame-fixture-gate-probe.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T191502Z_compressed-frame-fixture-gate-probe_manifest.json