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>
4.1 KiB
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.mdv2.0.0.Reason: Under ADR-011 there is no separate
gps-denied-replay-cliDocker image — the airborne image IS the replay image, running the same components from a single source tree withconfig.mode = "replay"chosen at startup. The SBOM-diff CI step this task specified existed to enforce the exclusion ofc6_tile_cache/c10_provisioning/c11_tilemanager/c12_operator_orchestratorfrom 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'sBUILD_C6=OFFflag 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.pystep on the airborne image, NOT by a separate replay-specific SBOM diff.Therefore: no fourth Docker image, no
docker/replay-cli/Dockerfile, noci/sbom_diff_replay.pyscript, no GitHub Actions matrix entry forreplay-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-replayconsole-script) ships from the airborne image via AZ-402.Tracker action: transition the Jira ticket
AZ-403to 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.mdfor 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 + C1–C5 + 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)