From c4050050998c86f3276e68abe8a387ed46afb963 Mon Sep 17 00:00:00 2001 From: Sirius DevOps Date: Sat, 29 Aug 2026 14:20:04 -0400 Subject: [PATCH] feat(map): dark-hull v1 Hormuz SAR+AIS candidate note Eyeballs fusion: Hormuz tap already enables Sentinel-1 SAR and vesselapi AIS together; add the HUD note that a bright radar return without a boat icon is a candidate, not a detection. --- app/static/index.html | 1 + tests/test_frontend_reliability.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/app/static/index.html b/app/static/index.html index 4100be3..f5eba23 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -868,6 +868,7 @@
Opacity 80%
Cloud-penetrating C-band. Last 7 days, viewport bbox. Tiles from same-origin TiTiler — not fetched on load.
+
SAR + AIS: bright radar with no boat icon is a candidate, not a detection.
diff --git a/tests/test_frontend_reliability.py b/tests/test_frontend_reliability.py index d734f49..f573bac 100644 --- a/tests/test_frontend_reliability.py +++ b/tests/test_frontend_reliability.py @@ -76,3 +76,25 @@ def test_phone_chokepoints_use_select_not_buttons(): mobile = HTML.split("@media (max-width: 820px)")[1].split("@media (prefers-reduced-motion")[0] assert "#chokepoint-select { display: block; }" in mobile assert ".chokepoint-btns { display: none; }" in mobile or "#chokepoint-label, .chokepoint-btns { display: none; }" in mobile + + +def test_dark_hull_v1_sar_ais_candidate_note(): + sar = HTML.split('id="sentinel-1-sar"')[1].split('class="lp-layer"')[0] + assert "SAR + AIS:" in sar + assert "candidate" in sar + assert "not a detection" in sar + assert sar.count('class="lp-note"') >= 2 + + +def test_hormuz_tap_enables_sar_and_vesselapi_src(): + apply = HTML.split("function applyChokepoint")[1].split("function currentBBox")[0] + assert "p.vesselapi ? 'vesselapi' : ''" in apply + assert "vChk.checked = true" in apply + assert "vesselsOn = true" in apply + assert "p.id === 'hormuz' || p.vesselapi" in apply + assert "sChk.checked = true" in apply + assert "sentinelOn = true" in apply + assert "if (vesselsOn) loadVessels();" in apply + assert "if (sentinelOn) loadSentinel1();" in apply + load = HTML.split("async function loadVessels")[1].split("async function toggleStorms")[0] + assert "&src=${encodeURIComponent(vesselSrcPref)}" in load or "src=${encodeURIComponent(vesselSrcPref)}" in load