[js8.sh job] utc=2026-05-28T06:38:59Z [js8.sh job] build=step90-real-wav-intake-validator-auto-handoff [js8.sh job] root=/decoders/js8_decoder [js8.sh job] command=./run_js8_decoder_lab.sh real-wav-intake-validator-auto-handoff /decoders/js8_test.wav [js8.sh job] rx-only: no TX / no PTT / no Tune / no Send [webftr-js8-lab] command=real-wav-intake-validator-auto-handoff [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260528T063859Z_real-wav-intake-validator-auto-handoff.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260528T063859Z_real-wav-intake-validator-auto-handoff_manifest.json [webftr-js8-lab] utc=20260528T063859Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] Step90 real WAV intake validator auto-handoff [webftr-js8-lab] requested primary WAV: /decoders/js8_test.wav [webftr-js8-lab] Validates WAV format/readability before running the long Step87 corpus hunt. [webftr-js8-lab] If no valid extra WAV exists this stays lightweight; if a valid extra WAV exists it runs Step87 automatically. [webftr-js8-lab] RX-only guard: no TX / no PTT / no Tune / no Send / no JS8Call runtime control. [webftr-js8-lab] resolved primary WAV: /decoders/js8_test.wav ========== STEP90 1/3: VALIDATE WAV CORPUS INTAKE ========== [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260528T063859Z_real_wav_intake_validator_auto_handoff_precheck_output.json [webftr-js8-lab] JSON timeout guard: 30s { "ok": true, "tool": "webftr-js8-real-wav-intake-validator-auto-handoff", "tool_version": "step90-real-wav-intake-validator-auto-handoff", "schema": "webftr-js8-real-wav-intake-validator-auto-handoff-v1", "created_utc": "2026-05-28T06:38:59Z", "rx_only": true, "safety": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "root": "/decoders/js8_decoder", "purpose": "Validate the real WAV corpus before auto-handoff. This avoids long hunts on missing/broken files and makes ./start.sh useful once an extra real JS8 free-text WAV is added.", "primary_wav": "/decoders/js8_test.wav", "planned_wav_count": 1, "discovered_wav_count": 1, "extra_wav_count": 0, "valid_extra_wav_count": 0, "invalid_wav_count": 0, "invalid_extra_wav_count": 0, "primary_wav_valid": true, "planned_wavs": [ { "path": "/decoders/js8_test.wav", "source": "primary", "stat": { "path": "/decoders/js8_test.wav", "exists": true, "is_file": true, "size": 4608442, "mtime_utc": "2026-05-26T06:05:27Z" } } ], "validation_results": [ { "path": "/decoders/js8_test.wav", "source": "primary", "stat": { "path": "/decoders/js8_test.wav", "exists": true, "is_file": true, "size": 4608442, "mtime_utc": "2026-05-26T06:05:27Z" }, "exists": true, "is_file": true, "readable_wav": true, "valid_for_corpus_hunt": true, "warnings": [], "errors": [], "sha256_first_2m": "c049995adf22be86b9acd8d57a566fba642f877fbcd24c1c120463a665956fbf", "channels": 1, "sample_width_bytes": 2, "sample_rate_hz": 12000, "frames": 2304199, "duration_seconds": 192.017, "compression_type": "NONE" } ], "valid_extra_wavs": [], "invalid_wavs": [], "latest_step87_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_data_frame_hunt_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_data_frame_hunt_latest.json", "exists": true, "is_file": true, "size": 7303, "mtime_utc": "2026-05-28T05:20:57Z" }, "available": true, "tool_version": "step87-real-wav-corpus-data-frame-hunt", "created_utc": "2026-05-28T05:20:57Z", "verdict": "step87_corpus_control_frames_only_no_data_frames", "tested_wav_count": 1, "planned_wav_count": 1, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0, "unique_control_frame_total_across_wavs": 2 }, "previous_step89_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json", "exists": true, "is_file": true, "size": 4026, "mtime_utc": "2026-05-28T06:14:28Z" }, "available": true, "tool_version": "step89-real-wav-corpus-auto-handoff", "created_utc": "2026-05-28T06:14:28Z", "verdict": "step89_waiting_for_additional_real_js8_freetext_wav", "action": "wait_for_extra_wav", "full_hunt_ran": false, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0 }, "previous_step90_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json", "exists": false, "error": "[Errno 2] No such file or directory: '/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json'" }, "available": false, "tool_version": null, "created_utc": null, "verdict": null, "action": null, "full_hunt_ran": false, "valid_extra_wav_count": 0, "invalid_wav_count": 0, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0 }, "operator_files": { "input_wavs_dir": "/decoders/js8_decoder/runtime/input_wavs", "fixtures_wavs_dir": "/decoders/js8_decoder/runtime/fixtures/wavs", "readme": "/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md", "helper": "/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh", "readme_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md", "exists": true, "is_file": true, "size": 427, "mtime_utc": "2026-05-28T06:38:59Z" }, "helper_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh", "exists": true, "is_file": true, "size": 446, "mtime_utc": "2026-05-28T06:38:59Z" } }, "step90_operator_files": { "input_wavs_dir": "/decoders/js8_decoder/runtime/input_wavs", "readme": "/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md", "helper": "/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh", "readme_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md", "exists": true, "is_file": true, "size": 415, "mtime_utc": "2026-05-28T06:38:59Z" }, "helper_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh", "exists": true, "is_file": true, "size": 194, "mtime_utc": "2026-05-28T06:38:59Z" } }, "after_hunt": false, "force_hunt": false, "full_hunt_ran": false, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0, "action": "wait_for_extra_wav", "verdict": "step90_waiting_for_valid_additional_real_js8_freetext_wav", "warnings": [ "Step90 still does not release JS8 free text directly.", "The primary /decoders/js8_test.wav is a control-frame reference and is not counted as an extra WAV.", "Only valid extra WAVs trigger the full Step87 corpus hunt automatically." ], "next_action": "Add a real JS8 WAV with free-text/Data/Compressed transmission to runtime/input_wavs or set JS8LAB_WAV_CORPUS_DIRS. Step90 validates the WAV first and then auto-runs the full corpus hunt only when a valid extra WAV is present. If Data/Compressed candidates appear, route them to the guarded release gate." } [webftr-js8-lab] step90 action=wait_for_extra_wav ========== STEP90 2/3: NO FULL HUNT NEEDED IN THIS RUN ========== [webftr-js8-lab] action=wait_for_extra_wav ========== STEP90 3/3: FINAL VALIDATOR AUTO-HANDOFF SUMMARY ========== [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260528T063859Z_real_wav_intake_validator_auto_handoff_output.json [webftr-js8-lab] JSON timeout guard: 30s { "ok": true, "tool": "webftr-js8-real-wav-intake-validator-auto-handoff", "tool_version": "step90-real-wav-intake-validator-auto-handoff", "schema": "webftr-js8-real-wav-intake-validator-auto-handoff-v1", "created_utc": "2026-05-28T06:39:00Z", "rx_only": true, "safety": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "root": "/decoders/js8_decoder", "purpose": "Validate the real WAV corpus before auto-handoff. This avoids long hunts on missing/broken files and makes ./start.sh useful once an extra real JS8 free-text WAV is added.", "primary_wav": "/decoders/js8_test.wav", "planned_wav_count": 1, "discovered_wav_count": 1, "extra_wav_count": 0, "valid_extra_wav_count": 0, "invalid_wav_count": 0, "invalid_extra_wav_count": 0, "primary_wav_valid": true, "planned_wavs": [ { "path": "/decoders/js8_test.wav", "source": "primary", "stat": { "path": "/decoders/js8_test.wav", "exists": true, "is_file": true, "size": 4608442, "mtime_utc": "2026-05-26T06:05:27Z" } } ], "validation_results": [ { "path": "/decoders/js8_test.wav", "source": "primary", "stat": { "path": "/decoders/js8_test.wav", "exists": true, "is_file": true, "size": 4608442, "mtime_utc": "2026-05-26T06:05:27Z" }, "exists": true, "is_file": true, "readable_wav": true, "valid_for_corpus_hunt": true, "warnings": [], "errors": [], "sha256_first_2m": "c049995adf22be86b9acd8d57a566fba642f877fbcd24c1c120463a665956fbf", "channels": 1, "sample_width_bytes": 2, "sample_rate_hz": 12000, "frames": 2304199, "duration_seconds": 192.017, "compression_type": "NONE" } ], "valid_extra_wavs": [], "invalid_wavs": [], "latest_step87_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_data_frame_hunt_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_data_frame_hunt_latest.json", "exists": true, "is_file": true, "size": 7303, "mtime_utc": "2026-05-28T05:20:57Z" }, "available": true, "tool_version": "step87-real-wav-corpus-data-frame-hunt", "created_utc": "2026-05-28T05:20:57Z", "verdict": "step87_corpus_control_frames_only_no_data_frames", "tested_wav_count": 1, "planned_wav_count": 1, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0, "unique_control_frame_total_across_wavs": 2 }, "previous_step89_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json", "exists": true, "is_file": true, "size": 4026, "mtime_utc": "2026-05-28T06:14:28Z" }, "available": true, "tool_version": "step89-real-wav-corpus-auto-handoff", "created_utc": "2026-05-28T06:14:28Z", "verdict": "step89_waiting_for_additional_real_js8_freetext_wav", "action": "wait_for_extra_wav", "full_hunt_ran": false, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0 }, "previous_step90_summary": { "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json", "stat": { "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json", "exists": true, "is_file": true, "size": 6408, "mtime_utc": "2026-05-28T06:38:59Z" }, "available": true, "tool_version": "step90-real-wav-intake-validator-auto-handoff", "created_utc": "2026-05-28T06:38:59Z", "verdict": "step90_waiting_for_valid_additional_real_js8_freetext_wav", "action": "wait_for_extra_wav", "full_hunt_ran": false, "valid_extra_wav_count": 0, "invalid_wav_count": 0, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0 }, "operator_files": { "input_wavs_dir": "/decoders/js8_decoder/runtime/input_wavs", "fixtures_wavs_dir": "/decoders/js8_decoder/runtime/fixtures/wavs", "readme": "/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md", "helper": "/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh", "readme_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md", "exists": true, "is_file": true, "size": 427, "mtime_utc": "2026-05-28T06:38:59Z" }, "helper_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh", "exists": true, "is_file": true, "size": 446, "mtime_utc": "2026-05-28T06:38:59Z" } }, "step90_operator_files": { "input_wavs_dir": "/decoders/js8_decoder/runtime/input_wavs", "readme": "/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md", "helper": "/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh", "readme_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md", "exists": true, "is_file": true, "size": 415, "mtime_utc": "2026-05-28T06:38:59Z" }, "helper_stat": { "path": "/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh", "exists": true, "is_file": true, "size": 194, "mtime_utc": "2026-05-28T06:38:59Z" } }, "after_hunt": false, "force_hunt": false, "full_hunt_ran": false, "data_frame_candidate_count": 0, "compressed_data_frame_candidate_count": 0, "action": "wait_for_extra_wav", "verdict": "step90_waiting_for_valid_additional_real_js8_freetext_wav", "warnings": [ "Step90 still does not release JS8 free text directly.", "The primary /decoders/js8_test.wav is a control-frame reference and is not counted as an extra WAV.", "Only valid extra WAVs trigger the full Step87 corpus hunt automatically." ], "next_action": "Add a real JS8 WAV with free-text/Data/Compressed transmission to runtime/input_wavs or set JS8LAB_WAV_CORPUS_DIRS. Step90 validates the WAV first and then auto-runs the full corpus hunt only when a valid extra WAV is present. If Data/Compressed candidates appear, route them to the guarded release gate." } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260528T063859Z_real-wav-intake-validator-auto-handoff.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260528T063859Z_real-wav-intake-validator-auto-handoff_manifest.json [js8.sh job] finished utc=2026-05-28T06:39:00Z exit_code=0