Files
geointel/docs/accuracy-program/04-risk-register.md
T

23 KiB

GeoIntel Accuracy Improvement Program — risicoregister

  • Status: release blocked
  • Auditmoment: 2026-08-01
  • Scope: Belgium land en Belgische Noordzee, met de actieve building-detector beperkt tot zijn bewezen Mol/Kempen-scope

Beslissing en claimgrens

GeoIntel mag op basis van de huidige evidence niet als nationaal gevalideerd AI-systeem worden vrijgegeven en de scope van de actieve detector mag niet worden verruimd. De productie-adapter heeft op de Tower één echte tile op cuda:0 verwerkt, maar die smoke bewijst uitsluitend dat het model technisch kan laden en infereren. Hij bewijst geen nauwkeurigheid, calibratie of geografische generalisatie.

De volgende regels gelden totdat alle bijbehorende exit-evidence is vastgelegd:

  • geen nationale kwaliteitsclaim voor building detection;
  • geen promotie van v56, v58, v62, v66 of een afgeleid checkpoint;
  • geen wijziging van de actieve modelscope op basis van bestandsaanwezigheid of aggregate metrics;
  • geen productieclaim voor segmentatie of zonnepaneeldetectie;
  • geen verwijdering of overschrijving van bestaande datasets, checkpoints, evaluaties of auditbewijzen;
  • elke herstelling begint met een regressietest die het bewezen defect op de oude implementatie reproduceert.

Ernstclassificatie:

  • Critical: kan een plausibel maar ruimtelijk/inhoudelijk fout resultaat, een onterechte autoriteitsclaim of een besmet promotiebesluit veroorzaken;
  • High: blokkeert de nationale claim, reproduceerbaarheid of een betrouwbare releasebeslissing;
  • Medium: verzwakt assurance, onderhoudbaarheid of deploymentcontrole, maar is op zichzelf geen bewezen fout resultaat.

Alle risico's hieronder zijn open. Een controle telt pas als uitgevoerd wanneer de genoemde exit-evidence bestaat en door QA opnieuw is geverifieerd.

A. Ruimtelijke juistheid en bronautoriteit

ID Ernst Bewezen evidence Impact Owner Vereiste controle Exit-evidence
ACC-R01 Critical geojson_service.py behoudt bron-CRS-informatie, terwijl vector_feature_service.py geometrieën zonder transformatie als SRID 4326 schrijft. De runtime-snapshot vindt 4 detections met Belgische Lambert-coördinaten rond x=193k/y=205k maar SRID 4326; zie artifacts/evidence/accuracy/P1/tower-runtime-database-snapshot-detailed.json. Verkeerde kaartpositie, ruimtelijke predicates, clipping, export en coverage; resultaten kunnen geldig ogen maar buiten het EPSG:4326-domein liggen. GIS + Architecture Eén expliciet CRS-ingestcontract; gekende CRS transformeren naar canoniek 4326, onbekende CRS fail-closed weigeren; bestaande vier records quarantainen of herleiden vanuit tile-transform en bron-CRS. Unit- en PostGIS-integratietests voor EPSG:31370, EPSG:3812 en EPSG:4326; round-trip/extent-asserties; migratierapport met voor/na-ID's en zero outside_epsg4326_domain; geen stille datawijziging.
ACC-R02 Critical VectorOperationsService.buffer voert geometry.buffer(distance_m) uit op ongetransformeerde GeoJSON. Een 100 m-reproductie nabij Mol levert een span van circa 200 graden. Een meterparameter wordt als graden geïnterpreteerd; analysegebied en downstream-resultaten zijn materieel fout. GIS Bufferen in een geschikte metrische projectie/geography; bron- en doel-CRS en eenheden verplicht valideren; ongeschikte/ontbrekende CRS weigeren. Regressietest met een gekend punt/polygoon in Mol en geodetische toleranties; API-test voor onbekende CRS; PostGIS/Shapely-pariteit; bewijs dat 100 m geen graadbuffer meer oplevert.
ACC-R03 Critical CoverageRegistryService._matching_datasets voegt bbox-scopes toe vóór layer_matches en zone_matches. Een kleine buildingscope plus een volledige roadscope resulteert voor buildings ten onrechte in fully_covered=true. Verkeerde bron/thema-combinaties kunnen als operationeel en volledig gedekt verschijnen. Architecture + GIS Alleen scopes van datasets die bron, thema, layer en zone volledig matchen in de union opnemen; coverage per bronversie en thema isoleren. Regressietest voor mixed-theme/mixed-zone datasets; property-based tests voor monotoniciteit en bronisolatie; API-evidence dat de buildingscope in de reproductie fully_covered=false blijft.
ACC-R04 Critical De uploadroute accepteert caller-controlled source_name, reference_layer_name, source_metadata en provenance_metadata; coverage vertrouwt deze velden. Een upload kan zich als GRB/authoritative voordoen. Een handmatige upload kan de attributie, autoriteit en operationele dekking van een officiële bron erven. Architecture + Data Governance Server-owned source registry en trust class; user uploads altijd manual/untrusted; officiële identiteit uitsluitend via een governed acquisition adapter met immutable provider evidence; bestaande records classificeren. Security/regressietest die een forged GRB-upload uitvoert en manual/untrusted verwacht; migratie-audit van bestaande bronnen; API-response toont bronvertrouwen en kan geen officiële attribution injecteren.
ACC-R05 High Juridische coveragezones worden via mutable displaynamen (SCOPE_AREA_NAMES) bepaald. Dezelfde geometrie met Flanders versus Vlaanderen verandert de zonematch. Een hernoeming kan scope/coverage juridisch en operationeel veranderen zonder geometrische wijziging. Architecture + GIS Immutable area/zone code en geometry-backed containment gebruiken; displaynaam uitsluitend presentatie; grensgevallen expliciet modelleren. Rename-regressietest met identieke geometrie; zone-ID-migratie; grens- en Noordzee-tests; coverage-uitkomst blijft naam-onafhankelijk.
ACC-R06 Critical De YOLO-validatiescope wordt afgedwongen via substringmatching op de mutable Area.name. Een gebied buiten Mol met naam Mol validation bypass wordt aanvaard. Inferentie kan buiten de bewezen modelscope worden uitgevoerd en als ondersteund worden gepresenteerd. AI + GIS + Architecture Scope koppelen aan immutable geometry/zone-ID en model-card scope polygon; volledige containment/intersection-policy vastleggen; lege geometrie en naammatch nooit voldoende. Negatieve API/service-tests voor spoofnaam, lege geometry en deels overlappende AOI; positieve Mol/Kempen-tests; scope-evidence bevat modelhash, scope-ID en spatial predicate.
ACC-R07 High Area PATCH documenteert geometry-wijziging, maar het schema verwerkt enkel naam/CRS en negeert extra geometry; CRS kan los van de geometry worden herschreven. API kan 200 retourneren zonder gevraagde geometry-update of coördinaten fout labelen. Architecture + GIS Extra velden verbieden; contract en implementatie gelijkmaken; CRS alleen wijzigen via gevalideerde transformatie, niet via relabeling. Contracttest met geometry PATCH; unknown-field 422-test; CRS-transformtest; OpenAPI-contract en implementatie tonen hetzelfde gedrag.
ACC-R08 High Clip/buffer/intersect roepen _persist_derived_dataset aan met persist_vector_features=false; een dataset kan ready zijn zonder querybare PostGIS-features, volledige provenance of atomaire AnalysisRun-koppeling. Downstreamanalyse ziet een gereed artefact dat niet betrouwbaar querybaar/reproduceerbaar is; partial commits zijn mogelijk. Architecture + GIS Eén transactie voor AnalysisRun, DatasetVersion, vector_features en lineage; processing tot artifact én PostGIS-persist voltooid zijn; failure rollback/fail-closed. Integratietests per operatie, inclusief geïnjecteerde write failure; zero ready-derived datasets zonder features; lineage-query van inputhash tot output; transactie-evidence.

B. Dataset-, split- en labelintegriteit

ID Ernst Bewezen evidence Impact Owner Vereiste controle Exit-evidence
ACC-R09 Critical De training-orchestrator evalueert iedere iteratie op calibration, test en background. build_failure_driven_yolo_sampling.py gebruikt vervolgens assessment.get("test") bij het wegen van de volgende training en registreert test als failure source. De protected test stuurt training; daardoor is hij geen onafhankelijke eenmalige release-evaluatie meer. AI + QA Orchestrator in twee fysiek/logisch gescheiden paden splitsen: iteratie mag alleen train/val/calibration lezen; test/background-test blijven verzegeld tot kandidaat, threshold en gates zijn bevroren. Sampler moet ieder testartefact of protected sample weigeren. Canary-tests met protected IDs; file-access/auditlog bewijst nul testreads vóór freeze; sampler-test faalt op test-input; één gesigneerd test-open event voor exact één modelhash/config; geen verdere training in die candidate family na opening.
ACC-R10 High V56 rapporteert een minimale cross-split AOI-afstand van 95,72 m en 24 cross-splitparen onder 2 km. Dat bewijst geen overlap, maar wel dat de vereiste buffer groter dan maximale tile-context nog niet is aangetoond. Nabije context, dezelfde bebouwing of providerseams kunnen validatie/calibratie/test correleren met training. GIS + AI + QA Splittoewijzing op gebufferde AOI's vóór tiling; buffer afleiden uit tilecontext/resolutie; instance-, bronbeeld- en perceptuele near-duplicatecontrole. Immutable split-audit met minimumafstand ≥ bevroren contextbuffer, zero intersecties, zero gedeelde feature-ID's/checksums/near-dupes en kaartbewijs per dichtste paar.
ACC-R11 High Het v56 operator-manifest heeft 180 AOI's maar reviewed=0/180; de productie-DB telt 0 detection_reviews. Labelkwaliteit en representatieve fouten zijn niet door menselijke beoordeling afgesloten; automatische audits kunnen semantische mislabels niet bewijzen. QA + Data Governance Gestratificeerde menselijke review van label-contact-sheets door regio, context, provider, objectgrootte, dichte en moeilijke gevallen; beslissingen als immutable records met reviewer, tijd en reden. 100% van de vooraf geselecteerde reviewqueue beslist; zero unresolved critical/high label findings; manifest met review-ID's en hashes; inter-reviewer steekproef en getekende QA-beslissing.
ACC-R12 High V56 bevat slechts 3 pure-empty background-test-AOI's (Flanders 2, Wallonia 1, Brussels 0). V66 bevat slechts 3 Vlaamse train-AOI's. De achtergrond- en nationale claim is niet representatief voor alle regio's en contexten. AI + GIS + QA Nieuwe ruimtelijk onafhankelijke AOI's per regio/context; pure-empty én moeilijke negatieve voorbeelden voor alle regio's, waaronder Brussels; protected portfolios nooit naar training kopiëren. Corpus-compositiematrix voldoet aan het vooraf bevroren contract uit PYTORCH_TRAINING_ROADMAP_BELGIUM.md; elk vereist stratum heeft positieve/negatieve coverage; zero protected-to-train overlap; kaart/contact-sheet evidence.
ACC-R13 High V56: 31.452 inputfeatures, 30.662 geaccepteerd, 326 onder minimumresolutie en 464 post-imagery; 521 kleine labels en maximale aspectratio 103,67. V66 gebruikt imagery/labels met circa 575 dagen verschil. Onzichtbare, verouderde, te kleine of extreem gevormde labels veroorzaken fout-negatieven/positieven en onbetrouwbare boxtraining, met extra risico in dichte PICC/UrbIS-gebieden. GIS + AI + QA Per-provider tijdsrelatie en resolvability vastleggen; post-imagery/subpixel uitsluiten met reason code; extreme aspect/dense-cluster review; dak/footprint-displacement en PICC/UrbIS-regels bevriezen. Label-audit met accepted/rejected reason per feature; temporal matrix per AOI; zero unknown silent inclusion; alle extreme/dense reviewqueues gesloten; opnieuw gerenderde contact sheets en corpus-SHA.
ACC-R14 High V56-tiling telt 2.496 tiles en 60.229 labels, maar dataset-YAML/class/tile/stride-velden zijn afwezig of null in de auditketen. Het trainingsinputcontract kan niet exact worden gereconstrueerd of vergeleken; een checkpoint kan aan ambiguë preprocessing worden gekoppeld. AI + Data Engineering Eén verplicht manifest-schema met dataset-YAML SHA, class mapping, tile size, stride/overlap, nodata, normalization, augmentations, software/runtime en seed; schema fail-closed. JSON-schema-tests; volledige immutable manifest; alle artifacts hash-bound; clean-room export produceert identieke samplelijst/labels en gedocumenteerde byteverschillen waar bestandmetadata varieert.
ACC-R15 High Van 3.377 datasets missen 2.377 observed_at en 1.761 source_version; checksums, CRS, imported_at en provenancevelden zijn wel volledig. Tijd- en bronversievergelijkingen kunnen niet voor elke bronfamilie worden gereproduceerd; sommige misses kunnen legitiem zijn maar zijn nog niet geclassificeerd. Data Governance + Architecture Veldbeleid per bronfamilie: required, not_applicable of unknown_with_reason; backfill uitsluitend uit authoritative evidence; nooit downloadtijd als observatietijd invullen. Audit per source family met zero ongeclassificeerde ontbrekende waarden; migratie/backfillrapport; API toont unknown/not-applicable expliciet; checksums blijven ongewijzigd.

C. Modelvalidatie, metrics en runtime-lineage

ID Ernst Bewezen evidence Impact Owner Vereiste controle Exit-evidence
ACC-R16 Critical V58-calibratie bij confidence 0,15 geeft aggregate F1 0,5129, Brussels 0,6944, Wallonia 0,4674 en Flanders 0; er is geen protected-test-, background-test- of promotion-evidence. De actieve modelkaart blijft nationally_validated=false en Mol/Kempen-scoped. Aggregate score maskeert een volledige regionale failure; geen nationale kwaliteitsclaim of promotie is verdedigbaar. AI + QA Region/context macro- en worst-stratum gates vóór aggregate score; threshold alleen op calibration; actieve scope fail-closed behouden; geen status op basis van checkpointnaam. Bevroren gateconfig vóór test; calibrationrapport per regio/context/objectgrootte; alle gates pass; daarna pas eenmalige protected-test en promotion report voor exact model-SHA.
ACC-R17 Critical 1.146 persisted detection runs en 299.233 detections hebben een lege model_version; 3 runs missen modelhash; alle missen tile-manifest-SHA, runtime/hardware en seed. Resultaten kunnen niet eenduidig aan model, preprocessing en execution environment worden herleid; incidentanalyse en reproduceerbaarheid falen. Architecture + AI Verplicht immutable RunManifest vóór inference: model-ID/version/SHA, adapter/config, tile-manifest/SHA, dataset/version, CRS/transform, threshold/NMS/max_det, seed, runtime/container/GPU. Run weigeren als verplichte velden ontbreken. DB-migratie en schema constraints; contracttests; nieuwe run round-trip; reproduction op dezelfde tile/model/config; legacy records expliciet lineage_incomplete, nooit stil aangevuld.
ACC-R18 High Van 697 QA-samenvattingen zijn F1 en precision 58 keer null, mean IoU 90 keer null en recall 1 keer null. De no-overlap golden case geeft precision/recall 0 maar F1 null. Undefined, zero en not-computable worden door elkaar gebruikt; dashboards/gates kunnen failures overslaan. QA + Architecture Metricsemantiek per empty/empty, prediction-only, truth-only en no-match case bevriezen; status/reason naast waarde; gate-aggregator mag null niet negeren. Truth-table unit tests; migratie/classificatie van historische nulls; golden benchmark per case; promotion fails bij onverwachte null of ontbrekend stratum.
ACC-R19 High De GPU-smoke op één bestaande EPSG:31370-tile slaagt met active model SHA a9088…59c1, 17 detections en RTX 4080 SUPER, maar heeft geen ground truth en verklaart zelf geen accuracy/generalization claim. Technische beschikbaarheid kan onterecht als modelkwaliteit worden geïnterpreteerd. AI + QA Smoke strikt scheiden van evaluatie; UI/docs/status benoemen runtime_ready apart van validated_scope; geen promotie op smoke-resultaat. Contracttests voor statussen; model card toont afzonderlijk runtime-, calibration-, test- en scopebewijs; promotion code vereist alle hashes en gates.
ACC-R20 High De runtime heeft 0 segmentations en het gevalideerde segmentatiemodel ontbreekt; aanwezige assets zijn geen configuratie- of kwaliteitsbewijs. UI/API kan door bestandsaanwezigheid een niet-bewezen capability suggereren. AI + Frontend + QA Segmentatie en zonnepaneelmodellen blijven not_configured totdat hun eigen corpus, metrics, model card en releasepad slagen. End-to-end not_configured-tests; capability registry is evidence-driven; geen persisted outputs vóór aparte validatie/promotion.

D. Verificatie, foutafhandeling en deployment

ID Ernst Bewezen evidence Impact Owner Vereiste controle Exit-evidence
ACC-R21 High Met root/backend PYTHONPATH worden 1.197 tests verzameld: 1.180 pass en 17 falen. De gedocumenteerde backend-CI-aanroep faalt al bij collection doordat backend/scripts het rootpakket scripts overschaduwt. Een groene deelset kan een kapotte canonical testentrypoint of regressies verbergen. QA + Architecture Eén canonical testcommand vanuit repo-root; package shadowing verwijderen; stale source-text assertions vervangen door behavior tests; geen baseline-updating zonder contractreview. Volledige suite pass op CI-runtime én Tower-compatible image; exact command/exitcode/log vastgelegd; 17 regressies inhoudelijk geclassificeerd en opgelost.
ACC-R22 Medium Ruff rapporteert 112 issues (69 E702, 23 F401, 13 E402, 2 E701, 2 F811, 2 F841 en 1 F403). Frontend heeft geen lint script ondanks de teststrategie; typecheck, 51 Vitest-tests en build slagen wel. Dead imports/compact statements en ontbrekende frontendlint verhogen defectrisico; het formele QA-contract is niet uitvoerbaar zoals beschreven. QA + Frontend + Architecture Ruff-baseline gecontroleerd afbouwen; echte frontendlintconfig/script toevoegen; lint in CI; generated/legacy uitzonderingen expliciet en smal. ruff check en npm run lint pass; CI voert beide uit; bestaande typecheck/Vitest/build blijven groen.
ACC-R23 High Frontend detail/bootstrapfouten worden stil omgezet naar fallback/null; raster cache-open kan ondanks fout ready opleveren; secundaire detection/segmentation DB-markering kan worden ingeslikt. Gebruiker ziet oude, onvolledige of schijnbaar succesvolle output zonder zichtbare lineagebreuk. Frontend + Architecture + QA Error states expliciet en typed; stale/cache-status tonen; persistence-failure maakt run/dataset failed of incomplete; geen broad catch zonder telemetry en user-visible status. Fault-injectiontests per fallback; API/UI tonen correlation/run ID en retry; zero ready/success na verplichte persistence failure; structured logs/evidence.
ACC-R24 High Golden benchmark gebruikt UUID4 en meerdere trainingsscripts hebben onvolledig bevroren seed/runtimegedrag. Baselines en manifests zijn byte-onstabiel; reruns kunnen niet betrouwbaar worden vergeleken. QA + AI Deterministische IDs uit inhoud/hash, seed alle RNG's, deterministische algoritmen waar ondersteund, expliciete nondeterministische kernelregistratie en tolerantiebeleid. Twee clean-room reruns met identieke manifest/sample/split hashes; metrische verschillen binnen vooraf bevroren tolerantie; runtime/seed in RunManifest.
ACC-R25 High Lokale audit draait op Python 3.13/Node 24, CI op Python 3.11/Node 20. Compose default verwijst naar cu130, deployment naar cu128; CI bouwt alleen AI-disabled en valideert CUDA/AI-dependencies niet. Tower gebruikt PyTorch 2.11.0+cu128 en Ultralytics 8.4.99. Een image kan lokaal/CPU slagen en op de GPU-runtime falen of een andere dependencyset gebruiken. DevOps + AI + QA Eén pinned AI build path en lock/SBOM; CI bouwt CPU-contract én GPU-image; Tower preflight valideert exacte torch/CUDA/Ultralytics/modelhash; geen CPU-fallback voor training. Image digest + SBOM; build/test logs voor AI-enabled image; cuda:0 preflight en bounded inference op RTX 4080; runtimeversies exact in release manifest.
ACC-R26 Medium De repo bevat een tracked geneste geointel/-kopie met 1.153 files en 68 afwijkende root/mirror-paren, plus grote tracked audit/inputartefacten. .dockerignore sluit de geneste mirror wel uit. Lokale tooling/imports kunnen de verkeerde kopie analyseren; review en branchgrootte worden onnodig ambigu. Architecture + DevOps Canonieke root expliciet afdwingen; mirror in P2 via afzonderlijke, reviewbare migratie inventariseren en pas na bewijs archiveren/verwijderen; artifact-retentiebeleid. CI-test faalt bij nieuwe root/mirrorduplicatie; nul ambigue importpaden; migratiemanifest met hashes en herstelpad; runtime image blijft rootcode gebruiken.
ACC-R27 High Tower checkout staat op main, loopt 67 commits vóór de stale origin/main en bevat untracked runtime-evidence/cache. Deploybron en remote history zijn niet eenduidig; rollback/restore kan een andere codebasis opleveren. DevOps + Architecture Deployment uitsluitend vanaf gepushte immutable commit/tag en image digest; servercheckout niet als bron van waarheid; untracked runtime data buiten source tree of expliciet gemount. Push/commit ancestrybewijs; deployment manifest met commit+digest+config; clean source checkout; rollbacktest naar vorige digest zonder dataverlies.
ACC-R28 Medium PostGIS meldt versie 3.6.4, maar core/topology procedures uit 3.4.3 “need upgrade”. Ruimtelijke functiegedrag/migraties kunnen per omgeving afwijken en upgrades kunnen onverwacht falen. Architecture + GIS + DevOps Extension-upgradepad in restorebare stagingdatabase; functieversie/preflight in deployment; geen in-place productie-upgrade zonder backup en dry-run. Restoretest, ALTER EXTENSION-dry-run/resultaat, PostGIS regression suite en versie-evidence vóór/na; rollbackprocedure getest.
ACC-R29 Medium API-contract, implementation gap docs, preflightvoorbeelden en actieve runtimeversies spreken elkaar op meerdere plaatsen tegen. Operators en agents kunnen verouderde instructies volgen of capabilities overclaimen. Architecture + QA Docs genereren/valideren tegen OpenAPI, migrations, capability registry en runtime manifest; stale claims verwijderen met behoud van historisch bewijs. Doc-contracttests; alle versies/scopes uit één bron; accuracy-program en operator README verwijzen naar actuele model card en release status.

Positieve controles die behouden moeten blijven

Deze bevindingen verlagen de bovenstaande risico's niet, maar zijn bewezen onderdelen waarop Phase 2 kan voortbouwen:

  • Tower ziet een NVIDIA GeForce RTX 4080 SUPER; PyTorch CUDA is beschikbaar en de productie-adapter heeft één bounded, read-only inference uitgevoerd.
  • Alle 3.377 datasets hebben checksum, CRS, imported-at en source/provenance metadata; alle 1.671 DatasetVersions hebben checksum, storage path en metadata.
  • De database-audit vond geen ontbrekende directe storage references in de gecontroleerde set.
  • Areas en vector_features hebben in de runtime-snapshot geen invalid, empty of wrong-SRID geometrieën; de vier detection-afwijkingen blijven afzonderlijk releaseblokkerend.
  • API/OpenAPI-, GIS-, AI-contract-, migratie-, frontend typecheck/Vitest/build- en gerichte testgroepen slaagden; de volledige canonical gate blijft desondanks rood door ACC-R21/22.

Risicoacceptatie

Geen Critical-risico is accepteerbaar voor promotie of scopeverruiming. Een High-risico kan alleen door een expliciete, tijdgebonden operatorbeslissing worden geaccepteerd wanneer het geen accuracy-, bronautoriteits-, split- of lineagegate omzeilt. Zo'n uitzondering moet het risico-ID, bereik, eigenaar, rollback en bewijs bevatten. Ontbrekende evidence telt als een gefaalde gate, niet als “niet van toepassing”.