Add governed orthophoto release promotion
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-17 02:17:04 +02:00
parent 20d3aae1fb
commit 06d05f03a6
14 changed files with 1579 additions and 28 deletions
+11
View File
@@ -476,6 +476,17 @@ containment, sampled flight dates/years, local comparison state and
`staging_permitted`. It performs no pixel request, upload, Job, Dataset write
or legacy metadata rewrite. This operator script adds no public API contract.
Governed pixel promotion remains outside the HTTP request cycle in
`scripts/manage_orthophoto_release.py`. `plan` reruns that read-only preflight;
`stage` makes exactly one allowlisted bounded `Ortho` GetMap request and writes
only checksummed source/raster/preview evidence; `review` requires a named
approval; and `apply` requires the exact plan/review SHA-256 values. Apply
revalidates the remote identity and local comparison state, then delegates to
the existing `POST .../datasets/upload` contract with `dataset_type=raster`,
`source_name=digitaal_vlaanderen_orthophoto`, the official `YYYY.NN`
`source_version` and complete source/provenance metadata. No release endpoint,
provider URL parameter, Job type or alternate response envelope is added.
The endpoint accepts no arbitrary URL, feature query, area or layer. It does
not fetch vector features, raster pixels or models, create jobs/datasets, write
to PostGIS or trigger an import. The normal `source-freshness` endpoint remains
+32
View File
@@ -9767,3 +9767,35 @@ Boundary:
backfill existing orthophotos. A future stage/review/apply coordinator must
revalidate and retain the exact preflight identity before creating a new
immutable raster Dataset with official `YYYY.NN` source version.
## Sprint 231 - Governed orthophoto release promotion (2026-07-17)
Implemented:
- Added `scripts/manage_orthophoto_release.py` with separate `plan`, `stage`,
named `review` and checksum-confirmed `apply` actions for one bounded current
orthophoto selection. No action is scheduled or browser-triggered.
- Reused the complete Sprint 230 preflight identity. Stage performs exactly one
allowlisted WMS `Ortho` GetMap, retains the exact source response, creates a
three-band EPSG:31370 GeoTIFF plus PNG preview and mutates no Dataset.
- Bound remote catalog/WMS/WCS/flight evidence, request identity, all staged
file hashes, reviewer and the final Dataset checksum into atomic persistent
evidence. Host/path drift, oversize responses, modified bytes, stale local
state and missing exact confirmations fail closed.
- Added a double-confirmed first official baseline transition for legacy
`most_recent_at_*` markers. Apply retains every legacy raster and uses only
the existing canonical upload/DatasetService transaction.
- Made the latest official `YYYY.NN` Dataset authoritative for source-catalog
comparison even when a newer-imported rolling marker also exists. No API,
migration, release table, Job type or frontend behavior changed.
Validation so far:
- 38 focused Sprint 222/230/231 tests pass with deprecations treated as errors.
Coverage includes official-edition ordering, first-baseline authorization,
GetMap allowlisting/limits, RGB/CRS normalization, preview generation,
tampering, preflight drift, named review, loopback-only apply and complete
upload provenance.
Next:
- Run complete readiness, deploy the packaged operator to Tower, inspect the
live bounded Mol review preview and only then apply the first official
`2025.04` immutable baseline with explicit review evidence.
+9 -7
View File
@@ -291,13 +291,15 @@ annual Dataset, DatasetVersion and vector_features records with
`source_version=<year>-definitive`. Earlier annual snapshots are retained and
provisional v1/v2 publications cannot create rows.
The current-orthophoto release preflight likewise adds no lifecycle table or
migration. It is read-only and creates neither Dataset nor Job. It compares the
existing local `source_version` with the official `YYYY.NN` catalog edition
and verifies WMS/WCS/flight-day evidence for one bounded selection. A later
governed pixel apply must still create an immutable raster Dataset plus
DatasetVersion through DatasetService and retain that exact edition/evidence;
direct metadata backfill of legacy `most_recent_at_*` rows is prohibited.
Current-orthophoto release management likewise adds no lifecycle table or
migration. Preflight is read-only; stage and named review are filesystem-only.
Approved apply uploads the exact checksummed EPSG:31370 GeoTIFF through the
existing dataset endpoint and DatasetService transaction, creating one normal
immutable raster Dataset and DatasetVersion with official `YYYY.NN`
`source_version`, temporal flight-date evidence and release provenance.
Official editions take precedence over legacy rolling markers in catalog
comparison, but direct metadata backfill, update or deletion of those legacy
rows remains prohibited.
## Geometry normalization
+13 -2
View File
@@ -24,7 +24,7 @@ aanvraag. GeoIntel verzint geen historische pixelopnamedatum. Bronnen:
- https://www.vlaanderen.be/datavindplaats/catalogus/orthofotomozaiek-middenschalig-winteropnamen-kleur-meest-recent-vlaanderen
- https://www.vlaanderen.be/digitaal-vlaanderen/onze-diensten-en-platformen/luchtopnamen/gebruik-orthofotomozaieken
Voor een toekomstige rolling-releasebeslissing gebruikt
Voor een rolling-releasebeslissing gebruikt
`scripts/orthophoto_release_preflight.py` uitsluitend metadata. Het bindt de
lokale `most_recent`-productvariant aan de officiële ISO-editie en exacte WMS-
capabilitieshash, controleert het EPSG:31370/15 cm/driebanden-rasterdomein via
@@ -39,6 +39,17 @@ union. Een selectie met ontbrekende contourpunten, meerdere/afwijkende
vluchtjaren, gewijzigde service-identiteit of een niet-vergelijkbare lokale
`most_recent_at_*` marker is niet stagebaar.
`scripts/manage_orthophoto_release.py` voert daarna uitsluitend op expliciet
operatorverzoek `plan`, `stage`, `review` en `apply` uit. Stage haalt exact een
begrensde `Ortho`-GetMap op, bewaart bronresponse, genormaliseerde RGB-GeoTIFF
en review-PNG met checksums, maar schrijft geen Dataset. Review koppelt een
benoemde goedkeuring aan exact die bytes. Apply valideert preflight, plan,
review en lokale bronstaat opnieuw en gebruikt vervolgens de bestaande
Dataset-uploadroute. De nieuwe Dataset krijgt de officiële `YYYY.NN`-editie;
oude `most_recent_at_*` rasters blijven onveranderd bewaard. De eerste overgang
vereist een aparte baselinevlag plus de exacte oude marker. Er is geen
scheduler, browserfetch of automatische vervanging.
Dit document verzamelt concrete databronnen voor GeoIntel Kempen.
## Cross-domain official area profile
@@ -189,7 +200,7 @@ gebeurd.
| GRB gebouwen/wegen/water/percelen | operationele, expliciete plan-stage-apply refresh met onveranderlijke snapshots | alleen een nieuw officieel gedateerd cataloguseditie na operatorbevestiging ophalen |
| Statbel bevolking | jaarlijkse, expliciete edities in één tijdreeks; officiële DCAT-releaseprobe | een nieuwe publicatie alleen na schema-, sectorgeometrie- en totalencontrole toevoegen |
| ALZ landbouwgebruikspercelen | definitieve jaarlijkse edities 2008-2025; expliciete publicatieprobe en plan-stage-review-apply promotie; metricvergelijking zonder objectlineage | alleen een nieuwere definitieve v3-editie na gestagede schema-/codelijst-/scopecontrole en benoemde review toevoegen |
| orthofoto | vaste lokale opname per expliciete analysezone; read-only releasepreflight voor variant, officiële editie, exact WCS-domein en begrensd vluchtjaarbewijs | eerst officiële lokale editieprovenance vastleggen; daarna pas een afzonderlijke menselijke pixel-stage/apply-flow bouwen |
| orthofoto | vaste lokale analyseopnamen plus operationele preflight en benoemde plan-stage-review-apply-promotie voor een officiële `YYYY.NN`-editie | alleen een nieuwere officiële editie als afzonderlijke immutable Dataset promoveren na verse evidence en review |
| landgebruik, thematische rasters, DHMV en VMM-scenario's | vaste product-/scenario-edities, geen rolling snapshot | alleen een nieuwe gedocumenteerde producteditie als afzonderlijke Dataset verwerven |
| bodemkaart en historische kaarten | historische referentie-editie | niet als verouderde actuele bron labelen; alleen vervangen bij een officiële inhoudelijke heruitgave |
| BWK/Natura 2000 en gebouwen-/adressenregister | expliciete actuele snapshot met eigen methodologische betekenis | eerst een stabiele officiële editieprobe en bron-specifieke reconciliatiecontrole toevoegen |
+7 -3
View File
@@ -274,12 +274,16 @@ layer, observation label, `observed_at`, optional `valid_from`/`valid_to`,
temporal granularity, request/spatial hash, attribution and a limitation that
states whether the product is annual, multi-year or merely most recent.
A future rolling `most_recent` import must also retain the exact official
A governed rolling `most_recent` release import must also retain the exact official
`YYYY.NN` edition and the preflight identities for WMS capabilities, WCS
coverage description, selected EPSG:31370 domain and sampled flight year. A
legacy `most_recent_at_<date>` value is acquisition timing, not an official
edition, and cannot be promoted or compared as if it were one. The read-only
preflight creates no Dataset and does not retroactively rewrite that evidence.
edition, and cannot be compared as if it were one. The read-only preflight
creates no Dataset. Stage retains the exact source response, normalized
three-band EPSG:31370 GeoTIFF and review preview. Apply requires exact plan and
review hashes, persists sampled official flight dates as the temporal evidence
range and creates a new Dataset/DatasetVersion through DatasetService. It does
not retroactively rewrite or delete legacy rows.
### Hydrological station observations
+21 -6
View File
@@ -148,12 +148,27 @@ in source/provenance metadata. Browser PNG rendering is derived on request and
does not replace the stored GeoTIFF.
The orthophoto release preflight writes no source file, raster or database row.
Its JSON stdout may be retained by an operator as review evidence, but it is
not itself staging authorization. The report binds official WMS and WCS XML
hashes, the exact selected domain and hashed flight-day sample evidence. A
future pixel stage must persist and revalidate that identity separately before
DatasetService is called; existing `most_recent_at_*` raster metadata is not
silently rewritten.
Its JSON stdout is not staging authorization. Governed release evidence is
retained separately per scope, official edition and exact selection hash:
```text
storage/operator-evidence/orthophoto-release/{scope}/{YYYY.NN}/{selection-hash}/
official-wms-response.tif
orthophoto_{YYYY.NN}_{selection-hash}.tif
review-preview.png
staged-manifest.json
staged-plan.json
review-evidence.json
applied-evidence.json
```
The manifest binds the one bounded source response, normalized three-band
EPSG:31370 GeoTIFF and PNG preview. The plan also binds WMS/WCS/catalog and
flight-day preflight identities; review binds a named approval; applied
evidence binds both to the immutable Dataset id and checksum. Paths outside
this root, changed files and changed provider/local state fail closed. Only the
normalized GeoTIFF enters ordinary Dataset storage through DatasetService.
Existing `most_recent_at_*` raster metadata is never rewritten.
DHMV II DTM/DSM outputs are also normal raster Dataset files. The provider WCS
returns multipart coverage data; GeoIntel retains response and extracted
+3 -3
View File
@@ -692,6 +692,6 @@ This file now starts with the current implementation status. Older preparation/b
campaign-snapshot and definitive-archive publication contract.
- [x] Add a read-only orthophoto preflight for product variant, official
edition, exact WCS selected-area domain and deterministic flight-year points.
- [ ] Keep orthophoto pixel refresh manual and blocked until a separate
plan-stage-review-apply flow can retain the passed preflight identity and
create a new immutable Dataset with official `YYYY.NN` source version.
- [x] Keep orthophoto pixel refresh manual through a separate
plan-stage-review-apply flow that retains the passed preflight identity and
creates a new immutable Dataset with official `YYYY.NN` source version.