diff --git a/CHANGELOG.md b/CHANGELOG.md index a5f56cec..ab038331 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,8 @@ incorrectly labelling Walloon elevations as TAW. - Made terrain readiness fail closed on both the source raster and its valid SHA-256 sidecar, wrote provisioning evidence atomically, and corrected the - persisted acquisition interval to the canonical `period` granularity. + persisted acquisition interval to the canonical `period` granularity with a + stable spatial series key. - Extended detection-model capabilities with machine-readable training scope, validation scope, validated regions, national-validation status and the operator-review requirement. The configured local model remains bound to diff --git a/backend/app/services/spw_terrain_service.py b/backend/app/services/spw_terrain_service.py index 002bbcea..69134eef 100644 --- a/backend/app/services/spw_terrain_service.py +++ b/backend/app/services/spw_terrain_service.py @@ -418,6 +418,7 @@ class SpwTerrainService: content=content, source="SPW Relief de la Wallonie MNT 2021-2022 operator-provisioned GeoTIFF", source_name=SpwTerrainService.PROVIDER, + temporal_series_key=f"spw:terrain:mnt:{request_hash[:24]}", observed_at=datetime(2022, 3, 5, 23, 59, 59, tzinfo=UTC), valid_from=datetime(2021, 2, 19, tzinfo=UTC), valid_to=datetime(2022, 3, 5, 23, 59, 59, tzinfo=UTC), diff --git a/backend/tests/test_spw_terrain_service.py b/backend/tests/test_spw_terrain_service.py index 95371335..59c82625 100644 --- a/backend/tests/test_spw_terrain_service.py +++ b/backend/tests/test_spw_terrain_service.py @@ -164,8 +164,18 @@ def test_spw_terrain_acquisition_persists_bounded_dng_raster_and_provenance( assert captured["source_metadata"]["coverage_zones"] == ["wallonia"] assert captured["provenance_metadata"]["resampling"] == "bilinear" assert captured["provenance_metadata"]["source_sha256"] == source_digest + assert captured["temporal_series_key"].startswith("spw:terrain:mnt:") assert captured["temporal_granularity"] == "period" assert captured["valid_from"].date().isoformat() == "2021-02-19" + temporal = DatasetService._validate_temporal_metadata( + temporal_series_key=captured["temporal_series_key"], + observed_at=captured["observed_at"], + valid_from=captured["valid_from"], + valid_to=captured["valid_to"], + temporal_granularity=captured["temporal_granularity"], + source_version=captured["source_version"], + ) + assert temporal["temporal_granularity"] == "period" with rasterio.MemoryFile(captured["content"]) as memory: with memory.open() as derived: assert derived.crs.to_epsg() == 3812 diff --git a/docs/CODEX_EXECUTION_LOG.md b/docs/CODEX_EXECUTION_LOG.md index ba0557b0..daa5710a 100644 --- a/docs/CODEX_EXECUTION_LOG.md +++ b/docs/CODEX_EXECUTION_LOG.md @@ -11193,7 +11193,7 @@ Implemented and verified: retained the source raster, checksum sidecar and atomic provisioning report; - made terrain availability fail closed until both raster and valid SHA-256 sidecar exist, and persisted the official 2021-02-19/2022-03-05 observation - interval using the canonical `period` granularity; + interval using the canonical `period` granularity and spatial series key; - constrained AI capability claims to the actual Mol/Kempen evidence through machine-readable training/validation scope, `nationally_validated=false` and mandatory operator review. No national training result was fabricated.