feat(accuracy): complete phase 3 data scan and quarantine
This commit is contained in:
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
|
||||
@@ -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.
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user