docs(accuracy): refresh governed scan and training evidence

This commit is contained in:
Jens
2026-08-30 06:00:57 +02:00
parent c272220277
commit 0e3c1b20e9
27 changed files with 88787 additions and 318 deletions
+37
View File
@@ -12970,3 +12970,40 @@ Open:
- Kept the historical evidence boundary explicit: this runtime receipt does not
invent human review, a historical training commit/container, protected-test
independence, national validity or a new promotion decision.
## 2026-08-30 - Accuracy-status en fail-closed modelactivatie
- Herhaalde de lokale Phase-3-scan deterministisch als
`p3-eb67185e61107cc7`: 1013 bestanden onderzocht, nul overgeslagen en drie
gedeclareerde externe productiegrenzen, met content-hash
`f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`.
- Corrigeerde de statusgrens naar `local_complete_production_inventory_pending`;
Tower-volumes en productie-PostGIS zijn nog niet als totale productie-
inventaris gereconcilieerd.
- Retireerde de stale tracked `geointel/`-mirror met immutable Git-recovery en
verplaatste 207 niet-getrackte runtimebestanden intact naar een genegeerde
recoverymap; productiegegevens en modelgewichten zijn niet verwijderd.
- Legde onafhankelijke AI-visuele triage vast met `human_reviewer=false`.
Referentiegeometrie, dense/nested labels, tile-edge-regels en regionale
hard-negative dekking blokkeren corpusacceptatie, training en promotie.
- Versterkte de activatiegrens: alleen een exact overeenkomende candidate key,
model-SHA-256 en benchmarkmanifest-SHA-256 in een geslaagd governed Phase-4/5
release-gaterapport kunnen activatie autoriseren. Een legacy diagnostisch
promotierapport is onvoldoende.
- De taakgeschikte officiële bron blijft doorslaggevend voor productresultaten.
Deze remediatie levert geen menselijke review, nationale validatie,
modelpromotie of 100%-accuratieclaim.
## 2026-08-30 - Fail-closed release-, backup- en rollbackpad
- Retireerde het aparte, niet-gegate Unraid-workflowpad; productie-deploy hangt
nu uitsluitend af van quality-, dependency- en AI-containergates.
- Bond controller, OCI-label, SBOM, Trivy-evidence en draaiende container aan
het exacte full-SHA en lokale Docker image-ID.
- Maakte storage/models byte-compleet, symlink-veilig en checksum-geverifieerd;
latere snapshots hardlinken alleen gelijke backup-naar-backup bytes.
- Bewees databaseherstel vóór productiecutover in een tijdelijke database,
behield de pre-restore database en bond same-revision rollback aan het
image-ID uit de specifieke pre-deploybackup.
- Maakte cleanup-quarantine en herstel interruption-safe en no-clobber, en
behield HTTPS-forwarding uitsluitend voor interne vertrouwde proxies.
+19
View File
@@ -1,5 +1,24 @@
# GeoIntel TODO
## Accuracy-remediatie (2026-08-30)
- [x] Herhaal de lokale Phase-3-scan deterministisch: scan
`p3-eb67185e61107cc7` onderzocht 1013 bestanden, sloeg er nul over en
registreerde drie externe productiegrenzen expliciet; content-hash
`f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`.
- [ ] Inventariseer de drie gedeclareerde Tower-/productiegrenzen gecontroleerd
en reconcileer servervolumes en productie-PostGIS; de lokale scan is geen
totale productie-inventaris.
- [x] Leg de onafhankelijke AI-visuele hercontrole vast met
`human_reviewer=false`; corpusacceptatie, training en promotie blijven
geblokkeerd.
- [x] Laat modelactivatie fail-closed vereisen dat candidate key, model-SHA-256
en benchmarkmanifest-SHA-256 exact overeenkomen met een geslaagd governed
Phase-4/5 release-gaterapport.
- [ ] Herstel de vastgestelde labelsemantiek, dense/nested conflicten,
tile-edge-regels en regionale hard-negative dekking; verkrijg daarna
representatieve menselijke acceptatie vóór een volgende governed training.
## CI-onderhoud (2026-08-29)
- [x] Vervang de Gitea-incompatibele TruffleHog-actionwrapper.
@@ -224,6 +224,22 @@ produce map geometry or location claims.
| DHMV | Contract requires product key, DTM/DSM semantics, EPSG:31370, native/analysis resolution, one-band numeric units, nodata, TAW vertical reference and 2013-2015 period for the currently configured DHMV II source. It is elevation evidence, not building truth. |
| Bathymetry | Vertical datum/reference plane, depth versus bed-elevation semantics, survey epoch and uncertainty are mandatory. No water volume is inferred. |
### 5.4 Inference tile-manifest contract
Raster tiling emits `geointel.raster.tile-manifest@2.0.0`. The manifest binds
the source Dataset id/checksum/size, the latest DatasetVersion identity and
checksum, registry/snapshot identities and snapshot checksum, data-contract
identity, source version and—when present—the Area identity and geometry hash.
Each tile has an explicit CRS/bounds, byte size and SHA-256.
Configured detection and segmentation validate that exact binding against the
requested live Dataset before model loading. They recompute every tile hash,
normalize the tile union to EPSG:4326 and require it to remain inside the
manifest and persisted Dataset extents and intersect the bound Area. Missing,
legacy or changed evidence is not inferred from filenames: it fails closed with
a typed dataset, provenance, tile-integrity or spatial-scope error.
## 6. Vector data contract
### 6.1 Required vector fields
+36 -10
View File
@@ -6,21 +6,30 @@ De reproduceerbare scan `scripts/run_accuracy_phase3_full_data_scan.py` is read-
| Telling | Aantal |
| --- | ---: |
| Onderzochte bestanden | 295 |
| Onderzochte bestanden | 1013 |
| Overgeslagen bestanden | 0 |
| Onbereikbare scope-items | 3 |
| Geïnventariseerd totaal | 298 |
| Reconciliatie | groen (`295 + 0 + 3 = 298`) |
| Geïnventariseerd totaal | 1016 |
| Reconciliatie | groen (`1013 + 0 + 3 = 1016`) |
De drie expliciet onbereikbare items zijn de niet-gemounte Tower-corpora, gemounte modelvolumes en een productie-PostGIS/API-endpoint. Elk staat als `unreachable` in het volledige manifest met concrete reden; er is geen stilzwijgende skip.
De drie expliciet onbereikbare items zijn grenzen van deze lokale
Windows-scan: de niet lokaal gemounte Tower-corpora, modelvolumes en het
productie-PostGIS/API-endpoint. Elk staat als `unreachable` in het volledige
manifest met concrete reden; er is geen stilzwijgende skip. Dit betekent niet
dat de server zelf onbereikbaar is. Een afzonderlijke gecontroleerde
productiescan moet die remote scopes beoordelen voordat een nationale
volledigheidsclaim mogelijk is.
De scan leverde 172 anomalieën op. Dat is geen geldigheidsclaim: 163 items zijn daarom in de logische quarantine-manifest opgenomen. De scanner promoot geen enkel foutief item tot ground truth en voert geen automatische reparatie uit. De huidige bevindingen zijn:
De scan leverde 711 anomalieën op. Dat is geen geldigheidsclaim: 682 items
zijn daarom in het logische quarantainemanifest opgenomen. De scanner promoot
geen enkel foutief item tot ground truth en voert geen automatische reparatie
uit. De huidige bevindingen zijn:
| Categorie | Aantal | Standaardactie |
| --- | ---: | --- |
| Onleesbare/corrupte GeoTIFF | 96 | quarantine |
| Afgeleide artefacten zonder expliciete lineage | 58 | quarantine |
| Bronlabel zonder declared freshness | 9 | requires review |
| Onleesbare/corrupte GeoTIFF | 96 | unavailable or unreadable |
| Afgeleide artefacten zonder expliciete lineage | 577 | quarantine |
| Bronlabel zonder declared freshness | 29 | requires review |
| Manifest met nul-bounding-box | 6 | quarantine |
| Niet-bereikbare externe scope | 3 | unavailable or unreadable |
@@ -43,7 +52,7 @@ Er zijn vijf vaste ernstniveaus (`blocker`, `critical`, `major`, `minor`, `infor
De scanner bouwt eerst een gesorteerde inventory-hash. Per batch wordt `scan-checkpoint.json` atomair bijgewerkt. Met dezelfde inventory en `--resume` worden onveranderde records hergebruikt; gewijzigde records worden opnieuw gelezen. De inhoudshash sluit alleen uitvoertimestamps uit. Twee opeenvolgende runs gaven dezelfde scan-ID en content-hash:
`p3-46ee3f8d3a2dc52b` / `1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e`
`p3-eb67185e61107cc7` / `f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`
## Bewijsartefacten
@@ -69,9 +78,26 @@ De fixturetest controleert geldige en foutieve GeoJSON, corrupte rasterinput, ex
## Fasebeslissing
Fase 3 is `done` voor de afgebakende projectomgeving: alle 295 veilige lokale bestanden zijn verwerkt en de drie niet-bereikbare externe grenzen zijn expliciet geregistreerd. Fase 4 is `ready` voor verdere beoordeling van de gevonden quarantine- en leakage-signalen. Dit is geen modelpromotie- of nationale kwaliteitsclaim; de inhoudelijke anomalieën moeten eerst door de volgende fase worden hersteld of menselijk beoordeeld.
De lokale Fase-3-scan is volledig voor de afgebakende projectomgeving: alle
1013 veilige lokale bestanden zijn verwerkt en de drie niet-gemounte grenzen
zijn expliciet geregistreerd. Fase 3 blijft voor de totale operationele
omgeving `production_inventory_pending` totdat de servervolumes en database
in een gecontroleerde productiescan zijn gereconcilieerd. Fase 4 kan de lokale
quarantine- en leakage-signalen al beoordelen. Dit is geen modelpromotie- of
nationale kwaliteitsclaim; de inhoudelijke anomalieën moeten eerst worden
hersteld of representatief menselijk beoordeeld.
> **Historische handoff:** `ready` beschrijft het overdrachtsmoment direct na
> de Phase-3-scan. Het Phase-4-harnas is inmiddels geïmplementeerd, maar de
> actuele productbenchmark is nog `not_evaluable`; de normatieve actuele
> status staat in `docs/accuracy-program/status.json`.
## Accuracy-handoff na de scan
De onafhankelijke AI-visuele triage van 30 augustus is vastgelegd in
`artifacts/evidence/accuracy/model-training/20260830-independent-ai-visual-review.json`.
Daarin blijven `human_reviewer=false`, corpusacceptatie, training en promotie
expliciet geblokkeerd. Een model kan bovendien pas worden geactiveerd wanneer
de exacte candidate key en model-SHA-256 overeenkomen met een geslaagd governed
Phase-4/5 release-gaterapport dat ook de benchmarkmanifest-SHA-256 bindt. De
taakgeschikte officiële bron blijft doorslaggevend voor productresultaten.
+46 -31
View File
@@ -2,11 +2,12 @@
"schema_version": 1,
"program": "GeoIntel Accuracy Improvement Program",
"phase": "P4",
"generated_at": "2026-08-02T04:40:51+02:00",
"generated_at": "2026-08-30T05:58:29+02:00",
"scope": {
"product": "Belgium and the Belgian North Sea",
"active_building_model_claim": "Mol/Kempen only, operator review required",
"national_building_validation": false
"national_building_validation": false,
"result_authority_policy": "Task-appropriate official sources remain decisive for product results; AI output is a reviewable proposal unless a governed task-specific release gate proves otherwise."
},
"baseline": {
"branch": "codex/geointel-accuracy-program",
@@ -34,7 +35,8 @@
"promotion_allowed": false,
"scope_widening_allowed": false,
"training_allowed_now": false,
"training_unlock_gate": "P2-08 after P2-00 through P2-07 have passed",
"training_unlock_gate": "A corrected checksum-frozen corpus, independent splits, representative human acceptance and every applicable pre-registered training gate must pass before a new governed run.",
"activation_gate": "Activation requires the exact candidate key and model SHA-256 bound to a passing governed Phase-4/5 release-gate report and its benchmark-manifest SHA-256; a legacy diagnostic promotion report alone has no activation authority.",
"critical_risk_count": 8,
"high_risk_count": 17,
"medium_risk_count": 4
@@ -80,23 +82,24 @@
]
},
"phase3": {
"status": "done",
"meaning": "All 295 safe local files in the configured GeoIntel roots were scanned read-only; three known external boundaries were explicitly recorded as unreachable.",
"status": "local_complete_production_inventory_pending",
"meaning": "All 1013 safe local files in the configured GeoIntel roots were scanned read-only; three declared external production boundaries were recorded explicitly and still require a controlled server-side inventory.",
"scanner": "scripts/run_accuracy_phase3_full_data_scan.py",
"scanner_version": "3.0.3",
"scan_id": "p3-46ee3f8d3a2dc52b",
"scanner_version": "3.1.0",
"scan_id": "p3-eb67185e61107cc7",
"evidence_root": "artifacts/evidence/accuracy/P3",
"content_hash": "1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e",
"content_hash": "f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a",
"reconciliation": {
"examined": 295,
"examined": 1013,
"skipped": 0,
"unreachable": 3,
"inventory_total": 298,
"inventory_total": 1016,
"reconciles": true
},
"anomaly_count": 172,
"quarantine_item_count": 163,
"anomaly_count": 711,
"quarantine_item_count": 682,
"does_not_mean": [
"the total production inventory is complete",
"all anomalies are repaired",
"AOI split independence is proven",
"GRB ground truth is locally available",
@@ -256,21 +259,31 @@
"promotion_evidence": false
},
"protected_test_isolation": false,
"human_label_acceptance": false
"human_label_acceptance": false,
"latest_independent_ai_visual_review": {
"review_id": "20260830-independent-ai-visual-review",
"evidence": "artifacts/evidence/accuracy/model-training/20260830-independent-ai-visual-review.json",
"human_reviewer": false,
"corpus_accepted": false,
"training_gate": "blocked",
"promotion_allowed": false,
"claim_boundary": "Independent AI visual inspection is triage evidence only; it is not representative human acceptance, protected-test evidence or an accuracy measurement."
}
},
"verification": {
"backend_full_suite": {
"status": "failed",
"passed": 1282,
"failed": 17,
"duration_seconds": 116.62,
"classification": "The canonical backend test import boundary now collects. Sixteen remaining failures are historical source-text assertions for changed UI/deployment/README behavior; one full Windows run also hit an intermittent WSL-backed bash.exe host failure in a shell-wrapper syntax test. This still prevents a whole-suite-green claim."
"status": "passed",
"passed": 1702,
"skipped": 1,
"failed": 0,
"duration_seconds": 279.63,
"classification": "The complete canonical backend suite passes with deprecations promoted to errors. The single skip is the Windows-host symlink fixture; the symlink refusal path remains covered by static and Linux-targeted release checks."
},
"backend_ci_entrypoint": {
"status": "collected_with_failures",
"collected": 1299,
"result": "1282 passed, 17 failed",
"note": "The former scripts.render_operator_polygon_label_qa collection failure is resolved by the canonical backend-test import boundary."
"status": "passed",
"collected": 1703,
"result": "1702 passed, 1 skipped",
"note": "The canonical backend test import boundary, deployment contracts, guest analysis flow and governed raster handoff all collect and pass."
},
"phase1_tooling_tests": {
"status": "passed",
@@ -280,14 +293,14 @@
"status": "passed"
},
"repository_ruff": {
"status": "failed",
"finding_count": 95,
"note": "P2-changed Python paths pass their scoped Ruff check; repository-wide remediation remains an explicit P2-01 gate."
"status": "passed",
"finding_count": 0,
"note": "Repository-wide Ruff validation passes across backend, scripts and tests without policy weakening."
},
"frontend_unit": {
"status": "passed",
"test_files": 16,
"tests": 51,
"test_files": 40,
"tests": 170,
"command": "npm run test:unit"
},
"frontend_typecheck": {
@@ -302,13 +315,13 @@
},
"openapi_contract": {
"status": "passed",
"implemented_routes": 147,
"explicit_non_envelope_endpoints": 10
"implemented_routes": 155,
"explicit_non_envelope_endpoints": 12
},
"alembic": {
"status": "passed_offline_and_disposable_postgis",
"heads": [
"202608010001"
"202608230001"
],
"offline_upgrade_rendered": true,
"offline_downgrade_rendered": true,
@@ -390,10 +403,12 @@
"docs/accuracy-program/09-full-data-scan.md",
"docs/accuracy-program/10-evaluation-protocol.md",
"docs/accuracy-program/11-baseline-benchmark.md",
"docs/accuracy-program/12-release-gates.md"
"docs/accuracy-program/12-release-gates.md",
"docs/accuracy-program/13-nested-mirror-retirement.md"
],
"evidence_root": "artifacts/evidence/accuracy/P1",
"evidence_manifest": "artifacts/evidence/accuracy/P1/evidence-manifest.json",
"latest_verification_evidence_manifest": "artifacts/evidence/accuracy/P1/evidence-manifest-20260830-verification.json",
"phase2_evidence_root": "artifacts/evidence/accuracy/P2",
"phase2_evidence_manifest": "artifacts/evidence/accuracy/P2/evidence-manifest.json",
"phase3_evidence_root": "artifacts/evidence/accuracy/P3",