Files
gps-denied-onboard/_docs/02_tasks/_dependencies_table.md
T
Oleksandr Bezdieniezhnykh 05fcacffa3 [AZ-943] [AZ-951] [AZ-952] Move OKVIS2 chain back to todo/ as next phase
Per user 2026-05-29 directive: "OKVIS2-related tasks needed to be
implemented after full e2e derkachi flight test would be finished
successfully. So maybe put it back to todo?"

Reasoning accepted. OKVIS2 chain is the planned NEXT phase after
the cycle-4 Derkachi demo lands, not a cycle-5+ deferral. The
2026-05-27 production-default pivot directive remains in force;
today's earlier "deferred to cycle-5+" framing was over-correction
after the AZ-943 spec-reality gap.

- AZ-943 stays HARD-BLOCKED on AZ-951 + AZ-952 (PAUSED preamble
  preserved). Cannot be worked on until both blockers land. Moving
  to todo/ signals "queued, next-after-blockers", not "actionable
  now".
- AZ-951 + AZ-952 are themselves NOT blocked. They ship the
  upstream patches that unblock AZ-943.

Implementation sequence (unchanged): finish cycle-4 demo (AZ-959
+ remaining CSV-replay path) → AZ-951 → AZ-952 → AZ-943 → AZ-944
→ AZ-945. Current implement-batch target stays AZ-959; this
commit is bookkeeping only, does not change what's next on deck.

Touches: 3 file moves (backlog/ → todo/), dep-table preamble
fourth bump narrative documenting the placement reversal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-29 12:34:32 +03:00

73 KiB
Raw Blame History

Dependencies Table

Date: 2026-05-29 (cycle-4 Step 10 Implement — OKVIS2 chain (AZ-943 + AZ-951 + AZ-952) moved backlog/ → todo/ per user 2026-05-29 directive: "I have a feeling that it needed to be implemented after full e2e derkachi flight test would be finished successfully. So maybe put it back to todo?" Reasoning accepted: OKVIS2 is the planned NEXT phase after the cycle-4 Derkachi demo lands, not a cycle-5+ deferral. The 2026-05-27 production-default pivot directive remains in force; today's earlier "deferred to cycle-5+" framing was over-correction after the AZ-943 spec-reality gap. AZ-943 keeps its PAUSED preamble (still HARD-BLOCKED on AZ-951 + AZ-952; cannot be worked on until both blockers land). AZ-951 + AZ-952 are themselves NOT blocked — they ship the upstream patches that unblock AZ-943. Implementation sequence remains: finish the cycle-4 demo (AZ-959 backend extension + the existing CSV-replay path) → AZ-951 (covariance + ADR) → AZ-952 (tracking-stats) → AZ-943 (binding wiring) → AZ-944 (CI BUILD_OKVIS2=ON) → AZ-945 (Jetson Tier-2 --vio-strategy okvis2). Current implement-batch target stays AZ-959. Earlier same-day — AZ-897 relocated to ../ui repo: original framing was wrong-shop. The Azaion suite already has a single React 19 SPA front-end at ../ui per ui/README.md; spinning up a second React toolchain in gps-denied-onboard would have been parallel-pipeline duplication forbidden by coderule.mdc. Per user 2026-05-29 directive, AZ-897 description + summary rewritten to UI-only scope in ../ui (adapted to take CSV + nadir-camera video uploads aligned with the AZ-894 CSV path); local AZ-897 spec deleted from gps-denied-onboard/_docs/02_tasks/todo/ and re-authored into ../ui/_docs/02_tasks/todo/AZ-897_replay_ui_web_form.md (no commit in ../ui — left for that repo's autodev next cycle). Backend dependency filed as AZ-959 (3pt, todo/, c1 replay_api extension to accept (video, csv) multipart + GET /static/example-csv endpoint; deps AZ-701 + AZ-894 + AZ-896; no epic) — extends the AZ-701 POST /replay to dispatch on --imu vs --tlog based on which upload field was present, with XOR validation. AZ-897 Jira linked is blocked by AZ-959. Cycle-4 in-repo effort: 5 SP (AZ-897) + 3 SP (AZ-959) = 2 SP net. Pivoting next implement batch to AZ-959. Earlier same-day — AZ-943 implementation attempt paused mid-batch on spec-reality gap: OKVIS2 v2 public API does NOT expose 6×6 pose covariance, feature counts, mean parallax, or MRE; the AZ-943 spec's "approach (a) in-binding subclass workaround" is structurally impossible because ThreadedSlam::estimator_ is private and ViSlamBackend has no public telemetry accessor. The spec-documented "approach (b) upstream patch" fallback filed as AZ-951 (3pt, backlog/, OKVIS2 v2 upstream patch: expose 6×6 pose covariance accessor + ADR for pin deviation; deps AZ-332 + AZ-592; epic AZ-254) + AZ-952 (3pt, backlog/, OKVIS2 v2 upstream patch: expose tracking-stats accessor — feature counts + parallax + MRE; deps AZ-332 + AZ-592 + AZ-951 SOFT; epic AZ-254). Both linked Jira-side as is blocked by against AZ-943; AZ-943 transitioned In Progress → To Do with full audit comment. AZ-943 moved todo/ → backlog/ with PAUSED preamble preserving original AC list for audit. Per user 2026-05-29 confirmation, cycle-4 Derkachi demo target stays KLT/RANSAC (per tests/e2e/replay/conftest.py line 159 c1_vio: strategy: klt_ransac); OKVIS2 chain (AZ-943 → AZ-944 → AZ-945 + AZ-951/952 blockers) deferred to cycle-5+ alongside AZ-945's Tier-2 --vio-strategy okvis2 Jetson variant. Pivot to AZ-897 (replay UI web form). Earlier this session: OKVIS2 production-default pivot per user 2026-05-27 directive: AZ-592 placeholder split into 3 properly-sized sub-tickets per PBI rule, all three filed Jira-side then; local-spec import for AZ-943 happens this session before implement batch starts. AZ-943 (5pt, NOW backlog/ with PAUSED preamble, c1_vio, OKVIS2 binding wiring; replaces AZ-332 skeleton; deps AZ-332 + AZ-592 + AZ-951 + AZ-952 (blockers); epic AZ-254). Sibling tickets remain Jira-only this session: AZ-944 (3pt, Linux CI build env + DBoW2 small_voc + Tier-1 EuRoC smoke; Blocks chain AZ-943→AZ-944) and AZ-945 (3pt, Jetson L4T + Tier-2 Derkachi --vio-strategy okvis2 e2e; Blocks chain AZ-944→AZ-945). Local specs for AZ-944 + AZ-945 will be authored when their Implement turns come up. Earlier 2026-05-26 (cycle-4 Step 10 Implement — AZ-895 batch 3 user complexity decision: chose Option A "minimum deprecation" path. Filed AZ-908 (3pt, backlog/, replay: hard removal of deprecated auto-sync surface — AZ-895 follow-up; deps AZ-895 HARD + AZ-842 HARD; no epic) to track the cycle-5+ physical removal that AZ-895's minimum-path explicitly defers. AZ-895 ships the no-op stubs + CLI deprecation warnings; AZ-908 will delete the stub files, drop the DTOs from replay_input/interface.py, remove the deprecated CLI flags, and drop the auto_sync config block. No SP change to cycle-4 totals (AZ-908 is cycle-5+ backlog, not cycle-4 active scope). Earlier same-day at Step 9 New Task — scope adjustments: (a) AZ-841 (1pt, un-xfail AZ-777 Tier-2 tests) moved from todo/ to backlog/ due to hard conflict with AZ-895 AC-4 (test_derkachi_real_tlog.py stays @xfail in cycle 4 because AZ-848 is backlogged) + partial overlap with AZ-894 AC-3 (CSV-path adapter covers the test_derkachi_1min.py un-xfail target); Jira comment added to AZ-841 documenting the deferral. (b) AZ-842 (2pt → 3pt, +1 SP rescope) — dropped AZ-841 soft dependency, expanded replay_protocol.md scope to add new Invariant 13 covering single-canonical-clock model + cycle-4 CSV-driven replay narrative (AZ-894 + AZ-895 + AZ-896), plus architecture.md replay-input section updates. New deps: AZ-894 HARD + AZ-895 HARD + AZ-896 SOFT. (c) +AZ-899 (1pt, product, todo/, land architecture_compliance_baseline.md — cycle-3 retro Top-3 #3 third try; deps None; no epic). (d) +AZ-900 (1pt, product, todo/, autodev cycle-N+1 Step-9 retro-existence gate — cycle-3 retro Top-3 #2 + 2026-05-26 LESSONS process entry; deps None; no epic). (e) +AZ-901 (1pt, product, todo/, fix EVIDENCE_OUT default path in e2e/runner/conftest.py:56 — closes 2026-05-26 leftover; deps None; no epic). Cycle-4 active scope: 6 product tickets in todo/ totaling 17 SP = AZ-842 (3, docs) + AZ-894 (3, CSV adapter) + AZ-895 (2, auto-sync deprecation) + AZ-896 (1, format docs) + AZ-897 (5, replay UI) + AZ-899 (1) + AZ-900 (1) + AZ-901 (1). Dependency order: AZ-894 blocks AZ-895 + AZ-842 + AZ-897; AZ-896 blocks AZ-897 + AZ-842. AZ-899/AZ-900/AZ-901 standalone (no internal blockers). AZ-848 (5) + AZ-883 (2) + AZ-908 (3) remain in backlog/ (cycle-3 retro Top-3 #1 + AZ-895 follow-up deferred to cycle-5+; CSV-bypass strategy supersedes their fixes for the demo path). Earlier 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 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: 184 (143 product + 41 blackbox-test) — 2026-05-29 cycle-4 Step 10 third bump (AZ-897 relocation + AZ-959 filing): +AZ-959 (1 product task, todo/, 3pt). AZ-897 was never in this table's row count (pre-existing gap — the cycle-4 AZ-89x specs land in todo/ but were not back-filled into the table rows; not fixing that here, out of scope). Prior same-day 2026-05-29 second bump (AZ-943 paused, dependency PBIs filed): 183 (142 product + 41 blackbox-test) — +AZ-951 + AZ-952 (2 product tasks, both backlog/, 3pt each). AZ-943 (5pt) moved todo/ → backlog/ (no count change). Prior same-day 2026-05-29 bump (OKVIS2 binding session start): 181 (140 product + 41 blackbox-test) → 182 (141 product) — +AZ-943 (1 product task, originally todo/, 5pt). AZ-944 + AZ-945 remain Jira-only at the time of this update (sibling tickets, local specs deferred to their own Implement turns); their Total-Tasks impact will be reconciled when their specs land. Prior 2026-05-26 cycle-4 Step 10 bump (AZ-895 batch 3 follow-up): 180 (139 product + 41 blackbox-test) — +AZ-908 (1 product task, backlog/, 3pt). Prior 2026-05-26 cycle-4 Step 9 bump: +AZ-899 + AZ-900 + AZ-901 (3 product tasks). AZ-841 moved todo/ → backlog/ (no count change; backlog tickets are still in the table). Prior 2026-05-23 refactor-run bump: 176 (135 product + 41 blackbox-test) — +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: 584 (451 product + 133 blackbox-test) — 2026-05-29 cycle-4 Step 10 third bump (AZ-897 relocation + AZ-959 filing): +3pt AZ-959. AZ-897 (5pt) was never table-counted here, so no decrement at this layer; the in-repo cycle-4 effort still drops by 5pt at the active-scope layer (AZ-897 work is now executed in ../ui). Prior same-day 2026-05-29 second bump (AZ-943 paused, dependency PBIs filed): 581 (448 product + 133 blackbox-test) — +3pt AZ-951 + 3pt AZ-952 = +6 product pts. AZ-943 stays counted at 5pt (moved todo/ → backlog/, not deleted). Prior same-day 2026-05-29 bump (OKVIS2 binding session start): 580 (447 product + 133 blackbox-test) — +5pt AZ-943. AZ-944 (3pt) + AZ-945 (3pt) sibling tickets are filed Jira-side but not yet imported as local specs; their +6pt will land when AZ-944 / AZ-945 specs are authored. Prior 2026-05-26 cycle-4 Step 10 bump (AZ-895 batch 3 follow-up): 570 (437 product + 133 blackbox-test) — +3pt AZ-908. Prior 2026-05-26 cycle-4 Step 9 bump: +1pt AZ-899 + 1pt AZ-900 + 1pt AZ-901 + 1pt AZ-842 rescope (2→3) = +4 product pts. Prior 2026-05-23 refactor-run bump: 563 (430 product + 133 blackbox-test) — +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 (BACKLOGGED 2026-05-26 — AZ-895 AC-4 conflict) 1 AZ-839; AZ-840 AZ-835
AZ-842 C6: Docs — replay_protocol.md Invariants 12+13 + architecture.md + orchestrator-test README 3 AZ-894; AZ-895; AZ-896 (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
AZ-899 Land architecture_compliance_baseline.md (cycle-3 retro #3, 3rd try) 1 None (none)
AZ-900 Autodev: gate cycle-N+1 Step-9 entry on previous-cycle retro existence 1 None (none)
AZ-901 Fix EVIDENCE_OUT default path in e2e/runner/conftest.py:56 1 None (none)
AZ-908 Replay: hard removal of deprecated auto-sync surface (AZ-895 follow-up; cycle-5+ backlog) 3 AZ-895; AZ-842 (none)
AZ-943 OKVIS2 binding: real ThreadedSlam wiring (AZ-592 split 1/3) — PAUSED, blocked on AZ-951+AZ-952 5 AZ-332; AZ-592; AZ-951 (blocker); AZ-952 (blocker) AZ-254
AZ-951 OKVIS2 v2 upstream patch: expose 6×6 pose covariance accessor (+ ADR for pin deviation) 3 AZ-332; AZ-592 AZ-254
AZ-952 OKVIS2 v2 upstream patch: expose tracking-stats accessor (counts + parallax + MRE) 3 AZ-332; AZ-592; AZ-951 (SOFT) AZ-254
AZ-959 replay_api: extend POST /replay to accept (video, csv) multipart for AZ-897 UI 3 AZ-701; AZ-894; AZ-896 (none)

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.