{
  "ok": true,
  "tool": "webftr-js8-real-wav-corpus-data-frame-hunt",
  "tool_version": "step93-real-wav-per-wav-evidence-surface",
  "schema": "webftr-js8-real-wav-corpus-data-frame-hunt-v1",
  "created_utc": "2026-05-28T08:28:30Z",
  "rx_only": true,
  "safety": {
    "tx": false,
    "ptt": false,
    "tune": false,
    "send": false,
    "js8call_runtime_control": false
  },
  "purpose": "Run the real-WAV Step86 chain over a bounded WAV corpus to find true FrameData/FrameDataCompressed evidence, not duplicate control frames.",
  "root": "/decoders/js8_decoder",
  "log_dir": "/decoders/js8_decoder/logs",
  "plan_json": "/decoders/js8_decoder/logs/20260528T081843Z_real_wav_corpus_plan_output.json",
  "plan_stat": {
    "path": "/decoders/js8_decoder/logs/20260528T081843Z_real_wav_corpus_plan_output.json",
    "exists": true,
    "is_file": true,
    "size": 4157,
    "mtime_utc": "2026-05-28T08:18:43Z"
  },
  "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"
    }
  ],
  "tested_wav_count": 2,
  "wav_was_read": true,
  "result_json_count": 2,
  "data_frame_candidate_count": 0,
  "compressed_data_frame_candidate_count": 0,
  "wavs_with_data_frame_candidate_count": 0,
  "wavs_with_compressed_data_frame_candidate_count": 0,
  "unique_control_frame_total_across_wavs": 4,
  "per_wav_results": [
    {
      "result_json": "/decoders/js8_decoder/logs/20260528T081843Z_step87_wav0_unique_frame_census_output.json",
      "result_stat": {
        "path": "/decoders/js8_decoder/logs/20260528T081843Z_step87_wav0_unique_frame_census_output.json",
        "exists": true,
        "is_file": true,
        "size": 24463,
        "mtime_utc": "2026-05-28T08:26:02Z"
      },
      "ok": true,
      "tool_version": "step86-real-wav-unique-frame-census",
      "verdict": "step86_real_wav_unique_control_frames_only_no_data_frames",
      "input_wav": "/decoders/js8_test.wav",
      "wav_was_read": true,
      "planned_window_count": 3,
      "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
      },
      "webftr_display_count": 6,
      "unique_webftr_display_count": 2,
      "duplicate_control_frame_group_count": 2,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "unique_frame_rows_preview": [
        {
          "key": "message174:001XqOA2iDZ0",
          "raw_message174": "001XqOA2iDZ0",
          "frame_type": "FrameHeartbeat",
          "status": "HB",
          "from": "004REY/0V4",
          "to": "@HB",
          "text": "HB 004REY/0V4 OJ16",
          "valid_message174_crc12": true,
          "crc12_distance": 0,
          "seen_count": 6,
          "windows_seen": [
            0,
            1,
            2
          ],
          "example_row": {
            "id": "js8-rx67-de15d3110b0d",
            "source_candidate_id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-51c5d4d9",
            "mode": "JS8",
            "raw_message174": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "frame_type": "FrameHeartbeat",
            "confidence": "high",
            "confidence_score": 6,
            "confidence_reasons": [
              "valid_heartbeat_callsign",
              "valid_heartbeat_grid"
            ],
            "show_in_rx_list": true,
            "candidate_class": "webftr_control_frame_display_ready",
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "sort_index": 0,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260528T081844Z_step85_window0_source_exact_map_probe_output.json",
              "json_path": "$.top_candidates[0].info87_bitstring",
              "source_kind": "info87_bitstring",
              "row_index": 214,
              "map_name": "raw",
              "map_source": null
            },
            "status": "HB",
            "from": "004REY/0V4",
            "to": "@HB",
            "grid": "OJ16",
            "message": "HB 004REY/0V4 OJ16",
            "text": "HB 004REY/0V4 OJ16",
            "display_text": "HB 004REY/0V4 OJ16",
            "is_control_frame": true
          }
        },
        {
          "key": "message174:Q0VsKWqfJ96x",
          "raw_message174": "Q0VsKWqfJ96x",
          "frame_type": "FrameDirected",
          "status": "INFO",
          "from": "9I2TZR/P",
          "to": "0Z0PMP",
          "text": "9I2TZR/P 0Z0PMP INFO 28",
          "valid_message174_crc12": true,
          "crc12_distance": 0,
          "seen_count": 6,
          "windows_seen": [
            0,
            1,
            2
          ],
          "example_row": {
            "id": "js8-rx67-bd37f68199eb",
            "source_candidate_id": "js8-frame66-66ab29ded46c",
            "source_decode_id": "js8-msg174-8d6ee5d0",
            "mode": "JS8",
            "raw_message174": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "frame_type": "FrameDirected",
            "confidence": "high",
            "confidence_score": 10,
            "confidence_reasons": [
              "valid_directed_from",
              "valid_directed_to",
              "directed_command"
            ],
            "show_in_rx_list": true,
            "candidate_class": "webftr_control_frame_display_ready",
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "sort_index": 1,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260528T081844Z_step85_window0_source_exact_map_probe_output.json",
              "json_path": "$.top_candidates[1].info87_bitstring",
              "source_kind": "info87_bitstring",
              "row_index": 215,
              "map_name": "raw",
              "map_source": null
            },
            "status": "INFO",
            "from": "9I2TZR/P",
            "to": "0Z0PMP",
            "command": "INFO",
            "extra": 59,
            "extra_value": {
              "kind": "number",
              "value": 28
            },
            "message": "INFO 28",
            "text": "9I2TZR/P 0Z0PMP INFO 28",
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "is_control_frame": true
          }
        }
      ]
    },
    {
      "result_json": "/decoders/js8_decoder/logs/20260528T081843Z_step87_wav1_unique_frame_census_output.json",
      "result_stat": {
        "path": "/decoders/js8_decoder/logs/20260528T081843Z_step87_wav1_unique_frame_census_output.json",
        "exists": true,
        "is_file": true,
        "size": 14764,
        "mtime_utc": "2026-05-28T08:28:30Z"
      },
      "ok": true,
      "tool_version": "step86-real-wav-unique-frame-census",
      "verdict": "step86_real_wav_unique_control_frames_only_no_data_frames",
      "input_wav": "/decoders/js8_decoder/runtime/input_wavs/A_1_4.wav",
      "wav_was_read": true,
      "planned_window_count": 1,
      "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
      },
      "webftr_display_count": 2,
      "unique_webftr_display_count": 2,
      "duplicate_control_frame_group_count": 2,
      "data_frame_candidate_count": 0,
      "compressed_data_frame_candidate_count": 0,
      "unique_frame_rows_preview": [
        {
          "key": "message174:001XqOA2iDZ0",
          "raw_message174": "001XqOA2iDZ0",
          "frame_type": "FrameHeartbeat",
          "status": "HB",
          "from": "004REY/0V4",
          "to": "@HB",
          "text": "HB 004REY/0V4 OJ16",
          "valid_message174_crc12": true,
          "crc12_distance": 0,
          "seen_count": 2,
          "windows_seen": [
            0
          ],
          "example_row": {
            "id": "js8-rx67-de15d3110b0d",
            "source_candidate_id": "js8-frame66-bf1ce62fdb4a",
            "source_decode_id": "js8-msg174-40d98f4a",
            "mode": "JS8",
            "raw_message174": "001XqOA2iDZ0",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 2920,
            "computed_crc12": 2920,
            "frame_type": "FrameHeartbeat",
            "confidence": "high",
            "confidence_score": 6,
            "confidence_reasons": [
              "valid_heartbeat_callsign",
              "valid_heartbeat_grid"
            ],
            "show_in_rx_list": true,
            "candidate_class": "webftr_control_frame_display_ready",
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "sort_index": 0,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260528T082602Z_step85_window0_source_exact_map_probe_output.json",
              "json_path": "$.top_candidates[0].info87_bitstring",
              "source_kind": "info87_bitstring",
              "row_index": 214,
              "map_name": "raw",
              "map_source": null
            },
            "status": "HB",
            "from": "004REY/0V4",
            "to": "@HB",
            "grid": "OJ16",
            "message": "HB 004REY/0V4 OJ16",
            "text": "HB 004REY/0V4 OJ16",
            "display_text": "HB 004REY/0V4 OJ16",
            "is_control_frame": true
          }
        },
        {
          "key": "message174:Q0VsKWqfJ96x",
          "raw_message174": "Q0VsKWqfJ96x",
          "frame_type": "FrameDirected",
          "status": "INFO",
          "from": "9I2TZR/P",
          "to": "0Z0PMP",
          "text": "9I2TZR/P 0Z0PMP INFO 28",
          "valid_message174_crc12": true,
          "crc12_distance": 0,
          "seen_count": 2,
          "windows_seen": [
            0
          ],
          "example_row": {
            "id": "js8-rx67-bd37f68199eb",
            "source_candidate_id": "js8-frame66-66ab29ded46c",
            "source_decode_id": "js8-msg174-53fd0ab3",
            "mode": "JS8",
            "raw_message174": "Q0VsKWqfJ96x",
            "valid_message174_crc12": true,
            "crc12_distance": 0,
            "received_crc12": 980,
            "computed_crc12": 980,
            "frame_type": "FrameDirected",
            "confidence": "high",
            "confidence_score": 10,
            "confidence_reasons": [
              "valid_directed_from",
              "valid_directed_to",
              "directed_command"
            ],
            "show_in_rx_list": true,
            "candidate_class": "webftr_control_frame_display_ready",
            "release_guard": "step67_source_confirmed_fixed_control_frame_only",
            "sort_index": 1,
            "source": {
              "source_file": "/decoders/js8_decoder/logs/20260528T082602Z_step85_window0_source_exact_map_probe_output.json",
              "json_path": "$.top_candidates[1].info87_bitstring",
              "source_kind": "info87_bitstring",
              "row_index": 215,
              "map_name": "raw",
              "map_source": null
            },
            "status": "INFO",
            "from": "9I2TZR/P",
            "to": "0Z0PMP",
            "command": "INFO",
            "extra": 59,
            "extra_value": {
              "kind": "number",
              "value": 28
            },
            "message": "INFO 28",
            "text": "9I2TZR/P 0Z0PMP INFO 28",
            "display_text": "9I2TZR/P 0Z0PMP INFO 28",
            "is_control_frame": true
          }
        }
      ]
    }
  ],
  "wavs_with_data_frame_candidates": [],
  "wavs_with_compressed_data_frame_candidates": [],
  "verdict": "step87_corpus_control_frames_only_no_data_frames",
  "warnings": [
    "Step93 keeps Step87 RX-only behavior, keeps Step92 byte-identical WAV de-duplication, and adds per-WAV evidence surfacing in the higher-level handoff summary.",
    "If only /decoders/js8_test.wav plus the bundled A_1_4.wav are present, the expected result can still be control frames only and zero Data/Compressed frames."
  ],
  "next_action": "Add or record a WAV containing a real JS8 free-text/Data/Compressed transmission under runtime/input_wavs or set JS8LAB_WAV_CORPUS_DIRS; rerun Step87. If Data/Compressed candidates appear, feed them into the guarded release/text probe path."
}
