{
  "schema": "webftr-js8-decoder-lab-browser-report-v1-slim-step90",
  "version": "step96-manifest-status-evidence-polish",
  "created_utc": "2026-05-28T10:56:49Z",
  "project": "WebFTR JS8 Decoder Lab",
  "root": "/decoders/js8_decoder",
  "expected_root": "/decoders/js8_decoder",
  "logs_dir": "/decoders/js8_decoder/logs",
  "runtime_dir": "/decoders/js8_decoder/runtime",
  "report_mode": "step90_slim_timeout_guard",
  "daemon_status": {
    "schema": "webftr-js8lab-daemon-status-v2",
    "version": "step96-manifest-status-evidence-polish",
    "created_utc": "2026-05-26T07:46:12Z",
    "updated_utc": "2026-05-28T10:11:20Z",
    "state": "diagnostics_ok",
    "detail": "Diagnose fertig",
    "exit_code": 0,
    "root": "/decoders/js8_decoder",
    "expected_root": "/decoders/js8_decoder",
    "wav": "/decoders/js8_test.wav",
    "mode": "real-wav-intake-validator-auto-handoff",
    "start_guard": {
      "start_stops_existing_instance": true,
      "stale_pid_cleanup": true,
      "root_orphan_cleanup": true,
      "port_guard": true,
      "foreign_port_owner_not_killed": true
    },
    "server": {
      "host": "0.0.0.0",
      "port": 8000,
      "pid": 176367,
      "running": true,
      "log": "/decoders/js8_decoder/logs/js8_browser_server.log"
    },
    "diagnostics": {
      "pid": 176383,
      "running": false,
      "log": "/decoders/js8_decoder/logs/js8_start_diagnostics_latest.log",
      "last_command": "./run_js8_decoder_lab.sh real-wav-intake-validator-auto-handoff /decoders/js8_test.wav"
    },
    "latest_chain_summary": {
      "available": true,
      "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json",
      "stat": {
        "exists": true,
        "size": 13515,
        "mtime_utc": "2026-05-28T10:11:19Z"
      },
      "tool_version": "step96-manifest-status-evidence-polish",
      "created_utc": "2026-05-28T10:11:19Z",
      "verdict": "step90_full_hunt_completed_no_data_frames_waiting_for_new_wav",
      "planned_wav_count": 2,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "latest_step87_summary_slim": {
        "available": true,
        "tool_version": "step96-manifest-status-evidence-polish",
        "created_utc": "2026-05-28T10:11:18Z",
        "verdict": "step87_corpus_control_frames_only_no_data_frames",
        "tested_wav_count": 2,
        "planned_wav_count": 2,
        "unique_discovered_wav_count": 2,
        "duplicate_wav_count": 1,
        "unique_control_frame_total_across_wavs": 4,
        "data_frame_candidate_count": 0,
        "compressed_data_frame_candidate_count": 0
      },
      "per_wav_evidence_surface": {
        "schema": "webftr-js8-real-wav-per-wav-evidence-surface-v1",
        "tool_version": "step96-manifest-status-evidence-polish",
        "created_utc": "2026-05-28T10:11:19Z",
        "tested_wav_count": 2,
        "wavs_with_control_frames": 2,
        "wavs_with_data_frames": 0,
        "wavs_with_compressed_data_frames": 0,
        "data_frame_candidate_count": 0,
        "compressed_data_frame_candidate_count": 0,
        "per_wav": [
          {
            "index": 0,
            "input_wav": "/decoders/js8_test.wav",
            "basename": "js8_test.wav",
            "duration_seconds": 192.017,
            "sample_rate_hz": 12000,
            "wav_was_read": true,
            "tested_window_count": 3,
            "runtime_info87_rows_count": 144,
            "source_exact_zero_distance_candidate_count": 48,
            "message174_decode_count": 6,
            "frame_type_counts": {
              "FrameHeartbeat": 3,
              "FrameDirected": 3
            },
            "unique_control_frame_count": 2,
            "data_frame_candidate_count": 0,
            "compressed_data_frame_candidate_count": 0,
            "unique_frame_rows_preview": [
              {
                "type": "FrameHeartbeat",
                "text": "HB 004REY/0V4 OJ16",
                "callsign": "004REY/0V4",
                "grid": null,
                "command": null
              },
              {
                "type": "FrameDirected",
                "text": "9I2TZR/P 0Z0PMP INFO 28",
                "callsign": "9I2TZR/P",
                "grid": null,
                "command": null
              }
            ],
            "verdict": "control_frames_only"
          },
          {
            "index": 1,
            "input_wav": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
            "basename": "A_1_4.wav",
            "duration_seconds": 15.0,
            "sample_rate_hz": 12000,
            "wav_was_read": true,
            "tested_window_count": 1,
            "runtime_info87_rows_count": 48,
            "source_exact_zero_distance_candidate_count": 16,
            "message174_decode_count": 2,
            "frame_type_counts": {
              "FrameHeartbeat": 1,
              "FrameDirected": 1
            },
            "unique_control_frame_count": 2,
            "data_frame_candidate_count": 0,
            "compressed_data_frame_candidate_count": 0,
            "unique_frame_rows_preview": [
              {
                "type": "FrameHeartbeat",
                "text": "HB 004REY/0V4 OJ16",
                "callsign": "004REY/0V4",
                "grid": null,
                "command": null
              },
              {
                "type": "FrameDirected",
                "text": "9I2TZR/P 0Z0PMP INFO 28",
                "callsign": "9I2TZR/P",
                "grid": null,
                "command": null
              }
            ],
            "verdict": "control_frames_only"
          }
        ],
        "operator_verdict": "tested_wavs_contain_control_frames_only_or_no_frames"
      },
      "extra_wav_count": 1,
      "valid_extra_wav_count": 1,
      "invalid_wav_count": 0,
      "invalid_extra_wav_count": 0,
      "primary_wav_valid": true,
      "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"
        },
        {
          "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "source": "dir:/decoders/js8_decoder/runtime/input_wavs",
          "stat": {
            "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
            "exists": true,
            "is_file": true,
            "size": 360208,
            "mtime_utc": "2026-05-28T06:39:47Z"
          },
          "exists": true,
          "is_file": true,
          "readable_wav": true,
          "valid_for_corpus_hunt": true,
          "warnings": [],
          "errors": [],
          "sha256_first_2m": "60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138",
          "channels": 1,
          "sample_width_bytes": 2,
          "sample_rate_hz": 12000,
          "frames": 180000,
          "duration_seconds": 15.0,
          "compression_type": "NONE"
        }
      ],
      "valid_extra_wavs": [
        {
          "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "source": "dir:/decoders/js8_decoder/runtime/input_wavs",
          "stat": {
            "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
            "exists": true,
            "is_file": true,
            "size": 360208,
            "mtime_utc": "2026-05-28T06:39:47Z"
          },
          "exists": true,
          "is_file": true,
          "readable_wav": true,
          "valid_for_corpus_hunt": true,
          "warnings": [],
          "errors": [],
          "sha256_first_2m": "60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138",
          "channels": 1,
          "sample_width_bytes": 2,
          "sample_rate_hz": 12000,
          "frames": 180000,
          "duration_seconds": 15.0,
          "compression_type": "NONE"
        }
      ],
      "invalid_wavs": [],
      "discovered_wav_count": 3,
      "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": 13561,
          "mtime_utc": "2026-05-28T10:11:18Z"
        },
        "available": true,
        "tool_version": "step96-manifest-status-evidence-polish",
        "created_utc": "2026-05-28T10:11:18Z",
        "verdict": "step87_corpus_control_frames_only_no_data_frames",
        "tested_wav_count": 2,
        "planned_wav_count": 2,
        "unique_discovered_wav_count": 2,
        "duplicate_wav_count": 1,
        "data_frame_candidate_count": 0,
        "compressed_data_frame_candidate_count": 0,
        "unique_control_frame_total_across_wavs": 4
      },
      "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": 13518,
          "mtime_utc": "2026-05-28T10:01:32Z"
        },
        "available": true,
        "tool_version": "step96-manifest-status-evidence-polish",
        "created_utc": "2026-05-28T10:01:32Z",
        "verdict": "step90_valid_extra_wav_detected_auto_handoff_to_step87",
        "action": "run_full_corpus_hunt_now",
        "full_hunt_ran": false,
        "valid_extra_wav_count": 1,
        "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-28T10:11:19Z"
        },
        "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-28T10:11:19Z"
        }
      },
      "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-28T10:11:19Z"
        },
        "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-28T10:11:19Z"
        }
      },
      "action": "await_new_real_js8_freetext_wav",
      "full_hunt_ran": true,
      "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."
    },
    "links": {
      "home": "/",
      "api_report": "/api/report",
      "api_status": "/api/status",
      "logs": "/logs/",
      "latest_log": "/logs/latest.log",
      "start_diagnostics_log": "/logs/js8_start_diagnostics_latest.log",
      "server_log": "/logs/js8_browser_server.log"
    },
    "rx_only_guard": {
      "tx": false,
      "ptt": false,
      "tune": false,
      "send": false,
      "js8call_runtime_control": false
    },
    "history": [
      {
        "utc": "2026-05-28T05:48:39Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:48:39Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T06:14:26Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:14:26Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:14:27Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T06:14:27Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-corpus-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:14:29Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:14:29Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T06:38:57Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:38:58Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:38:59Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T06:38:59Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:39:00Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T06:39:01Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T07:01:51Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:01:52Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:01:53Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T07:01:53Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:01:54Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:14:24Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T07:46:19Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:46:20Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:46:21Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T07:46:21Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:46:22Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T07:56:20Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T08:18:41Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:18:42Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:18:43Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T08:18:43Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:18:44Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:28:33Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T08:41:01Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:41:02Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:41:03Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T08:41:03Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:41:04Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T08:50:50Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T09:03:58Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T09:03:58Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T09:03:59Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T09:03:59Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T09:04:01Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T09:13:50Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T10:01:30Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T10:01:30Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T10:01:31Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T10:01:31Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-intake-validator-auto-handoff /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T10:01:32Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T10:11:20Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      }
    ],
    "status_file": "/decoders/js8_decoder/runtime/js8lab_status.json"
  },
  "latest_chain_summary": {
    "available": true,
    "path": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 13515,
      "mtime_utc": "2026-05-28T10:11:19Z"
    },
    "tool_version": "step96-manifest-status-evidence-polish",
    "created_utc": "2026-05-28T10:11:19Z",
    "verdict": "step90_full_hunt_completed_no_data_frames_waiting_for_new_wav",
    "planned_wav_count": 2,
    "unique_discovered_wav_count": 2,
    "duplicate_wav_count": 1,
    "duplicate_wavs": [
      {
        "path": "/decoders/js8_wavs/A_1_4.wav",
        "source": "dir:/decoders/js8_wavs",
        "stat": {
          "path": "/decoders/js8_wavs/A_1_4.wav",
          "exists": true,
          "is_file": true,
          "size": 360208,
          "mtime_utc": "2026-05-28T06:39:47Z"
        },
        "fingerprint": {
          "ok": true,
          "size": 360208,
          "sha256_first_2m": "60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138",
          "key": "size:360208:sha256_first_2m:60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138"
        },
        "duplicate_of": {
          "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "source": "dir:/decoders/js8_decoder/runtime/input_wavs"
        },
        "dedup_reason": "same_size_and_sha256_first_2m"
      }
    ],
    "data_frame_candidate_count": 0,
    "compressed_data_frame_candidate_count": 0,
    "latest_step87_summary_slim": {
      "available": true,
      "tool_version": "step96-manifest-status-evidence-polish",
      "created_utc": "2026-05-28T10:11:18Z",
      "verdict": "step87_corpus_control_frames_only_no_data_frames",
      "tested_wav_count": 2,
      "planned_wav_count": 2,
      "unique_discovered_wav_count": 2,
      "duplicate_wav_count": 1,
      "unique_control_frame_total_across_wavs": 4,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0
    },
    "per_wav_evidence_surface": {
      "schema": "webftr-js8-real-wav-per-wav-evidence-surface-v1",
      "tool_version": "step96-manifest-status-evidence-polish",
      "created_utc": "2026-05-28T10:11:19Z",
      "tested_wav_count": 2,
      "wavs_with_control_frames": 2,
      "wavs_with_data_frames": 0,
      "wavs_with_compressed_data_frames": 0,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "per_wav": [
        {
          "index": 0,
          "input_wav": "/decoders/js8_test.wav",
          "basename": "js8_test.wav",
          "duration_seconds": 192.017,
          "sample_rate_hz": 12000,
          "wav_was_read": true,
          "tested_window_count": 3,
          "runtime_info87_rows_count": 144,
          "source_exact_zero_distance_candidate_count": 48,
          "message174_decode_count": 6,
          "frame_type_counts": {
            "FrameHeartbeat": 3,
            "FrameDirected": 3
          },
          "unique_control_frame_count": 2,
          "data_frame_candidate_count": 0,
          "compressed_data_frame_candidate_count": 0,
          "unique_frame_rows_preview": [
            {
              "type": "FrameHeartbeat",
              "text": "HB 004REY/0V4 OJ16",
              "callsign": "004REY/0V4",
              "grid": null,
              "command": null
            },
            {
              "type": "FrameDirected",
              "text": "9I2TZR/P 0Z0PMP INFO 28",
              "callsign": "9I2TZR/P",
              "grid": null,
              "command": null
            }
          ],
          "verdict": "control_frames_only"
        },
        {
          "index": 1,
          "input_wav": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "basename": "A_1_4.wav",
          "duration_seconds": 15.0,
          "sample_rate_hz": 12000,
          "wav_was_read": true,
          "tested_window_count": 1,
          "runtime_info87_rows_count": 48,
          "source_exact_zero_distance_candidate_count": 16,
          "message174_decode_count": 2,
          "frame_type_counts": {
            "FrameHeartbeat": 1,
            "FrameDirected": 1
          },
          "unique_control_frame_count": 2,
          "data_frame_candidate_count": 0,
          "compressed_data_frame_candidate_count": 0,
          "unique_frame_rows_preview": [
            {
              "type": "FrameHeartbeat",
              "text": "HB 004REY/0V4 OJ16",
              "callsign": "004REY/0V4",
              "grid": null,
              "command": null
            },
            {
              "type": "FrameDirected",
              "text": "9I2TZR/P 0Z0PMP INFO 28",
              "callsign": "9I2TZR/P",
              "grid": null,
              "command": null
            }
          ],
          "verdict": "control_frames_only"
        }
      ],
      "operator_verdict": "tested_wavs_contain_control_frames_only_or_no_frames"
    },
    "extra_wav_count": 1,
    "valid_extra_wav_count": 1,
    "invalid_wav_count": 0,
    "invalid_extra_wav_count": 0,
    "primary_wav_valid": true,
    "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"
      },
      {
        "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
        "source": "dir:/decoders/js8_decoder/runtime/input_wavs",
        "stat": {
          "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "exists": true,
          "is_file": true,
          "size": 360208,
          "mtime_utc": "2026-05-28T06:39:47Z"
        },
        "exists": true,
        "is_file": true,
        "readable_wav": true,
        "valid_for_corpus_hunt": true,
        "warnings": [],
        "errors": [],
        "sha256_first_2m": "60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138",
        "channels": 1,
        "sample_width_bytes": 2,
        "sample_rate_hz": 12000,
        "frames": 180000,
        "duration_seconds": 15.0,
        "compression_type": "NONE"
      }
    ],
    "valid_extra_wavs": [
      {
        "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
        "source": "dir:/decoders/js8_decoder/runtime/input_wavs",
        "stat": {
          "path": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
          "exists": true,
          "is_file": true,
          "size": 360208,
          "mtime_utc": "2026-05-28T06:39:47Z"
        },
        "exists": true,
        "is_file": true,
        "readable_wav": true,
        "valid_for_corpus_hunt": true,
        "warnings": [],
        "errors": [],
        "sha256_first_2m": "60b650c2090dff5e2144f164ebe692cde5f048c769518e1b1b9e67223f3da138",
        "channels": 1,
        "sample_width_bytes": 2,
        "sample_rate_hz": 12000,
        "frames": 180000,
        "duration_seconds": 15.0,
        "compression_type": "NONE"
      }
    ],
    "invalid_wavs": [],
    "discovered_wav_count": 3,
    "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": 13561,
        "mtime_utc": "2026-05-28T10:11:18Z"
      },
      "available": true,
      "tool_version": "step96-manifest-status-evidence-polish",
      "created_utc": "2026-05-28T10:11:18Z",
      "verdict": "step87_corpus_control_frames_only_no_data_frames",
      "tested_wav_count": 2,
      "planned_wav_count": 2,
      "unique_discovered_wav_count": 2,
      "duplicate_wav_count": 1,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "unique_control_frame_total_across_wavs": 4
    },
    "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": 13518,
        "mtime_utc": "2026-05-28T10:01:32Z"
      },
      "available": true,
      "tool_version": "step96-manifest-status-evidence-polish",
      "created_utc": "2026-05-28T10:01:32Z",
      "verdict": "step90_valid_extra_wav_detected_auto_handoff_to_step87",
      "action": "run_full_corpus_hunt_now",
      "full_hunt_ran": false,
      "valid_extra_wav_count": 1,
      "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-28T10:11:19Z"
      },
      "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-28T10:11:19Z"
      }
    },
    "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-28T10:11:19Z"
      },
      "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-28T10:11:19Z"
      }
    },
    "action": "await_new_real_js8_freetext_wav",
    "full_hunt_ran": true,
    "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."
  },
  "wav_candidates": [
    {
      "path": "/decoders/js8_test.wav",
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 4608442,
      "mtime_utc": "2026-05-26T06:05:27Z"
    },
    {
      "path": "/home/webftr/decoders/js8_test.wav",
      "exists": false,
      "error": "[Errno 2] No such file or directory: '/home/webftr/decoders/js8_test.wav'"
    },
    {
      "path": "/decoders/js8_decoder/runtime/input_wavs",
      "exists": true,
      "is_file": false,
      "is_dir": true,
      "size": 4096,
      "mtime_utc": "2026-05-28T07:01:52Z"
    },
    {
      "path": "/decoders/js8_decoder/runtime/fixtures/wavs",
      "exists": true,
      "is_file": false,
      "is_dir": true,
      "size": 4096,
      "mtime_utc": "2026-05-28T05:48:38Z"
    }
  ],
  "selected_wav_hint": {
    "path": "/decoders/js8_test.wav",
    "exists": true,
    "is_file": true,
    "is_dir": false,
    "size": 4608442,
    "mtime_utc": "2026-05-26T06:05:27Z"
  },
  "latest_manifest": {
    "name": "20260528T100131Z_real-wav-intake-validator-auto-handoff_manifest.json",
    "url": "/logs/20260528T100131Z_real-wav-intake-validator-auto-handoff_manifest.json",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 1720,
      "mtime_utc": "2026-05-28T10:11:19Z"
    },
    "json": {
      "version": "step96-manifest-status-evidence-polish",
      "schema": "webftr-js8-decoder-lab-log-manifest-v2",
      "status": "ok",
      "exit_code": 0,
      "command": "real-wav-intake-validator-auto-handoff",
      "timestamp_utc": "2026-05-28T10:11:19Z",
      "next_step": "Add a valid real JS8 WAV containing free-text/Data/Compressed frames under runtime/input_wavs or set JS8LAB_WAV_CORPUS_DIRS, then rerun ./start.sh. Step90 validates it and automatically runs the full corpus hunt when appropriate.",
      "outputs": {
        "real_wav_intake_validator_precheck_json": "/decoders/js8_decoder/logs/20260528T100131Z_real_wav_intake_validator_auto_handoff_precheck_output.json",
        "real_wav_intake_validator_json": "/decoders/js8_decoder/logs/20260528T100131Z_real_wav_intake_validator_auto_handoff_output.json",
        "real_wav_intake_validator_latest_json": "/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json",
        "latest_step87_json": "/decoders/js8_decoder/logs/js8_real_wav_corpus_data_frame_hunt_latest.json"
      }
    }
  },
  "latest_log": {
    "url": "/logs/latest.log",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 1885862,
      "mtime_utc": "2026-05-28T10:11:20Z"
    },
    "tail": "            \"grid\": null,\n            \"command\": null\n          },\n          {\n            \"type\": \"FrameDirected\",\n            \"text\": \"9I2TZR/P 0Z0PMP INFO 28\",\n            \"callsign\": \"9I2TZR/P\",\n            \"grid\": null,\n            \"command\": null\n          }\n        ],\n        \"verdict\": \"control_frames_only\"\n      },\n      {\n        \"index\": 1,\n        \"input_wav\": \"/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav\",\n        \"basename\": \"A_1_4.wav\",\n        \"duration_seconds\": 15.0,\n        \"sample_rate_hz\": 12000,\n        \"wav_was_read\": true,\n        \"tested_window_count\": 1,\n        \"runtime_info87_rows_count\": 48,\n        \"source_exact_zero_distance_candidate_count\": 16,\n        \"message174_decode_count\": 2,\n        \"frame_type_counts\": {\n          \"FrameHeartbeat\": 1,\n          \"FrameDirected\": 1\n        },\n        \"unique_control_frame_count\": 2,\n        \"data_frame_candidate_count\": 0,\n        \"compressed_data_frame_candidate_count\": 0,\n        \"unique_frame_rows_preview\": [\n          {\n            \"type\": \"FrameHeartbeat\",\n            \"text\": \"HB 004REY/0V4 OJ16\",\n            \"callsign\": \"004REY/0V4\",\n            \"grid\": null,\n            \"command\": null\n          },\n          {\n            \"type\": \"FrameDirected\",\n            \"text\": \"9I2TZR/P 0Z0PMP INFO 28\",\n            \"callsign\": \"9I2TZR/P\",\n            \"grid\": null,\n            \"command\": null\n          }\n        ],\n        \"verdict\": \"control_frames_only\"\n      }\n    ],\n    \"operator_verdict\": \"tested_wavs_contain_control_frames_only_or_no_frames\"\n  },\n  \"previous_step89_summary\": {\n    \"path\": \"/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json\",\n    \"stat\": {\n      \"path\": \"/decoders/js8_decoder/logs/js8_real_wav_corpus_auto_handoff_latest.json\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 4026,\n      \"mtime_utc\": \"2026-05-28T06:14:28Z\"\n    },\n    \"available\": true,\n    \"tool_version\": \"step89-real-wav-corpus-auto-handoff\",\n    \"created_utc\": \"2026-05-28T06:14:28Z\",\n    \"verdict\": \"step89_waiting_for_additional_real_js8_freetext_wav\",\n    \"action\": \"wait_for_extra_wav\",\n    \"full_hunt_ran\": false,\n    \"data_frame_candidate_count\": 0,\n    \"compressed_data_frame_candidate_count\": 0\n  },\n  \"previous_step90_summary\": {\n    \"path\": \"/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json\",\n    \"stat\": {\n      \"path\": \"/decoders/js8_decoder/logs/js8_real_wav_intake_validator_auto_handoff_latest.json\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 13518,\n      \"mtime_utc\": \"2026-05-28T10:01:32Z\"\n    },\n    \"available\": true,\n    \"tool_version\": \"step96-manifest-status-evidence-polish\",\n    \"created_utc\": \"2026-05-28T10:01:32Z\",\n    \"verdict\": \"step90_valid_extra_wav_detected_auto_handoff_to_step87\",\n    \"action\": \"run_full_corpus_hunt_now\",\n    \"full_hunt_ran\": false,\n    \"valid_extra_wav_count\": 1,\n    \"invalid_wav_count\": 0,\n    \"data_frame_candidate_count\": 0,\n    \"compressed_data_frame_candidate_count\": 0\n  },\n  \"operator_files\": {\n    \"input_wavs_dir\": \"/decoders/js8_decoder/runtime/input_wavs\",\n    \"fixtures_wavs_dir\": \"/decoders/js8_decoder/runtime/fixtures/wavs\",\n    \"readme\": \"/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md\",\n    \"helper\": \"/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh\",\n    \"readme_stat\": {\n      \"path\": \"/decoders/js8_decoder/runtime/input_wavs/README_STEP88_WAV_CORPUS_INTAKE.md\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 427,\n      \"mtime_utc\": \"2026-05-28T10:11:19Z\"\n    },\n    \"helper_stat\": {\n      \"path\": \"/decoders/js8_decoder/runtime/input_wavs/add_wav_to_corpus_step88.sh\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 446,\n      \"mtime_utc\": \"2026-05-28T10:11:19Z\"\n    }\n  },\n  \"step90_operator_files\": {\n    \"input_wavs_dir\": \"/decoders/js8_decoder/runtime/input_wavs\",\n    \"readme\": \"/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md\",\n    \"helper\": \"/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh\",\n    \"readme_stat\": {\n      \"path\": \"/decoders/js8_decoder/runtime/input_wavs/README_STEP90_WAV_INTAKE_VALIDATOR.md\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 415,\n      \"mtime_utc\": \"2026-05-28T10:11:19Z\"\n    },\n    \"helper_stat\": {\n      \"path\": \"/decoders/js8_decoder/runtime/input_wavs/validate_wav_corpus_step90.sh\",\n      \"exists\": true,\n      \"is_file\": true,\n      \"size\": 194,\n      \"mtime_utc\": \"2026-05-28T10:11:19Z\"\n    }\n  },\n  \"after_hunt\": true,\n  \"force_hunt\": false,\n  \"full_hunt_ran\": true,\n  \"data_frame_candidate_count\": 0,\n  \"compressed_data_frame_candidate_count\": 0,\n  \"action\": \"await_new_real_js8_freetext_wav\",\n  \"verdict\": \"step90_full_hunt_completed_no_data_frames_waiting_for_new_wav\",\n  \"warnings\": [\n    \"Step93 still does not release JS8 free text directly; it surfaces per-WAV evidence so duplicate/control-only WAVs are obvious.\",\n    \"The primary /decoders/js8_test.wav is a control-frame reference and is not counted as an extra WAV.\",\n    \"Byte-identical corpus WAV paths are de-duplicated before validation/hunt, so a mirrored bundled sample is tested once.\",\n    \"Step93 promotes a compact per_wav_evidence_surface into status/report so A_1_4.wav evidence is visible without opening huge logs.\",\n    \"Only valid unique extra WAVs trigger the full corpus hunt automatically.\"\n  ],\n  \"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.\"\n}\n\n[webftr-js8-lab] OK\n[webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260528T100131Z_real-wav-intake-validator-auto-handoff.log\n[webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260528T100131Z_real-wav-intake-validator-auto-handoff_manifest.json\n"
  },
  "recent_files": [
    {
      "name": "js8_browser_server.log",
      "size": 5770,
      "mtime_utc": "2026-05-28T10:56:49Z",
      "url": "/logs/js8_browser_server.log"
    },
    {
      "name": "js8_browser_report_latest.json",
      "size": 54575,
      "mtime_utc": "2026-05-28T10:56:22Z",
      "url": "/logs/js8_browser_report_latest.json"
    },
    {
      "name": "js8_start_diagnostics_latest.log",
      "size": 1886222,
      "mtime_utc": "2026-05-28T10:11:20Z",
      "url": "/logs/js8_start_diagnostics_latest.log"
    },
    {
      "name": "latest.log",
      "size": 1885862,
      "mtime_utc": "2026-05-28T10:11:20Z",
      "url": "/logs/latest.log"
    },
    {
      "name": "20260528T100131Z_real-wav-intake-validator-auto-handoff.log",
      "size": 1885862,
      "mtime_utc": "2026-05-28T10:11:20Z",
      "url": "/logs/20260528T100131Z_real-wav-intake-validator-auto-handoff.log"
    },
    {
      "name": "20260528T100131Z_real-wav-intake-validator-auto-handoff_manifest.json",
      "size": 1720,
      "mtime_utc": "2026-05-28T10:11:19Z",
      "url": "/logs/20260528T100131Z_real-wav-intake-validator-auto-handoff_manifest.json"
    },
    {
      "name": "js8_real_wav_intake_validator_auto_handoff_latest.json",
      "size": 13515,
      "mtime_utc": "2026-05-28T10:11:19Z",
      "url": "/logs/js8_real_wav_intake_validator_auto_handoff_latest.json"
    },
    {
      "name": "20260528T100131Z_real_wav_intake_validator_auto_handoff_output.json",
      "size": 13515,
      "mtime_utc": "2026-05-28T10:11:19Z",
      "url": "/logs/20260528T100131Z_real_wav_intake_validator_auto_handoff_output.json"
    },
    {
      "name": "20260528T100131Z_real_wav_intake_validator_auto_handoff_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:19Z",
      "url": "/logs/20260528T100131Z_real_wav_intake_validator_auto_handoff_output.stderr.log"
    },
    {
      "name": "20260528T100132Z_real-wav-corpus-data-frame-hunt.log",
      "size": 1856952,
      "mtime_utc": "2026-05-28T10:11:19Z",
      "url": "/logs/20260528T100132Z_real-wav-corpus-data-frame-hunt.log"
    },
    {
      "name": "20260528T100132Z_real-wav-corpus-data-frame-hunt_manifest.json",
      "size": 1740,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100132Z_real-wav-corpus-data-frame-hunt_manifest.json"
    },
    {
      "name": "js8_real_wav_corpus_data_frame_hunt_latest.json",
      "size": 13561,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/js8_real_wav_corpus_data_frame_hunt_latest.json"
    },
    {
      "name": "20260528T100132Z_real_wav_corpus_data_frame_hunt_output.json",
      "size": 13561,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100132Z_real_wav_corpus_data_frame_hunt_output.json"
    },
    {
      "name": "20260528T100132Z_real_wav_corpus_data_frame_hunt_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100132Z_real_wav_corpus_data_frame_hunt_output.stderr.log"
    },
    {
      "name": "20260528T100132Z_step87_wav1_unique_frame_census_output.json",
      "size": 14764,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100132Z_step87_wav1_unique_frame_census_output.json"
    },
    {
      "name": "20260528T100132Z_step87_result_jsons.txt",
      "size": 176,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100132Z_step87_result_jsons.txt"
    },
    {
      "name": "20260528T100853Z_real-wav-unique-frame-census.log",
      "size": 450698,
      "mtime_utc": "2026-05-28T10:11:18Z",
      "url": "/logs/20260528T100853Z_real-wav-unique-frame-census.log"
    },
    {
      "name": "20260528T100853Z_real-wav-unique-frame-census_manifest.json",
      "size": 1578,
      "mtime_utc": "2026-05-28T10:11:17Z",
      "url": "/logs/20260528T100853Z_real-wav-unique-frame-census_manifest.json"
    },
    {
      "name": "js8_real_wav_unique_frame_census_latest.json",
      "size": 14764,
      "mtime_utc": "2026-05-28T10:11:17Z",
      "url": "/logs/js8_real_wav_unique_frame_census_latest.json"
    },
    {
      "name": "20260528T100853Z_real_wav_unique_frame_census_output.json",
      "size": 14764,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/20260528T100853Z_real_wav_unique_frame_census_output.json"
    },
    {
      "name": "20260528T100853Z_real_wav_unique_frame_census_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/20260528T100853Z_real_wav_unique_frame_census_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_real-wav-wide-data-frame-search.log",
      "size": 434418,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/20260528T100853Z_real-wav-wide-data-frame-search.log"
    },
    {
      "name": "20260528T100853Z_real-wav-wide-data-frame-search_manifest.json",
      "size": 1834,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/20260528T100853Z_real-wav-wide-data-frame-search_manifest.json"
    },
    {
      "name": "js8_step85_window_results_manifest_latest.json",
      "size": 1552,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/js8_step85_window_results_manifest_latest.json"
    },
    {
      "name": "js8_real_wav_wide_window_plan_latest.json",
      "size": 3744,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/js8_real_wav_wide_window_plan_latest.json"
    },
    {
      "name": "js8_real_wav_wide_data_frame_search_latest.json",
      "size": 12676,
      "mtime_utc": "2026-05-28T10:11:16Z",
      "url": "/logs/js8_real_wav_wide_data_frame_search_latest.json"
    },
    {
      "name": "20260528T100853Z_real_wav_wide_data_frame_search_output.json",
      "size": 12676,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_real_wav_wide_data_frame_search_output.json"
    },
    {
      "name": "20260528T100853Z_real_wav_wide_data_frame_search_output.stderr.log",
      "size": 182,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_real_wav_wide_data_frame_search_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_step85_window_results_manifest.json",
      "size": 1552,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_step85_window_results_manifest.json"
    },
    {
      "name": "20260528T100853Z_step85_window_results.jsonl",
      "size": 1203,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_step85_window_results.jsonl"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_confirmed_control_frame_rx_release_output.json",
      "size": 9856,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_confirmed_control_frame_rx_release_output.json"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_confirmed_control_frame_rx_release_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_confirmed_control_frame_rx_release_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_varicode_frame_unpack_probe_output.json",
      "size": 60579,
      "mtime_utc": "2026-05-28T10:11:15Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_varicode_frame_unpack_probe_output.json"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_varicode_frame_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:14Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_varicode_frame_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_confirmed_message174_decode_output.json",
      "size": 8022,
      "mtime_utc": "2026-05-28T10:11:14Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_confirmed_message174_decode_output.json"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_confirmed_message174_decode_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:14Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_confirmed_message174_decode_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_exact_map_probe_output.json",
      "size": 158187,
      "mtime_utc": "2026-05-28T10:11:14Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_exact_map_probe_output.json"
    },
    {
      "name": "20260528T100853Z_step85_window0_source_exact_map_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:11:11Z",
      "url": "/logs/20260528T100853Z_step85_window0_source_exact_map_probe_output.stderr.log"
    },
    {
      "name": "20260528T100853Z_step85_window0_post_ldpc_info87_runtime_export_output.json",
      "size": 99742,
      "mtime_utc": "2026-05-28T10:11:11Z",
      "url": "/logs/20260528T100853Z_step85_window0_post_ldpc_info87_runtime_export_output.json"
    },
    {
      "name": "20260528T100853Z_step85_window0_post_ldpc_info87_runtime_export_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T10:10:04Z",
      "url": "/logs/20260528T100853Z_step85_window0_post_ldpc_info87_runtime_export_output.stderr.log"
    }
  ],
  "stable_latest_links": {
    "browser_report": "/logs/js8_browser_report_latest.json",
    "real_wav_corpus_auto_handoff_latest": "/logs/js8_real_wav_corpus_auto_handoff_latest.json",
    "real_wav_corpus_intake_status_latest": "/logs/js8_real_wav_corpus_intake_status_latest.json",
    "real_wav_corpus_data_frame_hunt_latest": "/logs/js8_real_wav_corpus_data_frame_hunt_latest.json",
    "real_wav_corpus_plan_latest": "/logs/js8_real_wav_corpus_plan_latest.json",
    "real_wav_unique_frame_census_latest": "/logs/js8_real_wav_unique_frame_census_latest.json",
    "latest_log": "/logs/latest.log"
  },
  "browser_links": {
    "home": "/",
    "api_report": "/api/report",
    "api_status": "/api/status",
    "logs": "/logs/"
  },
  "rx_only_guard": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false,
    "webftr_productive_integration": false
  },
  "note": "Step89/Step88 slim report avoids heavy historical JSON previews so /api/report and /logs stay responsive. Full files remain directly downloadable under /logs/<filename>."
}