You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CLAUDE.md
+7-3Lines changed: 7 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -90,6 +90,8 @@
90
90
| Geodata image carries no data | The Docker image bundles Python + GDAL/PROJ + tippecanoe + the code. Datasets land in the named PostGIS volume at first `limen geodata init`. Verify with `docker image inspect` — image size ≪ data size. |
91
91
| Geodata never in critical path | The operational API reads pre-computed numeric per-cell features. `limen geodata export-features` ships those across with one upsert per cell. The MCP server is for agents; nothing in the hourly scoring path waits on it. |
92
92
| Geodata is self-contained |`geodata/` is a uv workspace member designed to be extracted into a standalone repo with one `mv`. Nothing in `geodata.*` imports from `limen.*`; Prompt-2 parsers are duplicated in `geodata/parsers.py`. |
93
+
| EFFIS is MapServer, not GeoServer |`maps.effis.emergency.copernicus.eu/gwis` is a **MapServer** CGI, and every GeoServer habit fails differently: `/gwis/ows` hangs (use `/gwis`), a wrong `typeNames` closes the connection mid-response instead of 404ing, `CQL_FILTER` is silently ignored, and `bbox` + `filter` together kill the connection. The layer is `nrt.ba.poly` with `initialdate`/`area`; dates are filtered **client-side** after a bbox request, which is cheap because one AOI's whole history is a single response (Basilicata: 515 perimeters 2012-2026, 305 KB). A sync that returns zero is a client bug, not missing credentials — that mistake cost this project a year of an empty `fire_perimeters` and three issues blocked on an accreditation nobody needed. |
94
+
| A hit rate without a base rate is unreadable |`backtest-wildfire` reports both, plus their ratio. A model that calls every summer day dangerous scores a perfect hit rate while discriminating nothing, and the base rate is what exposes it. Measure it over the **fire season only**, never the spin-up days: including them dropped Basilicata's 2025 base from 43 % to 35 % and inflated the discrimination from 1.82 to 2.27 for free. |
93
95
| Geodata URLs are official | The manifest schema refuses any URL outside `https://idrogeo.isprambiente.it/` by construction. To add a dataset, edit `datasets.yaml` (single source of truth) — no code change required. |
94
96
| MCP refresh is admin-only | The `refresh` tool requires `MCP_ADMIN_TOKEN`. Env var **unset** = refresh disabled (fail-closed). |
95
97
|`quality-local` never on a synchronous path | Colibrì/GLM-5.2 generate in *tens of minutes* (measured: 40 s for 3 tokens). Every `LLM__MODELS__*` role is synchronous — HTTP request, MCP tool call, or a scheduler tick shorter than the response — so mapping one there stalls the hourly sweep silently instead of just being slow. Enforced by `SLOW_GENERATION_MODELS` + a `model_validator` on `LLMSettings`: the process **refuses to start**. See `docs/inference.md`. |
@@ -286,9 +288,11 @@ extension points already:
286
288
`landuse_code` (CORINE) and `slope_deg` (DEM) are unpopulated in most
287
289
deployments, so the terrain term is constant and the wildfire map is
288
290
effectively the FWI map — which is what EFFIS publishes, but not yet
289
-
territory-modulated risk. And the EFFIS perimeter endpoint answers **403**
290
-
without accreditation, so `backtest-wildfire` has no ground truth until
291
-
someone ingests it; the report says so instead of reporting zeros.
291
+
territory-modulated risk. The EFFIS perimeter service, on the other hand,
292
+
**needs no credentials** — the earlier conclusion that it required CEMS
293
+
accreditation was wrong, and the fix was in our own client. Measured on
294
+
Basilicata against real perimeters: hit rate 79 % against a 43 % base rate
295
+
in 2025, 100 % against 28 % in 2024.
292
296
- Flood (#63-#64) still has no YAML and no engine.
293
297
- V2 ML scoring engine (drop-in replacement of
294
298
`MultiFactorScoringEngine` consuming the same `CellFeatureBundle`).
0 commit comments