{
  "schema": "webftr-js8-decoder-lab-browser-report-v1-slim-step90",
  "version": "step93-real-wav-per-wav-evidence-surface",
  "created_utc": "2026-05-28T08:27:43Z",
  "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": "step93-real-wav-per-wav-evidence-surface",
    "created_utc": "2026-05-26T07:46:12Z",
    "updated_utc": "2026-05-28T08:18:44Z",
    "state": "diagnostics_running",
    "detail": "Diagnosejob im Hintergrund gestartet",
    "exit_code": null,
    "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": 152086,
      "running": true,
      "log": "/decoders/js8_decoder/logs/js8_browser_server.log"
    },
    "diagnostics": {
      "pid": 152102,
      "running": true,
      "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": 11203,
        "mtime_utc": "2026-05-28T08:18:43Z"
      },
      "tool_version": "step93-real-wav-per-wav-evidence-surface",
      "created_utc": "2026-05-28T08:18:43Z",
      "verdict": "step90_valid_extra_wav_detected_auto_handoff_to_step87",
      "planned_wav_count": 2,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "latest_step87_summary_slim": {
        "available": true,
        "tool_version": "step92-real-wav-corpus-sha-dedup-handoff",
        "created_utc": "2026-05-28T07:56:17Z",
        "verdict": "step87_corpus_control_frames_only_no_data_frames",
        "tested_wav_count": 2,
        "planned_wav_count": 2,
        "unique_discovered_wav_count": 0,
        "duplicate_wav_count": 0,
        "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": "step93-real-wav-per-wav-evidence-surface",
        "created_utc": "2026-05-28T08:18:43Z",
        "tested_wav_count": 0,
        "wavs_with_control_frames": 0,
        "wavs_with_data_frames": 0,
        "wavs_with_compressed_data_frames": 0,
        "data_frame_candidate_count": 0,
        "compressed_data_frame_candidate_count": 0,
        "per_wav": [],
        "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": 13506,
          "mtime_utc": "2026-05-28T07:56:18Z"
        },
        "available": true,
        "tool_version": "step92-real-wav-corpus-sha-dedup-handoff",
        "created_utc": "2026-05-28T07:56:17Z",
        "verdict": "step87_corpus_control_frames_only_no_data_frames",
        "tested_wav_count": 2,
        "planned_wav_count": 2,
        "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": 9972,
          "mtime_utc": "2026-05-28T07:56:19Z"
        },
        "available": true,
        "tool_version": "step92-real-wav-corpus-sha-dedup-handoff",
        "created_utc": "2026-05-28T07:56:19Z",
        "verdict": "step90_full_hunt_completed_no_data_frames_waiting_for_new_wav",
        "action": "await_new_real_js8_freetext_wav",
        "full_hunt_ran": true,
        "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-28T08:18:43Z"
        },
        "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-28T08:18:43Z"
        }
      },
      "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-28T08:18:43Z"
        },
        "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-28T08:18:43Z"
        }
      },
      "action": "run_full_corpus_hunt_now",
      "full_hunt_ran": false,
      "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-28T04:10:54Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-wide-data-frame-search /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:10:55Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:18:43Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T04:36:38Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:36:38Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:36:39Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T04:36:40Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-unique-frame-census /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:36:41Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T04:44:08Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T05:11:47Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:11:47Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:11:48Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T05:11:48Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-corpus-data-frame-hunt /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:11:50Z",
        "state": "diagnostics_running",
        "detail": "Diagnosejob im Hintergrund gestartet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:21:01Z",
        "state": "diagnostics_ok",
        "detail": "Diagnose fertig",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T05:48:36Z",
        "state": "restarting",
        "detail": "Start-Guard: bestehende JS8Lab-Instanz wird geprüft und beendet",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:48:37Z",
        "state": "server_starting",
        "detail": "Browser-Logserver startet auf 0.0.0.0:8000",
        "exit_code": null
      },
      {
        "utc": "2026-05-28T05:48:38Z",
        "state": "server_running",
        "detail": "Browser-Logserver läuft auf 0.0.0.0:8000",
        "exit_code": 0
      },
      {
        "utc": "2026-05-28T05:48:38Z",
        "state": "diagnostics_running",
        "detail": "Diagnose läuft: real-wav-corpus-intake-status-slim /decoders/js8_test.wav",
        "exit_code": null
      },
      {
        "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
      }
    ],
    "status_file": "/decoders/js8_decoder/runtime/js8lab_status.json"
  },
  "latest_chain_summary": {
    "available": true,
    "path": "/decoders/js8_decoder/logs/js8_real_wav_unique_frame_census_latest.json",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 24463,
      "mtime_utc": "2026-05-28T08:26:02Z"
    },
    "tool_version": "step86-real-wav-unique-frame-census",
    "created_utc": "2026-05-28T08:26:01Z",
    "verdict": "step86_real_wav_unique_control_frames_only_no_data_frames",
    "input_wav": "/decoders/js8_test.wav",
    "wav_was_read": true,
    "runtime_info87_rows_count": 144,
    "source_exact_zero_distance_candidate_count": 48,
    "message174_decode_count": 6,
    "frame_probe_count": 6,
    "frame_type_counts": {
      "FrameHeartbeat": 3,
      "FrameDirected": 3
    },
    "webftr_display_count": 6,
    "planned_window_count": 3,
    "tested_window_count": 3,
    "unique_webftr_display_count": 2,
    "duplicate_control_frame_group_count": 2,
    "data_frame_candidate_count": 0,
    "compressed_data_frame_candidate_count": 0,
    "next_action": "Use a WAV containing a real JS8 free-text/Data/Compressed frame or import an externally confirmed fixture; otherwise continue decoder work with the two unique control frames as the confirmed audio-to-message174 regression baseline."
  },
  "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": "20260528T081844Z_real-wav-unique-frame-census_manifest.json",
    "url": "/logs/20260528T081844Z_real-wav-unique-frame-census_manifest.json",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 1524,
      "mtime_utc": "2026-05-28T08:26:02Z"
    },
    "json": {
      "schema": "webftr-js8-decoder-lab-log-manifest-v2",
      "outputs": {
        "real_wav_unique_frame_census_json": "/decoders/js8_decoder/logs/20260528T081844Z_real_wav_unique_frame_census_output.json",
        "real_wav_unique_frame_census_latest_json": "/decoders/js8_decoder/logs/js8_real_wav_unique_frame_census_latest.json",
        "step85_latest_json": "/decoders/js8_decoder/logs/js8_real_wav_wide_data_frame_search_latest.json"
      }
    }
  },
  "latest_log": {
    "url": "/logs/latest.log",
    "stat": {
      "exists": true,
      "is_file": true,
      "is_dir": false,
      "size": 1381977,
      "mtime_utc": "2026-05-28T08:26:02Z"
    },
    "tail": "step85_wide_windows/js8_step85_window_02_0120_0168.wav\",\n      \"start_seconds\": 120.0,\n      \"end_seconds\": 168.0,\n      \"selection_score\": 7.6539,\n      \"exit_codes\": {\n        \"candidate_export\": 0,\n        \"post_ldpc_info87_runtime_export\": 0,\n        \"source_exact_map_probe\": 0,\n        \"source_confirmed_message174_decode\": 0,\n        \"source_varicode_frame_unpack_probe\": 0,\n        \"source_confirmed_control_frame_rx_release\": 0\n      },\n      \"runtime_info87_rows_count\": 48,\n      \"source_exact_zero_distance_candidate_count\": 16,\n      \"message174_decode_count\": 2,\n      \"frame_probe_count\": 2,\n      \"frame_type_counts\": {\n        \"FrameHeartbeat\": 1,\n        \"FrameDirected\": 1\n      },\n      \"control_frame_release_count\": 2,\n      \"webftr_display_count\": 2,\n      \"webftr_rx_rows_preview\": [\n        {\n          \"id\": \"js8-rx67-de15d3110b0d\",\n          \"source_candidate_id\": \"js8-frame66-bf1ce62fdb4a\",\n          \"source_decode_id\": \"js8-msg174-1968175f\",\n          \"mode\": \"JS8\",\n          \"raw_message174\": \"001XqOA2iDZ0\",\n          \"valid_message174_crc12\": true,\n          \"crc12_distance\": 0,\n          \"received_crc12\": 2920,\n          \"computed_crc12\": 2920,\n          \"frame_type\": \"FrameHeartbeat\",\n          \"confidence\": \"high\",\n          \"confidence_score\": 6,\n          \"confidence_reasons\": [\n            \"valid_heartbeat_callsign\",\n            \"valid_heartbeat_grid\"\n          ],\n          \"show_in_rx_list\": true,\n          \"candidate_class\": \"webftr_control_frame_display_ready\",\n          \"release_guard\": \"step67_source_confirmed_fixed_control_frame_only\",\n          \"sort_index\": 0,\n          \"source\": {\n            \"source_file\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_exact_map_probe_output.json\",\n            \"json_path\": \"$.top_candidates[0].info87_bitstring\",\n            \"source_kind\": \"info87_bitstring\",\n            \"row_index\": 214,\n            \"map_name\": \"raw\",\n            \"map_source\": null\n          },\n          \"status\": \"HB\",\n          \"from\": \"004REY/0V4\",\n          \"to\": \"@HB\",\n          \"grid\": \"OJ16\",\n          \"message\": \"HB 004REY/0V4 OJ16\",\n          \"text\": \"HB 004REY/0V4 OJ16\",\n          \"display_text\": \"HB 004REY/0V4 OJ16\",\n          \"is_control_frame\": true\n        },\n        {\n          \"id\": \"js8-rx67-bd37f68199eb\",\n          \"source_candidate_id\": \"js8-frame66-66ab29ded46c\",\n          \"source_decode_id\": \"js8-msg174-23d83ad2\",\n          \"mode\": \"JS8\",\n          \"raw_message174\": \"Q0VsKWqfJ96x\",\n          \"valid_message174_crc12\": true,\n          \"crc12_distance\": 0,\n          \"received_crc12\": 980,\n          \"computed_crc12\": 980,\n          \"frame_type\": \"FrameDirected\",\n          \"confidence\": \"high\",\n          \"confidence_score\": 10,\n          \"confidence_reasons\": [\n            \"valid_directed_from\",\n            \"valid_directed_to\",\n            \"directed_command\"\n          ],\n          \"show_in_rx_list\": true,\n          \"candidate_class\": \"webftr_control_frame_display_ready\",\n          \"release_guard\": \"step67_source_confirmed_fixed_control_frame_only\",\n          \"sort_index\": 1,\n          \"source\": {\n            \"source_file\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_exact_map_probe_output.json\",\n            \"json_path\": \"$.top_candidates[1].info87_bitstring\",\n            \"source_kind\": \"info87_bitstring\",\n            \"row_index\": 215,\n            \"map_name\": \"raw\",\n            \"map_source\": null\n          },\n          \"status\": \"INFO\",\n          \"from\": \"9I2TZR/P\",\n          \"to\": \"0Z0PMP\",\n          \"command\": \"INFO\",\n          \"extra\": 59,\n          \"extra_value\": {\n            \"kind\": \"number\",\n            \"value\": 28\n          },\n          \"message\": \"INFO 28\",\n          \"text\": \"9I2TZR/P 0Z0PMP INFO 28\",\n          \"display_text\": \"9I2TZR/P 0Z0PMP INFO 28\",\n          \"is_control_frame\": true\n        }\n      ],\n      \"outputs\": {\n        \"candidate_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_candidate_export_output.json\",\n        \"post_ldpc_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_post_ldpc_info87_runtime_export_output.json\",\n        \"source_exact_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_exact_map_probe_output.json\",\n        \"message174_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_confirmed_message174_decode_output.json\",\n        \"varicode_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_varicode_frame_unpack_probe_output.json\",\n        \"rx_release_json\": \"/decoders/js8_decoder/logs/20260528T081844Z_step85_window2_source_confirmed_control_frame_rx_release_output.json\"\n      }\n    }\n  ],\n  \"verdict\": \"step86_real_wav_unique_control_frames_only_no_data_frames\",\n  \"warnings\": [\n    \"Step86 is a census/dedup gate; it does not release JS8 free text.\",\n    \"Repeated Heartbeat/Directed rows across nearby windows are counted as duplicate evidence, not separate new messages.\",\n    \"FrameData and FrameDataCompressed remain blocked until a real externally confirmed fixture or real-WAV data candidate exists.\"\n  ],\n  \"notes\": [\n    \"This step was added after Step85 confirmed the real WAV path but repeated the same two control frames across multiple windows.\",\n    \"If data_frame_candidate_count and compressed_data_frame_candidate_count remain 0, the current js8_test.wav appears to contain only the two confirmed control frames for this chain.\"\n  ],\n  \"next_action\": \"Use a WAV containing a real JS8 free-text/Data/Compressed frame or import an externally confirmed fixture; otherwise continue decoder work with the two unique control frames as the confirmed audio-to-message174 regression baseline.\"\n}\n[webftr-js8-lab] step86 census exit_code=0\n\n[webftr-js8-lab] OK\n[webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260528T081844Z_real-wav-unique-frame-census.log\n[webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260528T081844Z_real-wav-unique-frame-census_manifest.json\n"
  },
  "recent_files": [
    {
      "name": "js8_browser_server.log",
      "size": 522,
      "mtime_utc": "2026-05-28T08:27:43Z",
      "url": "/logs/js8_browser_server.log"
    },
    {
      "name": "js8_browser_report_latest.json",
      "size": 40540,
      "mtime_utc": "2026-05-28T08:27:43Z",
      "url": "/logs/js8_browser_report_latest.json"
    },
    {
      "name": "20260528T082602Z_step85_window0_post_ldpc_info87_runtime_export_output.json",
      "size": 0,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T082602Z_step85_window0_post_ldpc_info87_runtime_export_output.json"
    },
    {
      "name": "20260528T082602Z_step85_window0_post_ldpc_info87_runtime_export_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T082602Z_step85_window0_post_ldpc_info87_runtime_export_output.stderr.log"
    },
    {
      "name": "20260528T082602Z_real-wav-wide-data-frame-search.log",
      "size": 82232,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T082602Z_real-wav-wide-data-frame-search.log"
    },
    {
      "name": "20260528T081843Z_real-wav-intake-validator-auto-handoff.log",
      "size": 1483198,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T081843Z_real-wav-intake-validator-auto-handoff.log"
    },
    {
      "name": "20260528T081843Z_real-wav-corpus-data-frame-hunt.log",
      "size": 1470658,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T081843Z_real-wav-corpus-data-frame-hunt.log"
    },
    {
      "name": "20260528T082602Z_real-wav-unique-frame-census.log",
      "size": 83204,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T082602Z_real-wav-unique-frame-census.log"
    },
    {
      "name": "js8_start_diagnostics_latest.log",
      "size": 1483501,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/js8_start_diagnostics_latest.log"
    },
    {
      "name": "20260528T082602Z_step85_window0_candidate_export_output.json",
      "size": 76395,
      "mtime_utc": "2026-05-28T08:27:15Z",
      "url": "/logs/20260528T082602Z_step85_window0_candidate_export_output.json"
    },
    {
      "name": "20260528T082602Z_step85_window0_candidate_export_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:26:16Z",
      "url": "/logs/20260528T082602Z_step85_window0_candidate_export_output.stderr.log"
    },
    {
      "name": "20260528T082602Z_real_wav_wide_window_plan_output.json",
      "size": 3744,
      "mtime_utc": "2026-05-28T08:26:15Z",
      "url": "/logs/20260528T082602Z_real_wav_wide_window_plan_output.json"
    },
    {
      "name": "20260528T082602Z_real_wav_wide_window_plan_output.stderr.log",
      "size": 182,
      "mtime_utc": "2026-05-28T08:26:03Z",
      "url": "/logs/20260528T082602Z_real_wav_wide_window_plan_output.stderr.log"
    },
    {
      "name": "20260528T082602Z_step85_window_results.jsonl",
      "size": 0,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/20260528T082602Z_step85_window_results.jsonl"
    },
    {
      "name": "20260528T081843Z_step87_wav0_unique_frame_census_output.json",
      "size": 24463,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/20260528T081843Z_step87_wav0_unique_frame_census_output.json"
    },
    {
      "name": "20260528T081843Z_step87_result_jsons.txt",
      "size": 88,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/20260528T081843Z_step87_result_jsons.txt"
    },
    {
      "name": "latest.log",
      "size": 1381977,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/latest.log"
    },
    {
      "name": "20260528T081844Z_real-wav-unique-frame-census.log",
      "size": 1381977,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/20260528T081844Z_real-wav-unique-frame-census.log"
    },
    {
      "name": "20260528T081844Z_real-wav-unique-frame-census_manifest.json",
      "size": 1524,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/20260528T081844Z_real-wav-unique-frame-census_manifest.json"
    },
    {
      "name": "js8_real_wav_unique_frame_census_latest.json",
      "size": 24463,
      "mtime_utc": "2026-05-28T08:26:02Z",
      "url": "/logs/js8_real_wav_unique_frame_census_latest.json"
    },
    {
      "name": "20260528T081844Z_real_wav_unique_frame_census_output.json",
      "size": 24463,
      "mtime_utc": "2026-05-28T08:26:01Z",
      "url": "/logs/20260528T081844Z_real_wav_unique_frame_census_output.json"
    },
    {
      "name": "20260528T081844Z_real_wav_unique_frame_census_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:26:01Z",
      "url": "/logs/20260528T081844Z_real_wav_unique_frame_census_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_real-wav-wide-data-frame-search.log",
      "size": 1356054,
      "mtime_utc": "2026-05-28T08:26:01Z",
      "url": "/logs/20260528T081844Z_real-wav-wide-data-frame-search.log"
    },
    {
      "name": "20260528T081844Z_real-wav-wide-data-frame-search_manifest.json",
      "size": 1780,
      "mtime_utc": "2026-05-28T08:26:01Z",
      "url": "/logs/20260528T081844Z_real-wav-wide-data-frame-search_manifest.json"
    },
    {
      "name": "js8_step85_window_results_manifest_latest.json",
      "size": 4220,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/js8_step85_window_results_manifest_latest.json"
    },
    {
      "name": "js8_real_wav_wide_window_plan_latest.json",
      "size": 11377,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/js8_real_wav_wide_window_plan_latest.json"
    },
    {
      "name": "js8_real_wav_wide_data_frame_search_latest.json",
      "size": 32464,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/js8_real_wav_wide_data_frame_search_latest.json"
    },
    {
      "name": "20260528T081844Z_real_wav_wide_data_frame_search_output.json",
      "size": 32464,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_real_wav_wide_data_frame_search_output.json"
    },
    {
      "name": "20260528T081844Z_real_wav_wide_data_frame_search_output.stderr.log",
      "size": 182,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_real_wav_wide_data_frame_search_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_step85_window_results_manifest.json",
      "size": 4220,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_step85_window_results_manifest.json"
    },
    {
      "name": "20260528T081844Z_step85_window_results.jsonl",
      "size": 3609,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_step85_window_results.jsonl"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_confirmed_control_frame_rx_release_output.json",
      "size": 9856,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_confirmed_control_frame_rx_release_output.json"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_confirmed_control_frame_rx_release_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_confirmed_control_frame_rx_release_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_varicode_frame_unpack_probe_output.json",
      "size": 60579,
      "mtime_utc": "2026-05-28T08:26:00Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_varicode_frame_unpack_probe_output.json"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_varicode_frame_unpack_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:25:59Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_varicode_frame_unpack_probe_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_confirmed_message174_decode_output.json",
      "size": 8022,
      "mtime_utc": "2026-05-28T08:25:59Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_confirmed_message174_decode_output.json"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_confirmed_message174_decode_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:25:59Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_confirmed_message174_decode_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_exact_map_probe_output.json",
      "size": 156591,
      "mtime_utc": "2026-05-28T08:25:59Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_exact_map_probe_output.json"
    },
    {
      "name": "20260528T081844Z_step85_window2_source_exact_map_probe_output.stderr.log",
      "size": 0,
      "mtime_utc": "2026-05-28T08:25:56Z",
      "url": "/logs/20260528T081844Z_step85_window2_source_exact_map_probe_output.stderr.log"
    },
    {
      "name": "20260528T081844Z_step85_window2_post_ldpc_info87_runtime_export_output.json",
      "size": 102055,
      "mtime_utc": "2026-05-28T08:25:56Z",
      "url": "/logs/20260528T081844Z_step85_window2_post_ldpc_info87_runtime_export_output.json"
    }
  ],
  "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>."
}