# Batch 79 Report — FT-P-02 Derkachi fixture builder **Batch**: 79 **Date**: 2026-05-17 **Context**: Test implementation (greenfield Step 10 — Implement Tests) **Tasks**: AZ-599 (3 cp) — 1 task (FT-P-02 Derkachi builder + b78 helper extraction) **Cycle**: 1 **Verdict**: COMPLETE — PASS (self-reviewed; see `reviews/batch_79_review.md`) ## Summary Replicates the b78 vertical-slice pattern for FT-P-02 (Derkachi continuous-flight drift). Different from b78 in three ways: 1. **Video is already MP4** — no still-image encoding step. 2. **IMU is real recorded telemetry** — needs CSV → tlog conversion with real motion data (vs. b78's synthetic stationary tlog). 3. **Output is the SUT's natural FDR archive directory** — FT-P-02 reads it via `fdr_reader.iter_records`, not via the per-call `outbound_messages_*.json` schema b78 ships. Also extracted `run_gps_denied_replay` + `write_observer_fixture` into a shared `_common.py` so both b78 and b79 reference one canonical implementation. Future per-scenario builders (FT-P-04 also uses Derkachi inputs, FT-P-05 needs its own, etc.) will reuse the same helpers. ### AZ-599 — FT-P-02 Derkachi builder (3 cp) * **`e2e/fixtures/sitl_replay_builder/_common.py`** (new): shared `run_gps_denied_replay`, `write_observer_fixture`, `DEFAULT_CLI_BIN`. * **`e2e/fixtures/sitl_replay_builder/build_p01_fixtures.py`** (edited): re-imports the moved helpers from `_common.py`; b78 tests still pass unchanged. * **`e2e/fixtures/sitl_replay_builder/build_p02_fixtures.py`** (new): * `P02BuilderConfig` frozen dataclass. * `convert_imu_csv_to_tlog(csv_path, output_tlog)` — parses `data_imu.csv` rows, packs RAW_IMU + ATTITUDE pairs. Yaw from `GLOBAL_POSITION_INT.hdg` (centidegrees → radians); roll/pitch = 0 (fixed-wing cruise approximation). * `verify_fdr_has_estimates(fdr_path)` — counts `record_type="estimate"` records; raises if zero. * `build_p02_fixtures(cfg, ...)` — orchestrator. * `_main(argv=None)` — argparse CLI. * **`e2e/fixtures/sitl_replay_builder/README.md`** (edited): two- builder structure with scenario coverage table; FT-P-01 + FT-P-02 per-builder sections with strategy + usage + limitations. * **`e2e/_unit_tests/fixtures/test_sitl_replay_builder_p02.py`** (new): +20 tests. * **`e2e/_unit_tests/test_directory_layout.py`** (edited): registers the two new modules (`_common.py` + `build_p02_fixtures.py`). ## Out of scope (deferred) * **Live capture EXECUTION** — same as b78, a manual operator step. * **FT-P-04** (Derkachi F2F registration) — also uses Derkachi inputs and could reuse `build_p02_fixtures`. Deferred to a follow-up so this batch ships at 3 cp. * **Other scenarios** (FT-P-03 / 05 / 07 / 08 / 10 / 11, FT-N-01..04). * **iNav adapter** for FT-P-02. * **True SCALED_IMU2 → RAW_IMU unit conversion** — pass-through; re-visit if the SUT's tlog parser rejects. * **Aggressive-manoeuvre ATTITUDE synthesis** (roll/pitch ≠ 0) — re-visit if FT-P-04 or other scenarios show fusion drift. ## Test Results * New unit tests: **20**. * Full `e2e/_unit_tests` suite: **686 passed in 123 s** (previous: 664 → +22 net = +20 new tests + +2 directory-layout entries). * No new linter errors. * b78 builder tests (24) still pass after `_common.py` extraction. ## State * Spec moved: `_docs/02_tasks/todo/AZ-599_ft_p_02_derkachi_builder.md` → `_docs/02_tasks/done/`. * `_docs/_autodev_state.md` advanced to `last_completed_batch: 79`. * No K=3 cumulative review this batch (next due after b81; the b76-b78 cumulative just shipped one batch ago). ## Incidents * **Disk-full during regression gate**: the first regression-gate attempt failed with 212 conftest setup errors (all `FileNotFoundError: /var/folders/.../pytest-of-...`). Surfaced to the user with options; user freed space (37 Gi avail after); re-ran the gate and it passed cleanly. Not a code issue.