From 2992232fccaa046e85b253abe2a936e818689a83 Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Tue, 10 Nov 2026 14:07:07 -0800 Subject: [PATCH] fix(shipwrecks): tidy after merging main: the retired-token test reuses the retired token, natural Hebrew, voice comment beside its entry - layerStateTokenLedger.test: the retired-token reuse case now offers the retired token (02) to the newcomer, not News's 00. - he.json: the catalog's singular imperative, {count} first in the plural, Wikidata read as one source, and smoother legend and info text. - layerManifest: News after Shipwrecks, so the prompt-budget comment stays next to the entries it explains. - CURRENT-STATE: Prettier-formatted (table column, blank line before a heading). --- docs/CURRENT-STATE.md | 3 ++- src/data/layerStateTokenLedger.test.mjs | 2 +- src/i18n/locales/he.json | 16 ++++++++-------- src/voice/layerManifest.js | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md index 596364ce0..d0204c9e8 100644 --- a/docs/CURRENT-STATE.md +++ b/docs/CURRENT-STATE.md @@ -209,6 +209,7 @@ finds, protected status and source. Clicking the card opens the Wikipedia article (else the Wikidata item), the wreck's own web page when EMODnet lists one, else EMODnet's portal. Voice does not toggle this layer yet (prompt budget, as for the airspace layer). + ## Wildlife Sightings โ€” iNaturalist and Acartia **Wildlife Sightings** (`wildlife-sightings`, share-link token `9`) is off by @@ -4847,7 +4848,7 @@ its criteria cannot be silently ignored. | Ski Pistes โ›ท (`ski-pistes`) | OpenSnowMap piste raster tiles (keyless; CC BY-SA tiles, OSM data ODbL; no bulk download) | `src/data/osmOverlays.js` | โ€” (browser-direct tiles) | on view (Cesium tile requests; no polling) | | Fire Perimeters ๐Ÿ”ฅ | NIFC WFIGS current interagency perimeters (keyless, paged past the 2000-record cap); InciWeb catalog + incident page origin and update time checks for verified incident-page links | `src/layers/perimeters/` via `src/app/layers/perimeters.js` | `/api/fire-perimeters` + `/api/fire-perimeters/inciweb/*` | 5 min (server caches: catalog 1 h; publication 30 min) | | Prohibited & Restricted Airspace ๐Ÿšซ | FAA Special Use Airspace prohibited (P) and restricted (R) zones (keyless FeatureServer, simplified geometry) | `src/layers/droneAirspace/` via `src/app/layers/droneAirspace.js` | `/api/drone-airspace` | 1 h (server cache 1 h; stale-on-error) | -| Shipwrecks โš“ (`shipwrecks`) | EMODnet Human Activities heritage shipwrecks (European waters, keyless WFS, CC BY 4.0) and Wikidata (notable wrecks worldwide, keyless, CC0) | `src/layers/shipwrecks/` via `src/app/layers/shipwrecks.js` | `/api/shipwrecks` | 6 h page check; server refresh once a day (stale-on-error up to 7 days) | +| Shipwrecks โš“ (`shipwrecks`) | EMODnet Human Activities heritage shipwrecks (European waters, keyless WFS, CC BY 4.0) and Wikidata (notable wrecks worldwide, keyless, CC0) | `src/layers/shipwrecks/` via `src/app/layers/shipwrecks.js` | `/api/shipwrecks` | 6 h page check; server refresh once a day (stale-on-error up to 7 days) | | News โ—† (`news`) | The last 24 h of reports in two sections, Conflicts and Local, with hotspots, outlines and disputed areas: from a news server (`GEV_NEWS_ORIGIN`), else Core's own reading of GDELT 2.0 events (no key), Liveuamap (`LIVEUAMAP_API_KEY`) and World News API (`WORLDNEWSAPI_KEY`) | `src/layers/news/` via `src/app/layers/news.js`; panel `src/ui/newsPanel.js`, `src/ui/news/`; server `server/providers/news.js`, `server/providers/news/` | `/api/news/hotspots`, `/api/news/feed`, `/api/news/outline` (forwarded to `GEV_NEWS_ORIGIN` when set, else answered by Core) | 2 min map refresh; Local re-read when the camera settles 0.8 s in a new half-degree cell below 3,000 km | | Wildlife Sightings ๐Ÿฆ‰ | iNaturalist wildlife observed within 48 h (whales 7 d), per view; Acartia Salish Sea marine mammal coverage (keyless) | `src/layers/wildlifeSightings/` via `src/app/layers/wildlifeSightings.js` | `/api/inaturalist/observations`, `/api/inaturalist/grid`, `/api/acartia/sightings` | camera moveEnd (600 ms debounce; enable settles 300 ms) + 5 min (observations 5 / 10 min; tiles 15 min; stale โ‰ค 1 h / 24 h) | diff --git a/src/data/layerStateTokenLedger.test.mjs b/src/data/layerStateTokenLedger.test.mjs index 1bcda2964..067904a35 100644 --- a/src/data/layerStateTokenLedger.test.mjs +++ b/src/data/layerStateTokenLedger.test.mjs @@ -435,7 +435,7 @@ test('checker reads a complete future base ledger and rejects retired-token reus () => validateLayerStateAllocations(published, { ...LAYER_STATE_TOKEN_RESERVATIONS, - newcomer: '00', + newcomer: '02', }), /changed or removed/, ); diff --git a/src/i18n/locales/he.json b/src/i18n/locales/he.json index 84bb7a6ba..5a6fe9404 100644 --- a/src/i18n/locales/he.json +++ b/src/i18n/locales/he.json @@ -3517,23 +3517,23 @@ "Cargo or finds: {value}": "ืžื˜ืขืŸ ืื• ืžืžืฆืื™ื: {value}", "Protected wreck": "ืกืคื™ื ื” ื˜ืจื•ืคื” ืžื•ื’ื ืช", "Source: {value}": "ืžืงื•ืจ: {value}", - "Click the card to open EMODnet โ†—": "ืœื—ืฆื• ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช EMODnet โ†—", - "Click the card to open the article โ†—": "ืœื—ืฆื• ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืขืจืš โ†—", - "Click the card to open the source โ†—": "ืœื—ืฆื• ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืžืงื•ืจ โ†—", + "Click the card to open EMODnet โ†—": "ืœื—ืฅ ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช EMODnet โ†—", + "Click the card to open the article โ†—": "ืœื—ืฅ ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืขืจืš โ†—", + "Click the card to open the source โ†—": "ืœื—ืฅ ืขืœ ื”ื›ืจื˜ื™ืก ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืžืงื•ืจ โ†—", "All years": "ื›ืœ ื”ืฉื ื™ื", "Period": "ืชืงื•ืคื”", "From": "ืžึพ", "First year of the shipwreck period": "ื”ืฉื ื” ื”ืจืืฉื•ื ื” ื‘ืชืงื•ืคืช ื”ื˜ื‘ื™ืขื•ืช", "To": "ืขื“", "Last year of the shipwreck period": "ื”ืฉื ื” ื”ืื—ืจื•ื ื” ื‘ืชืงื•ืคืช ื”ื˜ื‘ื™ืขื•ืช", - "Wikidata unavailable; showing EMODnet only": "ื•ื™ืงื™ื ืชื•ื ื™ื ืœื ื–ืžื™ืŸ; ืžื•ืฆื’ EMODnet ื‘ืœื‘ื“", - "EMODnet unavailable; showing Wikidata only": "EMODnet ืœื ื–ืžื™ืŸ; ืžื•ืฆื’ื™ื ื•ื™ืงื™ื ืชื•ื ื™ื ื‘ืœื‘ื“", + "Wikidata unavailable; showing EMODnet only": "ื•ื™ืงื™ื ืชื•ื ื™ื ืื™ื ื• ื–ืžื™ืŸ; ืžื•ืฆื’ EMODnet ื‘ืœื‘ื“", + "EMODnet unavailable; showing Wikidata only": "EMODnet ืื™ื ื• ื–ืžื™ืŸ; ืžื•ืฆื’ ื•ื™ืงื™ื ืชื•ื ื™ื ื‘ืœื‘ื“", "Shipwrecks unavailable": "ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช ืœื ื–ืžื™ื ื•ืช", "{count} wrecks": { - "one": "ืกืคื™ื ื” ื˜ืจื•ืคื” ืื—ืช ({count})", + "one": "{count} ืกืคื™ื ื” ื˜ืจื•ืคื”", "two": "{count} ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช", "other": "{count} ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช" }, - "EMODnet (European waters) ยท Wikidata (worldwide)": "EMODnet (ืžื™ื ืื™ืจื•ืคื™ื™ื) ยท ื•ื™ืงื™ื ืชื•ื ื™ื (ื›ืœ ื”ืขื•ืœื)", - "European heritage wrecks come from EMODnet Human Activities; notable wrecks worldwide come from Wikidata. Colour shows when the ship sank; marker size grows with deaths. Click a marker for its card.": "ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช ืžื•ืจืฉืช ืื™ืจื•ืคื™ื•ืช ืžื’ื™ืขื•ืช ืžึพEMODnet Human Activities; ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช ื‘ื•ืœื˜ื•ืช ืžื›ืœ ื”ืขื•ืœื ืžื’ื™ืขื•ืช ืžื•ื•ื™ืงื™ื ืชื•ื ื™ื. ื”ืฆื‘ืข ืžืจืื” ืžืชื™ ื”ืกืคื™ื ื” ื˜ื‘ืขื”; ื’ื•ื“ืœ ื”ืกืžืŸ ื’ื“ืœ ืขื ืžืกืคืจ ื”ื”ืจื•ื’ื™ื. ืœื—ืฆื• ืขืœ ืกืžืŸ ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ื›ืจื˜ื™ืก ืฉืœื•." + "EMODnet (European waters) ยท Wikidata (worldwide)": "EMODnet (ืžื™ืžื™ ืื™ืจื•ืคื”) ยท ื•ื™ืงื™ื ืชื•ื ื™ื (ื›ืœ ื”ืขื•ืœื)", + "European heritage wrecks come from EMODnet Human Activities; notable wrecks worldwide come from Wikidata. Colour shows when the ship sank; marker size grows with deaths. Click a marker for its card.": "ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช ืื™ืจื•ืคื™ื•ืช ื‘ืขืœื•ืช ืขืจืš ืžื•ืจืฉืช ืžื’ื™ืขื•ืช ืžึพEMODnet Human Activities; ืกืคื™ื ื•ืช ื˜ืจื•ืคื•ืช ื‘ื•ืœื˜ื•ืช ืžื›ืœ ื”ืขื•ืœื ืžื’ื™ืขื•ืช ืžื•ื•ื™ืงื™ื ืชื•ื ื™ื. ื”ืฆื‘ืข ืžืจืื” ืžืชื™ ื”ืกืคื™ื ื” ื˜ื‘ืขื”; ื”ืกืžืŸ ื’ื“ืœ ื›ื›ืœ ืฉืžืกืคืจ ื”ื”ืจื•ื’ื™ื ืขื•ืœื”. ืœื—ืฅ ืขืœ ืกืžืŸ ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ื›ืจื˜ื™ืก ืฉืœื•." } diff --git a/src/voice/layerManifest.js b/src/voice/layerManifest.js index bf9d621f9..da277293f 100644 --- a/src/voice/layerManifest.js +++ b/src/voice/layerManifest.js @@ -457,9 +457,9 @@ export const VOICE_OFF_LAYERS = Object.freeze({ // query for this layer wait until there is room. 'drone-airspace': 'informational airspace layer; no room in the prompt budget', - news: 'browsed in the News panel; voice tools are a later step', // Same budget: a historical wreck archive waits for room too. shipwrecks: 'historical shipwreck archive; no room in the prompt budget', + news: 'browsed in the News panel; voice tools are a later step', 'wildlife-sightings': 'community observation layer; no room in the prompt budget', });