Files
Oleksandr Bezdieniezhnykh 5fe67023b2 [AZ-329] [AZ-330] [AZ-523] [AZ-524] Batch 44 atomic refactor
Implements two new C12 services and rebalances the C11/C12 boundary
in one atomic commit:

* AZ-329 PostLandingUploadOrchestrator — gates C11 upload on the
  `flight_footer` FDR record's `clean_shutdown` field; 4 refusal
  modes; new FdrFooterReader Protocol + LocalFdrFooterReader.
* AZ-330 OperatorReLocService — AC-3.4 visual-loss re-localization
  hint; reuses shared LatLonAlt; OperatorCommandTransport Protocol
  cut (E-C8 owns the future pymavlink concrete); new FDR record
  kind `c12.reloc.requested`; log redaction (lat/lon 5 decimals,
  reason 200 chars).
* AZ-523 C11 internal flight-state gate removed (SRP refactor):
  `confirm_flight_state` / `FlightStateSignal` use /
  `FlightStateNotOnGroundError` deleted from C11; TileUploader
  contract bumped to v2.0.0 (frozen) with migration note; AZ-317
  superseded.
* AZ-524 Package rename `c12_operator_tooling` →
  `c12_operator_orchestrator` across source, tests, pyproject,
  CMake, Dockerfile, compose, CI, runtime-root services class
  (`OperatorOrchestratorServices`) + factory function
  (`build_operator_orchestrator`), logger namespaces, config slug,
  docs, and the E-C12 epic title.

Tests: 1543 passed, 80 skipped (all environment gates). Targeted
AC suite (AZ-329 + AZ-330 + FdrFooterReader): 37 passed. Cold-start
NFR-perf still ≤ 500 ms p99.

Tracker: AZ-317 → Done (superseded); AZ-319 v2.0.0 contract bump
comment; AZ-329/AZ-330 → In Testing; AZ-253 epic renamed; AZ-523
+ AZ-524 created and closed as audit-trail tickets.

See `_docs/03_implementation/batch_44_cycle1_report.md`.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-13 19:42:46 +03:00

90 lines
2.6 KiB
YAML

services:
companion:
build:
context: .
dockerfile: docker/companion-tier1.Dockerfile
image: gps-denied-onboard/companion:dev
depends_on:
db:
condition: service_healthy
mock-sat:
condition: service_healthy
environment:
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
CAMERA_CALIBRATION_PATH: /fixtures/calibration/adti26.json
LOG_LEVEL: DEBUG
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: /fixtures/mavlink_signing/dev_key
volumes:
- ./tests/fixtures:/fixtures:ro
- fdr-data:/var/lib/gps-denied/fdr
- tile-data:/var/lib/gps-denied/tiles
healthcheck:
test: ["CMD", "python3", "-m", "gps_denied_onboard.healthcheck"]
interval: 10s
timeout: 3s
retries: 3
operator-orchestrator:
build:
context: .
dockerfile: docker/operator-orchestrator.Dockerfile
image: gps-denied-onboard/operator-orchestrator:dev
depends_on:
db:
condition: service_healthy
environment:
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
CAMERA_CALIBRATION_PATH: /fixtures/calibration/adti26.json
LOG_LEVEL: DEBUG
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: /fixtures/mavlink_signing/dev_key
volumes:
- ./tests/fixtures:/fixtures:ro
- tile-data:/var/lib/gps-denied/tiles
mock-sat:
build:
context: .
dockerfile: docker/mock-suite-sat-service.Dockerfile
image: gps-denied-onboard/mock-suite-sat-service:dev
ports:
- "5100:5100"
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:5100/healthz').read()"]
interval: 5s
timeout: 2s
retries: 5
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: gps_denied
POSTGRES_PASSWORD: dev
POSTGRES_DB: gps_denied
volumes:
- db-data:/var/lib/postgresql/data
- ./docker/db-init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U gps_denied -d gps_denied"]
interval: 5s
timeout: 3s
retries: 10
volumes:
db-data: {}
fdr-data: {}
tile-data: {}