Files
gps-denied-onboard/_docs/02_tasks/_dependencies_table.md
T
Oleksandr Bezdieniezhnykh 08e657d433 [AZ-507] [AZ-508] Onboard hygiene PBIs from batches 31-33 review
Open two ~2-point hygiene PBIs surfaced by
_docs/03_implementation/cumulative_review_batches_31-33_cycle1_report.md:

- AZ-507 (parent AZ-246 / E-CC-CONF) — align module-layout.md
  cross-component import rules with the AZ-270 lint test. Resolves the
  doc-vs-lint contradiction surfaced on AZ-321 by tightening the doc
  (option (a) from the review) + hoisting EngineBuildError /
  CalibrationCacheError to _types/inference_errors.py.

- AZ-508 (parent AZ-264 / E-CC-HELPERS) — consolidate 5 identical
  _iso_ts_now() one-liners across c6_tile_cache + c7_inference into a
  single Layer-1 helper at helpers/iso_timestamps.py.

Dependencies table headers bumped: 142 -> 144 tasks, 478 -> 482 points
(product 345 -> 349). State file's pause-point detail cleared; next
sub_step is the implement skill's Step 3 (compute next batch) for
batch 34.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-13 01:27:04 +03:00

308 lines
42 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dependencies Table
**Date**: 2026-05-13 (refreshed after AZ-507 + AZ-508 hygiene-PBI onboarding from cumulative review batches 31-33; previously 2026-05-11 for AZ-489 + AZ-490 ADR-010 operator-origin path)
**Total Tasks**: 144 (103 product + 41 blackbox-test)
**Total Complexity Points**: 482 (349 product + 133 blackbox-test)
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 | 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 | 5 | AZ-263, AZ-269, AZ-266, AZ-273, AZ-303, AZ-305, AZ-317, 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 Post-Landing Upload | 3 | AZ-326, AZ-319, AZ-272, AZ-263, AZ-269, AZ-266 | AZ-253 |
| AZ-330 | C12 OperatorReLocService | 3 | AZ-326, AZ-273, 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 Protocol + JsonlReplaySink impl | 3 | AZ-263, AZ-269, AZ-270, AZ-381, AZ-266, AZ-272 | AZ-265 |
| AZ-401 | compose_replay(config) -> ReplayRoot + Clock injection across C1C5 | 3 | AZ-398, AZ-399, AZ-400, AZ-269, AZ-270, AZ-263, AZ-266, AZ-272, AZ-390 | AZ-265 |
| AZ-402 | gps-denied-replay CLI entrypoint + argparse + camera-calibration loader | 3 | AZ-401, AZ-269, AZ-270, AZ-263, AZ-266, AZ-272, AZ-273 | AZ-265 |
| AZ-403 | gps-denied-replay-cli Dockerfile + GitHub Actions matrix entry + SBOM diff | 3 | AZ-402, AZ-398, AZ-399, AZ-400, AZ-401, AZ-263, AZ-269, AZ-266 | AZ-265 |
| AZ-404 | E2E replay fixture test — Derkachi 12 min clip + tlog | 5 | AZ-402, AZ-403, AZ-401, AZ-263, AZ-269, AZ-266, AZ-272, AZ-273 | AZ-265 |
| AZ-405 | Auto-sync of video ↔ tlog via IMU take-off detection | 5 | AZ-402, AZ-399, AZ-398, AZ-263, AZ-269, AZ-266, AZ-272 | 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 |
## 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_replay)** 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.
- **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).
- **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/317/318/319/320
- C12 Operator Tooling → AZ-326/327/328/329/330 + AZ-489 (FlightsApiClient)
- 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 + CLI + auto-sync → AZ-401/402/405
- **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.