Files
gps-denied-onboard/_docs/02_tasks/_dependencies_table.md
T
Oleksandr Bezdieniezhnykh 9dc04cc677
ci/woodpecker/push/02-build-push Pipeline failed
Update autodev state and dependencies table for Phase 2 progress
- Changed autodev state sub_step to reflect new phase and task details: updated phase from 7 to 2, renamed task to 'refactor-analysis-gate', and revised detail to indicate the creation of new tasks AZ-844, AZ-845, AZ-846, and AZ-847, awaiting Phase-2 gate.
- Updated dependencies table with the latest task counts and complexity points, reflecting the addition of new tasks and the closure of AZ-777 in Jira. Total tasks now stand at 173 with 557 complexity points.
2026-05-23 17:11:50 +03:00

400 lines
62 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dependencies Table
**Date**: 2026-05-23 (cycle-3 Step 10 Implement, refactor run 02-az507-routespec-relocation — added AZ-844 (Epic, run dir `_docs/04_refactoring/02-az507-routespec-relocation/`) + AZ-845 (C01, 2pt relocate `RouteSpec` from `replay_input/tlog_route.py` to `_types/route.py`, deps None, epic AZ-844) + AZ-846 (C02, 2pt refresh `module-layout.md` cycle-3 entries — c11 + replay_input + `_types/route`, deps AZ-845, epic AZ-844) + AZ-847 (C03, 2pt widen `test_az270_compose_root` lint to enforce full rule-9 allow-list, deps AZ-845, epic AZ-844). Resolves cycle-3 cumulative review FAIL verdict (F1 High Architecture, F2 Medium Architecture, F3 Medium Maintainability) per `_docs/03_implementation/cumulative_review_batches_104-109_cycle3_report.md`. Jira "Blocks" links recorded: AZ-845 → AZ-846, AZ-845 → AZ-847. Earlier same-day at start of Step 10 Implement — Epic AZ-835 decomposed into 4 leaf tasks + AZ-777 closed: AZ-839 (C3, 5pt operator_pre_flight_setup real fixture, deps AZ-836+AZ-838+AZ-777Phase1+AZ-322+AZ-316+AZ-306, epic AZ-835), AZ-840 (C4, 3pt e2e orchestrator test (tlog,video,calibration), deps AZ-839+AZ-836+AZ-838+AZ-699+AZ-405+AZ-702+AZ-696, epic AZ-835), AZ-841 (C5, 1pt un-xfail AZ-777 AC-4+AC-5, deps AZ-839+AZ-840, epic AZ-835), AZ-842 (C6, 2pt docs — replay_protocol.md Invariant 12 + architecture.md + orchestrator README, soft dep AZ-841, epic AZ-835). AZ-777 transitioned to Done in Jira: Phases 1+2 shipped (batch 104 + between batches 104 and 106); Phases 3-5 superseded by Epic AZ-835 children per 2026-05-22 user directive. AZ-777 spec moved to done/. Earlier 2026-05-21 (cycle-3 Step 9 New Task — added AZ-776 (3pt open-loop ESKF composition profile via `c4_pose.enabled` flag, no deps, epic AZ-602) + AZ-777 (5pt Derkachi C6 reference tile cache + FAISS descriptor index from OSM/CARTO basemap, depends on AZ-776, epic AZ-602). Both unblock the 7 currently-`@xfail`-masked Derkachi e2e tests on Jetson; AZ-776 unblocks 5 (AC-1, AC-2, AC-5, AC-6 realtime, AC-6 asap), AZ-777 unblocks the remaining 2 (AC-3 + AZ-699 real-flight verdict). Earlier 2026-05-19 (refreshed late-morning after 11:27 Jetson Tier-2 e2e run for AZ-618 — surfaced a NEW gap: replay-mode `Config` lacks `c6_tile_cache` block, so `build_pre_constructed → _build_c6_descriptor_index → _c6_config` raises `KeyError` for AC-1/2/5/6. Follow-up filed as AZ-687 (2pt) under E-AZ-602 with guard at the bootstrap layer (NOT silent fallback in `_c6_config`). Earlier same-day mid-day after AZ-618 split: per the spec author's own Sizing-note recommendation + user-rule cap on PBI complexity, AZ-618 was split into 6 subtasks AZ-619..AZ-624 in Jira (subtasks of AZ-618; epic AZ-602 stays grandparent). AZ-618 retained at 0pt as the umbrella tracker; aggregate actionable work is 16pt across the subtasks (vs. AZ-618's original 5pt filing — author's "likely a true 8" caveat was understated due to c5_isam2_graph_handle ordering + GPU builder unknowns). Earlier same-day refresh at start of Step-7 rewind for AZ-618 — Step-11 Jetson tier-2 e2e gate identified missing internal product implementation: `runtime_root.main()` does not build the airborne `pre_constructed` infrastructure dict before `compose_root()`; AZ-618 = 5pt cross-cutting follow-up to AZ-591, lives under E-AZ-602; all 12 dep tasks are in `done/`. Earlier 2026-05-16 (cycle-1 completeness-gate post-mortem): AZ-589 + AZ-590 closed Won't Fix — were wrong abstraction (OKVIS v1 `ThreadedKFVio` API doesn't exist in OKVIS2 upstream; VINS-Mono `cpp/vins_mono/upstream/` submodule never existed; the actual production gap is the empty central `_STRATEGY_REGISTRY` affecting EVERY component with a strategy-selecting config field, not just c1_vio); replaced by AZ-591 (cross-cutting compose_root per-binary bootstrap, todo/, 5pt) + AZ-592 (AZ-332 Tier-2 validation bundle, backlog/, 5pt placeholder) + AZ-593 (AZ-333 Tier-2 validation bundle, backlog/, 5pt placeholder); AZ-332 + AZ-333 re-classified in gate report from FAIL to BLOCKED-on-Tier-2 per the original tasks' Implementation Notes deferral handles; earlier same-day after end of cycle-1 gate: AZ-589 + AZ-590 created (now closed); earlier same-day after end of Batch 64: AZ-558 implementation closed — `MavlinkTransport` seam now routes every C8 outbound MAVLink byte; AZ-401 AC-9 + AZ-404 AC-4b unskipped together; encoder helpers extracted to `_outbound_mavlink_payloads.py`; live-mode `compose_root` injection deferred to whichever future batch registers AP/iNav strategies in an airborne binary; earlier 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 Tooling``Operator 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**: 176 (135 product + 41 blackbox-test) — 2026-05-23 refactor-run bump: +AZ-844 (Epic, 0pt umbrella for refactor run 02) + AZ-845 + AZ-846 + AZ-847 (3 product tasks). Prior 2026-05-23 bump (Epic AZ-835 decomposition): 173 (132 product + 41 blackbox-test) = +AZ-835 (Epic) + AZ-836 (C1) + AZ-837 (test-stack hardening, not this Epic) + AZ-838 (C2) added 2026-05-22→2026-05-23 prior to that update; +AZ-839 (C3) + AZ-840 (C4) + AZ-841 (C5) + AZ-842 (C6) added in that update. AZ-777 stays in the table (now closed in Jira; spec at `done/AZ-777_derkachi_c6_reference_fixture.md` retains 8pt credit for Phases 1+2 shipped). Earlier counts: 165 (124 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; AZ-589 + AZ-590 closed Won't Fix (kept in table as 0pt audit-trail rows); AZ-591 = 5pt cross-cutting compose_root bootstrap (todo/); AZ-592 = 5pt OKVIS2 Tier-2 placeholder (backlog/); AZ-593 = 5pt VINS-Mono Tier-2 placeholder (backlog/); AZ-618 = 0pt umbrella (split into AZ-619..AZ-624 on 2026-05-19); AZ-619..AZ-624 = 6 subtasks of AZ-618 covering Phase A..F of the airborne `pre_constructed` assembly, summing to 16pt actionable work; AZ-687 = 2pt replay-mode guard follow-up surfaced by AZ-618 Tier-2 run on 2026-05-19
**Total Complexity Points**: 563 (430 product + 133 blackbox-test) — 2026-05-23 refactor-run bump: +2pt AZ-845 + 2pt AZ-846 + 2pt AZ-847 = +6 product pts on top of prior reconciled total (AZ-844 epic itself is 0pt umbrella). Prior 2026-05-23 reconciled total: 557 (424 product + 133 blackbox-test) — +5pt AZ-839 + 3pt AZ-840 + 1pt AZ-841 + 2pt AZ-842 = +11 product pts on top of prior reconciled total. AZ-836 (3pt) + AZ-838 (3pt) were added 2026-05-22→2026-05-23 prior to that update; AZ-837 (test-stack hardening, not this Epic) is unaccounted in that delta and should be folded in at the next preamble reconciliation. Earlier baseline: 546 (413 product + 133 blackbox-test) — +3pt AZ-776 + 8pt AZ-777 (5→8 override 2026-05-21 cycle-3 batch 104; see `_docs/_process_leftovers/2026-05-21_az777_complexity_override.md` for rationale + the spec refresh that pulled e2e-runner wiring + C11 contract adapt + Derkachi catalog seed + fixture replacement + un-xfail into one ticket) — AZ-523 = 3pt, AZ-524 = 2pt, AZ-526 = 2pt, AZ-527 = 2pt, AZ-528 = 3pt, AZ-558 = 3pt, AZ-589 + AZ-590 retained at 5pt each but closed Won't Fix (treated as 0 effective pts going forward), AZ-591 = 5pt, AZ-592 = 5pt placeholder, AZ-593 = 5pt placeholder, AZ-618 = 0pt umbrella post-split, AZ-619 = 2pt, AZ-620 = 3pt, AZ-621 = 3pt, AZ-622 = 3pt, AZ-623 = 3pt, AZ-624 = 2pt, AZ-687 = 2pt
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 |
| AZ-589 | Remediate AZ-332 (CLOSED Won't Fix — wrong abstraction + wrong OKVIS API; replaced by AZ-591+AZ-592) | 5 | AZ-332, AZ-276, AZ-277 | AZ-254 |
| AZ-590 | Remediate AZ-333 (CLOSED Won't Fix — wrong abstraction + missing upstream; replaced by AZ-591+AZ-593) | 5 | AZ-333, AZ-276, AZ-277 | AZ-254 |
| AZ-591 | compose_root per-binary bootstrap — populate `_STRATEGY_REGISTRY` for airborne binary | 5 | AZ-270, AZ-331, AZ-339, AZ-345, AZ-352, AZ-355, AZ-368, AZ-380 | AZ-246 |
| AZ-592 | AZ-332 Tier-2 validation — OKVIS2 ThreadedSlam wiring + CI build env + Jetson (backlog) | 5 | AZ-332, AZ-276, AZ-277, AZ-591 | AZ-254 |
| AZ-593 | AZ-333 Tier-2 validation — de-ROSified VINS-Mono upstream + binding + CI + Jetson (backlog) | 5 | AZ-333, AZ-276, AZ-277, AZ-591, AZ-592 | AZ-254 |
| AZ-618 | Airborne bootstrap pre_constructed (UMBRELLA — split into AZ-619..AZ-624) | 0 | AZ-619, AZ-620, AZ-621, AZ-622, AZ-623, AZ-624 | AZ-602 |
| AZ-619 | AZ-618 Phase A: build_pre_constructed seeds c13_fdr + clock | 2 | AZ-591, AZ-270, AZ-273, AZ-398 | AZ-602 |
| AZ-620 | AZ-618 Phase B: build_pre_constructed seeds c6_descriptor_index + c6_tile_store | 3 | AZ-619, AZ-303, AZ-306 | AZ-602 |
| AZ-621 | AZ-618 Phase C: build_pre_constructed seeds c7_inference engine | 3 | AZ-619, AZ-620, AZ-297, AZ-320 | AZ-602 |
| AZ-622 | AZ-618 Phase D: build_pre_constructed seeds c3_lightglue_runtime + c3_feature_extractor | 3 | AZ-619, AZ-620, AZ-621, AZ-278 | AZ-602 |
| AZ-623 | AZ-618 Phase E: build_pre_constructed seeds c282_ransac_filter + c5 helpers | 3 | AZ-619, AZ-282, AZ-276, AZ-277, AZ-279, AZ-381 | AZ-602 |
| AZ-624 | AZ-618 Phase F: wire build_pre_constructed into main() + AC-1..AC-5 (incl. Jetson tier-2) | 2 | AZ-619, AZ-620, AZ-621, AZ-622, AZ-623 | AZ-602 |
| AZ-687 | build_pre_constructed must guard c6_descriptor_index when config.mode == 'replay' | 2 | AZ-619, AZ-620, AZ-624 | AZ-602 |
| AZ-697 | T1: Direct binary-tlog GPS-truth extractor | 3 | None | AZ-696 |
| AZ-698 | T2: Tlog trim + mid-flight alignment for replay | 5 | AZ-697 | AZ-696 |
| AZ-699 | T3: Real-flight validation runner + accuracy report | 3 | AZ-697 | AZ-696 |
| AZ-700 | T4: Replay map visualization (estimated vs ground-truth tracks) | 3 | AZ-699 | AZ-696 |
| AZ-701 | T5: HTTP Replay API service (POST tlog+video, return GPS fixes + map) | 5 | AZ-699, AZ-700 | AZ-696 |
| AZ-702 | T6: Topotek KHP20S30 camera calibration (factory-sheet approximation) | 1 | None | AZ-696 |
| AZ-776 | Open-loop ESKF composition profile (c4_pose.enabled flag) | 3 | None | AZ-602 |
| AZ-777 | Derkachi e2e: wire EXISTING parent-suite satellite-provider into operator pre-flight fixture | 8 (override) | AZ-776 | AZ-602 |
| AZ-835 | E2E real-flight validation Epic: raw (tlog, video) → route-driven SP seeding → verdict | Epic (~17 child SP) | AZ-777 Phase 1 (reused); AZ-405; AZ-699; AZ-696; AZ-702 | (umbrella) |
| AZ-836 | C1: TlogRouteExtractor — active-segment trim + DP coarsen tlog GPS to ≤N waypoints | 3 | AZ-697, AZ-279 | AZ-835 |
| AZ-838 | C2: SatelliteProviderRouteClient + seed_route.py CLI — POST RouteSpec to SP, poll mapsReady | 3 | AZ-836; AZ-777 Phase 1; AZ-809 (soft) | AZ-835 |
| AZ-839 | C3: operator_pre_flight_setup real fixture — wire C1+C2+C11+C10, supersedes AZ-777 Phase 3 | 5 | AZ-836; AZ-838; AZ-777 Phase 1 (done); AZ-322; AZ-316; AZ-306 | AZ-835 |
| AZ-840 | C4: E2E orchestrator test — raw (tlog, video, calibration) drives steps 1-7 end-to-end | 3 | AZ-839; AZ-836; AZ-838; AZ-699; AZ-405; AZ-702; AZ-696 | AZ-835 |
| AZ-841 | C5: Un-xfail AZ-777 AC-4 + AC-5 Tier-2 tests once C3 + C4 land | 1 | AZ-839; AZ-840 | AZ-835 |
| AZ-842 | C6: Docs — replay_protocol.md Invariant 12 + architecture.md + orchestrator-test README | 2 | AZ-841 (soft) | AZ-835 |
| AZ-845 | Refactor C01: Relocate RouteSpec DTO to _types/route.py (AZ-507 rule 9 fix) | 2 | None | AZ-844 |
| AZ-846 | Refactor C02: Refresh module-layout.md cycle-3 entries (c11 + replay_input + _types/route) | 2 | AZ-845 | AZ-844 |
| AZ-847 | Refactor C03: Widen test_az270_compose_root lint to enforce full rule-9 allow-list | 2 | AZ-845 | AZ-844 |
## 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 Tooling`
`C12 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.