{
  "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"
}