# RX result schema The publisher creates both docs/handoff/results/RX_RESULT.json and docs/handoff/results/RX_RESULT.md on the existing rx-node branch. JSON is authoritative. Markdown is generated from the same validated object. ## READY JSON { "schema_version": 1, "task_id": "RF001A_OTA_CAPTURE_004", "state": "RX_READY_FOR_TX", "rx_ready_for_tx": true, "process_alive": true, "file_growing": true, "capture_pid": 1234, "published_at": "2026-09-21T12:00:02+00:00", "capture_started_at": "2026-09-21T12:00:00+00:00", "expected_capture_end": "2026-09-21T12:01:00+00:00", "capture_path": "C:\\Users\\Professional\\Documents\\SDR_Rover_Captures\\\\rf001a_ota_capture.cs8", "common_clock_verified": true, "source_head": "<40-character lowercase Git HEAD>", "rf_tx": 0, "exit_code": null, "file_size": null, "duration_seconds": null, "overruns": null, "usb_errors": null, "file_errors": null, "sha256": null, "clkin_after": "NOT_RUN", "rf_tx_observed": "UNKNOWN" } ## COMPLETE JSON The final object keeps the same identity, timing, path and PID. It changes these fields: state = CAPTURE_COMPLETE rx_ready_for_tx = false process_alive = false file_growing = false published_at = exit_code = file_size = duration_seconds = overruns = usb_errors = file_errors = sha256 = clkin_after = DETECTED or NOT_DETECTED rf_tx_observed = EXPECTED_EXTERNAL_TX or UNKNOWN rf_tx = 0 Use null when the capture tool did not report an error counter. Do not infer zero. Raw IQ, video, waveform files and large logs must stay outside Git.