Oleksandr Bezdieniezhnykh
2b19b8b90b
[AZ-558] Route C8 outbound encoder bytes through MavlinkTransport seam
...
All FC adapter outbound MAVLink bytes now go through the AZ-401
MavlinkTransport seam (NoopMavlinkTransport in replay,
SerialMavlinkTransport in live). New helpers in
_outbound_mavlink_payloads.py extract encode/pack/seq-bump so the four
AP _send sites and the iNav statustext _send site become
encode -> pack -> transport.write. TlogReplayFcAdapter emits real
AP-shape MAVLink bytes through the injected NoopMavlinkTransport,
satisfying replay protocol Invariant 5 and unblocking AZ-401 AC-9.
Closes AZ-558. Also unskips AZ-401 AC-9 and AZ-404 AC-4b. Live wire
output remains byte-identical (proven via two-instance MAVLink
byte-equivalence tests). AST scan asserts no .mav.<name>_send( calls
remain in the retrofit set (AP / iNav / tlog adapters).
Out of scope (logged in review): GCS adapter retrofit; airborne live
strategy registration that would activate the SerialMavlinkTransport
factory injection path.
Tests: 2110 passed, 92 environmental skips, 1 unrelated pre-existing
macOS cold-start flake deselected.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-16 05:33:56 +03:00
Oleksandr Bezdieniezhnykh
d7e6b0959e
[AZ-404] [AZ-389] [AZ-559] E2E replay test (Derkachi 60s) + AZ-389 cleanup
...
Batch 63 of /autodev replay slice. Adds the AZ-404 E2E test harness
against the Derkachi fixture and resolves the AZ-389 dependency
phantom (closing AZ-559 Won't Fix).
E2E test (AZ-404)
- tests/e2e/replay/_tlog_synth.py: deterministic CSV->tlog generator
(the original Derkachi tlog is not in repo; data_imu.csv is its
export, so we round-trip the CSV through pymavlink). Verified:
SCALED_IMU2 + ATTITUDE + GPS_RAW_INT + HEARTBEAT round-trip cleanly
through mavutil.mavlink_connection.
- tests/e2e/replay/_helpers.py: parse_jsonl, l2_horizontal_m
(haversine), match_percentage, CapturingMavlinkTransport (ready
for AZ-558 unblock), GroundTruthRow + load_ground_truth_csv.
- tests/e2e/replay/conftest.py: derkachi_replay_inputs (session
scope), replay_runner (subprocess fixture per AZ-402 CLI),
operator_pre_flight_setup placeholder.
- tests/e2e/replay/test_derkachi_1min.py: 9 tests covering AC-1..AC-8
with AC-7 skip-gate self-check + AC-4a mode-agnosticism AST scan
(passes unconditionally, confirms ADR-011 holding).
- tests/e2e/replay/test_helpers.py: 14 unit tests covering AC-9
helper L2 correctness + match_percentage + parse_jsonl +
CapturingMavlinkTransport (all unconditional).
- tests/e2e/replay/README.md: AC matrix, fixture state, runtime
budget, failure cookbook (AC-10).
AC matrix
- AC-1, AC-2, AC-5, AC-6 implemented and Tier-1 gated on
RUN_REPLAY_E2E=1.
- AC-3 (<=100m for 80%) xfail until real Topotek KHP20S30
calibration ships (camera_info.md states intrinsics are unknown).
- AC-4a (mode-agnosticism AST scan) PASSES unconditionally.
- AC-4b (encoder byte-equality) skip until AZ-558 routes C8 bytes
through MavlinkTransport.
- AC-7 (skip-gate self-check) PASSES unconditionally.
- AC-8 (operator workflow rehearsal) skip until D-PROJ-2
mock-suite-sat-service implements tile-fetch + index-build
endpoints.
- AC-9 (helper L2 correctness) 14 PASSES unconditionally.
AZ-389 housekeeping
- AZ-559 closed Won't Fix: investigation against
c6_tile_cache/_types.py confirmed TileSource.ONBOARD_INGEST +
TileMetadata.quality_metadata + write_tile's FreshnessRejectionError
already cover the mid-flight ingest semantic. The "missing API"
was a spec-vs-impl naming mismatch.
- AZ-389 spec rewritten to consume the existing write_tile API +
catch FreshnessRejectionError per AC-NEW-3 opportunistic emission.
- _dependencies_table.md reverted: AZ-389 deps -> AZ-303 (was
AZ-559 in the previous commit on this branch); total 150 / 497
pts.
Tests
- Full regression: 2099 passed (+14 new e2e/replay), 94 skipped
(incl. 8 e2e/replay heavy-tier + documented blocker skips), 3
perf-microbench flakes deselected (test_cli_cold_start_under_2s,
test_cold_start_under_500ms_p99, test_nfr_perf_sign_microbench;
all pass in isolation - pre-existing under-load flakes on dev
macOS).
Reviews
- _docs/03_implementation/reviews/batch_63_review.md: code review
PASS_WITH_WARNINGS (3 documented spec-gap deferrals: AC-3, AC-4b,
AC-8).
- _docs/03_implementation/cumulative_review_batches_61-63_cycle1_report.md:
cumulative review PASS_WITH_WARNINGS. Action items: prioritise
AZ-558 (closes AZ-401 AC-9 + AZ-404 AC-4b); consider 2pt hygiene
PBI for Protocol-completeness AST scan to catch the AZ-389 /
AZ-559 phantom-API pattern at task-prep time.
Architecture invariants observably holding
- ADR-011 (replay-as-configuration): AC-4a's AST scan over
src/gps_denied_onboard/components/**/*.py finds zero violations -
components branch on neither config.mode nor any synonym.
- Single composition root (replay protocol Invariant 11): AZ-402
CLI dispatches to runtime_root.main(config); does not call
compose_root directly.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-14 21:41:39 +03:00
Oleksandr Bezdieniezhnykh
b12db61444
[AZ-263] Bootstrap: repo skeleton + Docker + CI + Alembic + Tier-1 tests
...
Implements the AZ-263 / E-BOOT initial structure task:
- Python src/-layout package `gps_denied_onboard/` with per-component
interface stubs (14 components), type-only DTOs under `_types/`,
shared helpers under `helpers/` (R14 LightGlue ownership), structured
JSON logging, runtime composition root with env-var fail-fast gate,
healthcheck module shared by Docker and CI smoke.
- CMake top-level + `cmake/{build_options,dependencies,strategies}.cmake`
with the BUILD_* per-binary flags (ADR-002) and pinned external git
refs for OKVIS2 / VINS-Mono / GTSAM / FAISS / OpenCV >=4.12.0.
- Three Dockerfiles (companion-tier1, operator-tooling,
mock-suite-sat-service) + two compose files (dev + Tier-1 test).
- Four GitHub Actions workflows: ci.yml (lint/unit/integration/dual
binary build/SBOM diff/security), ci-tier2.yml (self-hosted Jetson
AC-bound NFTs), release.yml, cve-rescan.yml.
- Two CI gate scripts: `ci/sbom_diff.py` (deployment SBOM subset +
R02 exclusion), `ci/opencv_pin_gate.py` (>=4.12.0 enforcement,
D-CROSS-CVE-1).
- Alembic-driven Postgres 16 initial migration `0001_initial.py`
mirroring satellite-provider tiles + flights + sector_classifications
+ manifests + engine_cache_entries (data_model.md s 2).
- Tier-1 test scaffolding: 95 passing unit tests covering every AC,
per-component smoke tests, structured logging JSON output check,
env-var gate check, healthcheck import check. Two CI-gated tests
(cmake configure, actionlint) skip locally with explicit reasons.
- Batch report + code review report under `_docs/03_implementation/`.
Verdict: PASS_WITH_WARNINGS (two Low findings, both informational).
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-11 01:00:28 +03:00
Oleksandr Bezdieniezhnykh
8382cdae10
start over again
2026-05-07 04:08:03 +03:00
Oleksandr Bezdieniezhnykh
79997e39ac
[AZ-219] Scaffold onboard runtime project
...
Add the initial source, test, infrastructure, CI, configuration, and evidence-path scaffold so dependent implementation tasks have stable package and runtime boundaries.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-03 12:41:54 +03:00