mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 03:01:13 +00:00
[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>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user