mirror of
https://github.com/azaion/gps-denied-onboard.git
synced 2026-06-22 16:21:12 +00:00
docs: add Phase 1 ADRs and update PROJECT.md with completed decisions
ADR 0002: hexagonal/ports-and-adapters architecture — components/ layout, protocol.py per component, composition root, core/ for concentrated math. ADR 0003: @dataclass(slots=True, frozen=True) on hot path; Pydantic retained only at REST/config/DB boundaries. Pose/GPSPoint migration deferred to Phase 2. ADR 0004: Stage 2 as independent iteration — own phases 1-6, own requirements, stage1 code treated as MVP starting capital. PROJECT.md: Stage 2 Key Decisions updated from Pending → Accepted with Phase 1 implementation notes, deferred work list, and final architecture summary. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+142
-123
@@ -1,157 +1,176 @@
|
||||
# Requirements: GPS-Denied Onboard Navigation System
|
||||
# Requirements: GPS-Denied Onboard Navigation System — Stage 2
|
||||
|
||||
**Defined:** 2026-04-01
|
||||
**Defined:** 2026-05-10
|
||||
**Stage:** 2 (independent iteration)
|
||||
**Branch:** `stage2` (HEAD = stage1; v1.0 archived)
|
||||
**Core Value:** The flight controller must receive valid MAVLink GPS_INPUT at 5-10Hz with position accuracy ≤50m for 80% of frames — without this, the UAV cannot navigate in GPS-denied airspace.
|
||||
|
||||
## v1 Requirements
|
||||
---
|
||||
|
||||
Requirements for this milestone. The scaffold (~2800 lines) exists; all algorithmic kernels are missing or mocked. Every requirement below maps to one phase of implementation work.
|
||||
## Stage 2 Requirements
|
||||
|
||||
### ESKF — Error-State Kalman Filter
|
||||
Stage 2 is a self-contained iteration. Phases are numbered 1–6 within this stage. Stage 1 work (its 36 v1 requirements + 7 phases) is archived in `.planning/archive/v1.0/` as starting capital, not as active backlog.
|
||||
|
||||
- [ ] **ESKF-01**: 15-state ESKF implemented (δp, δv, δθ, δb_a, δb_g) with IMU prediction step (F, Q matrices, bias propagation)
|
||||
- [ ] **ESKF-02**: VO measurement update implemented (relative pose ΔR/Δt from cuVSLAM, H_vo, R_vo covariance, Kalman gain)
|
||||
- [ ] **ESKF-03**: Satellite measurement update implemented (absolute WGS84 position from matching, H_sat, R_sat from RANSAC inlier ratio)
|
||||
- [ ] **ESKF-04**: ESKF state initializes from GLOBAL_POSITION_INT at startup and on mid-flight reboot with high-uncertainty covariance
|
||||
- [ ] **ESKF-05**: Confidence tier computation outputs HIGH/MEDIUM/LOW based on covariance magnitude and last satellite correction age
|
||||
- [ ] **ESKF-06**: Coordinate transform chain implemented: pixel→camera ray (K matrix), camera→body (T_cam_body), body→NED (ESKF quaternion), NED→WGS84 — replacing all FAKE Math stubs
|
||||
The stage 1 codebase (ESKF + cuVSLAM + GPR + MAVLink + pipeline + 195 passing tests) is treated as MVP — refactoring is allowed and expected. Concept-level ideas from the parallel `try02` branch are re-implemented (not merged).
|
||||
|
||||
### VO — Visual Odometry
|
||||
### ARCH — Hexagonal architecture & composition
|
||||
|
||||
- [ ] **VO-01**: cuVSLAM wrapper implemented for Jetson target (Inertial mode, camera + IMU inputs, relative pose output with metric scale)
|
||||
- [ ] **VO-02**: OpenCV ORB stub conforms to the same `ISequentialVisualOdometry` interface as cuVSLAM wrapper, used on dev/CI (x86)
|
||||
- [ ] **VO-03**: TensorRT FP16 inference engine loader implemented for SuperPoint and LightGlue on Jetson; MockInferenceEngine used on dev/CI
|
||||
- [ ] **VO-04**: Scale ambiguity resolved — `scale_ambiguous` is False when ESKF provides metric scale reference; VO relative pose is metric in NED
|
||||
- [ ] **VO-05**: ImageInputPipeline batch validation minimum lowered to 1 image (not 10); `get_image_by_sequence` uses exact filename matching
|
||||
- [ ] **ARCH-01**: Codebase reorganized to `src/gps_denied/components/{vio, satellite_matcher, gpr, anchor_verifier, safety_state, flight_recorder, mavlink_io, coordinate_transforms}/`, each containing `protocol.py` + concrete implementations + (where applicable) `native/` for backend bridges
|
||||
- [ ] **ARCH-02**: Hot-path data types (`FrameState`, `IMUSample`, `PositionEstimate`, `VOEstimate`, `SatelliteAnchor`) implemented as `@dataclass(slots=True, frozen=True)` in `src/gps_denied/hot_types/`; Pydantic retained only for REST/config/DB boundary schemas
|
||||
- [ ] **ARCH-03**: Explicit DI composition root `src/gps_denied/pipeline/composition.py` exposes `build_pipeline(env: Literal["jetson", "x86_dev", "ci", "sitl"]) -> Pipeline` that wires environment-specific implementations
|
||||
- [ ] **ARCH-04**: `core/` retained for concentrated math (ESKF, factor graph, RANSAC, coordinate transforms) — these stay as pure-function single files, NOT split into `interfaces.py + types.py + impl.py`
|
||||
- [ ] **ARCH-05**: All component Protocols defined with `typing.Protocol`; concrete adapters implement them; `Pipeline` constructor takes Protocol-typed dependencies (no concrete imports inside pipeline orchestration)
|
||||
- [ ] **ARCH-06**: Per-environment YAML configuration in `config/{jetson,x86_dev,ci,sitl}.yaml`, loaded via `pydantic-settings` into a typed `RuntimeConfig` model passed to `build_pipeline`
|
||||
- [ ] **ARCH-07**: All 195 stage1 tests + 8 SITL skipped continue to pass after refactor; no regression in accuracy benchmarks
|
||||
|
||||
### SAT — Satellite Matching
|
||||
### AC — Formal acceptance criteria document
|
||||
|
||||
- [ ] **SAT-01**: XFeat TRT FP16 inference engine implemented for satellite feature matching on Jetson; MockInferenceEngine used on dev/CI
|
||||
- [ ] **SAT-02**: Satellite tile selection uses ESKF position ± 3σ_horizontal to define search area; tiles assembled into mosaic at matcher resolution
|
||||
- [ ] **SAT-03**: GSD normalization implemented — camera frame downsampled to match satellite GSD (0.3–0.6 m/px) before matching
|
||||
- [ ] **SAT-04**: RANSAC homography estimation produces WGS84 absolute position with confidence score from inlier ratio
|
||||
- [ ] **SAT-05**: SatelliteDataManager reads from pre-loaded GeoHash-indexed local directory (read-only, no live HTTP fetches during flight)
|
||||
- [ ] **AC-01**: `_docs/00_problem/acceptance_criteria.md` rewritten with formal AC-1.x…AC-NEW-x list adapted from `try02` and validated against this project's actual constraints
|
||||
- [ ] **AC-02**: Each AC entry includes (a) numeric thresholds, (b) validation method, (c) at least one test ID linking to `tests/`
|
||||
- [ ] **AC-03**: Position accuracy AC (50m@80%, 20m@50%, anchor age tracking, drift bounds) bound to `tests/integration/accuracy/` and `tests/e2e/`
|
||||
- [ ] **AC-04**: Failure-mode AC (visual blackout, spoofing promotion, dead reckoning, ≥3 disconnected segments) bound to `tests/blackbox/failure_modes/`
|
||||
- [ ] **AC-05**: Real-time performance AC (<400ms p95 e2e, <8GB RAM, ≥5Hz GPS_INPUT output) bound to a benchmark harness producing CI-tracked metrics
|
||||
- [ ] **AC-06**: Traceability matrix `.planning/AC-TRACEABILITY.md` generated linking every AC ID → test ID(s) → implementing component(s)
|
||||
|
||||
### GPR — Global Place Recognition
|
||||
### SAFE — Safety anchor state machine
|
||||
|
||||
- [ ] **GPR-01**: Real Faiss index loaded at runtime from file path (not synthetic random vectors); index built from DINOv2 descriptors of actual satellite tiles during offline pre-processing
|
||||
- [ ] **GPR-02**: DINOv2/AnyLoc TRT FP16 inference engine implemented on Jetson; MockInferenceEngine used on dev/CI
|
||||
- [ ] **GPR-03**: GPR candidate retrieval returns real tile matches ranked by descriptor similarity, used for re-localization after tracking loss
|
||||
- [ ] **SAFE-01**: `components/safety_state/SafetyAnchorStateMachine` owns authoritative `source_label ∈ {satellite_anchored, vo_extrapolated, dead_reckoned}` for every emitted `PositionEstimate`
|
||||
- [ ] **SAFE-02**: Covariance growth is monotonic in non-anchored modes; resets only on accepted satellite anchor
|
||||
- [ ] **SAFE-03**: `anchor_age_ms` recorded on every estimate; transitions to `vo_extrapolated` after configurable max-age threshold
|
||||
- [ ] **SAFE-04**: State machine receives anchor decisions from `AnchorVerifier`, never raw VPR top-K — bad candidates cannot poison the state
|
||||
- [ ] **SAFE-05**: Tile write eligibility flag exposed (`can_persist_tile: bool`) — false in `dead_reckoned` mode to prevent corrupt tile cache writes
|
||||
- [ ] **SAFE-06**: Unit tests cover all 9 state transitions; property-based test asserts covariance never decreases without an accepted anchor
|
||||
|
||||
### MAV — MAVLink Output
|
||||
### VERIFY — Geometry-gated anchor verification
|
||||
|
||||
- [ ] **MAV-01**: pymavlink added to dependencies; MAVLink output component implemented sending GPS_INPUT over UART at 5-10Hz
|
||||
- [ ] **MAV-02**: ESKF state and covariance mapped to GPS_INPUT fields (lat/lon/alt from position, velocity from v-state, accuracy from covariance diagonal, fix_type from confidence tier, synthesized hdop/vdop, GPS time from system clock)
|
||||
- [ ] **MAV-03**: IMU input path implemented — MAVLink listener receives ATTITUDE/RAW_IMU from flight controller at 5-10Hz and feeds ESKF prediction step
|
||||
- [ ] **MAV-04**: Consecutive-failure counter detects 3 frames without any position estimate; sends MAVLink NAMED_VALUE_FLOAT re-localization request to ground station operator
|
||||
- [ ] **MAV-05**: Telemetry output at 1Hz sends confidence score and drift estimate to ground station via MAVLink NAMED_VALUE_FLOAT
|
||||
- [ ] **VERIFY-01**: `components/anchor_verifier/GeometryGatedAnchorVerifier` accepts/rejects satellite candidate matches based on configurable gates: min inliers, max mean reprojection error (px), max homography condition number
|
||||
- [ ] **VERIFY-02**: Rejection reason string emitted on every reject (`"too_few_inliers"`, `"mre_above_threshold"`, `"degenerate_homography"`, `"freshness_expired"`)
|
||||
- [ ] **VERIFY-03**: Freshness check integrates with sector classification (active-conflict <6mo, stable-rear <12mo) — expired tiles produce `freshness_expired` reject
|
||||
- [ ] **VERIFY-04**: Verifier benchmark mode evaluates multiple matcher profiles on the same frame for offline comparison
|
||||
- [ ] **VERIFY-05**: Unit tests cover each gate independently; integration test with real Azaion frame verifies end-to-end accept/reject
|
||||
|
||||
### PIPE — Pipeline Wiring
|
||||
### FDR — Flight data recorder
|
||||
|
||||
- [ ] **PIPE-01**: FlightProcessor.process_frame wired end-to-end: image in → cuVSLAM VO → ESKF VO update → (keyframe) satellite match → ESKF satellite update → GPS_INPUT output
|
||||
- [ ] **PIPE-02**: SatelliteDataManager and CoordinateTransformer instantiated and wired into processor pipeline (currently standalone, not connected)
|
||||
- [ ] **PIPE-03**: FactorGraph replaced or backed by real GTSAM ISAM2 incremental smoothing with BetweenFactorPose3 (VO) and GPSFactor (satellite anchors)
|
||||
- [ ] **PIPE-04**: FailureRecoveryCoordinator connected to ESKF — on tracking loss, ESKF continues IMU-only prediction with growing uncertainty; on recovery success, ESKF is reset with satellite position
|
||||
- [ ] **PIPE-05**: ImageRotationManager integrated into process_frame — heading sweep on first frame; `calculate_precise_angle` implemented with real VO-based refinement
|
||||
- [ ] **PIPE-06**: Object GPS localization endpoint (POST /objects/locate) uses full pixel→ray→ground→WGS84 chain with ESKF attitude; hardcoded stub removed
|
||||
- [ ] **PIPE-07**: Confidence scoring and fix_type mapping wired end-to-end: ESKF confidence tier → GPS_INPUT fix_type (3/2/0), accuracy fields
|
||||
- [ ] **PIPE-08**: ImageRotationManager constructor signature fixed (accepts optional ModelManager); startup TypeError resolved
|
||||
- [ ] **FDR-01**: `components/flight_recorder/FlightRecorder` Protocol with `append_event(event)` and `export() -> FdrExportResult`
|
||||
- [ ] **FDR-02**: `InMemoryFlightRecorder` impl with bounded segments and configurable segment+storage byte limits
|
||||
- [ ] **FDR-03**: `DiskFlightRecorder` impl writing append-only JSONL segments under `data/fdr/{flight_id}/segment-NNNN.jsonl`
|
||||
- [ ] **FDR-04**: Health states `ok / degraded (≥90% storage) / critical (limit reached)` exposed via `health` property
|
||||
- [ ] **FDR-05**: Pipeline emits FDR events at every state transition, anchor decision, MAVLink send, and pipeline error
|
||||
- [ ] **FDR-06**: AC-NEW-3 forensic-thumbnail rate (≤0.1Hz on tile-generation failures) wired through FDR with size budget enforcement
|
||||
|
||||
### TEST — Test Harness and Validation
|
||||
### VPR — Conditional + multi-scale visual place recognition
|
||||
|
||||
- [ ] **TEST-01**: Docker SITL test harness implemented: ArduPilot SITL container, camera-replay service, satellite tile server mock, MAVLink capture
|
||||
- [ ] **TEST-02**: CI pipeline runs on x86 using OpenCV ORB stub and MockInferenceEngine; all unit tests pass
|
||||
- [ ] **TEST-03**: Accuracy validation test runs against 60-frame dataset (AD000001–AD000060.jpg) with coordinates.csv ground truth; reports 80%/50m and 60%/20m hit rates
|
||||
- [ ] **TEST-04**: Performance benchmark test validates <400ms end-to-end per frame on Jetson (or reports estimated latency breakdown on dev)
|
||||
- [ ] **TEST-05**: All 21 blackbox test scenarios (FT-P-01 to FT-P-14, FT-N-01 to FT-N-07) implemented as runnable pytest tests using SITL harness
|
||||
- [ ] **VPR-01**: VPR retrieval triggered conditionally — DINOv2 forward runs only on re-loc triggers (cold start, sharp turn AC-3.2, σ_xy > 50m, VO failure ≥2 frames, disconnected segment AC-3.3); steady-state uses geometric prior (IMU+VO predicted position) ranking by distance
|
||||
- [ ] **VPR-02**: VPR chunks decoupled from storage tiles — chunks sized to ground footprint (600-800m at deployment altitude band) with 40-50% overlap; any frame footprint falls fully inside ≥1 chunk
|
||||
- [ ] **VPR-03**: Multi-scale FAISS index — fine-scale (z=20-derived) + coarse-scale (z=17 or z=18) descriptor sets; coarse used in active-conflict sectors for change-robust retrieval
|
||||
- [ ] **VPR-04**: Dynamic top-K — K=5 in stable sectors with σ_xy ≤ 20m, K=20 in active-conflict, K=50 on expanding-window fallback
|
||||
- [ ] **VPR-05**: Chunking and indexing integrated into existing `chunk_manager.py`/`gpr.py` without breaking stage1 GPR API contracts
|
||||
|
||||
## v2 Requirements
|
||||
### MAVOUT — MAVLink output: source labels, dual-channel scaffold
|
||||
|
||||
Deferred to future release. Tracked but not in current roadmap.
|
||||
- [ ] **MAVOUT-01**: Every emitted `GPS_INPUT` includes `source_label`, `anchor_age_ms`, `covariance_semimajor_m` propagated from `PositionEstimate` (mapped into `horiz_accuracy` and a custom STATUSTEXT for label/age)
|
||||
- [ ] **MAVOUT-02**: `ODOMETRY` emitter scaffolded behind feature flag (`config.mavlink.odometry_enabled`); flag is false in stage 2; integration test asserts ODOMETRY is intentionally absent on the wire
|
||||
- [ ] **MAVOUT-03**: Spoofing-promotion latency monitor — listens to `GPS_RAW_INT`/`EKF_STATUS_REPORT`/`SYS_STATUS`; promotes own estimate to FC primary within <3s when real-GPS health rolling avg < threshold; emits `STATUSTEXT` on every promotion/demotion
|
||||
- [ ] **MAVOUT-04**: Visual blackout handling — pipeline switches to `dead_reckoned` within ≤1 processed frame OR ≤400ms when camera produces no usable signal; emits `VISUAL_BLACKOUT_IMU_ONLY` STATUSTEXT @ 1-2Hz
|
||||
|
||||
### Security
|
||||
### FIXTURE — Real-flight integration fixture (Azaion 10.05.2026)
|
||||
|
||||
- **SEC-01**: JWT bearer token authentication on all API endpoints
|
||||
- **SEC-02**: TLS 1.3 on all HTTPS connections
|
||||
- **SEC-03**: Satellite tile manifest SHA-256 integrity verification
|
||||
- **SEC-04**: Mahalanobis distance outlier rejection in ESKF measurement updates
|
||||
- **SEC-05**: CORS origins locked down (remove wildcard default)
|
||||
- [ ] **FIXTURE-01**: `tests/integration/azaion_flight/` integration test suite consuming `Data/Azaion/10.05.2026/` (tlog + cropped EO video + MAVLink CSV)
|
||||
- [ ] **FIXTURE-02**: Preprocessing script `scripts/prep_azaion_fixture.py` producing — (a) HUD-stripped EO frames at 0.7 fps, (b) IMU/GPS/ATTITUDE CSV from tlog, (c) timestamp-aligned manifest
|
||||
- [ ] **FIXTURE-03**: MAVLink replay test — feed tlog through `MAVLinkBridge` parser, assert all `GLOBAL_POSITION_INT`/`RAW_IMU`/`ATTITUDE` messages decoded without error
|
||||
- [ ] **FIXTURE-04**: ESKF real-IMU smoke test — replay IMU samples through `ESKFCore.predict`, assert no NaN/Inf, bounded covariance growth
|
||||
- [ ] **FIXTURE-05**: VO smoke test on cropped EO frames using ORB-SLAM3 backend — assert ≥30% frame registration success
|
||||
- [ ] **FIXTURE-06**: GPS-denial simulation — mask `GPS_RAW_INT` for t∈[180s, 280s], replay rest of stream, assert pipeline switches to `vo_extrapolated` and back to `satellite_anchored` correctly
|
||||
- [ ] **FIXTURE-07**: Azaion fixture documented in `_docs/00_problem/fixtures.md` with ground-truth references and known limitations (low altitude, multirotor dynamics, HUD overlay)
|
||||
|
||||
### Operational
|
||||
### TEST — Test taxonomy & infrastructure
|
||||
|
||||
- **OPS-01**: Uvicorn `reload` flag defaults to False in production config
|
||||
- **OPS-02**: Structured logging with configurable log levels per module
|
||||
- **OPS-03**: Pre-flight health check validates TRT engines loaded, tiles present, IMU receiving
|
||||
- **OPS-04**: ResultManager.publish_waypoint_update implemented for waypoint SSE emission
|
||||
- [ ] **TEST-01**: `tests/` reorganized to `tests/{unit,integration,blackbox,sitl,e2e}/`; existing tests redistributed by category
|
||||
- [ ] **TEST-02**: `pyproject.toml` test markers updated — `pytest -m unit` / `-m integration` / etc.; CI runs unit+integration on every push, blackbox on PR, sitl+e2e nightly
|
||||
- [ ] **TEST-03**: AC traceability auto-generated — pytest plugin tags each test with `@pytest.mark.ac("AC-1.1")`; `scripts/gen_ac_traceability.py` produces the matrix in `.planning/AC-TRACEABILITY.md`
|
||||
|
||||
### Performance
|
||||
### OBS — Observability & tooling
|
||||
|
||||
- **PERF-01**: Dual CUDA stream execution (Stream A: VO, Stream B: satellite matching) for pipeline parallelism
|
||||
- **PERF-02**: Satellite tile RAM preload (±2km corridor) at startup for sub-millisecond tile access
|
||||
- [ ] **OBS-01**: Structured JSON logging via `structlog` with `correlation_id` (frame_id) propagated through pipeline; Pydantic logging schemas at boundaries
|
||||
- [ ] **OBS-02**: CLI tool `gps_denied` (typer-based) with subcommands — `replay --tlog ... --video ...`, `benchmark --scenario ...`, `bench-ac AC-1.1` for AC-driven benchmark runs
|
||||
- [ ] **OBS-03**: Per-environment Docker images split — `Dockerfile.x86_dev` for CI/dev, `Dockerfile.jetson` (multi-stage with TRT engine prebuild step) for hardware
|
||||
|
||||
## Out of Scope
|
||||
---
|
||||
|
||||
Explicitly excluded. Documented to prevent scope creep.
|
||||
## Stage 3 candidates (parking lot)
|
||||
|
||||
| Feature | Reason |
|
||||
|---------|--------|
|
||||
| TRT engine building tooling | Engines are pre-built offline via trtexec; system only loads them |
|
||||
| Google Maps tile download tooling | Tiles pre-cached before flight; no live internet during flight |
|
||||
| Full ArduPilot hardware validation on Jetson | Post-v1; Jetson hardware testing is not in scope for this milestone |
|
||||
| Mobile/web ground station UI | SSE stream consumed by external systems; UI is out of scope |
|
||||
| Multi-UAV coordination | Single UAV instance only |
|
||||
| GTSAM ARM64 source build tooling | GTSAM on Jetson requires source compilation; CI uses mock; Jetson build is ops concern |
|
||||
| tech_stack.md synchronization | Documented inconsistency (3fps vs 0.7fps, etc.); separate documentation task |
|
||||
- Mid-flight tile generation + write-back to Azaion Satellite Service (AC-8.4)
|
||||
- On-device hardware validation on Jetson Orin Nano Super
|
||||
- Dual-channel MAVLink ODOMETRY enabled (depends on ArduPilot fixes for EKF3 source switching)
|
||||
- AC-NEW-1 cold-boot time-to-first-fix bench (<30s, 50× cold reboot)
|
||||
- BASALT VIO backend evaluation (only if cuVSLAM hits a blocker)
|
||||
|
||||
## Out of Scope (Stage 2)
|
||||
|
||||
- Migration to PostgreSQL (SQLite remains embedded default; Postgres optional for ground station only)
|
||||
- Folder-per-component layout for `core/` math files (ESKF/factor graph stay concentrated)
|
||||
- Real microservices with separate processes / IPC
|
||||
- Pydantic on per-frame hot path (dataclasses replace it)
|
||||
- Mobile/web ground station UI
|
||||
- Multi-UAV coordination
|
||||
|
||||
## Traceability
|
||||
|
||||
Which phases cover which requirements. Populated from ROADMAP.md phase assignments.
|
||||
Populated by roadmapper on 2026-05-10. Test IDs will be filled in by `/gsd:plan-phase` and `/gsd:implement` as each phase produces concrete tests.
|
||||
|
||||
| Requirement | Phase | Status |
|
||||
|-------------|-------|--------|
|
||||
| ESKF-01 | Phase 1 | Pending |
|
||||
| ESKF-02 | Phase 1 | Pending |
|
||||
| ESKF-03 | Phase 1 | Pending |
|
||||
| ESKF-04 | Phase 1 | Pending |
|
||||
| ESKF-05 | Phase 1 | Pending |
|
||||
| ESKF-06 | Phase 1 | Pending |
|
||||
| VO-01 | Phase 2 | Pending |
|
||||
| VO-02 | Phase 2 | Pending |
|
||||
| VO-03 | Phase 2 | Pending |
|
||||
| VO-04 | Phase 2 | Pending |
|
||||
| VO-05 | Phase 2 | Pending |
|
||||
| SAT-01 | Phase 3 | Pending |
|
||||
| SAT-02 | Phase 3 | Pending |
|
||||
| SAT-03 | Phase 3 | Pending |
|
||||
| SAT-04 | Phase 3 | Pending |
|
||||
| SAT-05 | Phase 3 | Pending |
|
||||
| GPR-01 | Phase 3 | Pending |
|
||||
| GPR-02 | Phase 3 | Pending |
|
||||
| GPR-03 | Phase 3 | Pending |
|
||||
| MAV-01 | Phase 4 | Pending |
|
||||
| MAV-02 | Phase 4 | Pending |
|
||||
| MAV-03 | Phase 4 | Pending |
|
||||
| MAV-04 | Phase 4 | Pending |
|
||||
| MAV-05 | Phase 4 | Pending |
|
||||
| PIPE-01 | Phase 5 | Pending |
|
||||
| PIPE-02 | Phase 5 | Pending |
|
||||
| PIPE-03 | Phase 5 | Pending |
|
||||
| PIPE-04 | Phase 5 | Pending |
|
||||
| PIPE-05 | Phase 5 | Pending |
|
||||
| PIPE-06 | Phase 5 | Pending |
|
||||
| PIPE-07 | Phase 5 | Pending |
|
||||
| PIPE-08 | Phase 5 | Pending |
|
||||
| TEST-01 | Phase 6 | Pending |
|
||||
| TEST-02 | Phase 6 | Pending |
|
||||
| TEST-03 | Phase 7 | Pending |
|
||||
| TEST-04 | Phase 7 | Pending |
|
||||
| TEST-05 | Phase 7 | Pending |
|
||||
| REQ | Phase | Tests |
|
||||
|-----|-------|-------|
|
||||
| ARCH-01 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-02 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-03 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-04 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-05 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-06 | Phase 1 | _pending plan-phase_ |
|
||||
| ARCH-07 | Phase 1 | _pending plan-phase_ |
|
||||
| AC-01 | Phase 2 | _pending plan-phase_ |
|
||||
| AC-02 | Phase 2 | _pending plan-phase_ |
|
||||
| AC-03 | Phase 2 | _pending plan-phase_ |
|
||||
| AC-04 | Phase 2 | _pending plan-phase_ |
|
||||
| AC-05 | Phase 2 | _pending plan-phase_ |
|
||||
| AC-06 | Phase 2 | _pending plan-phase_ |
|
||||
| TEST-01 | Phase 2 | _pending plan-phase_ |
|
||||
| TEST-02 | Phase 2 | _pending plan-phase_ |
|
||||
| TEST-03 | Phase 2 | _pending plan-phase_ |
|
||||
| OBS-01 | Phase 2 | _pending plan-phase_ |
|
||||
| SAFE-01 | Phase 3 | _pending plan-phase_ |
|
||||
| SAFE-02 | Phase 3 | _pending plan-phase_ |
|
||||
| SAFE-03 | Phase 3 | _pending plan-phase_ |
|
||||
| SAFE-04 | Phase 3 | _pending plan-phase_ |
|
||||
| SAFE-05 | Phase 3 | _pending plan-phase_ |
|
||||
| SAFE-06 | Phase 3 | _pending plan-phase_ |
|
||||
| VERIFY-01 | Phase 3 | _pending plan-phase_ |
|
||||
| VERIFY-02 | Phase 3 | _pending plan-phase_ |
|
||||
| VERIFY-03 | Phase 3 | _pending plan-phase_ |
|
||||
| VERIFY-04 | Phase 3 | _pending plan-phase_ |
|
||||
| VERIFY-05 | Phase 3 | _pending plan-phase_ |
|
||||
| VPR-01 | Phase 4 | _pending plan-phase_ |
|
||||
| VPR-02 | Phase 4 | _pending plan-phase_ |
|
||||
| VPR-03 | Phase 4 | _pending plan-phase_ |
|
||||
| VPR-04 | Phase 4 | _pending plan-phase_ |
|
||||
| VPR-05 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-01 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-02 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-03 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-04 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-05 | Phase 4 | _pending plan-phase_ |
|
||||
| FDR-06 | Phase 4 | _pending plan-phase_ |
|
||||
| MAVOUT-01 | Phase 5 | _pending plan-phase_ |
|
||||
| MAVOUT-02 | Phase 5 | _pending plan-phase_ |
|
||||
| MAVOUT-03 | Phase 5 | _pending plan-phase_ |
|
||||
| MAVOUT-04 | Phase 5 | _pending plan-phase_ |
|
||||
| FIXTURE-01 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-02 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-03 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-04 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-05 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-06 | Phase 6 | _pending plan-phase_ |
|
||||
| FIXTURE-07 | Phase 6 | _pending plan-phase_ |
|
||||
| OBS-02 | Phase 6 | _pending plan-phase_ |
|
||||
| OBS-03 | Phase 6 | _pending plan-phase_ |
|
||||
|
||||
**Coverage:**
|
||||
- v1 requirements: 36 total
|
||||
- Mapped to phases: 36
|
||||
- Unmapped: 0
|
||||
|
||||
---
|
||||
*Requirements defined: 2026-04-01*
|
||||
*Last updated: 2026-04-01 after initial definition*
|
||||
**Coverage:** 52/52 requirements mapped. No orphans, no duplicates.
|
||||
|
||||
Reference in New Issue
Block a user