[webftr-js8-lab] command=real-compressed-fixture-request [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T192543Z_real-compressed-fixture-request.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T192543Z_real-compressed-fixture-request_manifest.json [webftr-js8-lab] utc=20260527T192543Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] Step75 real compressed FrameDataCompressed fixture capture request [webftr-js8-lab] fixture JSON or source-dir argument: auto-detect runtime/fixtures + source [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T192543Z_real_compressed_fixture_request_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "tool": "webftr-js8-real-compressed-fixture-capture-request", "tool_version": "step75-real-compressed-fixture-capture-request", "schema": "webftr-js8-real-compressed-fixture-capture-request-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", "state": "waiting_for_real_compressed_framedata_fixture", "step74_gate_summary": { "tool_version": "step75-real-compressed-fixture-capture-request", "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.", "source_found": true, "jsc_entry_count": 200000, "external_fixture_count": 0, "external_fixture_pass_count": 0, "external_source_comparison_pass_count": 0, "synthetic_selftest_fixture_count": 8, "synthetic_selftest_pass_count": 8, "synthetic_selftest_all_passed": true, "webftr_display_count": 0 }, "fixture_paths": [ { "path": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json", "exists": false }, { "path": "/decoders/js8_decoder/runtime/js8_compressed_frame_fixtures.json", "exists": false }, { "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixtures.json", "exists": false }, { "path": "/decoders/js8_decoder/logs/js8_compressed_frame_fixture_import.json", "exists": false } ], "written_template": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.template.json", "target_fixture_file": "/decoders/js8_decoder/runtime/fixtures/js8_compressed_frame_fixtures.json", "operator_short_checklist": [ "Keep JS8Lab RX-only; do not start any TX/PTT/Tune/Send action from this package.", "Use JS8Call/JS8Call-Improved or a trusted external decoder to identify one exact compressed JS8 data frame and its decoded text.", "Copy the exact 12-character message174 payload and exact JS8Call-decoded text into runtime/fixtures/js8_compressed_frame_fixtures.json.", "Include reference metadata: WAV filename, UTC timestamp, JS8Call version/source, frequency/audio offset if known, and a short note.", "Rerun ./start.sh; Step75 will call the Step74 gate and report whether the external comparison passes." ], "fixture_template_preview": { "schema": "webftr-js8-compressed-frame-fixture-file-v1", "purpose": "Real JS8Call/RF comparison fixtures for FrameDataCompressed/JSC text validation. Do not use synthetic rows for release decisions.", "how_to_fill": [ "Capture or otherwise obtain one exact 12-character message174 payload for a FrameDataCompressed JS8 data frame.", "Decode the same frame with JS8Call/JS8Call-Improved and copy the exact expected text into expected_text.", "Add reference metadata that explains how the expected text was obtained, for example JS8Call log line, WAV name, UTC timestamp, frequency and SNR.", "Place the filled file at runtime/fixtures/js8_compressed_frame_fixtures.json and rerun ./start.sh or RUN_JS8_STEP75_REAL_COMPRESSED_FIXTURE_REQUEST.sh." ], "fixtures": [ { "message174_text_12chars": "REPLACE_ME12", "expected_text": "HELLO", "js8call_reference": "Exact JS8Call/JS8Call-Improved reference for this same frame; include log line, version, or screenshot note.", "rf_reference": { "wav": "/decoders/js8_test.wav", "utc": "2026-05-27T00:00:00Z", "dial_hz": null, "audio_offset_hz": null, "snr_db": null, "notes": "Replace with real capture metadata." }, "external_comparison": true, "note": "Template row only. Remove or replace before using as evidence." } ] }, "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, "step74_gate_latest": "/logs/js8_compressed_frame_fixture_gate_latest.json", "step75_request_latest": "/logs/js8_real_compressed_fixture_request_latest.json" }, "warnings": [ "Step75 does not decode new RF data and does not release compressed free text to WebFTR.", "Synthetic JSC fixtures are only selftests; a release gate needs a real JS8Call/RF comparison fixture.", "The generated template contains placeholder values and must not be counted as evidence until edited with real data." ], "next_action": "Fill runtime/fixtures/js8_compressed_frame_fixtures.json from the generated template, then rerun Step75.", "stable_latest_written": "/decoders/js8_decoder/logs/js8_real_compressed_fixture_request_latest.json" } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T192543Z_real-compressed-fixture-request.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T192543Z_real-compressed-fixture-request_manifest.json