# Comparison Framework

> Mode A Phase 2 — engine Step 4 (Build Comparison/Analysis Framework). Aggregates the per-component candidate matrices in `06_component_fit_matrix/` (per-component sub-matrices = 7.5.2; cross-component gates = `99_cross_component_gates.md`) into a single dimension-axis lens.
>
> **Research Output Class**: Technical-component selection (per `00_question_decomposition.md`). Decision Support framework type (per `references/comparison-frameworks.md`).
>
> Backing artifacts:
> - Source registry: [`01_source_registry/00_summary.md`](01_source_registry/00_summary.md) (#1–#121)
> - Fact cards: [`02_fact_cards/00_summary.md`](02_fact_cards/00_summary.md) (#1–#101)
> - Component fit matrix: [`06_component_fit_matrix/00_summary.md`](06_component_fit_matrix/00_summary.md)
> - Question decomposition + scope: [`00_question_decomposition.md`](00_question_decomposition.md)

---

## Selected Framework Type

**Decision Support** (per `references/comparison-frameworks.md`). The output names specific libraries/SDKs/algorithms that an implementation team will build with on a pinned hardware target (Jetson Orin Nano Super) within a pinned Project Constraint Matrix. Concept-Comparison framework is insufficient because every candidate is being measured against shared numerical AC budgets (latency p95, memory cap, error CDF), not just typed against each other.

## Selected Dimensions

The eight Decision Support dimensions from `references/comparison-frameworks.md`, plus four project-mandatory dimensions added because the Project Constraint Matrix demands them:

| # | Dimension | Why it's in scope |
|---|-----------|-------------------|
| 1 | **Solution overview** | What this candidate is and what role it plays in the full pipeline. |
| 2 | **Implementation cost** | Engineering days/weeks to integrate the candidate against the pinned mode/config. Includes ONNX export work, retraining cost, on-Jetson port effort. |
| 3 | **Maintenance cost** | Upstream activity (last commit, issue response time), API stability across versions, dependency-pin risk on Jetson AI Lab community wheels. |
| 4 | **Risk assessment** | License posture (per D-C1-1 track), maintenance staleness, cross-domain transfer assumption risk, hardware-specific compile risk. |
| 5 | **Expected benefit** | Documentary lift over the mandatory simple-baseline (AUC@5°, Recall@K, latency reduction, accuracy bound). |
| 6 | **Applicable scenarios** | UAV-vs-satellite-tile cross-view registration at ~1 km AGL with the Project Constraint Matrix's pinned mission profile. |
| 7 | **Team capability requirements** | Specific skills required (TensorRT INT8 calibration, GTSAM factor-graph design, MAVLink/MSP2 protocol authoring). |
| 8 | **Migration difficulty** | Cost to swap this candidate for an alternate after Plan-phase lock-in. |
| **PROJECT-9** | **License-track posture** | D-C1-1 split (BSD/permissive vs GPL-3.0 vs both) drives candidate eligibility per component. Not generic "license" — the project tracks two parallel candidate axes per row. |
| **PROJECT-10** | **AC-NEW-4 covariance-honesty fit** | Project requires explicit 6×6 posterior covariance recovery; only some C4/C5 candidates satisfy this NATIVELY. |
| **PROJECT-11** | **AC-4.1 + AC-4.2 fit on Jetson Orin Nano Super SM 87** | Pinned hardware target; FP16/INT8 precision viability per model family + 8 GB shared CPU+GPU + 25 W TDP. |
| **PROJECT-12** | **AC-NEW-7 cache-poisoning safety fit** | Specific to C6+C10 path: descriptor cache + tile cache must not silently load corrupted/tampered files. FAISS "no internal integrity check" is the canonical disqualifier. |

These twelve dimensions are populated component-by-component in §Initial Population below. Each cell cites at least one Fact # or Source # from the backing artifacts.

---

## Initial Population

The matrix is organized component-axis-down × dimension-axis-across. **Each cell summarizes the per-component candidate verdict from the corresponding `06_component_fit_matrix/Cx_*.md` row file**; consult those row files for full per-candidate detail.

### Component-axis ordering

| C# | Component | Status (research close) | Selected primary | Selected secondary / fallback / experimental |
|----|-----------|-------------------------|------------------|----------------------------------------------|
| C1 | Visual / Visual-Inertial Odometry | Doc-closed (Sources #43–#56; Facts in `C1_vio.md`) | OKVIS2 (BSD-3-Clause; modern-competitive-lead) | VINS-Mono (BSD; mandatory simple-baseline); KLT+RANSAC (project-internal homemade fallback) |
| C2 | Visual Place Recognition | Doc-closed mandatory pre-screen 5/5 (Sources #57–#68; Facts in `C2_vpr.md`) | MixVPR (MIT; mandatory simple-baseline) on BSD/permissive track; SALAD (GPL-3.0; modern-competitive-lead) on GPL-3.0 track | EigenPlaces (MIT; viewpoint-robust BSD/permissive sibling); SelaVPR (MIT; two-stage DINOv2-L sibling); NetVLAD (MIT canonical; classical-baseline) |
| C3 | Cross-domain matchers | Doc-closed (Sources #69–#81; Facts in `C3_matchers.md`) | DISK+LightGlue (Apache-2.0 throughout; recommended-primary-mitigation for canonical-SP-license-disqualifier) | XFeat / XFeat\* / XFeat+LighterGlue (Apache-2.0; alternate-modern-competitive-lead); ALIKED+LightGlue (Apache-2.0; modern-competitive-lead-secondary) |
| C4 | Pose estimation (PnP+RANSAC+LM) | Closed at 3/N (Sources #82–#87; Facts in `C4_pose_estimation.md`) | OpenCV `cv::solvePnPRansac` (Apache-2.0; mandatory simple-baseline) wrapped by GTSAM `Marginals` for D-C4-2 covariance recovery (BSD-3-Clause) | OpenGV (BSD-3-Clause-equivalent NOASSERTION pending license-clearance D-C4-3; modern-competitive-lead-richer-minimal-solver) |
| C5 | State estimator / sensor fusion | Closed at 2/N batch-1 (Sources #88–#91; Facts in `C5_state_estimator.md`) | Manual ESKF (Solà 2017; project-side implementation under project Apache-2.0; mandatory simple-baseline) | GTSAM iSAM2 + CombinedImuFactor + smart factors + Marginals + IncrementalFixedLagSmoother (BSD-3-Clause; modern-competitive-lead-factor-graph; **shares GTSAM substrate with C4 D-C4-2 = (b)** per D-C5-5 = (c) recommendation) |
| C6 | Tile cache + spatial index | Closed at 2/N batch-1 (Sources #92–#98; Facts in `C6_tile_cache_spatial_index.md`) | Mirror-of-suite-`satellite-provider` pattern (PostgreSQL btree + bytea + FAISS HNSW + filesystem; PostgreSQL License + MIT) | PostGIS+pgvector (GPL-2.0-or-later via PostGIS; deferred-secondary, comparative-improvement verdict does NOT clear user's significant-improvement bar) |
| C7 | On-Jetson inference runtime | Closed at 3/N batch-1 (Sources #99–#105; Facts in `C7_inference_runtime.md`) | TensorRT native (Apache-2.0 in TRT 10.x; bundled with JetPack 6.2; lowest-latency primary path) | ONNX Runtime + TensorRT EP (MIT; cross-architecture portability for replay/SITL); pure PyTorch FP16 (BSD-3; mandatory simple-baseline + reference-correctness oracle) |
| C8 | MAVLink / MSP2 FC adapter | Closed at 3/N batch-1 (Sources #106–#113; Facts in `C8_fc_adapter.md`) | pymavlink → MAVLink `GPS_INPUT` (LGPL-3.0; recommended-primary for ArduPilot Plane); MSP2_SENSOR_GPS via Python MSP V2 (YAMSPy + INAV-Toolkit MIT; recommended-primary for iNav) | UBX impersonation via pyubx2 NAV-PVT (BSD-3-Clause; deferred-secondary for iNav; comparative-improvement verdict does NOT clear user's significant-improvement bar over MSP2_SENSOR_GPS) |
| C9 | Datasets / SITL / replay | **DROPPED 2026-05-08 per SQ7/C9 restructure** (deferred to Test Spec greenfield Step 5) | n/a | n/a |
| C10 | Pre-flight cache provisioning + sector classification + freshness pipeline | Closed at 2/N batch-1 under CROSS-COUPLING MINIMAL scope (Sources #114–#121; Facts in `C10_preflight_provisioning.md`) | D-C6-3 confirmation: direct `faiss.write_index`/`faiss.read_index` Python API + `python-atomicwrites` + content-hash gate at takeoff load + `IO_FLAG_MMAP_IFC` mmap (FAISS MIT, atomicwrites MIT); D-C7-7 confirmation: hybrid Polygraphy CLI primary + `trtexec` for cache-reuse rebuilds + direct `IBuilderConfig` Python API escape hatch (Apache-2.0 throughout) | Operator CLI/desktop tooling, sector classification heuristics, freshness pipeline workflow — **deferred to Plan-phase as `operator tooling design` out-of-research-scope** |

### Dimension matrix (compact form)

The full per-candidate cell content lives in `06_component_fit_matrix/Cx_*.md`. The cells below carry only the cross-component verdict for each dimension.

| Dimension | C1 (VIO) | C2 (VPR) | C3 (Matchers) | C4 (Pose) | C5 (State estimator) | C6 (Tile cache) | C7 (Inference runtime) | C8 (FC adapter) | C10 (Pre-flight) |
|---|---|---|---|---|---|---|---|---|---|
| **1. Solution overview** | Frame-to-frame visual+IMU odometry; produces relative poses + IMU bias estimates (Fact #43) | Tile-level global descriptors for retrieval against satellite cache (Facts in `C2_vpr.md`) | UAV-frame ↔ satellite-tile dense cross-domain feature matching for absolute anchor (Facts in `C3_matchers.md`) | 3D-2D RANSAC PnP + LM refinement → 6-DoF anchor pose (Facts #52–#54) | Fuse C1 (VIO), C3 (PnP-anchor), IMU; produce 6-DoF posterior + AC-NEW-4 covariance (Facts #88–#89) | Cache satellite tiles + descriptors + spatial index for AC-3.3 re-loc retrieval (Facts #92–#93) | Run C2/C3/C1 ONNX models on Jetson at AC-4.1 budget (Facts #94–#96) | Deliver final pose to FC over per-FC external-positioning interface (Facts #97–#99) | Build/refresh descriptor cache + TensorRT engines pre-flight (Facts #100–#101) |
| **2. Implementation cost** | OKVIS2 ~1-2 weeks integration; KLT+RANSAC ~3-5 days fallback (`C1_vio.md`) | MixVPR ~3-5 days as-is; ~1-2 weeks if D-C2-1 retrain on aerial corpus; SALAD ~similar (`C2_vpr.md`) | DISK+LightGlue ~1 week ONNX export per D-C3-2; +1-2 weeks if D-C2-1 retrain on aerial corpus (`C3_matchers.md`) | OpenCV `cv::solvePnPRansac` ~1-3 days as wrapper; GTSAM `Marginals` recovery ~3-5 days for D-C4-2 = (b) (`C4_pose_estimation.md`) | Manual ESKF from Solà 2017 ~1-2 weeks; GTSAM iSAM2 ~2-3 weeks for full factor-graph (`C5_state_estimator.md`) | Cand 1 (mirror-suite-pattern) ~3-5 days as-is; Cand 2 (PostGIS+pgvector) ~1-2 weeks + PostGIS+pgvector co-installation (`C6_tile_cache_spatial_index.md`) | TensorRT engine builds ~1 week first-model + ~1 day per subsequent model via Polygraphy/trtexec recipe per D-C7-2 + D-C10-5 (`C7_inference_runtime.md`) | pymavlink+GPS_INPUT ~3-5 days; MSP2_SENSOR_GPS via YAMSPy ~3-5 days (`C8_fc_adapter.md`) | Pre-flight orchestration wrapper ~1 week (FAISS write+content-hash + Polygraphy/trtexec invocation) per D-C10-1..D-C10-8 (`C10_preflight_provisioning.md`) |
| **3. Maintenance cost** | OKVIS2 maintained 2024-2026; VINS-Mono stable since 2018 (`C1_vio.md`) | MixVPR active 2026; SALAD active 2024-2025 (`C2_vpr.md`) | LightGlue active 2025-2026; XFeat active 2024-2025 (`C3_matchers.md`) | OpenCV LTS 4.x; GTSAM daily-active (last-pushed 2026-05-08 today) (`C4_pose_estimation.md`) | Solà 2017 reference paper stable; GTSAM daily-active (`C5_state_estimator.md`) | PostgreSQL + FAISS stable; pgvector active (`C6_tile_cache_spatial_index.md`) | TensorRT 10.3 stable in JetPack 6.2; Polygraphy + trtexec bundled (`C7_inference_runtime.md`) | pymavlink + YAMSPy active (`C8_fc_adapter.md`) | All dependencies inherited from C6+C7 maintenance posture (`C10_preflight_provisioning.md`) |
| **4. Risk assessment** | OKVIS2 GPL-3.0 contingent (D-C1-1 = (a) eligible) (`C1_vio.md`) | SALAD GPL-3.0 contingent; D-C2-1 retrain a real cost; D-C2-5 ViT-export risk (`C2_vpr.md`) | Magic Leap noncommercial license on canonical SP weights = HARD DISQUALIFIER (D-C3-1 forced mitigation) (`C3_matchers.md`) | OpenGV NOASSERTION + ~3 yr stale (D-C4-3 + D-C4-4 mitigations) (`C4_pose_estimation.md`) | Reference ESKF code license uncertainty (D-C5-1 mitigation = re-implement from canonical Solà 2017 paper) (`C5_state_estimator.md`) | PostGIS GPL-2.0-or-later contingent on D-C1-1 = (a) track for Cand 2 (`C6_tile_cache_spatial_index.md`) | TensorRT 10.x Apache-2.0 throughout; Jetson AI Lab community wheels (`C7_inference_runtime.md`) | pymavlink LGPL-3.0 (D-C8-3 mitigation = bundle unmodified) (`C8_fc_adapter.md`) | FAISS "no internal integrity check" (D-C10-3 mitigation = SHA-256 content-hash gate at takeoff) (`C10_preflight_provisioning.md`) |
| **5. Expected benefit** | OKVIS2 modern-competitive lift over VINS-Mono on cross-domain tracking (`C1_vio.md`) | SALAD-full +5-7 R@1 over MixVPR-2048 on MSLS Challenge (`C2_vpr.md`) | DISK+LightGlue +7.99 absolute AUC@5° over canonical SP+LightGlue per LightGlue paper Table 6 (`C3_matchers.md`) | GTSAM `Marginals` provides NATIVE 6×6 posterior covariance per Source #87 — unique among C4 candidates (`C4_pose_estimation.md`) | GTSAM iSAM2 NATIVE AC-4.5 look-back refinement unique among C5 candidates (`C5_state_estimator.md`) | Cand 1 verdict: improvements of Cand 2 are "marginal-to-negative" in pinned 3 Hz spatial-grid query context — no material lift (`C6_tile_cache_spatial_index.md`) | TensorRT INT8 ~2-3× speedup over FP16 per Source #102 YOLO26n benchmark (`C7_inference_runtime.md`) | All 3 FC paths satisfy AC-4.3 by design (`C8_fc_adapter.md`) | Polygraphy `--data-loader-script` cleaner than hand-written `IInt8EntropyCalibrator2` (Source #117 + #118) (`C10_preflight_provisioning.md`) |
| **6. Applicable scenarios** | All C1 candidates apply to nadir-down ~1 km AGL flight (`C1_vio.md`) | All C2 candidates trained on street-view; D-C2-1 retrain required for aerial domain (`C2_vpr.md`) | All C3 candidates retrain-friendly to aerial domain (`C3_matchers.md`) | OpenCV simple-baseline + GTSAM modern competitive lead apply throughout (`C4_pose_estimation.md`) | Manual ESKF for fixed-wing cruise; GTSAM iSAM2 for sliding-window refinement (`C5_state_estimator.md`) | Cand 1 mirrors verified-existing `satellite-provider` pattern (Source #92 filesystem read) (`C6_tile_cache_spatial_index.md`) | TensorRT + Polygraphy + trtexec all run on Jetson Orin Nano Super SM 87 per Source #105 (`C7_inference_runtime.md`) | pymavlink GPS_INPUT covers ArduPilot Plane (verified Source #4 + #106 + #107); MSP2_SENSOR_GPS covers iNav (verified Source #111 + #112 + #113) (`C8_fc_adapter.md`) | All Source #114-#121 evidence on Jetson Orin Nano Super SM 87 (`C10_preflight_provisioning.md`) |
| **7. Team capability requirements** | C++ + ROS comfort for OKVIS2; basic OpenCV for KLT (`C1_vio.md`) | PyTorch + ONNX export literacy for VPR (`C2_vpr.md`) | Same + LightGlue API + DISK ONNX export (`C3_matchers.md`) | OpenCV calib3d + GTSAM Python API + factor graph design (`C4_pose_estimation.md`) | NumPy/SciPy for ESKF; GTSAM C++/Python factor-graph design + iSAM2 internals (`C5_state_estimator.md`) | PostgreSQL DBA + FAISS Python API; Cand 2 adds PostGIS + pgvector + Jetson aarch64 build (`C6_tile_cache_spatial_index.md`) | TensorRT INT8 calibration + ONNX export + Jetson AI Lab wheel management (`C7_inference_runtime.md`) | MAVLink protocol literacy + iNav MSP V2 protocol literacy (`C8_fc_adapter.md`) | Bash/Python orchestration + crash-safe atomic file writes + FAISS + TensorRT (`C10_preflight_provisioning.md`) |
| **8. Migration difficulty** | OKVIS2 → VINS-Mono ~1 week swap (similar interface) (`C1_vio.md`) | MixVPR → SALAD ~1 week swap (`C2_vpr.md`) | DISK+LightGlue → ALIKED+LightGlue ~1 week swap (`C3_matchers.md`) | OpenCV→OpenGV ~2 weeks if D-C4-3+D-C4-4 close (`C4_pose_estimation.md`) | Manual ESKF → GTSAM iSAM2 ~2-3 weeks (different state representation) (`C5_state_estimator.md`) | Cand 1 → Cand 2 ~1-2 weeks if Cand 2 elevated (`C6_tile_cache_spatial_index.md`) | TRT-native → ONNX Runtime+TRT EP ~3-5 days for portability path (`C7_inference_runtime.md`) | Cand 2 (MSP2) → Cand 3 (UBX) ~1-2 weeks (different message family) (`C8_fc_adapter.md`) | Tools are interchangeable per D-C10-5 = (d) hybrid (`C10_preflight_provisioning.md`) |
| **PROJECT-9. License-track posture** | BSD/permissive: VINS-Mono / OKVIS2 / Kimera-VIO / DPVO / KLT+RANSAC. GPL-3.0: VINS-Fusion / OpenVINS (`C1_vio.md`) | BSD/permissive: MixVPR + SelaVPR + NetVLAD + EigenPlaces (4-mode COMPLETE). GPL-3.0: SALAD + (conditional AnyLoc/BoQ/DINOv2-VLAD) (`C2_vpr.md`) | BSD/permissive: DISK+LightGlue + ALIKED+LightGlue + XFeat + XFeat+LighterGlue (4-mode COMPLETE). HARD DISQUALIFIER: canonical SP+LightGlue (Magic Leap noncommercial) (`C3_matchers.md`) | All 3 candidates BSD/permissive (Apache-2.0 / BSD-3-Clause / NOASSERTION pending) (`C4_pose_estimation.md`) | All BSD/permissive (Solà 2017 paper public-domain canonical equations + project-side Apache-2.0 implementation; GTSAM BSD-3-Clause) (`C5_state_estimator.md`) | Cand 1 BSD/permissive (PostgreSQL License + MIT). Cand 2 GPL-2.0-or-later via PostGIS — gated on D-C1-1 = (a) (`C6_tile_cache_spatial_index.md`) | All BSD/permissive (TensorRT 10.x Apache-2.0; ORT MIT; PyTorch BSD-3-Clause) (`C7_inference_runtime.md`) | Cand 1 LGPL-3.0 (D-C8-3 mitigation); Cand 2 + Cand 3 MIT/BSD-3 (`C8_fc_adapter.md`) | All BSD/permissive (FAISS MIT; atomicwrites MIT; Polygraphy + TensorRT 10.x Apache-2.0) (`C10_preflight_provisioning.md`) |
| **PROJECT-10. AC-NEW-4 covariance-honesty fit** | n/a (C1 produces relative poses; covariance is C5's job) | n/a (C2 produces descriptor distances; covariance is C5's job) | n/a (C3 produces feature matches; covariance is C5's job) | **OpenCV: NO native 6×6 covariance — D-C4-2 mitigation REQUIRED** (post-hoc Jacobian or wrap in GTSAM Marginals); **GTSAM: NATIVE via `Marginals.marginalCovariance` — only candidate that satisfies AC-NEW-4 NATIVELY** | Manual ESKF: NATIVE via analytic Jacobian (Solà §6); GTSAM iSAM2: NATIVE via `Marginals.marginalCovariance` (`C5_state_estimator.md`) | n/a (C6 stores tiles + descriptors; covariance is C5's job) | n/a (C7 runs models; covariance is C5's job) | **C8 enforces AC-NEW-4 via D-C8-8 per-FC unit conversion** (extracts 2×2 horizontal sub-matrix from C5 GTSAM `Marginals` 6×6, computes 95% confidence ellipse semi-major axis, emits as `horiz_accuracy` for AP / `hPosAccuracy` for iNav) | n/a (C10 is pre-flight; runtime covariance is C5's job) |
| **PROJECT-11. AC-4.1 + AC-4.2 fit on Jetson Orin Nano Super SM 87** | OKVIS2 ~30-50 ms per frame on Jetson Orin Nano Super extrapolation; KLT ~5-10 ms (`C1_vio.md`) | MixVPR ~10-20 ms FP16 + ~5-10 ms INT8 per query on Jetson per Source #102 extrapolation (`C2_vpr.md`) | DISK+LightGlue ~30-60 ms per pair FP16 on Jetson per Source #103 extrapolation; tight at K=10 pairs (`C3_matchers.md`) | OpenCV ~5-15 ms per RANSAC iteration; GTSAM `Marginals` ~30-90 ms per pose recovery (Plan-phase Jetson MVE) (`C4_pose_estimation.md`) | Manual ESKF ~5-15 ms per update; GTSAM iSAM2 ~5-100 ms per update depending on D-C5-5 factor density (`C5_state_estimator.md`) | Cand 1 ~6-54 ms per cache hit (Postgres btree + FAISS HNSW); Cand 2 5-10× slower geographic lookup per Source #93 (`C6_tile_cache_spatial_index.md`) | INT8+FP16 mixed per D-C7-6 per-family policy meets AC-4.1 across pipeline; ~700 MB-1.5 GB total memory within AC-4.2 (`C7_inference_runtime.md`) | pymavlink + MSP2 send-side ~1-5 ms per message; rate 5 Hz per D-C8-5 (`C8_fc_adapter.md`) | Pre-flight only; not in AC-4.1 budget. Takeoff load <5 s per D-C10-4 mmap path (`C10_preflight_provisioning.md`) |
| **PROJECT-12. AC-NEW-7 cache-poisoning safety fit** | n/a | n/a | n/a | n/a | n/a | Cand 1: filesystem tile storage + content-hash mandate per restrictions.md (`C6_tile_cache_spatial_index.md`); Cand 2: pgvector descriptor verification deferred to Plan-phase | n/a (TensorRT engines per-build, manifest-tracked per D-C10-7) | n/a | **D-C10-3 content-hash verification gate at takeoff load = direct AC-NEW-7 satisfaction**; D-C10-2 atomic-write mitigates the truncated-file class separately (`C10_preflight_provisioning.md`) |

---

## Cross-component coupling table (read alongside the dimension matrix)

The dimension matrix above hides the inter-component design coupling. The cross-component gates file [`06_component_fit_matrix/99_cross_component_gates.md`](06_component_fit_matrix/99_cross_component_gates.md) lists every D-Cx-y gate; the most architecturally significant couplings are:

| Coupling | Components | Recommended path | Why it matters |
|---|---|---|---|
| **Shared GTSAM substrate** (D-C5-5 = (c)) | C4 D-C4-2 = (b) wraps `solvePnPRansac` in GTSAM `Marginals`; C5 GTSAM iSAM2 fuses C4 anchor as `PriorFactorPose3` with native 6×6 covariance | RECOMMENDED — couples C4+C5 covariance recovery via shared GTSAM substrate; satisfies AC-NEW-4 NATIVELY at both layers; eliminates impedance-mismatch at the C4↔C5 boundary | Strongest cross-component lever in the C4+C5 design space; reduces dependency footprint by sharing GTSAM library between two layers; reduces engineering cost (D-C4-2 + D-C5 share calibration of factor weights) |
| **Per-model-family precision policy** (D-C7-6 = (b)) | C2 (CNN VPR backbones), C3 (matchers), C1 (learned VIO frontends), C7 (TensorRT) | RECOMMENDED — VPR backbones INT8+FP16 mixed; matchers FP16-only NO INT8; ViT-class VPR FP16-only initially; learned VIO FP16-only initially | Source #103 LightGlue FP8 quantization-sensitivity finding drives the matchers→FP16-only carve-out; ignoring this risks AC-1.1/1.2 frame-center accuracy violations |
| **C6 ↔ C10 descriptor-cache rebuild orchestration** (D-C6-3 closure + D-C10-1..D-C10-4) | C6 (cache file structure), C10 (rebuild trigger + atomic-write + content-hash gate) | RECOMMENDED — manifest-hash-driven rebuild + `python-atomicwrites` + SHA-256 content-hash gate at takeoff + mmap load with `madvise(MADV_WILLNEED)` | C10 owns the rebuild pipeline; C6 owns the cache file format; AC-NEW-7 cache-poisoning safety satisfied at the D-C10-3 gate |
| **C7 ↔ C10 TensorRT engine-build orchestration** (D-C7-7 closure + D-C10-5..D-C10-8) | C7 (precision policy + JetPack pin), C10 (orchestration tool matrix + filename schema + fallback venue) | RECOMMENDED — hybrid Polygraphy + trtexec + direct API matrix per D-C10-5 = (d); self-describing filename schema per D-C10-7; reference Jetson at HQ + deployed-Jetson-copy-to-archive per D-C10-8 | TensorRT engines are SM-version-tied per Source #105; D-C7-7 = (c) primary build-on-target with reference-Jetson fallback engines closes the operational risk |
| **C5 ↔ C8 covariance contract** (D-C8-8 = (b)) | C5 GTSAM `Marginals` 6×6 posterior, C8 per-FC `horiz_accuracy`/`hPosAccuracy` extraction | RECOMMENDED — extract 2×2 horizontal sub-matrix from C5 `Marginals.marginalCovariance`, compute 95% confidence ellipse semi-major axis `sqrt(2.0 * 5.991 * λ_max)`, emit per-FC | Strongest C5+C8 cross-component coupling; AC-NEW-4 covariance-honesty obligation is the same for both FCs; only the unit + field-name change |
| **C1 ↔ C2 ↔ C5 frame-rate pipeline** (Fact #40 dual-rate camera pipeline) | C1 (VIO at ~10 Hz), C2 (VPR at ~3 Hz), C5 (estimator-output at ~3 Hz nominal up to ~10 Hz when matcher confidence high) | RECOMMENDED — single-rate vs dual-rate is a Plan-phase decision; affects C1 candidate ranking + C2/C3 candidate scoring | Fact #40 was raised by the SQ2 closure as cross-cutting; resolution lives at Plan-phase |

---

## Decisions accumulated across the matrix (D-Cx-y by owner)

The full per-decision text is in [`06_component_fit_matrix/99_cross_component_gates.md`](06_component_fit_matrix/99_cross_component_gates.md). Aggregate count by owner:

| Owner | Count | Notes |
|---|---|---|
| User + Plan-phase architect | 4 | D-C1-1 license posture, D-C2-1 VPR retrain, D-C3-1 matcher mitigation, D-C2-11 MegaLoc successor evaluation |
| User + license-posture decision-maker | 1 | D-C2-8 NetVLAD PyTorch-port-strategy + license verification |
| Plan-phase architect | 27 | D-C2-2..D-C2-7 + D-C2-9..D-C2-10 + D-C3-3..D-C3-6 + D-C4-1..D-C4-4 + D-C5-1..D-C5-5 + D-C6-1..D-C6-7 + D-C7-1..D-C7-9 + D-C8-1..D-C8-8 + D-C10-1..D-C10-8 |
| Project bring-up team / C7 inference-runtime owner | 4 | D-C1-2 Jetson MVE, D-C2-4 + D-C2-5 ViT export, D-C7-3..D-C7-5 Jetson AI Lab wheel pinning, D-C3-2 LightGlue runtime |
| User + AC-NEW-7 owner | 1 | D-C10-3 content-hash verification gate (CROSS-COMPONENT) |
| User + AC-NEW-4 owner | 1 | D-C8-8 covariance-honesty cross-FC enforcement (CROSS-COMPONENT) |

The 27 Plan-phase-architect-owned decisions are the surface area the Plan skill (greenfield Step 3) must traverse. None requires user input as a hard prerequisite to start Plan, but D-C1-1 (license posture) is recommended to be confirmed by the user upfront because it gates which candidates per row are eligible.

---

## What this framework does NOT cover (deliberately deferred)

| Out-of-scope here | Where it goes | Reason |
|---|---|---|
| Fixture-file pin for D-C7-1 calibration corpus (e.g., AerialVL S03 vs Mavic + Derkachi flight clips) | Test Spec (greenfield Step 5) | Fixture-class; doesn't change architectural choice |
| Sector classification heuristics (active-conflict vs stable rear) | Plan-phase architect + operations team | Operational; AC-8.2 freshness threshold is operational not architectural |
| Operator CLI/desktop tooling for C10 pre-flight provisioning | Plan-phase architect + UX | Tool shape is UX/integration, doesn't bind architectural contract |
| Tile freshness pipeline workflow (when to re-pull from Suite Sat Service) | Plan-phase architect + operations team | Operational; cross-coupling with runtime architecture is mediated entirely via C6 + C10 cache files |
| Test datasets / SITL replay environments (was C9) | Test Spec (greenfield Step 5) | Per 2026-05-08 SQ7/C9 restructure |
| Engine-step SQ5 (failure modes / deployment lessons) | Plan-phase architect — interleaved | Per investigation-order pin in `00_question_decomposition.md` |
| Engine-step SQ8 (safety considerations AC-NEW-4 / AC-NEW-7) | Plan-phase architect | Carries the AP_GPS spoofing-signal probe deferred from SQ6 |
