Task Dependencies
Dependency Graph
Step 6 — Implement Tests (AZ-285..AZ-290)
| Task |
Depends On |
Points |
Status |
| AZ-285 Test Infrastructure |
— |
3 |
Done |
| AZ-286 TileService Tests |
AZ-285 |
3 |
Done |
| AZ-287 RegionService Tests |
AZ-285 |
3 |
Done |
| AZ-288 RouteService Tests |
AZ-285 |
3 |
Done |
| AZ-289 Integration Route Maps |
AZ-285 |
2 |
Done |
| AZ-290 Non-Functional Tests |
AZ-285 |
3 |
Done |
Step 8 — Refactor 02-coupling-refactoring (AZ-309 epic)
| Task |
Depends On |
Points |
Status |
| AZ-310 ServeTile via ITileService |
— |
3 |
Done (In Testing) |
| AZ-311 GetTileByLatLon via ITileService |
AZ-310 |
2 |
Done (In Testing) |
| AZ-312 Split Services into 3 csprojs |
AZ-311 |
5 |
Done (In Testing) |
| AZ-313 Update consumers (Api/Tests) |
AZ-312 |
3 |
Done (In Testing) |
| AZ-314 DI registration split |
AZ-313 |
2 |
Done (In Testing) |
| AZ-315 Documentation sync |
AZ-314 |
2 |
In Progress |
Step 8 — Refactor 03-code-quality-refactoring (AZ-350 epic)
Roadmap: _docs/04_refactoring/03-code-quality-refactoring/analysis/refactoring_roadmap.md (4 execution phases).
| Task |
C-ID |
Title |
Phase |
Depends On |
Points |
Status |
| AZ-351 |
C01 |
Fix null logger to DatabaseMigrator |
1 |
— |
2 |
Done (In Testing) |
| AZ-352 |
C02 |
Replace empty catch in ExtractTileCoordinatesFromFilename |
1 |
— |
2 |
Done (In Testing) |
| AZ-363 |
C10 |
Delete write-only counters in RegionRequestQueue |
1 |
— |
1 |
Done (In Testing) |
| AZ-356 |
C05 |
Stub endpoints return 501 |
1 |
— |
2 |
Done (In Testing) |
| AZ-354 |
C04 |
Strict CORS by default |
1 |
— |
2 |
Done (In Testing) |
| AZ-353 |
C03 |
Sanitize 5xx responses via IExceptionHandler |
1 |
— |
3 |
Done (In Testing) |
| AZ-359 |
C07 |
Consolidate RegionService catch ladder |
2 |
— |
3 |
Done (In Testing) |
| AZ-357 |
C06 |
Drop tile Version concept; new migration |
2 |
— |
5 |
Done (In Testing) |
| AZ-362 |
C09 |
Idempotent POST contract |
2 |
AZ-353 |
3 |
Done (In Testing) |
| AZ-366 |
C13 |
Consolidate Haversine + filename parser |
3 |
— |
2 |
Done (In Testing) |
| AZ-377 |
C24 |
Consolidate Earth constants + 111000 |
3 |
AZ-371 |
2 |
Done (In Testing) |
| AZ-368 |
C15 |
Shared TileCsvWriter |
3 |
— |
2 |
Done (In Testing) |
| AZ-367 |
C14 |
Shared TileGridStitcher |
3 |
AZ-364 |
3 |
Done (In Testing) |
| AZ-369 |
C16 |
Move inline DTOs out of Program.cs |
3 |
— |
2 |
Done (In Testing) |
| AZ-365 |
C12 |
Decompose RouteService.CreateRouteAsync |
3 |
— |
5 |
Done (In Testing) |
| AZ-364 |
C11 |
Decompose RouteProcessingService god-class |
3 |
AZ-366, AZ-367 (folds in AZ-360) |
5 |
Done (In Testing) |
| AZ-360 |
C08 |
Replace IServiceProvider in RouteProcessingService |
3 |
AZ-364 (folded) |
2 |
Done (In Testing) |
| AZ-371 |
C18 |
Magic numbers → ProcessingConfig/MapConfig |
4 |
— |
3 |
Done (In Testing) |
| AZ-370 |
C17 |
Status / point-type enums + AC RT2 update |
4 |
— |
3 |
Done (In Testing) |
| AZ-373 |
C20 |
Clarify / drop MapsVersion |
4 |
AZ-357 |
2 |
Done (In Testing) |
| AZ-374 |
C21 |
Typed HttpClient for Google Maps |
4 |
— |
2 |
Done (In Testing) |
| AZ-375 |
C22 |
O(N) existing-tile lookup (HashSet) |
4 |
AZ-371 |
2 |
Done (In Testing) |
| AZ-376 |
C23 |
Delete unused FindExistingTileAsync |
4 |
— |
1 |
Done (In Testing) |
| AZ-378 |
C25 |
Repo _logger fields: delete or use |
4 |
— |
1 |
Done (In Testing) |
| AZ-379 |
C26 |
Extract repo SELECT column-list constants |
4 |
— |
2 |
Done (In Testing) |
| AZ-380 |
C27 |
Delete CalculatePolygonDiagonalDistance |
4 |
— |
1 |
Done (In Testing) |
| AZ-372 |
C19 |
dotnet format + NetAnalyzers + Coverlet |
4 |
— |
3 |
Done (In Testing) |
Step 9 cycle 1 — New Task: Multi-source tile storage + UAV upload (AZ-483 epic)
| Task |
Title |
Depends On |
Points |
Status |
| AZ-484 |
Multi-source tile storage schema (source + captured_at) |
— |
5 |
Done (deployed cycle 1) |
Step 9 cycle 2 — New Task: JWT validation baseline + UAV upload completion
| Task |
Title |
Depends On |
Points |
Status |
| AZ-487 |
JWT validation baseline (HS256, JWT_SECRET, all endpoints) |
— (consumes suite-level contract suite/_docs/10_auth.md) |
2 |
Done (In Testing) |
| AZ-488 |
UAV tile upload endpoint with batch + 5-rule quality gate |
AZ-487 (hard prereq), AZ-484 contract tile-storage.md v1.0.0 |
8 (over-cap, user-accepted) |
Done (In Testing) |
Step 9 cycle 3 — New Task: Cycle-2 follow-ups (test infra + security hardening + process)
Source: cycle-2 retrospective top-3 improvement actions + carried-forward security and process items (_docs/06_metrics/retro_2026-05-11_cycle2.md).
| Task |
Title |
Depends On |
Points |
Status |
| AZ-491 |
Consolidate JWT test-mint helpers |
— (logically follows AZ-487 which introduced both copies) |
3 |
To Do |
| AZ-492 |
Perf harness: PT-07 + PT-08 + JWT-attach in run-performance-tests.sh |
AZ-487 (hard — Bearer token); AZ-491 (soft — token-mint reuse) |
3 |
In Testing |
| AZ-493 |
Integration test DB-reset hook |
— |
2 |
To Do |
| AZ-494 |
JWT iss/aud validation (enable + configure) |
AZ-487 (extends AddSatelliteJwt); external: admin team confirms iss/aud values |
2 |
In Testing (Option B: plumbing implemented; prod iss/aud values gated by fail-fast startup) |
| AZ-495 |
Resolve doc-folder convention for WebApi component |
— |
1 |
To Do |
| AZ-496 |
Bump Microsoft.AspNetCore.OpenApi + JwtBearer to 8.0.25 |
— |
2 |
To Do |
Execution Order
Step 6
- AZ-285 (test infrastructure — all others depend on this)
- AZ-286, AZ-287, AZ-288 (unit tests — can run in parallel)
- AZ-289 (integration tests — depends on infra only)
- AZ-290 (non-functional tests — depends on infra only)
Step 8 (02-coupling-refactoring)
- AZ-310 → AZ-311 (Phase A: route tile endpoints through ITileService)
- AZ-312 → AZ-313 → AZ-314 (Phase B: physical split + consumer + DI rewire)
- AZ-315 (Phase C: docs sync, must be last)
Step 8 (03-code-quality-refactoring)
Phase 1 (Critical fixes): AZ-351 → AZ-352 → AZ-363 → AZ-356 → AZ-354 → AZ-353
Phase 2 (Correctness): AZ-359 → AZ-357 → AZ-362 (AZ-362 needs AZ-353)
Phase 3 (Structural cleanup): AZ-366 → AZ-377 → AZ-368 → AZ-367 → AZ-369 → AZ-365 → AZ-364 (folds AZ-360) — AZ-377 needs AZ-371
Phase 4 (Typing/config/tooling/polish): AZ-371 → AZ-370 → AZ-373 → AZ-374 → AZ-375 → AZ-376 → AZ-378 → AZ-379 → AZ-380 → AZ-372
Step 9 cycle 1 (Multi-source tile storage epic AZ-483)
- AZ-484 — Multi-source tile storage schema (foundational)
Step 9 cycle 2
- AZ-487 — JWT validation baseline (must merge first; AZ-488 hard-depends on it)
- AZ-488 — UAV tile upload endpoint + 5-rule quality gate (consumer of both AZ-484 contract and AZ-487 auth)
Step 9 cycle 3
Independent tracks — most tasks can run in parallel; the only ordering constraint is the AZ-491 → AZ-492 soft dependency for token-mint reuse.
- AZ-495 (1 SP) — doc-folder convention. Cheapest unblocker; lands first to stop the F1 recurrence.
- AZ-491 (3 SP) — consolidate JWT test-mint helpers. Pre-stages AZ-492 if implementer picks Option B.
- AZ-493 (2 SP) — integration test DB-reset hook. Independent.
- AZ-496 (2 SP) — bump AspNetCore 8.0.25. Independent.
- AZ-492 (3 SP) — perf harness. After AZ-491 if Option B; else any time.
- AZ-494 (2 SP) — JWT iss/aud validation. Gated on cross-team input; not blocked by other cycle-3 tasks.
Total Effort
Step 6: 6 tasks, 17 story points
Step 8 (02-coupling-refactoring): 6 tasks, 17 story points
Step 8 (03-code-quality-refactoring): 27 tasks, ~66 story points
Step 9 cycle 1: 1 task created (AZ-484, 5 pts)
Step 9 cycle 2: 2 tasks created (AZ-487 = 2 pts, AZ-488 = 8 pts over-cap user-accepted) — total 10 pts
Step 9 cycle 3: 6 tasks created (AZ-491 = 3 pts, AZ-492 = 3 pts, AZ-493 = 2 pts, AZ-494 = 2 pts, AZ-495 = 1 pt, AZ-496 = 2 pts) — total 13 pts
Coverage Verification
| Test Spec Category |
Covered By |
| blackbox-tests.md (BT-01..BT-12, BT-N01..BT-N05) |
AZ-286, AZ-287, AZ-288, AZ-289 |
| performance-tests.md (PT-01..PT-06) |
AZ-290 |
| resilience-tests.md (RS-01..RS-06) |
AZ-290 |
| security-tests.md (SEC-01..SEC-04) |
AZ-290 |
| resource-limit-tests.md (RL-01..RL-04) |
AZ-290 |
| traceability-matrix.md (100% AC coverage) |
All tasks combined |