services: companion: extends: file: docker-compose.yml service: companion environment: LOG_LEVEL: INFO operator-orchestrator: extends: file: docker-compose.yml service: operator-orchestrator mock-sat: extends: file: docker-compose.yml service: mock-sat db: extends: file: docker-compose.yml service: db e2e-runner: build: context: . dockerfile: tests/e2e/Dockerfile image: gps-denied-onboard/e2e-runner:dev depends_on: companion: condition: service_healthy mock-sat: condition: service_healthy db: condition: service_healthy environment: # FullSystemConfig requires this full env set (see # src/gps_denied_onboard/config/loader.py:_check_required_env). # Values mirror the `companion` service in docker-compose.yml so # the subprocess invoked by the replay tests can resolve identically. GPS_DENIED_FC_PROFILE: ardupilot_plane GPS_DENIED_TIER: "1" DB_URL: postgresql://gps_denied:dev@db:5432/gps_denied SATELLITE_PROVIDER_URL: http://mock-sat:5100 COMPANION_URL: http://companion:8080 CAMERA_CALIBRATION_PATH: /opt/tests/fixtures/calibration/adti26.json LOG_LEVEL: INFO LOG_SINK: console INFERENCE_BACKEND: pytorch_fp16 FDR_PATH: /var/lib/gps-denied/fdr TILE_CACHE_PATH: /var/lib/gps-denied/tiles MAVLINK_SIGNING_KEY: /opt/tests/fixtures/mavlink_signing/dev_key # Track-1 bootstrap harness: enable the heavy replay-pipeline tests # in tests/e2e/replay/. AZ-602 / AZ-603 / AZ-604. RUN_REPLAY_E2E: "1" # Replay-mode build flags (Invariant 9; see # _replay_branch.REPLAY_BUILD_FLAGS). All three must be ON for # the replay path to construct — VideoFileFrameSource gates # cv2.VideoCapture, TlogReplayFcAdapter gates pymavlink, and # JsonlReplaySink gates the noop-transport sink. The Reality # Gate e2e was originally validated only at the auto-sync # layer (which fired before any of these three were touched); # since AZ-611 lets tests bypass auto-sync, the next two # gates surface — hence all three are required here. BUILD_VIDEO_FILE_FRAME_SOURCE: "ON" BUILD_TLOG_REPLAY_ADAPTER: "ON" BUILD_REPLAY_SINK_JSONL: "ON" volumes: - ./tests:/opt/tests:ro # Derkachi fixture (~60 s clip) consumed by the replay e2e suite. # Mount path matches `tests/e2e/replay/conftest._derkachi_dir()`, # which resolves to /_docs/00_problem/input_data/... # where == /opt inside the container. - ./_docs/00_problem/input_data:/opt/_docs/00_problem/input_data:ro # Writable runtime dirs the SUT expects (FDR_PATH, TILE_CACHE_PATH). - fdr-data:/var/lib/gps-denied/fdr - tile-data:/var/lib/gps-denied/tiles volumes: db-data: {} fdr-data: {} tile-data: {}