# Structural Snapshot — 2026-05-20 (cycle-1 close)

> Baseline snapshot for future retros. Captures the component / import /
> contract topology at end of cycle 1 so cycle 2 retro can compute deltas
> without re-deriving from source.

## Component Inventory

| # | Component | Path | Strategy slots (registered) | Notes |
|---|-----------|------|------------------------------|-------|
| 1 | C1 — VIO | `src/gps_denied_onboard/components/c1_vio/` | `klt_ransac` (operational default), `okvis2` (BLOCKED via AZ-332→AZ-592), `vins_mono` (BLOCKED via AZ-333→AZ-593) | Three strategies behind `_STRATEGY_REGISTRY`; airborne_bootstrap registers all 3 with `BUILD_*` gating |
| 2 | C2 — VPR | `src/gps_denied_onboard/components/c2_vpr/` | `ultra_vpr` (production default), `megaloc`, `mixvpr`, `selavpr`, `eigenplaces`, `salad`, `netvlad` | All implemented; secondaries behind `BUILD_*` flags per ADR-002 |
| 3 | C2.5 — Re-rank | `src/gps_denied_onboard/components/c2_5_rerank/` | `inlier_based_reranker` | Single strategy |
| 4 | C3 — Matcher | `src/gps_denied_onboard/components/c3_matcher/` | `disk_lightglue` (default), `aliked_lightglue`, `xfeat` | Three strategies |
| 5 | C3.5 — AdHoP | `src/gps_denied_onboard/components/c3_5_adhop/` | `adhop_refiner` (production), `passthrough` (baseline) | Conditional refinement |
| 6 | C4 — Pose | `src/gps_denied_onboard/components/c4_pose/` | `opencv_gtsam` (production) | D-CROSS-LATENCY-1 hybrid trigger lives here |
| 7 | C5 — State | `src/gps_denied_onboard/components/c5_state/` | `gtsam_isam2` (production), `eskf_baseline` (engine-rule baseline) | iSAM2 + IncrementalFixedLagSmoother |
| 8 | C6 — Tile cache | `src/gps_denied_onboard/components/c6_tile_cache/` | Factory-based (no `_STRATEGY_REGISTRY` entry) | Postgres 16 + filesystem + FAISS HNSW |
| 9 | C7 — Inference | `src/gps_denied_onboard/components/c7_inference/` | `tensorrt`, `pytorch_fp16`, `onnx_trt_ep` (selected via `INFERENCE_BACKEND` env) | Factory-based |
| 10 | C8 — FC adapter | `src/gps_denied_onboard/components/c8_fc_adapter/` | `ardupilot_plane` (signed MAVLink), `inav` (MSP2) | Selected via `GPS_DENIED_FC_PROFILE` |
| 11 | C10 — Provisioning | `src/gps_denied_onboard/components/c10_provisioning/` | n/a (operator-only) | C10 + C11 + C12 ship in `operator-orchestrator` image |
| 12 | C11 — Tile Manager | `src/gps_denied_onboard/components/c11_tilemanager/` | n/a (operator-only) | `BUILD_C11_TILE_MANAGER=OFF` on airborne (ADR-004) |
| 13 | C12 — Operator Orchestrator | `src/gps_denied_onboard/components/c12_operator_orchestrator/` | n/a (operator-only) | Includes `FlightsApiClient` (AZ-489) + `PostLandingUploadOrchestrator` + `OperatorReLocService` |
| 14 | C13 — FDR | `src/gps_denied_onboard/components/c13_fdr/` | Factory-based | Writer thread + segment rotation + 64 GB cap + flight header/footer |
| 15 | helpers/runtime_root | `src/gps_denied_onboard/helpers/`, `src/gps_denied_onboard/runtime_root/` | n/a — composition root + cross-cutting helpers | Hosts `compose_root`, `airborne_bootstrap`, `operator_bootstrap`, `_STRATEGY_REGISTRY`, replay branch, factory modules |

## Source Size

| Scope | Python LoC |
|-------|------------|
| `src/` (total) | 61,071 |

## Import Graph Health

- **Cycles in component import graph**: 0 (verified across batches 88–92 cumulative reviews — no back-edges introduced).
- **Composition seam**: `runtime_root.airborne_bootstrap` (single composition root for airborne binary) + `runtime_root.operator_bootstrap` (single composition root for operator-orchestrator binary). Both pull from per-component `*_factory` modules under `runtime_root/`.

## Contract Files

| Path | Purpose | Status |
|------|---------|--------|
| `_docs/02_document/contracts/shared_fdr_client/fdr_record_schema.md` | FDR record envelope (v1.3.0) | Production |
| `_docs/02_document/contracts/shared_fdr_client/fdr_client_protocol.md` | FDR client API surface | Production |
| `_docs/02_document/contracts/shared_log_bridge/log_record_schema.md` | Log record schema (v1.0.0) | Production |
| `_docs/02_document/contracts/shared_satellite_provider_ingest/` | D-PROJ-2 ingest endpoint placeholder | Planned (parent-suite work) |
| `_docs/02_document/contracts/shared_flights_api/` | C12 → `flights` REST DTO | Production (consumed by AZ-489) |

Contract coverage % vs public-API symbols is not computed in this snapshot (no public-API inventory exists yet). Recommend adding the inventory + coverage metric as a cycle-2 follow-up — the same effort that lands `architecture_compliance_baseline.md` per Improvement Action #3.

## Build Track Coverage (per ADR-002 + ADR-011)

| Binary | Composition root | Strategies linked (production) | `BUILD_*` flags |
|--------|------------------|---------------------------------|------------------|
| Airborne (`companion-tier1` Tier-1 / `companion-jetson` Tier-2) | `airborne_bootstrap` | C1=`klt_ransac`, C2=`ultra_vpr`, C2.5=`inlier_based_reranker`, C3=`disk_lightglue`, C3.5=`adhop_refiner`, C4=`opencv_gtsam`, C5=`gtsam_isam2`, C7=`tensorrt`/`pytorch_fp16`, C8=`ardupilot_plane`/`inav` | `BUILD_VINS_MONO=OFF`, `BUILD_SALAD=OFF`, `BUILD_C11_TILE_MANAGER=OFF`, `BUILD_DEV_STATIC_KEY=OFF`, `BUILD_STATE_ESKF=OFF`; replay flags `BUILD_VIDEO_FILE_FRAME_SOURCE=ON`, `BUILD_TLOG_REPLAY_ADAPTER=ON`, `BUILD_REPLAY_SINK_JSONL=ON` (ADR-011) |
| Research (lab Jetson IT-12) | `airborne_bootstrap` with research flags | airborne contents + every non-default strategy linked | All `BUILD_*` flags ON except `BUILD_DEV_STATIC_KEY` |
| Operator-Orchestrator | `operator_bootstrap` | C10, C11 (`TileDownloader` + `TileUploader`), C12 (`FlightsApiClient`, `PostLandingUploadOrchestrator`, `OperatorReLocService`) | `BUILD_C11_TILE_MANAGER=ON` |

## Process Leftovers (open at snapshot time)

- `_docs/_process_leftovers/2026-05-11_d_cross_cve_1_opencv_pin_deferred.md` — OPEN, gtsam numpy-2 unblock pending.

## Cycle-2 Delta Targets

When cycle 2 closes, compare against this snapshot:

- **Component count change** — target 0 (no new components mid-feature-cycle; if AZ-595 or follow-ups add a component, document why).
- **Source LoC change** — informational; rapid growth flagged for sub-component refactor review.
- **Cycles in import graph** — must stay 0; any new cycle is a regression and surfaces a Critical finding.
- **`_STRATEGY_REGISTRY` keys** — should grow by 0–2 (only when a new strategy lands per ADR-002).
- **Contract files** — D-PROJ-2 ingest moves from "placeholder" to "production" if parent-suite ships its endpoint.
