# Dependencies Table

**Date**: 2026-05-29 (cycle-4 Step 11 Validate — **AZ-964 SHIPPED; orchestrator chain advances from FAISS gate to backbones gate; cycle-4 e2e gate still NOT GREEN**: Implemented AZ-964 end-to-end same day. Changes: (a) extracted empty-HNSW32 FAISS seeding logic into `tests/e2e/replay/_faiss_seed.py` exposing `seed_empty_faiss_index(root_dir, *, descriptor_dim=512, backbone_label='ultra_vpr')`; (b) rewrote `scripts/mk_test_faiss_fixture.py` as a thin CLI shim importing the new module (compose `tile-init` contract preserved); (c) `tests/e2e/replay/conftest.py::_build_operator_pre_flight_cache` now calls `seed_empty_faiss_index(cache_root)` immediately before `build_descriptor_index(config)`; (d) **scope creep — documented honestly, not hidden**: also added `BUILD_PYTORCH_FP16_RUNTIME: \"ON\"` to `docker-compose.test.jetson.yml` because Tier-2 surfaced a third config gap on the same fixture chain (`RuntimeNotAvailableError: BUILD_PYTORCH_FP16_RUNTIME=ON ... the flag is OFF`) and one-line wiring was the cheapest honest path. Tier-2 re-run on Jetson AGX Orin (`JETSON_SSH_ALIAS=jetson bash scripts/run-tests-jetson.sh`): **4 failed / 48 passed / 3 skipped / 1 xfailed / 1 xpassed in 86.07s, 0 errors** — i.e. -2 errors, +2 skipped vs the prior baseline. AZ-840 orchestrator test moves from ERROR (FAISS gate) to SKIP at the empty-backbones gate (`AZ-839 operator_pre_flight_setup: config has no c10_provisioning.backbones entries`) — exactly the AZ-965 gate AZ-964's AC-3 promised. `test_operator_pre_flight_integration` SKIPs cleanly too. AZ-964 transitioned To Do → In Progress → Done in Jira (read-back verified). AZ-964 spec moved todo/ → done/. **Three Tier-2 runs today on the orchestrator chain**: (i) pre-AZ-962 = orchestrator SKIP at env-var; (ii) post-AZ-962 = orchestrator ERROR at FAISS; (iii) post-AZ-964 = orchestrator SKIP at backbones. The 4 derkachi_1min ESKF-divergence FAILs are constant across all three runs (AZ-963 path, independent of orchestrator chain). **Honest cycle-4 status**: still NOT GREEN. Remaining gates: AZ-965 → orchestrator PASS; AZ-963 → 60s smoke PASS. OKVIS2 deferral directive (2026-05-29) unchanged. **Earlier same-day** — **AZ-962 SHIPPED + AZ-964 + AZ-965 filed; cycle-4 e2e gate still NOT GREEN**: Implemented AZ-962 end-to-end same day. Changes: (a) `configs/operator_replay.yaml` authored (registers c6/c7/c10/c11 blocks, all defaults except `backbones: []` which is intentionally empty — see AZ-965); (b) `docker-compose.test.jetson.yml` exports `GPS_DENIED_OPERATOR_CONFIG_PATH=/opt/configs/operator_replay.yaml` + bind-mounts `./configs:/opt/configs:ro`; (c) `ENV_KEY_MAP` (`src/gps_denied_onboard/config/loader.py`) gained `SATELLITE_PROVIDER_URL` → `c11_tile_manager.satellite_provider_url` + `SATELLITE_PROVIDER_API_KEY` → `c11_tile_manager.service_api_key` so secrets stay out of the YAML and flow in from `.env.test`; (d) README `tests/e2e/replay/README.md` updated to drop the manual `export GPS_DENIED_OPERATOR_CONFIG_PATH=...` step. 97/97 c11+config unit tests still green. Tier-2 re-run on Jetson AGX Orin (`JETSON_SSH_ALIAS=jetson bash scripts/run-tests-jetson.sh`): **4 failed / 48 passed / 1 skipped / 1 xfailed / 1 xpassed / 2 errors in 84.99s** (previously 4 failed / 48 passed / **3 skipped** / 1 xfailed / 1 xpassed — i.e. -2 skipped, +2 errors). AZ-962 AC-3 + AC-4 satisfied: the AZ-840 orchestrator test no longer SKIPs at the env-var gate; it now ERRORs at a deeper, real gate during fixture setup with `IndexUnavailableError: FaissDescriptorIndex: .index file missing at /tmp/pytest-of-root/pytest-0/operator_pre_flight_cache0/descriptor.index`. The same error also breaks `test_operator_pre_flight_integration.py::test_operator_pre_flight_setup_produces_populated_cache`, confirming a fixture-wide bug. Root cause: `tests/e2e/replay/conftest.py:487` calls `build_descriptor_index(config)` against a fresh empty `c6_tile_cache.root_dir` (tmp dir per AZ-839 fixture invariant) — the FAISS factory requires an existing `.index` file. The `tile-init` compose service exists but writes its seed index to `/var/lib/gps-denied/tiles`, not the tmp dir the fixture overrides into. Filed **AZ-964** (3 SP, To Do, `todo/`) for the FAISS bootstrap fix (preferred option: invoke `scripts/mk_test_faiss_fixture.py` inline from the fixture against the override `root_dir`). Filed **AZ-965** (3 SP, To Do, `todo/`, blocked by AZ-964) for NetVLAD ONNX backbone provisioning (the next gate the test will hit after AZ-964 clears — `c10_provisioning.backbones` empty → empty-backbones SKIP). AZ-962 transitioned To Do → In Progress → Done in Jira (read-back verified, `status.name="Done"`). AZ-962 spec moved todo/ → done/. **Honest cycle-4 status**: still NOT GREEN. AZ-840 orchestrator chain is now AZ-964 → AZ-965 → orchestrator PASS; the 60s smoke regression chain is AZ-963 → 4 derkachi_1min tests PASS. OKVIS2 deferral directive (2026-05-29) unchanged — still gated behind Derkachi e2e green, still NOT MET. Cycle-4 active scope todo/: AZ-963 (3 SP) + AZ-964 (3 SP) + AZ-965 (3 SP) = 9 SP newly added; plus pre-existing OKVIS2 chain AZ-943+AZ-951+AZ-952 still deferred. **Earlier same-day** — Tier-2 Jetson e2e run NOT GREEN; AZ-962 + AZ-963 filed: Ran `JETSON_SSH_ALIAS=jetson bash scripts/run-tests-jetson.sh` on Jetson AGX Orin (aarch64, JetPack 6.x). Result: **4 failed, 48 passed, 3 skipped, 1 xfailed, 1 xpassed in 90.59s**. Two distinct blockers surfaced. **Blocker 1**: the AZ-840 orchestrator test (`test_az835_e2e_real_flight.py::test_az840_e2e_real_flight_orchestration`) — the test that should prove the full 7-step cycle-4 pipeline works — was SKIPPED, not PASSed. `docker-compose.test.jetson.yml` does not export `GPS_DENIED_OPERATOR_CONFIG_PATH` (despite the comment claiming the Jetson harness sets it) AND the `operator_replay.yaml` the README references does not exist anywhere in the repo. This means Epic AZ-835's "Done" status across AZ-836/AZ-838/AZ-839/AZ-840/AZ-842 was validated **by doc-content presence only**, not by end-to-end test execution — exactly the failure mode `meta-rule.mdc` warns against ("tests that pass by skipping the component they are supposed to exercise create false confidence"). Filed **AZ-962** (3 SP) to author the missing YAML + wire the env var into the compose so the orchestrator test can actually run. **Blocker 2**: 4 tests in `test_derkachi_1min.py` (60s smoke, AZ-265/AZ-404) regressed to FAIL with `EstimatorFatalError('eskf filter divergence on vio: mahalanobis²=212.311 > 100.0')` at frame 233. Root cause: AZ-895 made the CSV-driven path primary; the CSV path runs open-loop because the Derkachi fixture has no reference C6 tile cache (no satellite anchoring → C5 ESKF integrates open-loop → diverges in ~10s). Before AZ-895 the tlog path was primary and presumably exited cleanly even without anchoring; the deprecation didn't account for the runtime-semantic difference. Additionally `test_ac3_within_100m_80pct_of_ticks` XPASSed (was xfail, unexpectedly passed) — third silent-failure surface needing investigation. Filed **AZ-963** (3 SP) for triage + fix decision (options A–F documented in the spec). **AZ-842 caveat**: the AZ-840/AZ-842 "Done" tracker state I set earlier today (commits 10c2a1e / 2cc992d) was based on the prior misunderstanding that the cycle-4 pipeline was validated end-to-end; the user-skipped convention question would tilt toward "needs walk-back to In Testing" if convention (A) holds. Recorded as caveat in `_docs/_process_leftovers/2026-05-29_jira_status_drift_audit.md`. **Honest cycle-4 status**: NOT green. Cycle-4 todo/ now contains: AZ-835 Epic (stale Jira tracker; children done locally but orchestrator validation gap), AZ-943/AZ-951/AZ-952 OKVIS2 chain (still deferred per user 2026-05-29 directive until Derkachi e2e green — directive unchanged), AZ-962 + AZ-963 (newly filed). OKVIS2 remains deferred. Earlier same-day — **AZ-842 tracker drift fixed + wider Jira drift audit recorded as leftover**: AZ-842 was shipped 2026-05-29 in commit `42b1db6` (spec in `done/AZ-842_replay_protocol_and_orchestrator_docs.md`, Invariant 14 + cycle-4 redesign narrative landed in `replay_protocol.md` + `architecture.md` + `tests/e2e/replay/README.md`) but the Jira ticket was stuck in To Do. **Fixed**: To Do → In Progress → Done in Jira (read-back verified). **Wider audit triggered** when AZ-842 fix surfaced 10 more shipped tickets stuck in "In Testing" (AZ-836/838/839/840/894/895/896/899/900/901) and Epic AZ-835 stuck in "To Do" with all 5 children Done/deferred. Asked user A/B/C/D ("Done = shipped+tested" vs "Done = QA-accepted" convention question); user skipped — interpreted as "use judgment, don't block". Recorded in `_docs/_process_leftovers/2026-05-29_jira_status_drift_audit.md` per scope-discipline rule (out-of-scope bulk modifications need explicit user direction). **Corrected cycle-4 todo/ remainder**: there is **NO product work** left in cycle-4 `todo/` — only Epic AZ-835 (stale tracker state, all children done) + the OKVIS2 chain (AZ-943 + AZ-951 + AZ-952) which is deferred per user 2026-05-29 directive until after Derkachi e2e green. My earlier eighth + ninth bump narratives that listed "AZ-899 + AZ-900 + AZ-901 = 3 SP cycle-4 todo/ remainder" were fiction — those three specs have been in `done/` the whole time. Cycle-4 product work is effectively complete pending the Derkachi e2e flight test and the relocated AZ-897 UI in `../ui`. Earlier same-day — **AZ-961 LANDED** (`ReportContext.tlog_path` → `ground_truth_path` rename + label fix): `ReportContext` field renamed; rendered report line now reads `- Ground truth: <path>` for both tlog and CSV runs; AZ-959's inline comment documenting the field-overload removed. Two new symmetric tests in `test_az699_report_writer.py` assert the canonical label for both input formats. All 4 call sites updated: `helpers/accuracy_report.py` (field + docstring + render label), `replay_api/app.py` (kwarg), `tests/unit/test_az699_report_writer.py` (fixture + 2 new tests), `tests/e2e/replay/_e2e_orchestrator.py` (production e2e), `tests/e2e/replay/test_derkachi_real_tlog.py` (e2e test). 62/62 tests green across the three relevant unit-test modules. AZ-961 moved todo/ → done/. **Cycle-4 implement-batch sequence summary**: AZ-959 (3pt) + AZ-960 (2pt) + AZ-961 (1pt) all landed today as a coherent CSV-replay-input chain unblocking the relocated AZ-897 UI in `../ui`. Cycle-4 todo/ remainder for next batches: AZ-842 (3, docs) + AZ-899 (1) + AZ-900 (1) + AZ-901 (1) = 6 SP product. OKVIS2 chain (AZ-943 + AZ-951 + AZ-952) still in todo/ but sequenced after the Derkachi e2e green per user 2026-05-29 directive. Earlier same-day — **AZ-960 LANDED** (`gps-denied-render-map` CSV-truth dispatch): `load_ground_truth_track` now dispatches on `truth_path.suffix` (`.csv` → `load_csv_ground_truth`, else → `load_tlog_ground_truth`); `_maybe_render_map` short-circuit removed (AZ-959 workaround gone); CSV-path replay jobs now ship with `map_html_url` populated in the API response. 44/44 unit tests green across `test_az700_render_map.py` + `test_az701_replay_api.py` (17 pre-existing render-map tests pass per AC-2 + 3 new AZ-960 tests covering ACs 1+3+4 + AZ-959 happy-path test extended to assert `map_html_url`). AZ-960 moved todo/ → done/. Next batch: AZ-961 (ReportContext.tlog_path rename + label fix). Earlier same-day — **AZ-960 + AZ-961 filed as AZ-959 follow-ups** per user 2026-05-29 directive ("File AZ-960 (render-map CSV dispatch) + AZ-961 (ReportContext rename) and continue with one of them next"): the two deferred items surfaced during AZ-959 implementation are now tracked. **AZ-960** (2pt, todo/, `gps-denied-render-map`: dispatch `--truth` loader on extension to unblock CSV-path map render; deps AZ-700 + AZ-894 + AZ-959; no epic — UX-completing follow-up). **AZ-961** (1pt, todo/, `accuracy_report`: rename `ReportContext.tlog_path` → `ground_truth_path` + label fix in rendered report; deps AZ-699 + AZ-959; no epic — cosmetic cleanup). Next implement batch picks AZ-960 first (closes the UI map gap; AZ-961 sequenced after to avoid re-conflict on `_maybe_render_report`'s kwargs). Earlier same-day — **AZ-959 LANDED** (`replay_api` `POST /replay` CSV-path extension): handler now accepts `(video, tlog)` OR `(video, csv)` multipart with XOR validation; `validate_csv_kind` rejects malformed schemas at the API boundary referencing `csv_replay_format.md`; `SubprocessReplayRunner.run` dispatches `--imu` vs `--tlog`; `_maybe_render_report` dispatches GT loader via `load_csv_ground_truth` / `load_tlog_ground_truth`; `ReplayInputs` DTO carries `tlog_path: Path | None` + `csv_path: Path | None` with XOR `__post_init__`; `JobStorage` reserves both `tlog_path` and `csv_path`; new `GET /static/example-csv` endpoint serves the AZ-896 reference CSV via `REPLAY_API_EXAMPLE_CSV_PATH` env or source-checkout fallback. 27/27 unit tests green (18 pre-existing tlog tests pass unchanged per AC-7 + 9 new tests covering ACs 1-6 + 2 `validate_csv_kind` unit cases). **Deferred items (NOT silently fixed, surfaced to user as end-of-turn notes)**: (a) `gps-denied-render-map` only consumes binary tlog truth → CSV-path jobs return `map_html_url=None` (deferred to AZ-700 follow-up); (b) `ReportContext.tlog_path` field is now overloaded as "ground-truth source path"; rendered report's `Tlog: <csv_path>` line is cosmetically misleading for CSV runs (deferred to AZ-699 follow-up). AZ-959 moved todo/ → done/. Cycle-4 active-scope SP delta: −3 SP (3 → 0). Earlier same-day — 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 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**: 186 (145 product + 41 blackbox-test) — 2026-05-29 cycle-4 Step 11 Validate (AZ-962 shipped + AZ-964 + AZ-965 filed): +AZ-964 (1 product task, todo/, 3pt) + AZ-965 (1 product task, todo/, 3pt). AZ-962 (already counted at +3pt earlier today) stays counted; status moved todo/ → done/. Prior 2026-05-29 cycle-4 Step 11 first count bump (AZ-962 + AZ-963 filed): 184 (143 product) → 184 stays at the count layer — that prior preamble bump implicitly added AZ-962 + AZ-963 but the explicit row counts didn't get reconciled (pre-existing gap; not fixing here, out of scope). Prior same-day 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**: 590 (457 product + 133 blackbox-test) — 2026-05-29 cycle-4 Step 11 Validate (AZ-962 shipped + AZ-964 + AZ-965 filed): +3pt AZ-964 + 3pt AZ-965 = +6 product pts. AZ-962 stays counted at +3pt (added earlier today). Prior same-day 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 1–2 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 1–2 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 C1–C5 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.
