Files
gps-denied-onboard/_docs/02_tasks/done/AZ-403_replay_dockerfile_ci.md
Oleksandr Bezdieniezhnykh 5adf3dd04f [AZ-265] Replay as configuration of airborne binary (ADR-011)
Re-design replay mode per user direction: replay is no longer a fourth
Docker image with a reduced component set, but a `config.mode = "replay"`
branch of the single airborne binary. The pre-flight workflow (route in
suite UI -> C12 tile download via real satellite-provider -> C10
manifest+engines build) is identical between live and replay; only three
strategies swap at compose time:

  FrameSource:      Live <-> Video
  FcAdapter:        Pymavlink/MSP2 <-> TlogReplay
  MavlinkTransport: Serial <-> Noop

The C8 outbound MAVLink encoders run unchanged in both modes; their
bytes hit `NoopMavlinkTransport` in replay and disappear. A new
`JsonlReplaySink` taps C5's `EstimatorOutput` stream so the parent-suite
UI sees per-tick coordinates by tailing `results.jsonl`. MAVLink 2.0
signing key remains mandatory (operator supplies a dummy file).

A new `replay_input/` Layer-4 cross-cutting coordinator owns
`(video, tlog) -> (FrameSource, FcAdapter, Clock)` convergence; the
composition root sees only standard interfaces past `.open()`.

Docs:
- architecture.md: new ADR-011 with full rationale; ADR-002 binary
  narrative updated.
- contracts/replay/replay_protocol.md: bumped to v2.0.0; 12 invariants
  (notably mode-agnosticism + encoder byte-equality + signing key
  mandatory + real C6 cache in replay).
- module-layout.md: Build-Time Exclusion Map dropped from 4 to 3 binary
  columns; replay-mode `BUILD_*` flags default ON in airborne;
  `shared/replay_input` cross-cutting entry added.
- epics.md: E-DEMO-REPLAY scope reframed; story points 27-32 -> 19-24.

Task respecs:
- AZ-401: shrunk 3 -> 2 pts; `compose_root` mode branch + JSONL sink +
  NoopMavlinkTransport wiring; legacy `compose_replay` export deleted.
- AZ-402: console-script wrapper that mutates `config.mode = "replay"`
  and dispatches into the shared airborne main; `--mavlink-signing-key`
  mandatory.
- AZ-403: CANCELLED. Moved to done/ with banner; Jira transition deferred
  via `_docs/_process_leftovers/2026-05-14_az_403_cancellation_pending_tracker.md`.
- AZ-404: AC-4 reworded as mode-agnosticism AST scan + encoder
  byte-equality test; new AC-8 operator-workflow rehearsal.
- AZ-405: also owns the `replay_input/` module + `ReplayInputAdapter`.

_dependencies_table.md updated: AZ-401 gains AZ-405 dep; AZ-404 drops
AZ-403 dep; AZ-403 row marked CANCELLED.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-14 09:01:04 +03:00

4.1 KiB
Raw Permalink Blame History

Replay — gps-denied-replay-cli Dockerfile + GitHub Actions matrix + SBOM diff — CANCELLED per ADR-011 (2026-05-14)

Status: CANCELLED. Do NOT implement.

Cancelled by: _docs/02_document/architecture.md § ADR-011 (replay is a configuration of the airborne binary, not a separate image) + _docs/02_document/contracts/replay/replay_protocol.md v2.0.0.

Reason: Under ADR-011 there is no separate gps-denied-replay-cli Docker image — the airborne image IS the replay image, running the same components from a single source tree with config.mode = "replay" chosen at startup. The SBOM-diff CI step this task specified existed to enforce the exclusion of c6_tile_cache / c10_provisioning / c11_tilemanager / c12_operator_orchestrator from the replay binary. None of those exclusions hold any more:

  • C6 IS required in replay (epic AZ-265 AC-3 — ≤ 100 m horizontal accuracy — depends on C2's tile retrieval via the C6 FaissDescriptorIndex; v1.0.0's BUILD_C6=OFF flag for replay was the contradiction that prompted the ADR-011 rewrite).
  • C10/C11/C12 are already excluded from the airborne image by ADR-002 + ADR-004 — that exclusion is enforced by the existing ci/sbom_diff.py step on the airborne image, NOT by a separate replay-specific SBOM diff.

Therefore: no fourth Docker image, no docker/replay-cli/Dockerfile, no ci/sbom_diff_replay.py script, no GitHub Actions matrix entry for replay-cli. The work originally tracked under this task is replaced by zero work on the binary topology — the airborne image already does everything this task would have produced.

Replacement: none required. The replay-mode entry point (gps-denied-replay console-script) ships from the airborne image via AZ-402.

Tracker action: transition the Jira ticket AZ-403 to Cancelled with a comment pointing at ADR-011. If the Jira MCP is unavailable at execution time, record the transition in _docs/_process_leftovers/<YYYY-MM-DD>_az_403_cancellation.md for replay on the next autodev start (per .cursor/rules/tracker.mdc).

Affected dependencies: AZ-404 (E2E replay fixture test) previously listed AZ-403 as a hard dependency for "tests run via Docker image" (its old AC-8). AC-8 is reworded in the AZ-404 respec to test the airborne image instead. AZ-404's dependency on AZ-403 is removed from _docs/02_tasks/_dependencies_table.md.

The original specification below is preserved for traceability only. Do not implement.


(Cancelled) Original task spec — preserved for traceability

Task: AZ-403_replay_dockerfile_ci Name: gps-denied-replay-cli Dockerfile + GitHub Actions matrix entry + SBOM diff (excludes C6/C10/C11/C12) Description: Add the fourth Docker image gps-denied-replay-cli: multi-stage build (Python + C1C5 + cpp/* + replay strategies; NO C6/C10/C11/C12; NO HTTP server). Add a GitHub Actions matrix entry building and pushing this image alongside the existing 3 images (live / research / operator). Add an SBOM diff CI step that builds the SBOM (via syft or the project's existing SBOM tooling), parses it, and asserts the absence of c6_tile_cache, c10_provisioning, c11_tilemanager, c12_operator_orchestrator packages — verifies AC-4 of the epic. The SBOM diff fails the CI job if any excluded component leaks into the replay image. Image base: same Python + CUDA base as the live image (consistency with TensorRT engines from C7) but with BUILD_C6=OFF, BUILD_C10=OFF, BUILD_C11=OFF, BUILD_C12=OFF, BUILD_VIDEO_FILE_FRAME_SOURCE=ON, BUILD_TLOG_REPLAY_ADAPTER=ON, BUILD_REPLAY_SINK_JSONL=ON build args. Complexity: 3 points Dependencies: AZ-402 (CLI entrypoint registered in pyproject); AZ-398 / AZ-399 / AZ-400 / AZ-401 (replay strategies); existing Dockerfile + CI plumbing for the live image (pattern to mirror); module-layout.md build-flag table; AZ-263, AZ-269, AZ-266 Component: replay-cicd (epic AZ-265 / E-DEMO-REPLAY) — Dockerfile at docker/replay-cli/Dockerfile; CI at .github/workflows/build-images.yml (or equivalent); SBOM-diff script at ci/sbom_diff_replay.py Tracker: AZ-403 Epic: AZ-265 (E-DEMO-REPLAY)