Files
gps-denied-onboard/_docs/02_tasks/_dependencies_table.md
T
Oleksandr Bezdieniezhnykh 880eabcb3f Decompose Step 6 snapshot: 140 task specs + contract docs
Closes out greenfield Step 6 (Decompose) for all 14 components
(C1-C13 + cross-cutting helpers/replay). Covers tasks AZ-266..AZ-446
plus the _dependencies_table.md and component contract documents.

State file updated to greenfield Step 7 (Implement), not_started.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 00:39:48 +03:00

268 lines
39 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-10 (refreshed after E-BBT decomposition)
**Total Tasks**: 140 (99 product + 41 blackbox-test)
**Total Complexity Points**: 472 (339 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 140 tasks. The 13 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-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-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 initialization from FC EKF | 3 | AZ-406, AZ-407 | 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 |
## 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.
- **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).
## 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)
- 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
- 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
140 nodes — no cycles. The 13 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.
The graph is therefore a strict DAG once these documented forward
edges are accounted for, and remains sortable by tracker ID modulo
those edges.