Skip to main content

Traceability Matrix

Spec → code → verification, per acceptance criterion. Last verified: 2026-07-06 (v2 shell round).

Verification legend: ✅ automated test passing · ✅ live = exercised against real external systems this run · 👁 = verified by inspection (screenshot / interactive check), not automated.

FS-1 — Sentinel-2 FDI Ingestion (src/helio_ocean/ingest/sentinel2.py)

ACVerificationStatus
AC-1.1tests/test_fs1_sentinel2.py::test_ac_1_1 (network-marked)✅ live — 4 real L2A scenes found for the AOI windows
AC-1.2::test_ac_1_2_fdi_matches_formula
AC-1.3::test_ac_1_3_no_detections_on_land
AC-1.4::test_ac_1_4_observation_provenance
AC-1.5::test_ac_1_5_adapter_registry_consumed_downstream

Live pipeline result: 160 detections from scenes S2B_11SLT_20240113/20240123 (pre) and S2B_11SMT_20240212, S2B_11SLT_20240212 (post), pulled from the public earth-search STAC API with no credentials.

FS-2 — NOAA MDMAP (src/helio_ocean/ingest/noaa_mdmap.py)

ACVerificationStatus
AC-2.1tests/test_fs2_mdmap.py::test_ac_2_1
AC-2.2::test_ac_2_2_no_silent_count_loss
AC-2.3::test_ac_2_3_malformed_rows_rejected_with_reasons

Provenance: fixture (MDMAP bulk export requires an account). A real export dropped at data/raw/noaa_mdmap_export.csv is used automatically.

FS-3 — Debris Tracker (src/helio_ocean/ingest/debris_tracker.py)

ACVerificationStatus
AC-3.1tests/test_fs3_debris_tracker.py::test_ac_3_1
AC-3.2::test_ac_3_2_free_text_extraction
AC-3.3::test_ac_3_3_ambiguous_notes_flagged_not_guessed

Provenance: fixture (bulk export requires a data request). Real export drops at data/raw/debris_tracker_export.csv.

FS-4 — Normalization Core (src/helio_ocean/normalize/, src/helio_ocean/db.py)

ACVerificationStatus
AC-4.1tests/test_fs4_normalize.py::test_ac_4_1
AC-4.2::test_ac_4_2_idempotent_reruns✅ (also observed on repeated live runs: 188 observations, stable)
AC-4.3::test_ac_4_3_raw_provenance_intact
AC-4.4::test_ac_4_4_query_filters_exact

FS-5 — Zone Classification (src/helio_ocean/intel/zones.py)

ACVerificationStatus
AC-5.1tests/test_fs5_zones.py::test_ac_5_1
AC-5.2::test_ac_5_2_suspected_and_reported
AC-5.3::test_ac_5_3_valid_geojson
AC-5.4::test_ac_5_4_window_scoped

Live result: pre-storm 35 zones (13 confirmed / 22 suspected); post-storm 10 zones (3 confirmed / 6 suspected / 1 reported).

FS-6 — Map App (src/helio_ocean/api/main.py, web/)

ACVerificationStatus
AC-6.1tests/test_fs6_api.py (2 tests) + rendered map screenshots in docs/assets/✅ + 👁
AC-6.2Interactive check (Playwright, 2026-07-06): toggle switched readout 18/20/10 → 142/8/35 without reload👁 verified live
AC-6.3Superseded by the v2 detail panel (AC-6.6): clicks open a right panel with full metrics instead of popups👁 verified live
AC-6.4::test_ac_6_4_provenance_report + LIVE/FIXTURE stamps in the Data panel (screenshot)✅ + 👁
AC-6.5Interactive check (Playwright): Chart↔Satellite tile swap without reload; screenshot screenshot-satellite-detail.png👁 verified live
AC-6.6::test_ac_6_6_observations_carry_full_metrics + live click on Junipero Beach survey → 282 items itemized + Google satellite/Street View links✅ + 👁 verified live
AC-6.7::test_ac_6_7_zones_carry_sites_and_centroid

FS-7 — NL Query (src/helio_ocean/intel/query.py, llm.py)

ACVerificationStatus
AC-7.1tests/test_fs7_query.py::test_ac_7_1
AC-7.2::test_ac_7_2_offline_mode_labeled + live Bedrock query (2026-07-06): mode bedrock, tools compare_windows + zone_summary executed by Claude Opus 4.8✅ + ✅ live
AC-7.3::test_ac_7_3_insufficient_data_not_fabricated
AC-7.4::test_ac_7_4_which_beach_names_top_site + live Bedrock run: "Junipero Beach had the most reported debris after the storm, with 282 items…"✅ + ✅ live
AC-7.5Interactive check (Playwright): thinking indicator with elapsed seconds visible during query; input re-enabled after answer; screenshot screenshot-chat-live.png👁 verified live

FS-8 — Briefing (src/helio_ocean/intel/briefing.py)

ACVerificationStatus
AC-8.1tests/test_fs8_briefing.py::test_ac_8_1
AC-8.2::test_ac_8_2_provenance_section
AC-8.3::test_ac_8_3_briefing_renders_to_pdf — produced docs/pdf/helio-ocean-briefing-post-storm.pdf from the live DB

PRD Success Criteria

SCStatementStatus
SC-1Real Sentinel-2 scenes pulled + FDI-scored live✅ 160 detections, 4 real scenes, no credentials
SC-2Two ground sources normalized with provenance✅ 28 observations — via labeled fixtures (both sources gate bulk exports)
SC-3Map distinguishes confirmed/suspected zones across windows✅ verified live
SC-4NL question answered from normalized data✅ live via Bedrock (and labeled offline fallback)
SC-5Generated post-storm briefing✅ markdown + PDF
SC-6Traceability matrix complete✅ this document

v2 round notes (2026-07-06)

  • Chat root cause: queries returned 200 all along; 20–60 s Bedrock latency behind a static "querying…" label read as broken. Fixed with an animated progress indicator + elapsed timer (AC-7.5), effort: low on the Bedrock call, and the site_breakdown tool so answers name real beaches (AC-7.4).
  • PDF graphics: the PRD architecture diagram was broken in the first-round PDF — blank lines inside the mermaid fence ended pandoc's raw-HTML block and the diagram tail rendered as a syntax-error graphic. pdfgen now strips blank lines at embed time; all diagrams verified via Playwright parse checks + page images.
  • Docs site: docs-site/ (Docusaurus, port 8601) serves PRD/roadmap/stories/specs/traceability/runbook, synced from canonical docs/specs/ by scripts/sync_docs.py; all mermaid diagrams verified rendering on every page.

Known gaps / honest notes

  • Ground sources are fixtures in exact export formats (both providers gate bulk downloads behind accounts/requests); the run report and UI banner state this. Adapters read real exports from data/raw/ with zero code change.
  • Post-storm satellite detections (18) are far below pre-storm (142) — plausibly turbidity/cloud effects on the first clear post-storm pass (Feb 12). The POC reports what the data shows; the MARIDA-trained classifier (roadmap item 3) is the planned precision fix.
  • AC-6.3 (popup content) is the only criterion without automated or scripted verification.
  • FDI reflectance uses the PB≥4 offset ((DN−1000)/10000); scene-adaptive thresholding makes detections robust to residual calibration offsets.