Files
gps-denied-onboard/_docs/03_implementation/batch_79_report.md
T
Oleksandr Bezdieniezhnykh 4e0717e543 [AZ-599] Batch 79: FT-P-02 Derkachi builder + _common.py extraction
- Add build_p02_fixtures.py: IMU CSV → tlog conversion (RAW_IMU +
  ATTITUDE pairs, centidegrees→radians yaw) and orchestrator that
  runs gps-denied replay against Derkachi MP4 + generated tlog,
  verifying ≥1 record_type="estimate" in the FDR archive.
- Extract run_gps_denied_replay + FDR-parent-dir helpers into
  sitl_replay_builder/_common.py; refactor build_p01_fixtures.py
  to import from _common (b78 tests preserved).
- Add 20 unit tests under e2e/_unit_tests/fixtures/test_sitl_
  replay_builder_p02.py covering AC-1..AC-5; total unit suite
  686/686 passing (regression gate AC-6).
- README updated to document FT-P-01 + FT-P-02 builders.
- Advance autodev state: last_completed_batch=79, current_batch=80;
  prune verbose detail blob.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-17 13:40:07 +03:00

3.9 KiB

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.