Files
gps-denied-onboard/_docs/02_tasks/_dependencies_table.md
T
Oleksandr Bezdieniezhnykh d7e6b0959e [AZ-404] [AZ-389] [AZ-559] E2E replay test (Derkachi 60s) + AZ-389 cleanup
Batch 63 of /autodev replay slice. Adds the AZ-404 E2E test harness
against the Derkachi fixture and resolves the AZ-389 dependency
phantom (closing AZ-559 Won't Fix).

E2E test (AZ-404)
- tests/e2e/replay/_tlog_synth.py: deterministic CSV->tlog generator
  (the original Derkachi tlog is not in repo; data_imu.csv is its
  export, so we round-trip the CSV through pymavlink). Verified:
  SCALED_IMU2 + ATTITUDE + GPS_RAW_INT + HEARTBEAT round-trip cleanly
  through mavutil.mavlink_connection.
- tests/e2e/replay/_helpers.py: parse_jsonl, l2_horizontal_m
  (haversine), match_percentage, CapturingMavlinkTransport (ready
  for AZ-558 unblock), GroundTruthRow + load_ground_truth_csv.
- tests/e2e/replay/conftest.py: derkachi_replay_inputs (session
  scope), replay_runner (subprocess fixture per AZ-402 CLI),
  operator_pre_flight_setup placeholder.
- tests/e2e/replay/test_derkachi_1min.py: 9 tests covering AC-1..AC-8
  with AC-7 skip-gate self-check + AC-4a mode-agnosticism AST scan
  (passes unconditionally, confirms ADR-011 holding).
- tests/e2e/replay/test_helpers.py: 14 unit tests covering AC-9
  helper L2 correctness + match_percentage + parse_jsonl +
  CapturingMavlinkTransport (all unconditional).
- tests/e2e/replay/README.md: AC matrix, fixture state, runtime
  budget, failure cookbook (AC-10).

AC matrix
- AC-1, AC-2, AC-5, AC-6 implemented and Tier-1 gated on
  RUN_REPLAY_E2E=1.
- AC-3 (<=100m for 80%) xfail until real Topotek KHP20S30
  calibration ships (camera_info.md states intrinsics are unknown).
- AC-4a (mode-agnosticism AST scan) PASSES unconditionally.
- AC-4b (encoder byte-equality) skip until AZ-558 routes C8 bytes
  through MavlinkTransport.
- AC-7 (skip-gate self-check) PASSES unconditionally.
- AC-8 (operator workflow rehearsal) skip until D-PROJ-2
  mock-suite-sat-service implements tile-fetch + index-build
  endpoints.
- AC-9 (helper L2 correctness) 14 PASSES unconditionally.

AZ-389 housekeeping
- AZ-559 closed Won't Fix: investigation against
  c6_tile_cache/_types.py confirmed TileSource.ONBOARD_INGEST +
  TileMetadata.quality_metadata + write_tile's FreshnessRejectionError
  already cover the mid-flight ingest semantic. The "missing API"
  was a spec-vs-impl naming mismatch.
- AZ-389 spec rewritten to consume the existing write_tile API +
  catch FreshnessRejectionError per AC-NEW-3 opportunistic emission.
- _dependencies_table.md reverted: AZ-389 deps -> AZ-303 (was
  AZ-559 in the previous commit on this branch); total 150 / 497
  pts.

Tests
- Full regression: 2099 passed (+14 new e2e/replay), 94 skipped
  (incl. 8 e2e/replay heavy-tier + documented blocker skips), 3
  perf-microbench flakes deselected (test_cli_cold_start_under_2s,
  test_cold_start_under_500ms_p99, test_nfr_perf_sign_microbench;
  all pass in isolation - pre-existing under-load flakes on dev
  macOS).

Reviews
- _docs/03_implementation/reviews/batch_63_review.md: code review
  PASS_WITH_WARNINGS (3 documented spec-gap deferrals: AC-3, AC-4b,
  AC-8).
- _docs/03_implementation/cumulative_review_batches_61-63_cycle1_report.md:
  cumulative review PASS_WITH_WARNINGS. Action items: prioritise
  AZ-558 (closes AZ-401 AC-9 + AZ-404 AC-4b); consider 2pt hygiene
  PBI for Protocol-completeness AST scan to catch the AZ-389 /
  AZ-559 phantom-API pattern at task-prep time.

Architecture invariants observably holding
- ADR-011 (replay-as-configuration): AC-4a's AST scan over
  src/gps_denied_onboard/components/**/*.py finds zero violations -
  components branch on neither config.mode nor any synonym.
- Single composition root (replay protocol Invariant 11): AZ-402
  CLI dispatches to runtime_root.main(config); does not call
  compose_root directly.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-14 21:41:39 +03:00

48 KiB
Raw Blame History

Dependencies Table

Date: 2026-05-14 (refreshed at start of Batch 63: AZ-559 closed Won't Fix — gap was illusory; TileSource.ONBOARD_INGEST + TileMetadata.quality_metadata + write_tile's FreshnessRejectionError already cover the AZ-389 mid-flight ingest semantic without any new API; AZ-389 dep restored to AZ-303; earlier same-day after Batch 61: AZ-558 follow-up added — routes C8 outbound encoder bytes through MavlinkTransport seam; closes AZ-401 AC-9 deferred during batch 61 due to encoder-side routing not being in the AZ-401 task envelope; earlier same-day after cumulative review batches 52-54: AZ-528 hygiene PBI added for c1_vio strategy facade orchestration-spine 3-way duplication (Medium); earlier same-day after Batch 53: AZ-333 VINS-Mono landed — first c1_vio strategy after the AZ-332 OKVIS2 production-default; consolidation hygiene for the strategy-facade duplication deferred to a post-AZ-334 PBI; earlier same-day after Batch 51: AZ-527 hygiene PBI added from cumulative review batches 49-51 F1; 2026-05-13: AZ-526 hygiene PBI added from cumulative review batches 46-48 F1+F3; same-day refresh after Batch 44 SRP refactor: AZ-317 superseded; AZ-329 + AZ-330 specs rewritten; AZ-523 + AZ-524 audit-trail tickets added; E-C12 epic renamed Operator Pre-flight ToolingOperator Pre-flight Orchestrator; earlier same-day refresh: AZ-507 + AZ-508 hygiene PBIs from cumulative review batches 31-33; 2026-05-11: AZ-489 + AZ-490 ADR-010 operator-origin path) Total Tasks: 150 (109 product + 41 blackbox-test) — AZ-317 retained in the table marked SUPERSEDED for audit; AZ-523 (C11 gate removal) + AZ-524 (C12 rename) added as 2 closed audit-trail tasks; AZ-526 = 2pt clock-helper hygiene; AZ-527 = 2pt c2 engine-dim helper hygiene; AZ-528 = 3pt c1_vio facade-spine hygiene; AZ-558 = 3pt MavlinkTransport routing follow-up; AZ-559 closed Won't Fix Total Complexity Points: 497 (364 product + 133 blackbox-test) — AZ-523 = 3pt, AZ-524 = 2pt, AZ-526 = 2pt, AZ-527 = 2pt, AZ-528 = 3pt, AZ-558 = 3pt

Dependencies columns list only the tracker-ID portion (descriptive tail text in each task spec is omitted here for table-readability). The authoritative dependency narrative — including "co-developed", "forward dependency", and helper-vs-Protocol distinctions — lives in each task's own Dependencies: field. The graph is a strict DAG: a topological traversal visits all 142 tasks. The 15 forward edges (dep ID > task ID) are all declared and documented below under Cycle Check.

Task Name Complexity Dependencies Epic
AZ-263 Initial Structure 5 None AZ-244
AZ-266 Shared Logging Module 3 AZ-263 AZ-245
AZ-267 FDR Log Bridge 2 AZ-266, AZ-272 (forward) AZ-245
AZ-268 Log Schema Contract Test 2 AZ-266, AZ-267 AZ-245
AZ-269 Config Loader 3 AZ-263 AZ-246
AZ-270 Composition Root 3 AZ-269 AZ-246
AZ-271 Config Precedence Tests 2 AZ-269, AZ-270 AZ-246
AZ-272 FdrRecord Schema 3 AZ-263, AZ-266 AZ-247
AZ-273 FdrClient Ring Buffer 5 AZ-263, AZ-272, AZ-269, AZ-266 AZ-247
AZ-274 FDR Overrun Policy 2 AZ-272, AZ-273 AZ-247
AZ-275 FakeFdrSink 2 AZ-272, AZ-273 AZ-247
AZ-276 ImuPreintegrator Helper 2 AZ-263 AZ-264
AZ-277 SE3Utils Helper 2 AZ-263 AZ-264
AZ-278 LightGlueRuntime Helper 3 AZ-263 AZ-264
AZ-279 WgsConverter Helper 2 AZ-263 AZ-264
AZ-280 Sha256Sidecar Helper 2 AZ-263 AZ-264
AZ-281 EngineFilenameSchema Helper 2 AZ-263 AZ-264
AZ-282 RansacFilter Helper 2 AZ-263, AZ-277 AZ-264
AZ-283 DescriptorNormaliser Helper 2 AZ-263 AZ-264
AZ-291 C13 Writer Thread 5 AZ-263, AZ-272, AZ-273, AZ-266, AZ-269 AZ-248
AZ-292 C13 Flight Header/Footer + Accounting 3 AZ-291, AZ-272, AZ-263, AZ-269, AZ-266 AZ-248
AZ-293 C13 Capacity Cap Policy 5 AZ-291, AZ-292, AZ-272, AZ-263, AZ-269, AZ-266 AZ-248
AZ-294 C13 Mid-Flight Tile Snapshot Path 3 AZ-291, AZ-272, AZ-263, AZ-269 AZ-248
AZ-295 C13 AC-8.5 Forbidden-Kind + Thumbnail Rate Cap 3 AZ-291, AZ-272, AZ-263, AZ-269, AZ-266 AZ-248
AZ-296 C13 Takeoff Abort on FdrOpenError 2 AZ-291, AZ-292, AZ-263, AZ-266 AZ-248
AZ-297 C7 InferenceRuntime Protocol 3 AZ-263, AZ-269, AZ-266, AZ-280, AZ-281 AZ-249
AZ-298 C7 TensorrtRuntime 5 AZ-297, AZ-301, AZ-280, AZ-281, AZ-263, AZ-269, AZ-266 AZ-249
AZ-299 C7 OnnxTrtEpRuntime 3 AZ-297, AZ-301, AZ-280, AZ-281, AZ-263, AZ-269, AZ-266 AZ-249
AZ-300 C7 PytorchFp16Runtime 2 AZ-297, AZ-263, AZ-269, AZ-266 AZ-249
AZ-301 C7 EngineGate 3 AZ-297, AZ-280, AZ-281, AZ-266 AZ-249
AZ-302 C7 ThermalState Publisher 3 AZ-297, AZ-263, AZ-269, AZ-266, AZ-273 AZ-249
AZ-303 C6 Storage Interfaces 3 AZ-263, AZ-269, AZ-266, AZ-280 AZ-250
AZ-304 C6 Postgres Schema 2 AZ-303, AZ-263, AZ-269, AZ-266 AZ-250
AZ-305 C6 PostgresFilesystemStore 5 AZ-303, AZ-304, AZ-280, AZ-279, AZ-263, AZ-269, AZ-266, AZ-273 AZ-250
AZ-306 C6 FaissDescriptorIndex 5 AZ-303, AZ-280, AZ-263, AZ-269, AZ-266 AZ-250
AZ-307 C6 Freshness Gate 2 AZ-303, AZ-304, AZ-305, AZ-263, AZ-269, AZ-266, AZ-273 AZ-250
AZ-308 C6 Cache Budget Eviction 3 AZ-303, AZ-305, AZ-263, AZ-269, AZ-266, AZ-273 AZ-250
AZ-316 C11 TileDownloader 5 AZ-263, AZ-269, AZ-266, AZ-303, AZ-305, AZ-307, AZ-308 AZ-251
AZ-317 C11 Flight-State Gate (SUPERSEDED by Batch 44 / AZ-523; gate moved to C12 AZ-329) 2 AZ-263, AZ-269, AZ-266 AZ-251
AZ-318 C11 Per-Flight Signing Key 3 AZ-263, AZ-269, AZ-266, AZ-273 AZ-251
AZ-319 C11 TileUploader (contract v2.0.0 — internal flight-state gate removed in Batch 44) 5 AZ-263, AZ-269, AZ-266, AZ-273, AZ-303, AZ-305, AZ-318 AZ-251
AZ-320 C11 Idempotent Retry Decorator 3 AZ-263, AZ-269, AZ-266, AZ-273, AZ-303, AZ-319 AZ-251
AZ-321 C10 Engine Compiler 5 AZ-263, AZ-269, AZ-266, AZ-280, AZ-281, AZ-298 AZ-252
AZ-322 C10 Descriptor Batcher 3 AZ-263, AZ-269, AZ-266, AZ-303, AZ-306, AZ-321 AZ-252
AZ-323 C10 Manifest Builder 3 AZ-263, AZ-269, AZ-266, AZ-280, AZ-281, AZ-303 AZ-252
AZ-324 C10 ManifestVerifier 3 AZ-263, AZ-269, AZ-266, AZ-280, AZ-281 AZ-252
AZ-325 C10 CacheProvisioner 3 AZ-263, AZ-269, AZ-266, AZ-303, AZ-321, AZ-322, AZ-323 AZ-252
AZ-326 C12 CLI App 3 AZ-263, AZ-269, AZ-266, AZ-489 AZ-253
AZ-327 C12 Companion Bringup 3 AZ-263, AZ-269, AZ-266 AZ-253
AZ-328 C12 Build-Cache Orchestrator 5 AZ-326, AZ-327, AZ-316, AZ-325, AZ-489, AZ-263, AZ-269, AZ-266 AZ-253
AZ-329 C12 PostLandingUploadOrchestrator (flight_footer FDR gate; Batch 44 design pivot) 3 AZ-326, AZ-319, AZ-272, AZ-273, AZ-292, AZ-263, AZ-269, AZ-266 AZ-253
AZ-330 C12 OperatorReLocService 3 AZ-326, AZ-273, AZ-272, AZ-263, AZ-269, AZ-266 AZ-253
AZ-331 C1 VioStrategy Protocol 3 AZ-263, AZ-269, AZ-266, AZ-270, AZ-272, AZ-276, AZ-277 AZ-254
AZ-332 C1 OKVIS2 Strategy 5 AZ-331, AZ-263, AZ-269, AZ-266, AZ-276, AZ-277, AZ-272, AZ-273 AZ-254
AZ-333 C1 VINS-Mono Strategy 5 AZ-331, AZ-263, AZ-269, AZ-266, AZ-276, AZ-277, AZ-272, AZ-273 AZ-254
AZ-334 C1 KLT/RANSAC Strategy 5 AZ-331, AZ-263, AZ-269, AZ-266, AZ-276, AZ-277, AZ-282, AZ-272, AZ-273 AZ-254
AZ-335 C1 Warm-Start + F8 Reboot Recovery 3 AZ-331, AZ-332, AZ-333, AZ-334, AZ-263, AZ-269, AZ-266, AZ-270, AZ-280, AZ-272 AZ-254
AZ-336 C2 VprStrategy Protocol + Factory + Composition 3 AZ-263, AZ-269, AZ-270, AZ-303, AZ-297, AZ-266 AZ-255
AZ-337 C2 UltraVPR Primary Backbone (TRT) 5 AZ-336, AZ-263, AZ-269, AZ-298, AZ-303, AZ-283, AZ-281, AZ-321, AZ-266, AZ-272 AZ-255
AZ-338 C2 NetVLAD Mandatory Simple-Baseline 3 AZ-336, AZ-263, AZ-269, AZ-300, AZ-303, AZ-283, AZ-266, AZ-272 AZ-255
AZ-339 C2 MegaLoc + MixVPR Secondary Backbones (Research-only) 5 AZ-336, AZ-263, AZ-269, AZ-298, AZ-303, AZ-283, AZ-281, AZ-321, AZ-266, AZ-272 AZ-255
AZ-340 C2 SelaVPR + EigenPlaces + SALAD Secondary Backbones (Research-only) 5 AZ-336, AZ-263, AZ-269, AZ-298, AZ-303, AZ-283, AZ-281, AZ-321, AZ-266, AZ-272 AZ-255
AZ-341 C2 FAISS HNSW Retrieve Wiring 3 AZ-336, AZ-263, AZ-269, AZ-303, AZ-305, AZ-306, AZ-266, AZ-272 AZ-255
AZ-342 C2.5 ReRankStrategy Protocol + Factory + Composition 2 AZ-263, AZ-269, AZ-270, AZ-278, AZ-303, AZ-266 AZ-256
AZ-343 C2.5 InlierCountReRanker (drop-and-continue) 3 AZ-342, AZ-263, AZ-269, AZ-278, AZ-303, AZ-266, AZ-272 AZ-256
AZ-344 C3 CrossDomainMatcher Protocol + Factory + Composition 3 AZ-263, AZ-269, AZ-270, AZ-278, AZ-282, AZ-297, AZ-266 AZ-257
AZ-345 C3 DISK+LightGlue Primary Matcher 5 AZ-344, AZ-263, AZ-269, AZ-278, AZ-282, AZ-298, AZ-299, AZ-303, AZ-281, AZ-321, AZ-266, AZ-272 AZ-257
AZ-346 C3 ALIKED+LightGlue Secondary Matcher 3 AZ-344, AZ-263, AZ-269, AZ-278, AZ-282, AZ-298, AZ-299, AZ-303, AZ-281, AZ-321, AZ-266, AZ-272 AZ-257
AZ-347 C3 XFeat Alternate Lightweight Matcher 3 AZ-344, AZ-263, AZ-269, AZ-282, AZ-298, AZ-299, AZ-303, AZ-281, AZ-321, AZ-266, AZ-272 AZ-257
AZ-348 C3.5 ConditionalRefiner Protocol + Factory + PassthroughRefiner + Composition 3 AZ-263, AZ-269, AZ-270, AZ-282, AZ-297, AZ-344, AZ-266 AZ-258
AZ-349 C3.5 AdHoPRefiner — production-default conditional refiner 5 AZ-348, AZ-263, AZ-269, AZ-282, AZ-298, AZ-299, AZ-281, AZ-321, AZ-266, AZ-272 AZ-258
AZ-355 C4 PoseEstimator Protocol + Factory + DTOs + Composition 3 AZ-263, AZ-269, AZ-270, AZ-282, AZ-279, AZ-277, AZ-266 AZ-259
AZ-358 C4 OpenCVGtsamPoseEstimator (steady-state path) 5 AZ-355, AZ-381, AZ-282, AZ-279, AZ-277, AZ-269, AZ-266, AZ-272, AZ-263 AZ-259
AZ-361 C4 D-CROSS-LATENCY-1 hybrid — Jacobian + thermal-driven mode switch 3 AZ-358, AZ-355, AZ-302, AZ-277, AZ-279, AZ-269, AZ-266, AZ-272, AZ-263 AZ-259
AZ-381 C5 StateEstimator Protocol + Factory + DTOs + Composition + concrete ISam2GraphHandle 3 AZ-263, AZ-269, AZ-270, AZ-276, AZ-277, AZ-279, AZ-273, AZ-355, AZ-266 AZ-260
AZ-382 C5 GtsamIsam2StateEstimator skeleton — iSAM2 + IncrementalFixedLagSmoother wiring 5 AZ-381, AZ-263, AZ-269, AZ-266, AZ-272 AZ-260
AZ-383 C5 GtsamIsam2StateEstimator — add_vio / add_pose_anchor / add_fc_imu factor add bodies 5 AZ-382, AZ-381, AZ-276, AZ-358, AZ-263, AZ-269, AZ-266, AZ-272 AZ-260
AZ-384 C5 GtsamIsam2StateEstimator — Marginals + output methods 3 AZ-383, AZ-382, AZ-381, AZ-279, AZ-277, AZ-263, AZ-269, AZ-266, AZ-272 AZ-260
AZ-385 C5 SourceLabelStateMachine + spoof-promotion gate 5 AZ-384, AZ-381, AZ-382, AZ-383, AZ-263, AZ-269, AZ-266, AZ-272, AZ-391, AZ-397 AZ-260
AZ-386 C5 EskfStateEstimator — mandatory simple-baseline 5 AZ-381, AZ-276, AZ-277, AZ-279, AZ-263, AZ-269, AZ-266, AZ-272 AZ-260
AZ-387 C5 smoothed past-keyframe → FDR path (AC-4.5 revised) 3 AZ-384, AZ-386, AZ-273, AZ-272, AZ-263, AZ-269, AZ-266 AZ-260
AZ-388 C5 AC-5.2 fallback path — 3 s no-estimate detector + downstream signal 3 AZ-384, AZ-386, AZ-273, AZ-272, AZ-390, AZ-397, AZ-263, AZ-269, AZ-266 AZ-260
AZ-389 C5 internal orthorectifier — produces mid-flight tile candidates for C6 3 AZ-384, AZ-385, AZ-303, AZ-263, AZ-269, AZ-266, AZ-272 AZ-260
AZ-390 C8 FcAdapter + GcsAdapter Protocols + DTOs + errors + composition factories 3 AZ-263, AZ-269, AZ-270, AZ-273, AZ-277, AZ-279, AZ-266 AZ-261
AZ-391 C8 inbound subscription — IMU/attitude/GPS-health/MAV_STATE producer 5 AZ-390, AZ-263, AZ-269, AZ-266, AZ-272, AZ-273, AZ-276 AZ-261
AZ-392 C8 CovarianceProjector — honest 6×6 → 2×2 → equivalent_radius helper 3 AZ-390, AZ-263, AZ-269, AZ-266, AZ-272 AZ-261
AZ-393 C8 PymavlinkArdupilotAdapter outbound — GPS_INPUT 5 Hz + provenance side-channel 5 AZ-390, AZ-392, AZ-279, AZ-273, AZ-263, AZ-269, AZ-266, AZ-272 AZ-261
AZ-394 C8 Msp2InavAdapter outbound — MSP2_SENSOR_GPS 5 Hz 3 AZ-390, AZ-392, AZ-279, AZ-273, AZ-263, AZ-269, AZ-266, AZ-272 AZ-261
AZ-395 C8 AP MAVLink 2.0 per-flight signing — handshake + key rotation + zeroisation 5 AZ-393, AZ-390, AZ-273, AZ-272, AZ-263, AZ-269, AZ-266 AZ-261
AZ-396 C8 AP D-C8-2 source-set switch — MAV_CMD_SET_EKF_SOURCE_SET + spoof-recovery wiring 3 AZ-393, AZ-390, AZ-385, AZ-273, AZ-272, AZ-263, AZ-269, AZ-266 AZ-261
AZ-397 C8 QgcTelemetryAdapter — downsampled 12 Hz summary out + operator command in 3 AZ-390, AZ-392, AZ-279, AZ-273, AZ-263, AZ-269, AZ-266 AZ-261
AZ-398 FrameSource Protocol + Clock Protocol + LiveCameraFrameSource retrofit + VideoFileFrameSource 3 AZ-263, AZ-269, AZ-270, AZ-266, AZ-272 AZ-265
AZ-399 TlogReplayFcAdapter — replay-only FcAdapter parsing pymavlink .tlog 5 AZ-398, AZ-390, AZ-391, AZ-279, AZ-273, AZ-263, AZ-269, AZ-266, AZ-272 AZ-265
AZ-400 ReplaySink + JsonlReplaySink + MavlinkTransport seam + Noop/Serial transports 3 AZ-263, AZ-269, AZ-270, AZ-381, AZ-266, AZ-272, AZ-390 AZ-265
AZ-401 compose_root replay-mode branch — JSONL sink + NoopMavlinkTransport wiring 2 AZ-398, AZ-399, AZ-400, AZ-405, AZ-269, AZ-270, AZ-263, AZ-266, AZ-272, AZ-390 AZ-265
AZ-402 gps-denied-replay console-script wrapper (mode-config dispatcher) 3 AZ-401, AZ-269, AZ-270, AZ-263, AZ-266, AZ-272, AZ-273 AZ-265
AZ-403 (CANCELLED per ADR-011 — replay is a configuration of the airborne binary; no fourth image) AZ-265
AZ-404 E2E replay fixture test — Derkachi 12 min clip + mode-agnosticism + operator workflow 5 AZ-402, AZ-401, AZ-405, AZ-263, AZ-269, AZ-266, AZ-272, AZ-273 AZ-265
AZ-405 replay_input/ coordinator + auto-sync of video ↔ tlog via IMU take-off detection 5 AZ-399, AZ-398, AZ-263, AZ-269, AZ-266, AZ-272, AZ-279 AZ-265
AZ-558 Route C8 outbound encoder bytes through MavlinkTransport seam (closes AZ-401 AC-9) 3 AZ-401, AZ-273, AZ-294, AZ-399 AZ-265
AZ-406 Blackbox Test Infrastructure Bootstrap (Tier-1 + Tier-2 harness scaffold) 5 AZ-263 AZ-262
AZ-407 Static fixture builders — tile-cache, age-injector, cold-boot, MAVLink passkey, CVE JPEG 3 AZ-406 AZ-262
AZ-408 Runtime synthetic-injection fixture builders — outlier, blackout-spoof, multi-segment 3 AZ-406, AZ-407 AZ-262
AZ-409 FT-P-01 — Still-image set-60 frame-center accuracy 3 AZ-406, AZ-407 AZ-262
AZ-410 FT-P-02 — Cumulative drift between satellite anchors on Derkachi 3 AZ-406, AZ-407 AZ-262
AZ-411 FT-P-03 + FT-P-14 — Estimate output schema + WGS84 coordinate validation 2 AZ-406, AZ-407 AZ-262
AZ-412 FT-P-04 — Frame-to-frame registration ≥95% on normal Derkachi segments 3 AZ-406, AZ-407 AZ-262
AZ-413 FT-P-05 + FT-P-06 — Cross-domain matcher MRE budgets 3 AZ-406, AZ-407, AZ-412 AZ-262
AZ-414 FT-P-07 + FT-N-02 — Sharp-turn recovery via satellite reference 3 AZ-406, AZ-407 AZ-262
AZ-415 FT-P-08 — ≥3 disconnected segments via satellite-reference re-localization 3 AZ-406, AZ-407, AZ-408 AZ-262
AZ-416 FT-P-09-AP — ArduPilot Plane GPS_INPUT contract + MAVLink 2.0 signing handshake 5 AZ-406, AZ-407 AZ-262
AZ-417 FT-P-09-iNav — iNav MSP2_SENSOR_GPS contract conformance 3 AZ-406, AZ-407 AZ-262
AZ-418 FT-P-10 — GTSAM smoothing-loop look-back accuracy 3 AZ-406, AZ-407 AZ-262
AZ-419 FT-P-11 — Cold-start init (operator-manifest primary + FC EKF secondary + bounded-delta gate) 3 AZ-406, AZ-407, AZ-489 (forward), AZ-490 (forward) AZ-262
AZ-420 FT-P-12 + FT-P-13 — GCS downsample + GCS-originated re-loc command 3 AZ-406, AZ-407 AZ-262
AZ-421 FT-P-15 + FT-P-16 + FT-P-18 — Tile cache + offline + no-raw-retention 3 AZ-406, AZ-407 AZ-262
AZ-422 FT-P-17 + FT-N-06 — Mid-flight tile generation + freshness 3 AZ-406, AZ-407 AZ-262
AZ-423 FT-P-19 — Satellite-relocalization scale-ratio + scene-change PARTIAL 3 AZ-406, AZ-407 AZ-262
AZ-424 FT-N-01 — 350 m outlier injection tolerance 3 AZ-406, AZ-407, AZ-408 AZ-262
AZ-425 FT-N-03 — Extended outage triggers OPERATOR_RELOC_REQUEST 3 AZ-406, AZ-407, AZ-408 AZ-262
AZ-426 FT-N-04 — Visual blackout + spoofed GPS combined failsafe 5 AZ-406, AZ-407, AZ-408 AZ-262
AZ-427 FT-N-05 — Stale-tile rejection on freshness violation 2 AZ-406, AZ-407 AZ-262
AZ-428 NFT-PERF-01 — End-to-end latency p95 ≤ 400 ms on Tier-2 5 AZ-406, AZ-407, AZ-444 (forward) AZ-262
AZ-429 NFT-PERF-02 — Frame-by-frame streaming, no batching 2 AZ-406, AZ-407 AZ-262
AZ-430 NFT-PERF-03 — Cold-start TTFF ≤ 30 s on Tier-2 5 AZ-406, AZ-407, AZ-444 (forward) AZ-262
AZ-431 NFT-PERF-04 — Spoofing-promotion latency p95 ≤ 600 ms 3 AZ-406, AZ-407, AZ-408 AZ-262
AZ-432 NFT-RES-01 — IMU-only fallback drift bound 3 AZ-406, AZ-407, AZ-408 AZ-262
AZ-433 NFT-RES-02 — Companion mid-flight reboot recovery 3 AZ-406, AZ-407 AZ-262
AZ-434 NFT-RES-03 — 100-iteration Monte Carlo statistical envelope 5 AZ-406, AZ-407, AZ-408 AZ-262
AZ-435 NFT-RES-04 — 35 s blackout-with-spoof full escalation ladder 3 AZ-406, AZ-407, AZ-408, AZ-426 AZ-262
AZ-436 NFT-SEC-01 — Cache-poisoning safety probability ≤ 1e-6/flight 5 AZ-406, AZ-407 AZ-262
AZ-437 NFT-SEC-02 + NFT-SEC-05 — No-egress + DNS-blackhole defense-in-depth 3 AZ-406, AZ-407 AZ-262
AZ-438 NFT-SEC-03 — AP rejects unsigned/wrong-key/replayed messages 3 AZ-406, AZ-407 AZ-262
AZ-439 NFT-SEC-04 — OpenCV CVE-2025-53644 + AddressSanitizer fuzz 5 AZ-406, AZ-407, AZ-444 (forward, optional) AZ-262
AZ-440 NFT-LIM-01 — Jetson memory budget 3 AZ-406, AZ-407, AZ-444 (forward) AZ-262
AZ-441 NFT-LIM-02 — 8h-extrapolated FDR size ≤ 50 GB 2 AZ-406, AZ-407 AZ-262
AZ-442 NFT-LIM-03 + NFT-LIM-05 — Aggregate storage + thumbnail-log budget 2 AZ-406, AZ-407 AZ-262
AZ-443 NFT-LIM-04 — Jetson thermal envelope @ workstation ambient (AC-NEW-5 PARTIAL) 2 AZ-406, AZ-407, AZ-444 (forward) AZ-262
AZ-444 Tier-2 Jetson harness wrapper — run-tier2.sh, ssh provisioning, systemd, ASan-fuzz 5 AZ-406 AZ-262
AZ-445 CSV reporter + evidence bundler — per-NFR machine-readable outputs + traceability-status.json 2 AZ-406 AZ-262
AZ-446 CSV reporter refinements — trend-line + acceptance-band annotations + Monte Carlo CI 2 AZ-406, AZ-445 AZ-262
AZ-489 C12 FlightsApiClient — fetch Flight from suite flights service + offline JSON fallback 3 AZ-263, AZ-269, AZ-266, AZ-279, AZ-280 AZ-253
AZ-490 C5 set_takeoff_origin entrypoint — accept operator origin from C10 Manifest 3 AZ-263, AZ-269, AZ-266, AZ-272, AZ-273, AZ-279, AZ-381, AZ-383, AZ-384, AZ-385, AZ-386 AZ-260
AZ-507 Hygiene — align module-layout.md cross-component import rules with AZ-270 lint 2 AZ-263, AZ-270, AZ-321 AZ-246
AZ-508 Hygiene — consolidate _iso_ts_now helpers into helpers/iso_timestamps.py 2 AZ-263 AZ-264
AZ-526 Hygiene — add iso_ts_from_clock(clock) to helpers/iso_timestamps.py 2 AZ-508, AZ-398 AZ-264
AZ-527 Hygiene — consolidate _assert_engine_output_dim into c2-internal helper 2 AZ-340 AZ-255
AZ-528 Hygiene — consolidate c1_vio strategy facade orchestration spine 3 AZ-334 AZ-254
AZ-523 Batch 44 — C11 internal flight-state gate removal (SRP refactor; audit-trail; closed) 3 AZ-317, AZ-319, AZ-329 AZ-251
AZ-524 Batch 44 — C12 package rename: c12_operator_tooling → c12_operator_orchestrator (audit; closed) 2 AZ-263, AZ-326, AZ-327, AZ-328, AZ-329, AZ-330, AZ-489 AZ-253

Notes

  • Forward dependency on AZ-272 in AZ-267: the FDR Log Bridge task declares a forward dependency on the FdrRecord Schema (AZ-272). Both tasks ship together; the bridge ships against the published schema contract once AZ-272 is stable. This is the ONLY forward dependency in the plan — verified by inspection.
  • C4 ↔ C5 co-development (ADR-003): AZ-358 depends on AZ-381's concrete ISam2GraphHandle; AZ-383 depends on AZ-358's PoseEstimate.covariance_mode. Both tasks ship in lockstep — the shared ISam2GraphHandle Protocol stub is owned by AZ-355, the concrete impl by AZ-381.
  • C5 ↔ C8 co-development: AZ-385 depends on C8 GpsHealth (AZ-391) and QgcTelemetryAdapter (AZ-397); AZ-388 depends on AZ-390 / AZ-397; AZ-396 depends on AZ-385. Each side ships against the AZ-390 Protocol contract until the consumer task lands.
  • AZ-401 (compose_root replay-mode branch, per ADR-011) intentionally depends on the C1C5 epic IDs (AZ-254 … AZ-260) at the documentation level — concrete strategy task IDs flow in through each component's composition factory, not through this composition root directly. Under ADR-011 there is NO separate compose_replay function; replay is a config.mode = "replay" branch inside the single compose_root. The legacy v1.0.0 fourth-binary design (AZ-403) is cancelled — see the cancellation banner in _docs/02_tasks/done/AZ-403_replay_dockerfile_ci.md and the pending tracker leftover at _docs/_process_leftovers/2026-05-14_az_403_cancellation_pending_tracker.md.
  • AZ-405 (replay_input/ coordinator + auto-sync) is the architectural seam between (video, tlog) and the rest of the system under ADR-011. Its consumers are AZ-401 (composition-root branch builds the coordinator) and AZ-404 (E2E uses the populated coordinator via the CLI). It depends on AZ-398 / AZ-399 / AZ-279 but NOT on AZ-402 (the CLI consumes the coordinator's CLI-arg surface, but the coordinator itself is CLI-agnostic).
  • E-BBT (AZ-262) forward dependencies on AZ-444 (Tier-2 harness): AZ-428, AZ-430, AZ-440, AZ-443 declare hard forward deps on AZ-444; AZ-439 declares an optional forward dep on AZ-444 (Tier-2 ASan-fuzz variant). These tasks ship in a tight loop with AZ-444 — the harness must exist before any Tier-2 NFT scenario can run. Tier-1 sub-cases of NFT-PERF-02, NFT-RES-, NFT-SEC-, NFT-LIM-02, NFT-LIM-03 do not require AZ-444 and remain independently runnable.
  • E-BBT scenario chains within AZ-262:
    • AZ-413 (FT-P-05+06) depends on AZ-412 (FT-P-04) — FT-P-06 is a piggyback assertion over FT-P-04 + FT-P-05 evidence.
    • AZ-435 (NFT-RES-04) depends on AZ-426 (FT-N-04) — both consume blackout_spoof.py; NFT-RES-04 is the focused 35 s escalation scenario while FT-N-04 covers the 5 s / 15 s / 35 s ladder.
    • AZ-446 depends on AZ-445 — refinements layer over the bundler.
  • ADR-010 operator-origin path (added 2026-05-11):
    • AZ-489 (C12 FlightsApiClient) is the new read-only Flight resolver for C12; it has no consumers inside its own epic but feeds AZ-326 (CLI flags) and AZ-328 (orchestrator phase 0) — both declare a hard backward dep on AZ-489. The CLI's --flight-id / --flight-file flags + AZ-328's flight-resolve phase 0 cannot land without it.
    • AZ-490 (C5 set_takeoff_origin) extends the AZ-381 Protocol with the pre-takeoff entrypoint, amends the AZ-385 source-label state machine with the third bounded-delta clause, and depends on AZ-381..AZ-386 (Protocol + factor adds + marginals + source label gate + ESKF baseline) plus AZ-272/273/279 for FDR + Vincenty. All deps are backward; AZ-490 ships after the C5 epic core lands.
    • AZ-419 (FT-P-11 cold-start) carries forward deps on both AZ-489 + AZ-490 — the blackbox cold-start scenario now exercises the operator-manifest primary path (needs both) AND the FC EKF secondary fallback (back-compat).
  • All E-BBT tasks depend on AZ-406 (test infrastructure); this is by design — AZ-406 is the foundation every blackbox test depends on (analogous to AZ-263 for the product side).
  • Batch 44 SRP refactor + C12 rename (added 2026-05-13):
    • AZ-317 (C11 Flight-State Gate) is superseded. The C11-internal gate (confirm_flight_state / FlightStateSignal / FlightStateNotOnGroundError) was removed in Batch 44 Phase B; the post-landing safety responsibility moved to C12's new PostLandingUploadOrchestrator (AZ-329). The row is retained in the table for audit; the ticket is in _docs/02_tasks/done/ with a SUPERSEDED banner.
    • AZ-319 (C11 TileUploader) lost its dependency on AZ-317 (gate removed) and the TileUploader Protocol contract was bumped to v2.0.0 (frozen) with the gate parameters removed. Migration note in _docs/02_document/contracts/c11_tilemanager/tile_uploader.md.
    • AZ-329 (C12 PostLandingUploadOrchestrator) specification was rewritten in Phase C to gate on the flight_footer FDR record's clean_shutdown field instead of counting consecutive FlightStateSignal records. Added explicit dependency on AZ-292 (C13 footer write) since the orchestrator reads the footer record produced there.
    • AZ-330 (C12 OperatorReLocService) added an explicit dependency on AZ-272 (FDR schema) since the service emits a new c12.reloc.requested FDR record kind.
    • AZ-523 (C11 gate removal audit-trail) and AZ-524 (C12 package rename audit-trail) are post-hoc tickets closed on creation. Their dependencies (AZ-317/319/329 for AZ-523; the C12 task set for AZ-524) are listed for traceability; these tickets are not gates on any future work.
    • E-C12 epic (AZ-253) summary renamed: C12 Operator Pre-flight ToolingC12 Operator Pre-flight Orchestrator.
  • Hygiene PBI from cumulative review batches 52-54 (added 2026-05-14):
    • AZ-528 (E-C1 / AZ-254) — c1_vio strategy facade orchestration-spine 3-way duplication. Depends on AZ-334 (the trigger that escalated the duplication from 2-way to 3-way; all 3 callers now exist in done/). NOT a gate on AZ-335 in a strict technical sense, but recommended to sequence before AZ-335 so the warm-start path lands against the consolidated spine instead of a fourth divergent copy. 3 points: 1 new module (c1_vio/_facade_spine.py) + 3 small edits + 1 test file with AST-walk + import-grep regression guards. Pattern mirrors AZ-527's c2-side consolidation.
  • Hygiene PBIs from cumulative review batches 31-33 (added 2026-05-13):
    • AZ-507 (E-CC-CONF / AZ-246) — module-layout.md ↔ AZ-270 lint alignment. Depends on AZ-263 (structure), AZ-270 (the lint test
      • composition root), and AZ-321 (the engine_compiler whose except Exception is narrowed). All deps are backward and completed; AZ-507 can land in any future batch. NOT a gate on AZ-322 / AZ-337 (the cumulative review F2 notes hygiene defers).
    • AZ-508 (E-CC-HELPERS / AZ-264) — _iso_ts_now helper consolidation. Depends on AZ-263 only. Stateless stdlib helper; no cross-component or runtime dependencies. NOT a gate on any future product task; can ship in a hygiene-only batch.

Coverage Verification (Implementation Mode)

  • Every product interface in architecture.md has implementation task coverage.

    • C1 VioStrategy → AZ-331 (Protocol) + AZ-332/333/334 (concrete)
    • C2 VprStrategy → AZ-336 (Protocol) + AZ-337/338/339/340 (concrete)
    • C2.5 ReRankStrategy → AZ-342 (Protocol) + AZ-343 (concrete)
    • C3 CrossDomainMatcher → AZ-344 (Protocol) + AZ-345/346/347 (concrete)
    • C3.5 ConditionalRefiner → AZ-348 (Protocol + Passthrough) + AZ-349 (AdHoP)
    • C4 PoseEstimator → AZ-355 (Protocol) + AZ-358/361 (concrete)
    • C5 StateEstimator → AZ-381 (Protocol) + AZ-382..AZ-389 (concrete) + AZ-490 (set_takeoff_origin entrypoint + bounded-delta gate)
    • C6 TileStore / DescriptorIndex → AZ-303 (Interfaces) + AZ-304/305/306/307/308
    • C7 InferenceRuntime → AZ-297 (Protocol) + AZ-298/299/300/301/302
    • C8 FcAdapter / GcsAdapter → AZ-390 (Protocols) + AZ-391..AZ-397
    • C10 Provisioning → AZ-321/322/323/324/325
    • C11 Tile Manager → AZ-316/318/319/320 + AZ-523 (Batch 44 gate-removal audit; AZ-317 superseded)
    • C12 Operator Pre-flight Orchestrator → AZ-326/327/328/329/330 + AZ-489 (FlightsApiClient) + AZ-524 (Batch 44 rename audit)
    • C13 FDR Writer → AZ-291..AZ-296
  • Cross-cutting product modules:

    • Logging → AZ-266/267/268
    • Config + Composition Root → AZ-269/270/271
    • FDR Client → AZ-272..AZ-275
    • Shared helpers (IMU preintegrator, SE3, LightGlue runtime, WGS, SHA-256 sidecar, engine filename schema, RANSAC, descriptor normaliser) → AZ-276..AZ-283
    • Frame source + Clock → AZ-398
    • Replay sink → AZ-400
    • Replay composition branch + CLI wrapper + replay_input/ coordinator → AZ-401/402/405 (AZ-403 cancelled per ADR-011)
  • No unresolved AZ-? placeholders in any task file (verified by grep on Step 4 close-out).

  • E-BBT (AZ-262 / blackbox tests) coverage vs traceability-matrix.md:

    • All 35 Covered ACs map to ≥1 scenario task (AZ-409..AZ-443).
    • All 3 PARTIAL ACs carry the PARTIAL annotation in their pass criteria: AC-8.6 → AZ-423; AC-NEW-5 → AZ-443.
    • All 3 NOT COVERED ACs (AC-7.1, AC-7.2, RESTRICT-CAM-2) are handled by the conftest skip-rule embedded in AZ-406, not by a dedicated task.
    • Fixture coverage: 5 static fixtures (AZ-407) + 3 synthetic injectors (AZ-408) + cold-boot snapshot (AZ-407) cover every scenario's data needs.
    • Tier-2-only scenarios: AZ-428, AZ-430, AZ-440, AZ-443 (and optionally AZ-439's ASan-fuzz mode) all SKIP cleanly on Tier-1 via the conftest tier-guard.
    • Reporting: AZ-445 + AZ-446 produce per-NFR JSONs, traceability-status.json, and regression-baseline.json for every scenario.

Cycle Check

A static dependency-graph traversal (Kahn topological sort) visits all 142 nodes — no cycles. The 15 forward edges (dep ID > task ID) are all declared, bounded, and documented:

  • AZ-267 → AZ-272 (FDR Log Bridge → FdrRecord Schema; shipped in lockstep).
  • AZ-298 → AZ-301, AZ-299 → AZ-301 (TensorRT / ONNX-RT runtimes → engine gate; runtime ships against the gate's published contract).
  • AZ-358 → AZ-381 (C4 OpenCV/GTSAM marginals → C5 SAM2 graph handle; ADR-003 co-development against the AZ-355 Protocol stub).
  • AZ-385 → AZ-391, AZ-397, AZ-388 → AZ-390, AZ-397 (C5 ↔ C8 co-development; each side ships against the AZ-390 Protocol contract until the consumer task lands).
  • AZ-428, AZ-430, AZ-440, AZ-443 → AZ-444 (Tier-2 NFT scenarios → Tier-2 harness wrapper; AZ-439 carries the same forward dep optionally for the ASan-fuzz mode). AZ-444 is therefore scheduled as the first Tier-2 E-BBT deliverable; the dependent scenarios land on top of it.
  • AZ-326 → AZ-489, AZ-328 → AZ-489 (C12 CLI + orchestrator depend on the new C12 FlightsApiClient task added 2026-05-11; the client lands first inside the C12 epic and the CLI/orchestrator then plug it in).
  • AZ-419 → AZ-489, AZ-419 → AZ-490 (blackbox cold-start scenario forward-depends on both the C12 client + the new C5 entrypoint; the scenario lands after both product tasks).

The graph is therefore a strict DAG once these documented forward edges are accounted for, and remains sortable by tracker ID modulo those edges.