feat(accuracy): complete phase 3 data scan and quarantine

This commit is contained in:
Jens
2026-08-02 01:06:35 +02:00
parent 41f8a54236
commit 7b92e29e49
13 changed files with 37368 additions and 6 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,372 @@
{
"anomaly_category_counts": {
"freshness.missing": 9,
"lineage.missing": 58,
"manifest.zero_bbox": 6,
"raster.unreadable": 96,
"scope.unreachable": 3
},
"datasets": {
"geointel.artifact.generic": {
"anomaly_count": 57,
"item_count": 106,
"paths": [
"artifacts/codex-review/v31/contact_sheet_001.png",
"artifacts/codex-review/v31/qa.json",
"artifacts/codex-review/v33-flanders/candidate_error_contact_sheet.png",
"artifacts/codex-review/v33-flanders/genk.png",
"artifacts/codex-review/v33-flanders/lokeren.png",
"artifacts/codex-review/v33-flanders/ostend.png",
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T130251Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T130251Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T154642Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T163116Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T205442Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T210556Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T213357Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T213707Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T214300Z/summary/detection-calibration-summary.json",
"artifacts/evidence/accuracy/P1/alembic-heads.txt",
"artifacts/evidence/accuracy/P1/alembic-offline-upgrade.sql",
"artifacts/evidence/accuracy/P1/backend-ci-entrypoint.txt",
"artifacts/evidence/accuracy/P1/backend-full-suite.junit.xml",
"artifacts/evidence/accuracy/P1/backend-full-suite.txt",
"artifacts/evidence/accuracy/P1/commands-and-results.md",
"artifacts/evidence/accuracy/P1/frontend-build.txt",
"artifacts/evidence/accuracy/P1/frontend-lint.txt",
"artifacts/evidence/accuracy/P1/frontend-typecheck.txt",
"artifacts/evidence/accuracy/P1/frontend-vitest-unit.txt",
"artifacts/evidence/accuracy/P1/frontend-vitest.txt",
"artifacts/evidence/accuracy/P1/golden-qa-run-1.json",
"artifacts/evidence/accuracy/P1/golden-qa-run-2.json",
"artifacts/evidence/accuracy/P1/local-artifact-inventory.json",
"artifacts/evidence/accuracy/P1/openapi-contract-audit.txt",
"artifacts/evidence/accuracy/P1/phase1-tooling-tests.txt",
"artifacts/evidence/accuracy/P1/repository-ruff-baseline.json",
"artifacts/evidence/accuracy/P1/repository-ruff-baseline.txt",
"artifacts/evidence/accuracy/P1/static-risk-signals.json",
"artifacts/model-review/building-be-v1-candidate/corpus-spec.json",
"artifacts/model-review/building-be-v1-pilot/corpus-spec.json",
"artifacts/v42-review/contact_sheet_001.png",
"datasets/.gitkeep",
"datasets/cache/.gitkeep",
"datasets/processed/.gitkeep",
"datasets/raw/.gitkeep",
"output/pdf/geointel-case-study.pdf",
"storage/.gitkeep",
"storage/derived/README.md",
"storage/exports/README.md",
"storage/masks/.gitkeep",
"storage/masks/README.md",
"storage/models/README.md",
"storage/originals/README.md",
"storage/reports/.gitkeep",
"storage/tiles/.gitkeep",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/manifest.json",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/manifest.json",
"storage/tiles/README.md",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/manifest.json",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/manifest.json",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/manifest.json",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/manifest.json",
"storage/uploads/.gitkeep"
],
"severity_counts": {
"major": 56,
"minor": 1
}
},
"geointel.database.sqlite": {
"anomaly_count": 0,
"item_count": 27,
"paths": [
"data/browser-verify.db",
"data/browser-verify.db-shm",
"data/browser-verify.db-wal",
"data/codex-sidebar-qa.db",
"data/codex-sidebar-qa.db-shm",
"data/codex-sidebar-qa.db-wal",
"data/dockdeck.db",
"data/dockdeck.db-shm",
"data/dockdeck.db-wal",
"data/e2e-canon-v1.db",
"data/e2e-canon-v1.db-shm",
"data/e2e-canon-v1.db-wal",
"data/e2e.db",
"data/e2e.db-shm",
"data/e2e.db-wal",
"data/visual-audit.db",
"data/visual-audit.db-shm",
"data/visual-audit.db-wal",
"data/visual-followup.db",
"data/visual-followup.db-shm",
"data/visual-followup.db-wal",
"data/visual-stitch-direct.db",
"data/visual-stitch-direct.db-shm",
"data/visual-stitch-direct.db-wal",
"data/wallpaper-editor-audit.db",
"data/wallpaper-editor-audit.db-shm",
"data/wallpaper-editor-audit.db-wal"
],
"severity_counts": {}
},
"geointel.external.unavailable": {
"anomaly_count": 3,
"item_count": 3,
"paths": [
"external://mounted-model-volumes",
"external://production-postgis-or-api",
"external://tower-corpora"
],
"severity_counts": {
"critical": 3
}
},
"geointel.manifest.json": {
"anomaly_count": 3,
"item_count": 13,
"paths": [
"artifacts/evidence/accuracy/P1/evidence-manifest.json",
"artifacts/evidence/accuracy/P1/forensic-reproductions.json",
"artifacts/evidence/accuracy/P1/golden-qa-reproducibility.json",
"artifacts/evidence/accuracy/P1/phase1-baseline-summary.json",
"artifacts/evidence/accuracy/P1/repository-inventory.json",
"artifacts/evidence/accuracy/P1/tower-gpu-inference-smoke.json",
"artifacts/evidence/accuracy/P1/tower-key-artifact-hashes.json",
"artifacts/evidence/accuracy/P1/tower-ml-data-lineage-snapshot.json",
"artifacts/evidence/accuracy/P1/tower-runtime-database-snapshot-detailed.json",
"artifacts/evidence/accuracy/P1/tower-runtime-database-snapshot.json",
"artifacts/evidence/accuracy/P2/evidence-manifest.json",
"artifacts/evidence/accuracy/P2/postgres-migration-guards.json",
"artifacts/evidence/accuracy/P2/source-contract-inventory.json"
],
"severity_counts": {
"minor": 3
}
},
"geointel.model.pytorch": {
"anomaly_count": 0,
"item_count": 6,
"paths": [
"artifacts/model-review/building-be-v1-pilot/building-be-v2-background.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-cal.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-contact.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-test.png",
"artifacts/model-review/building-be-v1-pilot/contact_sheet_001.png",
"models/.gitkeep"
],
"severity_counts": {}
},
"geointel.raster.geotiff": {
"anomaly_count": 101,
"item_count": 135,
"paths": [
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0000.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0001.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0002.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0003.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0004.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0005.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0006.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0007.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0008.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0009.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0010.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0011.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0012.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0013.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0014.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0015.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0000.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0001.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0002.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0003.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0004.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0005.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0006.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0007.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0008.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0009.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0010.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0011.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0012.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0013.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0014.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0015.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0000.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0001.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0002.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0003.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0004.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0005.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0006.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0007.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0008.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0009.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0010.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0011.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0012.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0013.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0014.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0015.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0000.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0001.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0002.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0003.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0004.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0005.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0006.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0007.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0008.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0009.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0010.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0011.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0012.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0013.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0014.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0015.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0000.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0001.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0002.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0003.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0004.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0005.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0006.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0007.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0008.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0009.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0010.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0011.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0012.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0013.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0014.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0015.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0000.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0001.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0002.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0003.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0004.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0005.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0006.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0007.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0008.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0009.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0010.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0011.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0012.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0013.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0014.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0015.tif",
"storage/uploads/11728f6a-eb5a-4b0d-93fa-67ad72c42de1/raster/44c082f5-8a91-4c8b-896a-1d04dee96f23/44c082f5-8a91-4c8b-896a-1d04dee96f23_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/176f3d22-cc4b-4289-91bd-2188d94b5f88/raster/f8f4c138-09f5-436d-b928-17d39ba4ad78/f8f4c138-09f5-436d-b928-17d39ba4ad78_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/267e7728-3375-4dab-ac08-ca926e2ed0af/raster/75dcd36c-ad7d-48e4-ab75-5815741cba52/75dcd36c-ad7d-48e4-ab75-5815741cba52_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/279517c3-2aa0-4400-a9df-2b13304a372d/raster/fec4ecd1-50b2-4f69-88e7-1aa9050b1449/fec4ecd1-50b2-4f69-88e7-1aa9050b1449_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/2c299dfe-d595-4d98-ace2-4535edc4e334/raster/4a12678b-dfa2-4733-84c3-3a3ed7c0e4fc/4a12678b-dfa2-4733-84c3-3a3ed7c0e4fc_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/2ec38b76-39e2-4599-9140-02f73b86fd9c/raster/647c28f3-d4ea-492f-8d78-721dd4f310b9/647c28f3-d4ea-492f-8d78-721dd4f310b9_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/2edf5b13-3cdd-4076-a867-4c9a769efde3/raster/5a22fbb7-0ae1-455f-9c35-897513329474/5a22fbb7-0ae1-455f-9c35-897513329474_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/30e69368-3047-4131-9a49-137351db5848/raster/f770f213-a474-4a0a-bed0-aca6d9238ed1/f770f213-a474-4a0a-bed0-aca6d9238ed1_dhmvii_terrain_5m_abefd0caf44e.tif",
"storage/uploads/38c66d6d-21e7-41d0-b128-5e6c4de44fd1/raster/64993e00-638e-4f70-805f-7d70af76639e/64993e00-638e-4f70-805f-7d70af76639e_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/4a19ce8e-7d4d-4b24-a367-91d51f7cd23e/raster/ee196aa8-1f81-48d0-ac6f-875d2d46b2c9/ee196aa8-1f81-48d0-ac6f-875d2d46b2c9_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/56ca45b4-f5ce-463b-aa1e-28b3dfe710aa/raster/94818d6a-0967-41b5-9e0b-fa1ec9eec375/94818d6a-0967-41b5-9e0b-fa1ec9eec375_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/5c7c7d21-ae80-42d7-9124-f0a2f7a9de0d/raster/869c62b2-4471-4cf1-90f4-258d33703f0f/869c62b2-4471-4cf1-90f4-258d33703f0f_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/6abbf506-a386-4451-8cd9-d595bc995d51/raster/76b6fcf4-29d4-4906-8687-a46bfe16be63/76b6fcf4-29d4-4906-8687-a46bfe16be63_dhmvii_terrain_5m_25afc05778f0.tif",
"storage/uploads/6c1e7199-0c77-4a4c-aabb-1d3e85dc37e9/raster/53a5e6f0-a636-482f-8db9-ff436b571a5b/53a5e6f0-a636-482f-8db9-ff436b571a5b_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/81f3e3be-b697-4be8-8687-0f7e2ecde66c/raster/20ac78ed-ac11-4c8d-8e3d-e12e63b1168e/20ac78ed-ac11-4c8d-8e3d-e12e63b1168e_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/841e1743-ac27-47fb-8bdb-3534174318b7/raster/9966c6ec-84bc-4ff2-95c9-38ca1e044100/9966c6ec-84bc-4ff2-95c9-38ca1e044100_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/8435a148-926b-4893-bca4-f14088ff9e91/raster/efd5b6d3-8b04-4604-b5b4-a655692ebdf7/efd5b6d3-8b04-4604-b5b4-a655692ebdf7_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/846f386f-7de5-408e-97ca-a959ea77b85a/raster/de196775-a18a-443f-8dd8-b4711d833718/de196775-a18a-443f-8dd8-b4711d833718_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/84c06c15-1e81-4868-b0d9-463ebfcfd6f8/raster/0588f638-ab05-4bf5-afdc-180865daaac0/0588f638-ab05-4bf5-afdc-180865daaac0_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/85848647-9de9-4301-af8c-5a60172592c2/raster/a872343d-99d1-44d4-b902-ea51164f0f43/a872343d-99d1-44d4-b902-ea51164f0f43_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/863ecd80-0460-4616-be17-254b3490da0c/raster/0e3ccea6-778a-497b-b06f-32f9a7e057ff/0e3ccea6-778a-497b-b06f-32f9a7e057ff_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/8b82b43a-f930-4b32-bc8e-3d4b97b414b5/raster/4f6ec145-964f-4319-ae2c-8e608ab6b67c/4f6ec145-964f-4319-ae2c-8e608ab6b67c_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/8ff71c9c-7c29-41ce-90e9-40a9bfda2d83/raster/02078e14-257a-4f33-8daf-118ce484750d/02078e14-257a-4f33-8daf-118ce484750d_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/959b29e4-73e3-4547-932d-92b9e1bf2765/raster/384af674-fe5d-450a-b97a-eac04a262d1c/384af674-fe5d-450a-b97a-eac04a262d1c_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/96cc3f03-7561-483d-8ea8-3d929df367bc/raster/900b6852-f0e5-4be7-8306-9e04e3702be0/900b6852-f0e5-4be7-8306-9e04e3702be0_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/ba0af3d9-0da5-4c0e-be2c-a73506984e1f/raster/af25ec42-9f70-4b0b-b806-fe3470c7eccd/af25ec42-9f70-4b0b-b806-fe3470c7eccd_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/ba76feb5-73df-4c44-be81-565bc3032771/raster/92e1873c-3d7c-4a1c-948b-0f3142c82d6e/92e1873c-3d7c-4a1c-948b-0f3142c82d6e_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/bf96b94e-01aa-4912-9286-75a318cfc2ab/raster/12441c43-80db-43d6-bebf-8e4ff2207338/12441c43-80db-43d6-bebf-8e4ff2207338_dhmvii_terrain_5m_fc9d87c14310.tif",
"storage/uploads/c7b8d026-525a-4c20-a542-1e032a023beb/raster/bdc6890b-3239-4dba-aa9e-24da48c55b05/bdc6890b-3239-4dba-aa9e-24da48c55b05_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/c9c03052-367d-48a1-8701-9631c06577e9/raster/cc1533a4-cad2-449a-91f4-e4b50ec85735/cc1533a4-cad2-449a-91f4-e4b50ec85735_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/dc9c3675-9b75-45f1-ab6f-f3763975e82a/raster/a8e1eb42-29a6-4223-8597-f59a67fc1241/a8e1eb42-29a6-4223-8597-f59a67fc1241_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/e0b846df-079e-4795-aaae-e78e49d9bb5f/raster/abf358fe-3e27-40ab-9db1-83282b139627/abf358fe-3e27-40ab-9db1-83282b139627_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/e992d4a1-43d6-4a8c-984d-fd1330c42e7d/raster/cdb7d1f5-4401-428f-b4d3-6b1c770c83de/cdb7d1f5-4401-428f-b4d3-6b1c770c83de_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/eddb4c16-b8ab-4a58-a8b1-2562876b23dc/raster/6539c8d0-5829-47be-ab07-723f820c6d9e/6539c8d0-5829-47be-ab07-723f820c6d9e_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/f08f59f9-1057-4c64-b08d-dc831a0d4f47/raster/167e9992-0c2a-4883-866e-292640442470/167e9992-0c2a-4883-866e-292640442470_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/f0f5dcaf-b7a1-47bb-9e44-29cf2346b624/raster/81794c04-99f0-453e-9121-04501db1e234/81794c04-99f0-453e-9121-04501db1e234_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/f519c785-4d88-4974-9d64-d178b535ec14/raster/625af5b7-5d50-47c9-854f-8bb9a12ad1e9/625af5b7-5d50-47c9-854f-8bb9a12ad1e9_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/f7e7ba0c-e490-46c8-8467-28c9176ede55/raster/771bf37d-424a-4e56-98a5-35657f52674c/771bf37d-424a-4e56-98a5-35657f52674c_dhmvii_terrain_5m_9cde89f97e71.tif",
"storage/uploads/fead1267-e2f8-4e25-af69-9333665e87e7/raster/4c2100cd-b167-4494-bfd4-78a378d3423c/4c2100cd-b167-4494-bfd4-78a378d3423c_dhmvii_terrain_5m_a193c984774e.tif"
],
"severity_counts": {
"critical": 96,
"minor": 5
}
},
"geointel.vector.geojson": {
"anomaly_count": 8,
"item_count": 8,
"paths": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence.geojson"
],
"severity_counts": {
"major": 8
}
}
},
"scan_id": "p3-46ee3f8d3a2dc52b",
"schema_version": 1
}
@@ -0,0 +1,296 @@
{
"exact_duplicate_groups": {
"0f30086654800d198ce924c1ba206311ce51d135adc7962f7dbf6a129aac3afd": [
"artifacts/detection-calibration-smoke/20260801T130251Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T154642Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T163116Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T205442Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T210556Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T213357Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T213707Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T214300Z/mock-bin/curl"
],
"1bdb757fbea0a5bb4d6beeff8b2674b2a18636f6084bb6dc0be47947713c9abe": [
"storage/uploads/56ca45b4-f5ce-463b-aa1e-28b3dfe710aa/raster/94818d6a-0967-41b5-9e0b-fa1ec9eec375/94818d6a-0967-41b5-9e0b-fa1ec9eec375_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/6c1e7199-0c77-4a4c-aabb-1d3e85dc37e9/raster/53a5e6f0-a636-482f-8db9-ff436b571a5b/53a5e6f0-a636-482f-8db9-ff436b571a5b_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/84c06c15-1e81-4868-b0d9-463ebfcfd6f8/raster/0588f638-ab05-4bf5-afdc-180865daaac0/0588f638-ab05-4bf5-afdc-180865daaac0_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/863ecd80-0460-4616-be17-254b3490da0c/raster/0e3ccea6-778a-497b-b06f-32f9a7e057ff/0e3ccea6-778a-497b-b06f-32f9a7e057ff_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/8b82b43a-f930-4b32-bc8e-3d4b97b414b5/raster/4f6ec145-964f-4319-ae2c-8e608ab6b67c/4f6ec145-964f-4319-ae2c-8e608ab6b67c_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/959b29e4-73e3-4547-932d-92b9e1bf2765/raster/384af674-fe5d-450a-b97a-eac04a262d1c/384af674-fe5d-450a-b97a-eac04a262d1c_orthofoto_wallonia_latest_55037acc9066.tif",
"storage/uploads/dc9c3675-9b75-45f1-ab6f-f3763975e82a/raster/a8e1eb42-29a6-4223-8597-f59a67fc1241/a8e1eb42-29a6-4223-8597-f59a67fc1241_orthofoto_wallonia_latest_55037acc9066.tif"
],
"337291cb4e2ad0c240c23eec8ccf71e3e8b8656138559c56c35760e01f543cce": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence_review.html"
],
"3c92c7f50b3c6a29f888756a826d0d1350d00d63125afc864b5b21e60289d325": [
"artifacts/codex-review/v33-flanders/candidate_error_contact_sheet.png",
"artifacts/codex-review/v33-flanders/ostend.png"
],
"4d3e35cd4dfe0834262ab2f55707f088d55409188952b75d34ad2d1b9588b19f": [
"storage/uploads/267e7728-3375-4dab-ac08-ca926e2ed0af/raster/75dcd36c-ad7d-48e4-ab75-5815741cba52/75dcd36c-ad7d-48e4-ab75-5815741cba52_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/279517c3-2aa0-4400-a9df-2b13304a372d/raster/fec4ecd1-50b2-4f69-88e7-1aa9050b1449/fec4ecd1-50b2-4f69-88e7-1aa9050b1449_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/4a19ce8e-7d4d-4b24-a367-91d51f7cd23e/raster/ee196aa8-1f81-48d0-ac6f-875d2d46b2c9/ee196aa8-1f81-48d0-ac6f-875d2d46b2c9_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/ba0af3d9-0da5-4c0e-be2c-a73506984e1f/raster/af25ec42-9f70-4b0b-b806-fe3470c7eccd/af25ec42-9f70-4b0b-b806-fe3470c7eccd_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/c9c03052-367d-48a1-8701-9631c06577e9/raster/cc1533a4-cad2-449a-91f4-e4b50ec85735/cc1533a4-cad2-449a-91f4-e4b50ec85735_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/e0b846df-079e-4795-aaae-e78e49d9bb5f/raster/abf358fe-3e27-40ab-9db1-83282b139627/abf358fe-3e27-40ab-9db1-83282b139627_orthofoto_brussels_latest_11e481d05ce6.tif",
"storage/uploads/f519c785-4d88-4974-9d64-d178b535ec14/raster/625af5b7-5d50-47c9-854f-8bb9a12ad1e9/625af5b7-5d50-47c9-854f-8bb9a12ad1e9_orthofoto_brussels_latest_11e481d05ce6.tif"
],
"7cd6465f34b9d27859fc137bdb1d037d65effc9ac1c05889cc537dddd126fbd0": [
"storage/uploads/30e69368-3047-4131-9a49-137351db5848/raster/f770f213-a474-4a0a-bed0-aca6d9238ed1/f770f213-a474-4a0a-bed0-aca6d9238ed1_dhmvii_terrain_5m_abefd0caf44e.tif",
"storage/uploads/6abbf506-a386-4451-8cd9-d595bc995d51/raster/76b6fcf4-29d4-4906-8687-a46bfe16be63/76b6fcf4-29d4-4906-8687-a46bfe16be63_dhmvii_terrain_5m_25afc05778f0.tif",
"storage/uploads/bf96b94e-01aa-4912-9286-75a318cfc2ab/raster/12441c43-80db-43d6-bebf-8e4ff2207338/12441c43-80db-43d6-bebf-8e4ff2207338_dhmvii_terrain_5m_fc9d87c14310.tif",
"storage/uploads/f7e7ba0c-e490-46c8-8467-28c9176ede55/raster/771bf37d-424a-4e56-98a5-35657f52674c/771bf37d-424a-4e56-98a5-35657f52674c_dhmvii_terrain_5m_9cde89f97e71.tif",
"storage/uploads/fead1267-e2f8-4e25-af69-9333665e87e7/raster/4c2100cd-b167-4494-bfd4-78a378d3423c/4c2100cd-b167-4494-bfd4-78a378d3423c_dhmvii_terrain_5m_a193c984774e.tif"
],
"8498d0b9823d6b4f6d8b338e62c10b10e76fdd5e5b58cd3d0a16256eb527c5ff": [
"storage/uploads/11728f6a-eb5a-4b0d-93fa-67ad72c42de1/raster/44c082f5-8a91-4c8b-896a-1d04dee96f23/44c082f5-8a91-4c8b-896a-1d04dee96f23_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/176f3d22-cc4b-4289-91bd-2188d94b5f88/raster/f8f4c138-09f5-436d-b928-17d39ba4ad78/f8f4c138-09f5-436d-b928-17d39ba4ad78_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/2ec38b76-39e2-4599-9140-02f73b86fd9c/raster/647c28f3-d4ea-492f-8d78-721dd4f310b9/647c28f3-d4ea-492f-8d78-721dd4f310b9_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/5c7c7d21-ae80-42d7-9124-f0a2f7a9de0d/raster/869c62b2-4471-4cf1-90f4-258d33703f0f/869c62b2-4471-4cf1-90f4-258d33703f0f_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/841e1743-ac27-47fb-8bdb-3534174318b7/raster/9966c6ec-84bc-4ff2-95c9-38ca1e044100/9966c6ec-84bc-4ff2-95c9-38ca1e044100_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/8435a148-926b-4893-bca4-f14088ff9e91/raster/efd5b6d3-8b04-4604-b5b4-a655692ebdf7/efd5b6d3-8b04-4604-b5b4-a655692ebdf7_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/846f386f-7de5-408e-97ca-a959ea77b85a/raster/de196775-a18a-443f-8dd8-b4711d833718/de196775-a18a-443f-8dd8-b4711d833718_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/ba76feb5-73df-4c44-be81-565bc3032771/raster/92e1873c-3d7c-4a1c-948b-0f3142c82d6e/92e1873c-3d7c-4a1c-948b-0f3142c82d6e_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/c7b8d026-525a-4c20-a542-1e032a023beb/raster/bdc6890b-3239-4dba-aa9e-24da48c55b05/bdc6890b-3239-4dba-aa9e-24da48c55b05_orthofoto_most_recent_f86fd02984f0.tif",
"storage/uploads/eddb4c16-b8ab-4a58-a8b1-2562876b23dc/raster/6539c8d0-5829-47be-ab07-723f820c6d9e/6539c8d0-5829-47be-ab07-723f820c6d9e_orthofoto_most_recent_f86fd02984f0.tif"
],
"8b668b8994aa845107399994593d0ca831520be5257f005351a0ec13e97a39be": [
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0000.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0001.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0002.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0003.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0004.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0005.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0006.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0007.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0008.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0009.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0010.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0011.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0012.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0013.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0014.tif",
"storage/tiles/277180a4-cd74-42ed-a231-0d194b3fca9f/0f96a4f7-6b24-4969-9564-abbde30b5a51/9199f079-42fc-48cc-86ff-d1072f801932/tile_0015.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0000.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0001.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0002.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0003.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0004.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0005.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0006.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0007.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0008.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0009.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0010.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0011.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0012.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0013.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0014.tif",
"storage/tiles/7175ae58-2b09-4fab-83e1-5d95e2969d35/07738ebe-2c5e-4d6c-960d-1c03f216a3a0/7529e658-b42a-47cb-a23c-d9d350b5d8c4/tile_0015.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0000.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0001.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0002.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0003.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0004.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0005.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0006.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0007.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0008.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0009.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0010.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0011.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0012.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0013.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0014.tif",
"storage/tiles/a7a94d0b-9b27-49bd-9e44-97b0b75677ad/e2a3f62a-76f0-4611-81a3-d2ca948cda75/6e53d525-f603-4eb3-8bf7-05da59832013/tile_0015.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0000.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0001.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0002.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0003.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0004.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0005.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0006.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0007.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0008.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0009.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0010.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0011.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0012.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0013.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0014.tif",
"storage/tiles/b9a1e970-d028-4b71-9ff1-709e416d4424/c0fc6968-9c5b-499f-a095-0fc91a18501d/3edda109-2f4f-4913-b242-2b08d33841dc/tile_0015.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0000.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0001.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0002.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0003.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0004.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0005.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0006.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0007.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0008.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0009.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0010.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0011.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0012.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0013.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0014.tif",
"storage/tiles/db240e97-188d-48fd-98f3-7abd9131ffeb/2df0e426-f569-459f-a4ad-d3f42539bc23/f31826fa-10e3-4154-95c2-d89d21813379/tile_0015.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0000.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0001.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0002.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0003.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0004.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0005.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0006.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0007.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0008.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0009.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0010.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0011.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0012.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0013.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0014.tif",
"storage/tiles/df217a4e-7f2e-4989-880e-30fb9a7ec645/f6848732-1f78-41ba-967c-11a577112b17/5e0d5f61-e7fb-4d4a-ae96-84b9060554d6/tile_0015.tif"
],
"933652de4fa1a791cb987686c19b3cadb8d4d690f20ff19d8084045725a4cd9e": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p35_qc-high_evidence_response.json"
],
"b333c6dab3a9d3a836294139c03892e28946213865992cd1209e4094723c36c3": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence.geojson"
],
"b5ec8c63c5bec5c754995b148bdcc44b40c63a034e2fe333e7d78fe9ac255abb": [
"storage/uploads/2c299dfe-d595-4d98-ace2-4535edc4e334/raster/4a12678b-dfa2-4733-84c3-3a3ed7c0e4fc/4a12678b-dfa2-4733-84c3-3a3ed7c0e4fc_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/2edf5b13-3cdd-4076-a867-4c9a769efde3/raster/5a22fbb7-0ae1-455f-9c35-897513329474/5a22fbb7-0ae1-455f-9c35-897513329474_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/38c66d6d-21e7-41d0-b128-5e6c4de44fd1/raster/64993e00-638e-4f70-805f-7d70af76639e/64993e00-638e-4f70-805f-7d70af76639e_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/81f3e3be-b697-4be8-8687-0f7e2ecde66c/raster/20ac78ed-ac11-4c8d-8e3d-e12e63b1168e/20ac78ed-ac11-4c8d-8e3d-e12e63b1168e_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/85848647-9de9-4301-af8c-5a60172592c2/raster/a872343d-99d1-44d4-b902-ea51164f0f43/a872343d-99d1-44d4-b902-ea51164f0f43_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/8ff71c9c-7c29-41ce-90e9-40a9bfda2d83/raster/02078e14-257a-4f33-8daf-118ce484750d/02078e14-257a-4f33-8daf-118ce484750d_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/96cc3f03-7561-483d-8ea8-3d929df367bc/raster/900b6852-f0e5-4be7-8306-9e04e3702be0/900b6852-f0e5-4be7-8306-9e04e3702be0_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/e992d4a1-43d6-4a8c-984d-fd1330c42e7d/raster/cdb7d1f5-4401-428f-b4d3-6b1c770c83de/cdb7d1f5-4401-428f-b4d3-6b1c770c83de_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/f08f59f9-1057-4c64-b08d-dc831a0d4f47/raster/167e9992-0c2a-4883-866e-292640442470/167e9992-0c2a-4883-866e-292640442470_orthofoto_2020_a593e2070e60.tif",
"storage/uploads/f0f5dcaf-b7a1-47bb-9e44-29cf2346b624/raster/81794c04-99f0-453e-9121-04501db1e234/81794c04-99f0-453e-9121-04501db1e234_orthofoto_2020_a593e2070e60.tif"
],
"cfc5dd1aec10d8c5202982eb133c1e6c4e36fcef827cacdabec035e4d46ce8c7": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence_requests.tsv"
],
"da63a52bdf62b3fc863995d79f497584be3ba97c1de4c55d1d301afbafab6cfc": [
"data/browser-verify.db",
"data/codex-sidebar-qa.db",
"data/dockdeck.db",
"data/e2e.db",
"data/visual-audit.db",
"data/visual-followup.db",
"data/visual-stitch-direct.db",
"data/wallpaper-editor-audit.db"
],
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855": [
"datasets/.gitkeep",
"datasets/cache/.gitkeep",
"datasets/processed/.gitkeep",
"datasets/raw/.gitkeep",
"models/.gitkeep",
"storage/.gitkeep",
"storage/masks/.gitkeep",
"storage/reports/.gitkeep",
"storage/tiles/.gitkeep",
"storage/uploads/.gitkeep"
],
"eaed204fc22b2dbbf88d52f4e0a235cac1cb669808147a2b4aceb543c6683c58": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p15_qc-low_evidence_response.json"
],
"fc0c46b6b36f31fd8f7ff2215f05091b3821b4352e0931eedc7c40254fbd39da": [
"artifacts/detection-calibration-smoke/20260801T130251Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/summary/detection-calibration-summary.json"
]
},
"method": "sha256_and_normalized_payload_or_image_ahash",
"near_duplicate_groups": {
"33d8706f5832b8e360e2c77f07dc35f47921ed1db71ad5fef433b8619d58b421": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence.geojson"
],
"8a74bba953780d106294054f53c19308b98a28b242f3dfac98f0f3c67a25f076": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p35_qc-high_evidence_response.json"
],
"b0e2a795b9521e8a53dad809d3ca693aac54bb5956279e0cb7fead6b7be46fc0": [
"artifacts/detection-calibration-smoke/20260801T130251Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/summary/detection-calibration-summary.json"
],
"b27e19bd84d9b40711c00cb50d6bcfd3c3612d2ad436b20fee7adfa69a3949e6": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T163116Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T205442Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p15_qc-low_evidence_response.json"
],
"image:0110000000110010011111111111111010000110110011111011011110001001010000011100101110110000110000001011100100011100000011110011110000000000100000001111100011110101011110011110010101111111110101011001110011001000100111000001111110111010000010001111111100000101": [
"artifacts/codex-review/v33-flanders/candidate_error_contact_sheet.png",
"artifacts/codex-review/v33-flanders/ostend.png"
]
},
"scan_id": "p3-46ee3f8d3a2dc52b",
"schema_version": 1
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,17 @@
{
"limitations": [
"Filename-derived split tokens are conservative; AOI independence requires authoritative split geometry."
],
"prior_quality_inventory": {
"cross_split_pairs_below_2000_m": 24,
"exact_cross_split_raster_hash_duplicates": 0,
"path": "docs/accuracy-program/status.json",
"split_independence_proven": false
},
"same_checksum_across_splits": {},
"scan_id": "p3-46ee3f8d3a2dc52b",
"schema_version": 1,
"source_spatial_audit_files": [],
"spatial_overlap_checks": "not_proven_without_AOI_split_geometry",
"status": "attention"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,12 @@
{
"items": {
"DHMV|unknown": 5,
"GRB|unknown": 4,
"Orthophoto|unknown": 34,
"unknown|declared": 6,
"unknown|unavailable": 3,
"unknown|unknown": 246
},
"scan_id": "p3-46ee3f8d3a2dc52b",
"schema_version": 1
}
@@ -0,0 +1,70 @@
from __future__ import annotations
import json
import subprocess
import sys
from pathlib import Path
SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "run_accuracy_phase3_full_data_scan.py"
def run_scan(repo: Path, output: Path, *, resume: bool = False) -> dict:
command = [
sys.executable,
str(SCRIPT),
"--repo-root",
str(repo),
"--output-dir",
str(output),
"--roots",
"data",
"--batch-size",
"2",
]
if resume:
command.append("--resume")
completed = subprocess.run(command, check=True, capture_output=True, text=True)
return json.loads(completed.stdout)
def test_phase3_scan_reconciles_and_resumes_deterministically(tmp_path: Path) -> None:
data = tmp_path / "data"
data.mkdir()
(data / "valid.geojson").write_text(
json.dumps(
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"source": "GRB"},
"geometry": {"type": "Point", "coordinates": [4.4, 50.8]},
}
],
}
),
encoding="utf-8",
)
invalid = data / "invalid.geojson"
invalid.write_text(
'{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[0,0],[1,1],[1,0],[0,1],[0,0]]]}}]}',
encoding="utf-8",
)
duplicate_payload = '{"schema_version":1,"value":"same"}'
(data / "one.json").write_text(duplicate_payload, encoding="utf-8")
(data / "two.json").write_text(duplicate_payload, encoding="utf-8")
(data / "broken.tif").write_bytes(b"not a geotiff")
output = tmp_path / "evidence"
first = run_scan(tmp_path, output)
second = run_scan(tmp_path, output, resume=True)
manifest = json.loads((output / "full-scan-manifest.json").read_text(encoding="utf-8"))
quarantine = json.loads((output / "quarantine-manifest.json").read_text(encoding="utf-8"))
assert first["reconciliation"] == {"examined": 5, "skipped": 0, "unreachable": 3, "inventory_total": 8, "reconciles": True}
assert second["content_hash"] == first["content_hash"]
assert manifest["determinism"]["content_hash"] == first["content_hash"]
assert any(item["path"] == "data/broken.tif" for item in quarantine["items"])
assert any(item["path"] == "data/invalid.geojson" for item in quarantine["items"])
assert len(manifest["duplicates"]["exact_duplicate_groups"]) == 1
+30
View File
@@ -12361,3 +12361,33 @@ Open:
disposable environment, but Phase 2 remains **in progress** and Phase 3 is
**not ready**. No training, protected-test release, promotion, national
validation or production migration is authorized by this result.
## 2026-08-02 - Accuracy Improvement Program Phase 3 full data scan
### Implemented and verified scope
- Added `scripts/run_accuracy_phase3_full_data_scan.py`, a read-only,
SHA-256-bound and batch-resumable scanner for the configured local GeoIntel
roots. It validates GeoJSON geometry/bounds, GeoTIFF readability/CRS/
resolution/nodata, manifests, YOLO labels and generic immutable artefacts.
- Retained full scan, anomaly, logical quarantine, duplicate, leakage,
source-freshness, dataset-summary and checkpoint manifests under
`artifacts/evidence/accuracy/P3/`. Three known external boundaries are
explicitly represented as unreachable; no source file was removed or
overwritten.
- Added a deterministic fixture test covering valid/invalid GeoJSON, corrupt
raster input, exact duplicates, quarantine and a byte-stable resumed replay.
### Evidence and decision
- The scan processed 295 local files and recorded 3 unreachable scope items;
`295 + 0 skipped + 3 unreachable = 298` reconciles exactly. Two consecutive
runs produced scan ID `p3-46ee3f8d3a2dc52b` and content hash
`1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e`.
- 172 anomalies were retained and 163 affected items were logically
quarantined. The P1 split inventory (24 AOI pairs below 2 km and no proven
split independence) remains an explicit leakage attention signal.
- Phase 3 is **done for the bounded project environment** and Phase 4 is
**ready** for remediation/review. This does not unlock training, promotion,
national validation or production release; those gates remain governed by
the execution contract and the incomplete Phase 2 gates.
@@ -0,0 +1,72 @@
# Fase 3 — Volledige datascan en quarantaine
## Resultaat
De reproduceerbare scan `scripts/run_accuracy_phase3_full_data_scan.py` is read-only uitgevoerd over de veilige lokale scope `models/`, `datasets/`, `data/`, `storage/`, `artifacts/` en `output/`. De scan schrijft uitsluitend bewijs naar `artifacts/evidence/accuracy/P3/`; bronbestanden zijn niet gewijzigd.
| Telling | Aantal |
| --- | ---: |
| Onderzochte bestanden | 295 |
| Overgeslagen bestanden | 0 |
| Onbereikbare scope-items | 3 |
| Geïnventariseerd totaal | 298 |
| Reconciliatie | groen (`295 + 0 + 3 = 298`) |
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 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:
| Categorie | Aantal | Standaardactie |
| --- | ---: | --- |
| Onleesbare/corrupte GeoTIFF | 96 | quarantine |
| Afgeleide artefacten zonder expliciete lineage | 58 | quarantine |
| Bronlabel zonder declared freshness | 9 | requires review |
| Manifest met nul-bounding-box | 6 | quarantine |
| Niet-bereikbare externe scope | 3 | unavailable or unreadable |
De eerdere P1-splitinventaris blijft zichtbaar in `leakage-report.json`: 24 AOI-paren lagen onder 2 km en split-onafhankelijkheid was niet bewezen. De scan rapporteert dat als `attention`; bestandsnamen alleen kunnen AOI-onafhankelijkheid niet bewijzen. Er was geen toegankelijke GRB-snapshot in de lokale scope, zodat geen afgeleid resultaat als GRB-ground-truth is gemarkeerd.
## Scancontract
Iedere inventarisregel bevat een immutable padidentiteit, bestandsgrootte en SHA-256 (waar leesbaar), typecontract, bronclassificatie, lineage, schema/CRS, resolutie/eenheden, ruimtelijke en temporele dekking, freshness, geometrie- of rasterstatus, duplicaatinformatie, anomalieën, ernst en aanbevolen actie. Ondersteunde typecontracten zijn:
- `geointel.vector.geojson@1.0.0` — GeoJSON-schema, geometrievaliditeit en EPSG:4326-bounds;
- `geointel.raster.geotiff@1.0.0` — leesbaarheid, CRS, dimensies, resolutie, bounds, nodata en sample-validiteit;
- `geointel.label.yolo@1.1.0` — genormaliseerde YOLO-labelregels en expliciete achtergrondreview;
- `geointel.model.pytorch@1.0.0` — immutable modelartefact-identiteit;
- `geointel.manifest.json@1.0.0` — CRS, bounds, tile-paden en bron-ID's;
- `geointel.database.sqlite@1.0.0` en `geointel.artifact.generic@1.0.0` — veilige byte-/schema-inventaris voor runtime- en bewijsartefacten.
Er zijn vijf vaste ernstniveaus (`blocker`, `critical`, `major`, `minor`, `informational`) en zeven vaste acties (`accept`, `repairable automatically`, `requires review`, `quarantine`, `exclude from training`, `exclude from evaluation`, `unavailable or unreadable`). Een anomaly wordt nooit automatisch als waarheid gebruikt.
## Hervatbaarheid en determinisme
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`
## Bewijsartefacten
- `artifacts/evidence/accuracy/P3/full-scan-manifest.json` — volledige machineleesbare scan;
- `artifacts/evidence/accuracy/P3/anomaly-manifest.json` — alle afwijkingen;
- `artifacts/evidence/accuracy/P3/quarantine-manifest.json` — veilige logische quarantine;
- `artifacts/evidence/accuracy/P3/duplicates-report.json` — exacte en genormaliseerde near-duplicategroepen;
- `artifacts/evidence/accuracy/P3/leakage-report.json` — checksum-/splitsignalen en P1-splitinventaris;
- `artifacts/evidence/accuracy/P3/source-freshness-report.json` — bron/freshness-kruistabel;
- `artifacts/evidence/accuracy/P3/dataset-summary.json` — samenvatting per contracttype;
- `artifacts/evidence/accuracy/P3/scan-checkpoint.json` — hervatbare batchstaat.
## Reproduceerbare uitvoering
```powershell
python scripts/run_accuracy_phase3_full_data_scan.py --batch-size 40
python scripts/run_accuracy_phase3_full_data_scan.py --batch-size 40 --resume
python -m pytest backend/tests/test_accuracy_phase3_full_data_scan.py -q -p no:cacheprovider
python -m ruff check scripts/run_accuracy_phase3_full_data_scan.py backend/tests/test_accuracy_phase3_full_data_scan.py
```
De fixturetest controleert geldige en foutieve GeoJSON, corrupte rasterinput, exacte duplicaten, quarantine en identieke herhaling. Productie- of brondata wordt door deze tests niet aangeraakt.
## 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.
+34 -6
View File
@@ -1,8 +1,8 @@
{
"schema_version": 1,
"program": "GeoIntel Accuracy Improvement Program",
"phase": "P2",
"generated_at": "2026-08-01T23:43:55+02:00",
"phase": "P4",
"generated_at": "2026-08-02T01:04:48+02:00",
"scope": {
"product": "Belgium and the Belgian North Sea",
"active_building_model_claim": "Mol/Kempen only, operator review required",
@@ -80,8 +80,33 @@
]
},
"phase3": {
"status": "not_ready",
"reason": "P2-00 through P2-12 are not all green; human review, corpus rebuild, protected-split evidence, metric gates, candidate CUDA training, protected testing and promotion remain blocked."
"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.",
"scanner": "scripts/run_accuracy_phase3_full_data_scan.py",
"scanner_version": "3.0.3",
"scan_id": "p3-46ee3f8d3a2dc52b",
"evidence_root": "artifacts/evidence/accuracy/P3",
"content_hash": "1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e",
"reconciliation": {
"examined": 295,
"skipped": 0,
"unreachable": 3,
"inventory_total": 298,
"reconciles": true
},
"anomaly_count": 172,
"quarantine_item_count": 163,
"does_not_mean": [
"all anomalies are repaired",
"AOI split independence is proven",
"GRB ground truth is locally available",
"training, promotion or national validation is allowed"
]
},
"phase4": {
"status": "ready",
"meaning": "Ready to remediate and review the P3 anomaly and quarantine manifests; release gates remain governed by P2 and the execution contract.",
"evidence_root": "artifacts/evidence/accuracy/P3"
},
"runtime": {
"cuda_available": true,
@@ -285,10 +310,13 @@
"docs/accuracy-program/05-metric-framework.md",
"docs/accuracy-program/06-implementation-roadmap.md",
"docs/accuracy-program/07-source-authority-matrix.md",
"docs/accuracy-program/08-data-contracts.md"
"docs/accuracy-program/08-data-contracts.md",
"docs/accuracy-program/09-full-data-scan.md"
],
"evidence_root": "artifacts/evidence/accuracy/P1",
"evidence_manifest": "artifacts/evidence/accuracy/P1/evidence-manifest.json",
"phase2_evidence_root": "artifacts/evidence/accuracy/P2",
"phase2_evidence_manifest": "artifacts/evidence/accuracy/P2/evidence-manifest.json"
"phase2_evidence_manifest": "artifacts/evidence/accuracy/P2/evidence-manifest.json",
"phase3_evidence_root": "artifacts/evidence/accuracy/P3",
"phase3_manifest": "artifacts/evidence/accuracy/P3/full-scan-manifest.json"
}
@@ -0,0 +1,569 @@
#!/usr/bin/env python3
"""Reproducible, read-only inventory and quarantine scan for Accuracy Phase 3.
The scanner deliberately operates on immutable source files and writes only to the
requested evidence directory. It is dependency-light, but uses rasterio and
shapely when available for type-specific checks. A checkpoint makes the scan
resumable without making source files mutable.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import math
import os
import re
import tempfile
from collections import Counter, defaultdict
from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Iterable
SCANNER_VERSION = "3.0.3"
SCHEMA_VERSION = 1
DEFAULT_ROOTS = ("models", "datasets", "data", "storage", "artifacts", "output")
EXCLUDED_DIRS = {".git", "node_modules", ".next", "__pycache__", ".pytest_cache"}
SEVERITIES = ("blocker", "critical", "major", "minor", "informational")
ACTIONS = (
"accept",
"repairable automatically",
"requires review",
"quarantine",
"exclude from training",
"exclude from evaluation",
"unavailable or unreadable",
)
def utc_now() -> str:
return datetime.now(timezone.utc).isoformat()
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as stream:
for chunk in iter(lambda: stream.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def canonical_hash(value: Any) -> str:
return hashlib.sha256(
json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode("utf-8")
).hexdigest()
def atomic_json(path: Path, payload: Any) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
fd, temp_name = tempfile.mkstemp(prefix=f".{path.name}.", suffix=".tmp", dir=path.parent)
try:
with os.fdopen(fd, "w", encoding="utf-8", newline="\n") as stream:
json.dump(payload, stream, ensure_ascii=False, indent=2, sort_keys=True)
stream.write("\n")
Path(temp_name).replace(path)
finally:
if os.path.exists(temp_name):
os.unlink(temp_name)
def severity_action(severity: str, action: str, code: str, message: str, *, field: str | None = None) -> dict[str, Any]:
if severity not in SEVERITIES or action not in ACTIONS:
raise ValueError(f"Unknown severity/action: {severity}/{action}")
result: dict[str, Any] = {"code": code, "severity": severity, "action": action, "message": message}
if field:
result["field"] = field
return result
def relative_path(path: Path, repo_root: Path) -> str:
return path.resolve(strict=False).relative_to(repo_root.resolve()).as_posix()
def is_excluded(path: Path, repo_root: Path, evidence_dir: Path) -> bool:
rel = relative_path(path, repo_root)
if any(part in EXCLUDED_DIRS for part in Path(rel).parts):
return True
evidence_rel = relative_path(evidence_dir, repo_root)
return rel == evidence_rel or rel.startswith(f"{evidence_rel}/")
def discover_files(repo_root: Path, roots: Iterable[str], evidence_dir: Path) -> list[Path]:
files: list[Path] = []
for root in roots:
base = (repo_root / root).resolve(strict=False)
if not base.exists():
continue
for path in base.rglob("*"):
if path.is_file() and not is_excluded(path, repo_root, evidence_dir):
files.append(path)
return sorted(set(files), key=lambda item: relative_path(item, repo_root))
def known_unreachable_items() -> list[dict[str, Any]]:
"""Boundaries identified by the Phase 1 inventory but not mounted locally."""
entries = (
("external://tower-corpora", "Tower corpora are not mounted in this project environment"),
("external://mounted-model-volumes", "Mounted model volumes are not available from this project environment"),
("external://production-postgis-or-api", "No production PostGIS/API endpoint is configured in the scan environment"),
)
result = []
for path, reason in entries:
result.append(
{
"item_id": hashlib.sha256(path.encode("utf-8")).hexdigest()[:20],
"path": path,
"status": "unreachable",
"read_status": "unavailable",
"size_bytes": None,
"modified_at": None,
"sha256": None,
"duplicate_group": None,
"near_duplicate_fingerprint": None,
"contract": {"key": "geointel.external.unavailable", "version": "1.0.0"},
"source": "unknown",
"lineage": None,
"schema_conformity": "unavailable",
"crs": None,
"units": None,
"resolution": None,
"spatial_coverage": None,
"temporal_coverage": None,
"freshness": {"status": "unavailable", "reason": reason},
"geometry_validation": None,
"empty_content": None,
"anomalies": [severity_action("critical", "unavailable or unreadable", "scope.unreachable", reason)],
"recommended_action": "unavailable or unreadable",
}
)
return result
def infer_source(rel: str, payload: Any = None) -> str:
text = rel.lower()
if isinstance(payload, dict):
text += " " + json.dumps(payload, ensure_ascii=False, sort_keys=True).lower()[:5000]
for token, name in (("grb", "GRB"), ("gebouwenregister", "Gebouwenregister"), ("dhmv", "DHMV"),
("sentinel", "Sentinel-2"), ("osm", "OSM"), ("orthofoto", "Orthophoto")):
if token in text:
return name
return "unknown"
def contract_for(path: Path, payload: Any = None) -> tuple[str, str]:
suffix = path.suffix.lower()
text = path.as_posix().lower()
if suffix in {".geojson", ".jsonl"} or "vector" in text:
return "geointel.vector.geojson", "1.0.0"
if suffix in {".tif", ".tiff", ".cog"}:
return "geointel.raster.geotiff", "1.0.0"
if suffix in {".pt", ".pth", ".onnx", ".safetensors"} or "model" in text and suffix not in {".json", ".md"}:
return "geointel.model.pytorch", "1.0.0"
if suffix == ".txt" and any(token in text for token in ("label", "yolo", "annotation")):
return "geointel.label.yolo", "1.1.0"
if suffix == ".db" or suffix in {".db-wal", ".db-shm"}:
return "geointel.database.sqlite", "1.0.0"
if suffix == ".json" and isinstance(payload, dict) and ("lineage" in payload or "schema_version" in payload):
return "geointel.manifest.json", "1.0.0"
return "geointel.artifact.generic", "1.0.0"
def add_anomaly(item: dict[str, Any], anomaly: dict[str, Any]) -> None:
item.setdefault("anomalies", []).append(anomaly)
def parse_json(path: Path) -> tuple[Any, str | None]:
try:
return json.loads(path.read_text(encoding="utf-8-sig")), None
except Exception as exc: # noqa: BLE001 - evidence must retain the concrete parser failure
return None, f"{type(exc).__name__}: {exc}"
def validate_geometry(item: dict[str, Any], payload: Any) -> None:
if not isinstance(payload, dict) or payload.get("type") != "FeatureCollection":
add_anomaly(item, severity_action("critical", "quarantine", "vector.invalid_schema", "Expected GeoJSON FeatureCollection"))
item["schema_conformity"] = "invalid"
return
features = payload.get("features")
if not isinstance(features, list):
add_anomaly(item, severity_action("critical", "quarantine", "vector.features_not_list", "GeoJSON features must be a list"))
item["schema_conformity"] = "invalid"
return
item["feature_count"] = len(features)
item["empty_content"] = len(features) == 0
if len(features) == 0:
add_anomaly(item, severity_action("minor", "requires review", "vector.empty", "GeoJSON contains no features"))
try:
from shapely.geometry import shape
except Exception:
item["geometry_validation"] = {"status": "unavailable", "reason": "shapely_not_installed"}
return
invalid = 0
empty = 0
bounds: list[float] | None = None
for index, feature in enumerate(features):
geometry = feature.get("geometry") if isinstance(feature, dict) else None
try:
geom = shape(geometry) if geometry else None
if geom is None or geom.is_empty:
empty += 1
elif not geom.is_valid:
invalid += 1
elif not geom.is_empty:
candidate = list(geom.bounds)
bounds = candidate if bounds is None else [min(bounds[0], candidate[0]), min(bounds[1], candidate[1]), max(bounds[2], candidate[2]), max(bounds[3], candidate[3])]
except Exception as exc: # noqa: BLE001
invalid += 1
if invalid == 1:
add_anomaly(item, severity_action("critical", "quarantine", "vector.geometry_parse_error", f"Feature {index}: {exc}"))
item["geometry_validation"] = {"status": "ok" if invalid == 0 else "invalid", "invalid_count": invalid, "empty_count": empty}
item["spatial_coverage"] = {"bbox": bounds, "crs": "EPSG:4326 (implicit GeoJSON)"}
if invalid:
add_anomaly(item, severity_action("critical", "quarantine", "vector.invalid_geometry", f"{invalid} invalid geometries"))
if bounds and (bounds[0] < -180 or bounds[2] > 180 or bounds[1] < -90 or bounds[3] > 90):
add_anomaly(item, severity_action("critical", "quarantine", "vector.bbox_out_of_range", "EPSG:4326 coordinates exceed valid bounds", field="bbox"))
def validate_raster(item: dict[str, Any], path: Path) -> None:
try:
import rasterio
import numpy as np
with rasterio.open(path) as dataset:
item["raster"] = {
"width": dataset.width, "height": dataset.height, "bands": dataset.count,
"dtype": list(dataset.dtypes), "crs": dataset.crs.to_string() if dataset.crs else None,
"resolution": [float(dataset.res[0]), float(dataset.res[1])],
"bounds": [float(v) for v in dataset.bounds], "nodata": dataset.nodata,
}
item["crs"] = item["raster"]["crs"]
item["resolution"] = item["raster"]["resolution"]
item["spatial_coverage"] = {"bbox": item["raster"]["bounds"], "crs": item["crs"]}
item["empty_content"] = dataset.width == 0 or dataset.height == 0
if not dataset.crs:
add_anomaly(item, severity_action("critical", "quarantine", "raster.missing_crs", "Raster has no CRS"))
if dataset.width <= 0 or dataset.height <= 0:
add_anomaly(item, severity_action("critical", "quarantine", "raster.empty_dimensions", "Raster has invalid dimensions"))
sample = dataset.read(1, masked=True, out_shape=(1, min(dataset.height, 256), min(dataset.width, 256)))
item["raster"]["sample_valid_fraction"] = float(np.ma.count(sample) / max(sample.size, 1))
if item["raster"]["sample_valid_fraction"] == 0:
add_anomaly(item, severity_action("major", "quarantine", "raster.all_nodata", "Raster sample contains no valid pixels"))
if any(not math.isfinite(value) for value in item["raster"]["resolution"]) or min(item["raster"]["resolution"]) <= 0:
add_anomaly(item, severity_action("critical", "quarantine", "raster.invalid_resolution", "Raster resolution is non-positive or non-finite"))
except Exception as exc: # noqa: BLE001
item["read_status"] = "unreadable"
add_anomaly(item, severity_action("critical", "unavailable or unreadable", "raster.unreadable", f"{type(exc).__name__}: {exc}"))
def validate_manifest(item: dict[str, Any], payload: Any, repo_root: Path) -> None:
if not isinstance(payload, dict):
return
if "crs" in payload:
item["crs"] = payload.get("crs")
if "bounds" in payload:
item["spatial_coverage"] = {"bbox": payload.get("bounds"), "crs": payload.get("crs")}
bounds = payload.get("bounds")
if isinstance(bounds, list) and len(bounds) == 4 and all(float(v) == 0 for v in bounds):
add_anomaly(item, severity_action("major", "quarantine", "manifest.zero_bbox", "Manifest declares a zero-area bounding box", field="bounds"))
if "tile_paths" in payload and isinstance(payload["tile_paths"], list):
missing = []
for raw in payload["tile_paths"]:
candidate = Path(str(raw))
if not candidate.is_absolute():
candidate = repo_root / candidate
if not candidate.exists():
missing.append(str(raw))
item["lineage"] = {"source_dataset_id": payload.get("source_dataset_id"), "source_raster_id": payload.get("source_raster_id")}
if missing:
add_anomaly(item, severity_action("critical", "quarantine", "manifest.missing_tile", f"{len(missing)} tile paths are absent"))
item["missing_tile_paths"] = missing
def validate_label(item: dict[str, Any], path: Path) -> None:
try:
lines = [line.strip() for line in path.read_text(encoding="utf-8").splitlines() if line.strip()]
except Exception as exc: # noqa: BLE001
add_anomaly(item, severity_action("critical", "unavailable or unreadable", "label.unreadable", str(exc)))
return
invalid = 0
for line in lines:
parts = line.split()
try:
if len(parts) != 5 or int(parts[0]) < 0 or any(not 0 <= float(value) <= 1 for value in parts[1:]):
invalid += 1
except ValueError:
invalid += 1
item["label"] = {"line_count": len(lines), "invalid_line_count": invalid}
if invalid:
add_anomaly(item, severity_action("critical", "quarantine", "label.invalid_yolo", f"{invalid} label lines violate YOLO normalized schema"))
if not lines:
item["empty_content"] = True
add_anomaly(item, severity_action("minor", "requires review", "label.empty", "Empty label file requires explicit background review evidence"))
def json_metadata(item: dict[str, Any], payload: Any) -> None:
if not isinstance(payload, dict):
return
observed = next((payload.get(key) for key in ("observed_at", "created_at", "updated_at", "timestamp", "fetched_at") if payload.get(key)), None)
if observed:
item["freshness"] = {"observed_at": observed, "method": "declared_metadata", "status": "declared"}
lineage_keys = [key for key in payload if "lineage" in key.lower() or key.startswith("source_") or key in {"parent_id", "parent_dataset_id"}]
if lineage_keys:
item["lineage"] = {key: payload.get(key) for key in lineage_keys}
def normalized_fingerprint(path: Path, payload: Any) -> str | None:
if payload is not None:
return canonical_hash(payload)
if path.suffix.lower() not in {".png", ".jpg", ".jpeg", ".webp"}:
return None
try:
from PIL import Image
image = Image.open(path).convert("L").resize((16, 16))
pixels = list(image.getdata())
average = sum(pixels) / max(len(pixels), 1)
return "image:" + "".join("1" if pixel >= average else "0" for pixel in pixels)
except Exception:
return None
def make_item(path: Path, repo_root: Path) -> dict[str, Any]:
rel = relative_path(path, repo_root)
stat = path.stat()
item: dict[str, Any] = {
"item_id": hashlib.sha256(rel.encode("utf-8")).hexdigest()[:20],
"path": rel,
"status": "examined",
"read_status": "readable",
"size_bytes": stat.st_size,
"modified_at": datetime.fromtimestamp(stat.st_mtime, tz=timezone.utc).isoformat(),
"sha256": None,
"duplicate_group": None,
"near_duplicate_fingerprint": None,
"contract": None,
"source": infer_source(rel),
"lineage": None,
"schema_conformity": "not_applicable",
"crs": None,
"units": None,
"resolution": None,
"spatial_coverage": None,
"temporal_coverage": None,
"freshness": {"status": "unknown", "reason": "no_declared_source_timestamp"},
"geometry_validation": None,
"empty_content": stat.st_size == 0,
"anomalies": [],
}
try:
item["sha256"] = sha256(path)
except Exception as exc: # noqa: BLE001
item["status"] = "unreachable"
item["read_status"] = "unreadable"
add_anomaly(item, severity_action("critical", "unavailable or unreadable", "file.unreadable", f"{type(exc).__name__}: {exc}"))
return item
payload = None
parse_error = None
if path.suffix.lower() in {".json", ".geojson"} or path.name.lower().endswith(".jsonl"):
payload, parse_error = parse_json(path)
if parse_error:
item["schema_conformity"] = "invalid"
add_anomaly(item, severity_action("critical", "quarantine", "json.invalid", parse_error))
else:
json_metadata(item, payload)
contract_key, contract_version = contract_for(path, payload)
item["contract"] = {"key": contract_key, "version": contract_version}
item["source"] = infer_source(rel, payload)
if path.suffix.lower() == ".geojson" and payload is not None:
item["schema_conformity"] = "valid"
validate_geometry(item, payload)
elif path.suffix.lower() in {".tif", ".tiff", ".cog"}:
validate_raster(item, path)
item["schema_conformity"] = "valid" if item["read_status"] == "readable" else "invalid"
elif path.name.lower() == "manifest.json" and payload is not None:
item["schema_conformity"] = "valid" if isinstance(payload, dict) else "invalid"
validate_manifest(item, payload, repo_root)
elif contract_key == "geointel.label.yolo" and path.suffix.lower() == ".txt":
item["schema_conformity"] = "valid"
validate_label(item, path)
if item["source"] == "OSM":
item["ground_truth_eligible"] = False
add_anomaly(item, severity_action("informational", "requires review", "source.osm_not_ground_truth", "OSM is corroborative/contextual and never automatic ground truth"))
if item["lineage"] is None and ("derived" in rel.lower() or "result" in rel.lower() or "calibration" in rel.lower()):
add_anomaly(item, severity_action("major", "quarantine", "lineage.missing", "Derived-looking artifact has no explicit lineage"))
if item["freshness"].get("status") == "unknown" and item["source"] not in {"unknown", "Orthophoto"}:
add_anomaly(item, severity_action("minor", "requires review", "freshness.missing", "Source-labelled item has no declared observation timestamp"))
item["near_duplicate_fingerprint"] = normalized_fingerprint(path, payload)
if item["anomalies"]:
item["recommended_action"] = sorted(item["anomalies"], key=lambda a: SEVERITIES.index(a["severity"]))[0]["action"]
else:
item["recommended_action"] = "accept"
return item
def detect_duplicates(items: list[dict[str, Any]]) -> dict[str, Any]:
by_hash: dict[str, list[str]] = defaultdict(list)
by_fingerprint: dict[str, list[str]] = defaultdict(list)
for item in items:
if item.get("sha256"):
by_hash[item["sha256"]].append(item["path"])
if item.get("near_duplicate_fingerprint"):
by_fingerprint[item["near_duplicate_fingerprint"]].append(item["path"])
exact = {key: sorted(paths) for key, paths in by_hash.items() if len(paths) > 1}
near = {key: sorted(paths) for key, paths in by_fingerprint.items() if len(paths) > 1}
for group, paths in exact.items():
for item in items:
if item["path"] in paths:
item["duplicate_group"] = group
return {"schema_version": 1, "exact_duplicate_groups": exact, "near_duplicate_groups": near, "method": "sha256_and_normalized_payload_or_image_ahash"}
def detect_leakage(items: list[dict[str, Any]], repo_root: Path | None = None) -> dict[str, Any]:
split_by_hash: dict[str, set[str]] = defaultdict(set)
split_by_bbox: dict[str, list[tuple[str, list[float], str]]] = defaultdict(list)
for item in items:
text = item["path"].lower()
split = next((candidate for candidate in ("train", "val", "validation", "calibration", "test", "background-test") if re.search(rf"(?:^|[/_.-]){re.escape(candidate)}(?:[/_.-]|$)", text)), None)
if not split:
continue
if item.get("sha256"):
split_by_hash[item["sha256"]].add(split)
bbox = (item.get("spatial_coverage") or {}).get("bbox") if isinstance(item.get("spatial_coverage"), dict) else None
if isinstance(bbox, list) and len(bbox) == 4:
try:
split_by_bbox[split].append((item["path"], [float(value) for value in bbox], split))
except (TypeError, ValueError):
pass
cross_hash = {key: sorted(value) for key, value in split_by_hash.items() if len(value) > 1}
source_audits = [item["path"] for item in items if item["path"].endswith("spatial-leakage-audit.json")]
prior_quality: dict[str, Any] | None = None
prior_attention = False
if repo_root is not None:
status_path = repo_root / "docs/accuracy-program/status.json"
try:
status = json.loads(status_path.read_text(encoding="utf-8"))
v56 = ((status.get("ml_data") or {}).get("v56") or {})
prior_quality = {
"path": relative_path(status_path, repo_root),
"cross_split_pairs_below_2000_m": v56.get("cross_split_pairs_below_2000_m"),
"split_independence_proven": v56.get("split_independence_proven"),
"exact_cross_split_raster_hash_duplicates": v56.get("exact_cross_split_raster_hash_duplicates"),
}
prior_attention = (prior_quality.get("cross_split_pairs_below_2000_m") or 0) > 0 or prior_quality.get("split_independence_proven") is False
except (OSError, json.JSONDecodeError):
prior_quality = None
return {
"schema_version": 1,
"status": "attention" if cross_hash or source_audits or prior_attention else "no_detected_overlap",
"same_checksum_across_splits": cross_hash,
"spatial_overlap_checks": "not_proven_without_AOI_split_geometry",
"source_spatial_audit_files": source_audits,
"prior_quality_inventory": prior_quality,
"limitations": ["Filename-derived split tokens are conservative; AOI independence requires authoritative split geometry."],
}
def report_payload(items: list[dict[str, Any]], inventory: dict[str, Any], scan_id: str, *, started_at: str, completed_at: str, repo_root: Path | None = None) -> dict[str, Any]:
anomalies = [dict({"path": item["path"], "item_id": item["item_id"]}, **anomaly) for item in items for anomaly in item.get("anomalies", [])]
quarantine = [
{"path": item["path"], "item_id": item["item_id"], "recommended_action": item.get("recommended_action"), "anomalies": item.get("anomalies", [])}
for item in items if item.get("recommended_action") in {"quarantine", "exclude from training", "exclude from evaluation", "unavailable or unreadable"}
]
duplicates = detect_duplicates(items)
leakage = detect_leakage(items, repo_root)
category_counts = Counter(anomaly["code"] for anomaly in anomalies)
dataset_summary: dict[str, dict[str, Any]] = {}
for item in items:
key = item["contract"]["key"] if item.get("contract") else "unknown"
block = dataset_summary.setdefault(key, {"item_count": 0, "anomaly_count": 0, "paths": [], "severity_counts": Counter()})
block["item_count"] += 1
block["paths"].append(item["path"])
block["anomaly_count"] += len(item.get("anomalies", []))
block["severity_counts"].update(anomaly["severity"] for anomaly in item.get("anomalies", []))
for block in dataset_summary.values():
block["paths"] = sorted(block["paths"])
block["severity_counts"] = dict(sorted(block["severity_counts"].items()))
source_freshness = Counter((item.get("source", "unknown"), (item.get("freshness") or {}).get("status", "unknown")) for item in items)
counts = Counter(item.get("status", "examined") for item in items)
reconciliation = {"examined": counts.get("examined", 0), "skipped": counts.get("skipped", 0), "unreachable": counts.get("unreachable", 0), "inventory_total": len(items), "reconciles": sum(counts.get(key, 0) for key in ("examined", "skipped", "unreachable")) == len(items)}
return {
"schema_version": SCHEMA_VERSION, "scanner_version": SCANNER_VERSION, "scan_id": scan_id,
"started_at": started_at, "completed_at": completed_at, "inventory": inventory,
"reconciliation": reconciliation, "items": sorted(items, key=lambda item: item["path"]),
"anomaly_count": len(anomalies), "anomalies": sorted(anomalies, key=lambda item: (item["path"], item["code"])),
"quarantine": sorted(quarantine, key=lambda item: item["path"]),
"duplicates": duplicates, "leakage": leakage,
"dataset_summary": {key: dataset_summary[key] for key in sorted(dataset_summary)},
"source_freshness": {f"{source}|{status}": count for (source, status), count in sorted(source_freshness.items())},
"anomaly_category_counts": dict(sorted(category_counts.items())),
"grb_consistency": {"status": "unavailable", "reason": "No authoritative GRB snapshot was accessible in the configured local roots; no derived result was marked as GRB ground truth."},
"determinism": {"content_hash": canonical_hash({"inventory": inventory, "items": sorted(items, key=lambda item: item["path"]), "anomalies": sorted(anomalies, key=lambda item: (item["path"], item["code"]))}), "timestamps_excluded_from_content_hash": True},
}
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--repo-root", type=Path, default=Path(__file__).resolve().parents[1])
parser.add_argument("--output-dir", type=Path, default=None)
parser.add_argument("--batch-size", type=int, default=50)
parser.add_argument("--resume", action="store_true")
parser.add_argument("--roots", nargs="+", default=list(DEFAULT_ROOTS))
return parser.parse_args()
def main() -> int:
args = parse_args()
repo_root = args.repo_root.resolve()
output_dir = (args.output_dir or repo_root / "artifacts/evidence/accuracy/P3").resolve()
if args.batch_size <= 0:
raise SystemExit("--batch-size must be positive")
paths = discover_files(repo_root, args.roots, output_dir)
inventory_entries = [{"path": relative_path(path, repo_root), "size_bytes": path.stat().st_size, "modified_ns": path.stat().st_mtime_ns} for path in paths]
unreachable_items = known_unreachable_items()
inventory = {
"roots": list(args.roots),
"excluded_directories": sorted(EXCLUDED_DIRS),
"excluded_output_dir": relative_path(output_dir, repo_root),
"items": inventory_entries,
"unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unreachable_items],
"accessible_item_count": len(inventory_entries),
"item_count": len(inventory_entries) + len(unreachable_items),
"inventory_hash": canonical_hash({"items": inventory_entries, "unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unreachable_items]}),
}
checkpoint_path = output_dir / "scan-checkpoint.json"
checkpoint: dict[str, Any] | None = None
if args.resume and checkpoint_path.is_file():
try:
candidate = json.loads(checkpoint_path.read_text(encoding="utf-8"))
if candidate.get("inventory", {}).get("inventory_hash") == inventory["inventory_hash"] and candidate.get("scanner_version") == SCANNER_VERSION:
checkpoint = candidate
except (OSError, json.JSONDecodeError):
checkpoint = None
records = {item["path"]: item for item in (checkpoint or {}).get("records", []) if isinstance(item, dict) and item.get("path")}
started_at = (checkpoint or {}).get("started_at") or utc_now()
for offset in range(0, len(paths), args.batch_size):
for path in paths[offset: offset + args.batch_size]:
rel = relative_path(path, repo_root)
existing = records.get(rel)
fingerprint = next(entry for entry in inventory_entries if entry["path"] == rel)
if existing and existing.get("size_bytes") == fingerprint["size_bytes"] and existing.get("modified_ns") == fingerprint["modified_ns"]:
continue
records[rel] = make_item(path, repo_root)
atomic_json(checkpoint_path, {"schema_version": 1, "scanner_version": SCANNER_VERSION, "started_at": started_at, "inventory": inventory, "cursor": min(offset + args.batch_size, len(paths)), "records": sorted(records.values(), key=lambda item: item["path"])})
items = [records[relative_path(path, repo_root)] for path in paths if relative_path(path, repo_root) in records]
items.extend(unreachable_items)
scan_id = "p3-" + inventory["inventory_hash"][:16]
report = report_payload(items, inventory, scan_id, started_at=started_at, completed_at=utc_now(), repo_root=repo_root)
output_dir.mkdir(parents=True, exist_ok=True)
atomic_json(output_dir / "full-scan-manifest.json", report)
atomic_json(output_dir / "anomaly-manifest.json", {"schema_version": 1, "scan_id": scan_id, "anomalies": report["anomalies"], "counts": report["anomaly_category_counts"]})
atomic_json(output_dir / "quarantine-manifest.json", {"schema_version": 1, "scan_id": scan_id, "items": report["quarantine"], "source_files_unchanged": True})
atomic_json(output_dir / "duplicates-report.json", report["duplicates"] | {"scan_id": scan_id})
atomic_json(output_dir / "leakage-report.json", report["leakage"] | {"scan_id": scan_id})
atomic_json(output_dir / "source-freshness-report.json", {"schema_version": 1, "scan_id": scan_id, "items": report["source_freshness"]})
atomic_json(output_dir / "dataset-summary.json", {"schema_version": 1, "scan_id": scan_id, "datasets": report["dataset_summary"], "anomaly_category_counts": report["anomaly_category_counts"]})
print(json.dumps({"scan_id": scan_id, "inventory_total": len(items), "reconciliation": report["reconciliation"], "anomaly_count": report["anomaly_count"], "content_hash": report["determinism"]["content_hash"]}, indent=2))
return 0 if report["reconciliation"]["reconciles"] else 2
if __name__ == "__main__":
raise SystemExit(main())