audit: establish accuracy phase 1 baseline

This commit is contained in:
Jens
2026-08-01 18:57:38 +02:00
parent 0c019bb22f
commit 3d442ef43f
48 changed files with 15390 additions and 1 deletions
@@ -0,0 +1,5 @@
command=python -m alembic heads
exit_code=0
captured_at=2026-08-01T18:37:24.0020021+02:00
202607260001 (head)
@@ -0,0 +1,500 @@
-- command=python -m alembic upgrade head --sql
-- exit_code=0
-- captured_at=2026-08-01T18:37:24.0299035+02:00
BEGIN;
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Generating static SQL
INFO [alembic.runtime.migration] Will assume transactional DDL.
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
);
INFO [alembic.runtime.migration] Running upgrade -> 202601110001, Initial PostGIS schema for Sprint 1 foundation.
-- Running upgrade -> 202601110001
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE projects (
id UUID NOT NULL,
name TEXT NOT NULL,
description TEXT,
region TEXT DEFAULT 'Kempen' NOT NULL,
status TEXT DEFAULT 'active' NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id)
);
CREATE TABLE areas (
id UUID NOT NULL,
project_id UUID NOT NULL,
name TEXT NOT NULL,
geometry geometry(MULTIPOLYGON,4326) NOT NULL,
original_crs TEXT,
area_m2 FLOAT,
bbox geometry(POLYGON,4326),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE
);
CREATE INDEX idx_areas_geometry ON areas USING gist (geometry);
CREATE INDEX idx_areas_bbox ON areas USING gist (bbox);
CREATE TABLE datasets (
id UUID NOT NULL,
project_id UUID NOT NULL,
area_id UUID,
name TEXT NOT NULL,
dataset_type TEXT NOT NULL,
source TEXT NOT NULL,
storage_path TEXT,
derived_from_dataset_id UUID,
crs TEXT,
bounds_json JSON,
resolution_json JSON,
bands_json JSON,
metadata_json JSON,
status TEXT DEFAULT 'created' NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(area_id) REFERENCES areas (id) ON DELETE SET NULL,
FOREIGN KEY(derived_from_dataset_id) REFERENCES datasets (id) ON DELETE SET NULL
);
CREATE TABLE dataset_versions (
id UUID NOT NULL,
dataset_id UUID NOT NULL,
version INTEGER DEFAULT '1' NOT NULL,
storage_path TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE CASCADE
);
CREATE TABLE analysis_runs (
id UUID NOT NULL,
project_id UUID NOT NULL,
area_id UUID,
analysis_type TEXT NOT NULL,
status TEXT NOT NULL,
parameters_json JSON NOT NULL,
started_at TIMESTAMP WITH TIME ZONE,
finished_at TIMESTAMP WITH TIME ZONE,
error_message TEXT,
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(area_id) REFERENCES areas (id) ON DELETE SET NULL
);
CREATE TABLE exports (
id UUID NOT NULL,
project_id UUID NOT NULL,
analysis_run_id UUID,
export_type TEXT NOT NULL,
storage_path TEXT NOT NULL,
metadata_json JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL
);
CREATE INDEX ix_areas_geometry ON areas USING gist (geometry);
CREATE INDEX ix_areas_project_id ON areas (project_id);
CREATE INDEX ix_datasets_project_id ON datasets (project_id);
INSERT INTO alembic_version (version_num) VALUES ('202601110001') RETURNING alembic_version.version_num;
INFO [alembic.runtime.migration] Running upgrade 202601110001 -> 202601120001, Add dataset storage metadata columns.
-- Running upgrade 202601110001 -> 202601120001
ALTER TABLE datasets ADD COLUMN original_filename TEXT;
ALTER TABLE datasets ADD COLUMN stored_filename TEXT;
ALTER TABLE datasets ADD COLUMN content_type TEXT;
ALTER TABLE datasets ADD COLUMN size_bytes INTEGER;
ALTER TABLE datasets ADD COLUMN checksum_sha256 TEXT;
ALTER TABLE datasets ALTER COLUMN status SET DEFAULT 'uploaded';
UPDATE alembic_version SET version_num='202601120001' WHERE alembic_version.version_num = '202601110001';
INFO [alembic.runtime.migration] Running upgrade 202601120001 -> 20260611212435, Add lightweight job table for sprint-3 async architecture foundation.
-- Running upgrade 202601120001 -> 20260611212435
CREATE TABLE jobs (
id UUID NOT NULL,
job_type TEXT NOT NULL,
status TEXT DEFAULT 'queued' NOT NULL,
project_id UUID NOT NULL,
dataset_id UUID,
input_dataset_id UUID,
output_dataset_id UUID,
parameters_json JSON NOT NULL,
result_json JSON,
error_message TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
started_at TIMESTAMP WITH TIME ZONE,
finished_at TIMESTAMP WITH TIME ZONE,
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE SET NULL,
FOREIGN KEY(input_dataset_id) REFERENCES datasets (id) ON DELETE SET NULL,
FOREIGN KEY(output_dataset_id) REFERENCES datasets (id) ON DELETE SET NULL
);
CREATE INDEX ix_jobs_project_id ON jobs (project_id);
CREATE INDEX ix_jobs_status ON jobs (status);
UPDATE alembic_version SET version_num='20260611212435' WHERE alembic_version.version_num = '202601120001';
INFO [alembic.runtime.migration] Running upgrade 20260611212435 -> 202606120001, Add dataset reference and provenance metadata columns.
-- Running upgrade 20260611212435 -> 202606120001
ALTER TABLE datasets ADD COLUMN dataset_role TEXT DEFAULT 'source' NOT NULL;
ALTER TABLE datasets ADD COLUMN source_name TEXT;
ALTER TABLE datasets ADD COLUMN reference_layer_name TEXT;
ALTER TABLE datasets ADD COLUMN source_metadata JSON;
ALTER TABLE datasets ADD COLUMN provenance_metadata JSON;
ALTER TABLE datasets ADD COLUMN imported_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL;
UPDATE alembic_version SET version_num='202606120001' WHERE alembic_version.version_num = '20260611212435';
INFO [alembic.runtime.migration] Running upgrade 202606120001 -> 202606120700, Add Sprint 7A vector feature and QA persistence foundation.
-- Running upgrade 202606120001 -> 202606120700
CREATE TABLE vector_features (
id UUID NOT NULL,
dataset_id UUID NOT NULL,
feature_class TEXT,
source_feature_id TEXT,
properties_json JSON,
geometry geometry(GEOMETRY,4326) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE CASCADE
);
CREATE INDEX ix_vector_features_dataset_id ON vector_features (dataset_id);
CREATE INDEX ix_vector_features_geometry ON vector_features USING gist (geometry);
CREATE TABLE quality_checks (
id UUID NOT NULL,
project_id UUID NOT NULL,
job_id UUID,
analysis_run_id UUID,
candidate_dataset_id UUID,
reference_dataset_id UUID NOT NULL,
check_type TEXT NOT NULL,
status TEXT NOT NULL,
score FLOAT,
parameters_json JSON,
findings_json JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
completed_at TIMESTAMP WITH TIME ZONE,
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(job_id) REFERENCES jobs (id) ON DELETE SET NULL,
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL,
FOREIGN KEY(candidate_dataset_id) REFERENCES datasets (id) ON DELETE SET NULL,
FOREIGN KEY(reference_dataset_id) REFERENCES datasets (id) ON DELETE CASCADE
);
CREATE INDEX ix_quality_checks_project_id ON quality_checks (project_id);
CREATE INDEX ix_quality_checks_reference_dataset_id ON quality_checks (reference_dataset_id);
CREATE INDEX ix_quality_checks_candidate_dataset_id ON quality_checks (candidate_dataset_id);
CREATE INDEX ix_quality_checks_analysis_run_id ON quality_checks (analysis_run_id);
CREATE TABLE metrics (
id UUID NOT NULL,
quality_check_id UUID,
analysis_run_id UUID,
metric_key TEXT NOT NULL,
metric_value FLOAT,
metric_unit TEXT,
label TEXT,
metadata_json JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (id),
FOREIGN KEY(quality_check_id) REFERENCES quality_checks (id) ON DELETE CASCADE,
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL
);
CREATE INDEX ix_metrics_quality_check_id ON metrics (quality_check_id);
CREATE INDEX ix_metrics_analysis_run_id ON metrics (analysis_run_id);
UPDATE alembic_version SET version_num='202606120700' WHERE alembic_version.version_num = '202606120001';
INFO [alembic.runtime.migration] Running upgrade 202606120700 -> 202606120800, Add Sprint 8 detection foundation.
-- Running upgrade 202606120700 -> 202606120800
ALTER TABLE analysis_runs ADD COLUMN dataset_id UUID;
ALTER TABLE analysis_runs ADD FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE SET NULL;
ALTER TABLE analysis_runs ADD COLUMN job_id UUID;
ALTER TABLE analysis_runs ADD FOREIGN KEY(job_id) REFERENCES jobs (id) ON DELETE SET NULL;
ALTER TABLE analysis_runs ADD COLUMN model_name VARCHAR(255);
ALTER TABLE analysis_runs ADD COLUMN model_version VARCHAR(120);
ALTER TABLE analysis_runs ADD COLUMN result_json JSON;
ALTER TABLE analysis_runs ADD COLUMN created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL;
CREATE TABLE detections (
id UUID NOT NULL,
project_id UUID NOT NULL,
dataset_id UUID,
analysis_run_id UUID,
job_id UUID,
model_name VARCHAR(255) NOT NULL,
model_version VARCHAR(120),
class_name VARCHAR(120) NOT NULL,
confidence FLOAT NOT NULL,
geometry geometry(GEOMETRY,4326) NOT NULL,
bbox_json JSON,
source_tile_path VARCHAR(500),
properties_json JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE SET NULL,
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL,
FOREIGN KEY(job_id) REFERENCES jobs (id) ON DELETE SET NULL
);
CREATE INDEX ix_detections_project_id ON detections (project_id);
CREATE INDEX ix_detections_dataset_id ON detections (dataset_id);
CREATE INDEX ix_detections_analysis_run_id ON detections (analysis_run_id);
CREATE INDEX ix_detections_class_name ON detections (class_name);
CREATE INDEX ix_detections_geometry ON detections USING gist (geometry);
UPDATE alembic_version SET version_num='202606120800' WHERE alembic_version.version_num = '202606120700';
INFO [alembic.runtime.migration] Running upgrade 202606120800 -> 202606120900, Add Sprint 9 segmentation foundation.
-- Running upgrade 202606120800 -> 202606120900
CREATE TABLE segmentations (
id UUID NOT NULL,
project_id UUID NOT NULL,
dataset_id UUID,
job_id UUID,
analysis_run_id UUID,
model_name VARCHAR(255) NOT NULL,
model_version VARCHAR(120),
class_name VARCHAR(120) NOT NULL,
confidence FLOAT,
geometry geometry(MULTIPOLYGON,4326) NOT NULL,
bbox_json JSON,
area_m2 FLOAT,
mask_path TEXT,
source_tile_path VARCHAR(500),
tile_index INTEGER,
properties_json JSON,
provenance_json JSON,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(dataset_id) REFERENCES datasets (id) ON DELETE SET NULL,
FOREIGN KEY(job_id) REFERENCES jobs (id) ON DELETE SET NULL,
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL
);
CREATE INDEX ix_segmentations_project_id ON segmentations (project_id);
CREATE INDEX ix_segmentations_dataset_id ON segmentations (dataset_id);
CREATE INDEX ix_segmentations_analysis_run_id ON segmentations (analysis_run_id);
CREATE INDEX ix_segmentations_job_id ON segmentations (job_id);
CREATE INDEX ix_segmentations_class_name ON segmentations (class_name);
CREATE INDEX ix_segmentations_geometry ON segmentations USING gist (geometry);
UPDATE alembic_version SET version_num='202606120900' WHERE alembic_version.version_num = '202606120800';
INFO [alembic.runtime.migration] Running upgrade 202606120900 -> 202607140001, Add temporal dataset metadata and durable dataset-version provenance.
-- Running upgrade 202606120900 -> 202607140001
ALTER TABLE datasets ADD COLUMN temporal_series_key VARCHAR(255);
ALTER TABLE datasets ADD COLUMN observed_at TIMESTAMP WITH TIME ZONE;
ALTER TABLE datasets ADD COLUMN valid_from TIMESTAMP WITH TIME ZONE;
ALTER TABLE datasets ADD COLUMN valid_to TIMESTAMP WITH TIME ZONE;
ALTER TABLE datasets ADD COLUMN temporal_granularity VARCHAR(32);
ALTER TABLE datasets ADD COLUMN source_version VARCHAR(120);
ALTER TABLE dataset_versions ADD COLUMN source_version VARCHAR(120);
ALTER TABLE dataset_versions ADD COLUMN observed_at TIMESTAMP WITH TIME ZONE;
ALTER TABLE dataset_versions ADD COLUMN valid_from TIMESTAMP WITH TIME ZONE;
ALTER TABLE dataset_versions ADD COLUMN valid_to TIMESTAMP WITH TIME ZONE;
ALTER TABLE dataset_versions ADD COLUMN checksum_sha256 VARCHAR(64);
ALTER TABLE dataset_versions ADD COLUMN source_metadata JSON;
ALTER TABLE dataset_versions ADD COLUMN provenance_metadata JSON;
CREATE INDEX ix_datasets_project_temporal_series_observed ON datasets (project_id, temporal_series_key, observed_at);
CREATE UNIQUE INDEX ix_dataset_versions_dataset_version ON dataset_versions (dataset_id, version);
CREATE INDEX ix_vector_features_dataset_source_feature ON vector_features (dataset_id, source_feature_id);
ALTER TABLE datasets ADD CONSTRAINT ck_datasets_temporal_valid_range CHECK (valid_to IS NULL OR valid_from IS NULL OR valid_to >= valid_from);
ALTER TABLE dataset_versions ADD CONSTRAINT ck_dataset_versions_temporal_valid_range CHECK (valid_to IS NULL OR valid_from IS NULL OR valid_to >= valid_from);
UPDATE alembic_version SET version_num='202607140001' WHERE alembic_version.version_num = '202606120900';
INFO [alembic.runtime.migration] Running upgrade 202607140001 -> 202607150001, Add durable operator review decisions for detection QA evidence.
-- Running upgrade 202607140001 -> 202607150001
CREATE TABLE detection_reviews (
id UUID NOT NULL,
project_id UUID NOT NULL,
quality_check_id UUID NOT NULL,
analysis_run_id UUID,
evidence_role VARCHAR(32) NOT NULL,
evidence_feature_id VARCHAR(255) NOT NULL,
detection_id UUID,
reference_feature_id UUID,
decision VARCHAR(64) DEFAULT 'unreviewed' NOT NULL,
notes TEXT,
reviewed_by VARCHAR(120) DEFAULT 'operator' NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
PRIMARY KEY (id),
CONSTRAINT ck_detection_reviews_evidence_role CHECK (evidence_role IN ('false_positive', 'false_negative')),
CONSTRAINT ck_detection_reviews_decision CHECK (decision IN ('confirmed_model_false_positive', 'confirmed_model_false_negative', 'reference_gap_or_change', 'qa_alignment_mismatch', 'imagery_obscured_or_uncertain', 'uncertain', 'unreviewed')),
FOREIGN KEY(analysis_run_id) REFERENCES analysis_runs (id) ON DELETE SET NULL,
FOREIGN KEY(detection_id) REFERENCES detections (id) ON DELETE SET NULL,
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(quality_check_id) REFERENCES quality_checks (id) ON DELETE CASCADE,
FOREIGN KEY(reference_feature_id) REFERENCES vector_features (id) ON DELETE SET NULL,
CONSTRAINT uq_detection_reviews_evidence UNIQUE (quality_check_id, evidence_role, evidence_feature_id)
);
CREATE INDEX ix_detection_reviews_project_id ON detection_reviews (project_id);
CREATE INDEX ix_detection_reviews_quality_check_id ON detection_reviews (quality_check_id);
CREATE INDEX ix_detection_reviews_analysis_run_id ON detection_reviews (analysis_run_id);
CREATE INDEX ix_detection_reviews_decision ON detection_reviews (decision);
UPDATE alembic_version SET version_num='202607150001' WHERE alembic_version.version_num = '202607140001';
INFO [alembic.runtime.migration] Running upgrade 202607150001 -> 202607160001, Index partitioned vector features by dataset and municipality.
-- Running upgrade 202607150001 -> 202607160001
CREATE INDEX ix_vector_features_dataset_municipality ON vector_features (dataset_id, (properties_json ->> 'municipality'));
UPDATE alembic_version SET version_num='202607160001' WHERE alembic_version.version_num = '202607150001';
INFO [alembic.runtime.migration] Running upgrade 202607160001 -> 202607260001, Add resumable AOI parent and partition operations.
-- Running upgrade 202607160001 -> 202607260001
CREATE TABLE aoi_operations (
id UUID NOT NULL,
project_id UUID NOT NULL,
area_id UUID,
parent_job_id UUID,
operation_type VARCHAR(128) NOT NULL,
status VARCHAR(32) NOT NULL,
geometry geometry(MULTIPOLYGON,4326) NOT NULL,
request_json JSON NOT NULL,
plan_json JSON NOT NULL,
result_json JSON,
error_message TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
started_at TIMESTAMP WITH TIME ZONE,
finished_at TIMESTAMP WITH TIME ZONE,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
PRIMARY KEY (id),
CONSTRAINT ck_aoi_operations_status CHECK (status IN ('queued', 'running', 'partial', 'success', 'failed', 'cancelled')),
FOREIGN KEY(project_id) REFERENCES projects (id) ON DELETE CASCADE,
FOREIGN KEY(area_id) REFERENCES areas (id) ON DELETE SET NULL,
FOREIGN KEY(parent_job_id) REFERENCES jobs (id) ON DELETE SET NULL
);
CREATE INDEX ix_aoi_operations_project_status ON aoi_operations (project_id, status);
CREATE INDEX ix_aoi_operations_geometry ON aoi_operations USING gist (geometry);
CREATE TABLE aoi_operation_partitions (
id UUID NOT NULL,
operation_id UUID NOT NULL,
child_job_id UUID,
partition_key VARCHAR(255) NOT NULL,
provider_key VARCHAR(120) NOT NULL,
product_key VARCHAR(120) NOT NULL,
ordinal INTEGER NOT NULL,
status VARCHAR(32) NOT NULL,
geometry geometry(MULTIPOLYGON,4326) NOT NULL,
attempt_count INTEGER DEFAULT '0' NOT NULL,
max_attempts INTEGER DEFAULT '3' NOT NULL,
checkpoint_json JSON,
result_json JSON,
error_message TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
started_at TIMESTAMP WITH TIME ZONE,
finished_at TIMESTAMP WITH TIME ZONE,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
PRIMARY KEY (id),
CONSTRAINT ck_aoi_operation_partitions_status CHECK (status IN ('queued', 'running', 'success', 'failed', 'skipped')),
CONSTRAINT uq_aoi_operation_partition_key UNIQUE (operation_id, partition_key),
FOREIGN KEY(operation_id) REFERENCES aoi_operations (id) ON DELETE CASCADE,
FOREIGN KEY(child_job_id) REFERENCES jobs (id) ON DELETE SET NULL
);
CREATE INDEX ix_aoi_operation_partitions_operation_status ON aoi_operation_partitions (operation_id, status);
CREATE INDEX ix_aoi_operation_partitions_geometry ON aoi_operation_partitions USING gist (geometry);
UPDATE alembic_version SET version_num='202607260001' WHERE alembic_version.version_num = '202607160001';
COMMIT;
@@ -0,0 +1,28 @@
workdir=backend
command=python -m pytest -W error::DeprecationWarning
exit_code=2
captured_at=2026-08-01T18:33:34.1591431+02:00
============================= test session starts =============================
platform win32 -- Python 3.13.2, pytest-8.4.0, pluggy-1.6.0
rootdir: C:\Projects\geointel\backend
configfile: pyproject.toml
plugins: asyncio-1.0.0, cov-6.3.0, anyio-4.12.1
asyncio: mode=Mode.STRICT, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 1194 items / 1 error
=================================== ERRORS ====================================
__________ ERROR collecting tests/test_operator_polygon_label_qa.py ___________
ImportError while importing test module 'C:\Projects\geointel\backend\tests\test_operator_polygon_label_qa.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
C:\Program Files\Python313\Lib\importlib\__init__.py:88: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests\test_operator_polygon_label_qa.py:1: in <module>
from scripts.render_operator_polygon_label_qa import geometry_rings
E ModuleNotFoundError: No module named 'scripts.render_operator_polygon_label_qa'
=========================== short test summary info ===========================
ERROR tests/test_operator_polygon_label_qa.py
!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 5.69s ===============================
File diff suppressed because one or more lines are too long
@@ -0,0 +1,325 @@
command=python -m pytest backend/tests -q -p no:cacheprovider -W error::DeprecationWarning --junitxml=artifacts/evidence/accuracy/P1/backend-full-suite.junit.xml
exit_code=1
captured_at=2026-08-01T18:32:02.4460806+02:00
........................................................................ [ 6%]
........................................................................ [ 12%]
.........................................F..........F..................F [ 18%]
..................F..................................................... [ 24%]
.........F.............................................................. [ 30%]
........................................................................ [ 36%]
.....F.F.......................................FF....................... [ 42%]
........................................................................ [ 48%]
..F..................................................................... [ 54%]
........................................................................ [ 60%]
.......F................................................................ [ 66%]
........................................................................ [ 72%]
........................................FFFF...........F................ [ 78%]
...............................................F........................ [ 84%]
........................................................................ [ 90%]
........................................................................ [ 96%]
............................................. [100%]
================================== FAILURES ===================================
_ test_frontend_prefers_materialized_national_workspace_and_resolves_drawn_bbox _
def test_frontend_prefers_materialized_national_workspace_and_resolves_drawn_bbox() -> None:
root = Path(__file__).parents[2]
focus = (root / "frontend" / "src" / "config" / "primaryFocus.ts").read_text(encoding="utf-8")
workspace_hook = (root / "frontend" / "src" / "hooks" / "useProjectWorkspace.ts").read_text(encoding="utf-8")
coverage_hook = (root / "frontend" / "src" / "hooks" / "useCoverageResolver.ts").read_text(encoding="utf-8")
map_workspace = (root / "frontend" / "src" / "components" / "map" / "MapWorkspace.tsx").read_text(encoding="utf-8")
assert "Belgium and North Sea Workbench" in focus
assert "nationalProject" in workspace_hook
assert "return nationalProject.id" in workspace_hook
assert "NATIONAL_WORKSPACE_REGION" in workspace_hook
assert "externalApi.resolveCoverage" in coverage_hook
assert "coverage.outside_supported_scope" in map_workspace
assert "coverageStatusLabel" in map_workspace
> assert "coverageSelectionAvailable" in map_workspace
E assert 'coverageSelectionAvailable' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_rc4_national_coverage.py:432: AssertionError
____ test_runtime_configuration_is_validated_before_container_replacement _____
def test_runtime_configuration_is_validated_before_container_replacement() -> None:
run_script = (ROOT / "deploy" / "unraid" / "run-dockerman-container.sh").read_text(encoding="utf-8")
validation_index = run_script.index("validate_runtime_config")
> replacement_index = run_script.index("docker compose down")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E ValueError: substring not found
backend\tests\test_rc5_release_deployment.py:65: ValueError
___________ test_rc9_loading_and_accessibility_states_are_explicit ____________
def test_rc9_loading_and_accessibility_states_are_explicit() -> None:
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
map_workspace = (
ROOT / "frontend" / "src" / "components" / "map" / "MapWorkspace.tsx"
).read_text(encoding="utf-8")
geo_map = (ROOT / "frontend" / "src" / "components" / "GeoMap.tsx").read_text(
encoding="utf-8"
)
assert "workspaceDataLoading" in app
assert 'role="status" aria-live="polite"' in app
assert "Databronnen worden gecontroleerd" in map_workspace
> assert "Beschikbaarheid controleren" in map_workspace
E assert 'Beschikbaarheid controleren' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_rc9_ux_release_contract.py:33: AssertionError
___________ test_all_in_one_deploy_embeds_immutable_build_identity ____________
def test_all_in_one_deploy_embeds_immutable_build_identity() -> None:
dockerfile = (ROOT / "deploy" / "unraid" / "Dockerfile.all-in-one").read_text(encoding="utf-8")
release_script = (ROOT / "deploy" / "unraid" / "deploy-release.sh").read_text(encoding="utf-8")
deploy_powershell = (ROOT / "scripts" / "deploy_tower.ps1").read_text(encoding="utf-8")
deploy_shell = (ROOT / "scripts" / "deploy_tower.sh").read_text(encoding="utf-8")
assert "ARG GEOINTEL_BUILD_SHA=unknown" in dockerfile
assert 'GEOINTEL_BUILD_SHA="${GEOINTEL_BUILD_SHA}"' in dockerfile
assert 'GEOINTEL_BUILD_TIME="${GEOINTEL_BUILD_TIME}"' in dockerfile
assert 'org.opencontainers.image.revision="${GEOINTEL_BUILD_SHA}"' in dockerfile
> assert 'GEOINTEL_BUILD_SHA="$(git rev-parse HEAD)"' in release_script
E assert 'GEOINTEL_BUILD_SHA="$(git rev-parse HEAD)"' in '#!/usr/bin/env bash\nset -euo pipefail\n\nROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"\ncd "$ROOT"\n\nG...ge.revision"}} created={{index .Config.Labels "org.opencontainers.image.created"}}\' \\\n "$GEOINTEL_RELEASE_IMAGE"\n'
backend\tests\test_rc_runtime_observability.py:47: AssertionError
_____________ test_frontend_exposes_map_bbox_selection_contracts ______________
def test_frontend_exposes_map_bbox_selection_contracts() -> None:
api_client = (ROOT / "frontend" / "src" / "services" / "api" / "datasets.ts").read_text(encoding="utf-8")
map_workspace = (ROOT / "frontend" / "src" / "components" / "map" / "MapWorkspace.tsx").read_text(encoding="utf-8")
geomap = (ROOT / "frontend" / "src" / "components" / "GeoMap.tsx").read_text(encoding="utf-8")
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
extract_hook = (ROOT / "frontend" / "src" / "hooks" / "useMapSelectionExtract.ts").read_text(encoding="utf-8")
theme_hook = (ROOT / "frontend" / "src" / "hooks" / "useMapThemeSelectionInsights.ts").read_text(encoding="utf-8")
assert "selectVectorFeatures" in api_client
assert "Area selection" in map_workspace
assert "Teken rechthoek" in map_workspace
assert "Objecten in gebied ophalen" in map_workspace
assert "Gebiedsdownload bewaren" in map_workspace
assert "bboxSelectionMode" in geomap
assert "selection-bbox" in geomap
assert "selection-result" in geomap
assert "useMapSelectionExtract" in app
assert "area_id: areaId" in extract_hook
assert "area_id: areaId" in theme_hook
> assert "analyzeSelection(selectedAreaBbox, selectedMapArea?.id)" in map_workspace
E assert 'analyzeSelection(selectedAreaBbox, selectedMapArea?.id)' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint106_map_bbox_extract.py:356: AssertionError
______ test_frontend_declares_national_scope_as_primary_operating_focus _______
def test_frontend_declares_national_scope_as_primary_operating_focus() -> None:
focus = (ROOT / "frontend" / "src" / "config" / "primaryFocus.ts").read_text(
encoding="utf-8"
)
project_hook = (ROOT / "frontend" / "src" / "hooks" / "useProjectWorkspace.ts").read_text(
encoding="utf-8"
)
map_source = (ROOT / "frontend" / "src" / "components" / "GeoMap.tsx").read_text(
encoding="utf-8"
)
navigation = (
ROOT
/ "frontend"
/ "src"
/ "components"
/ "shell"
/ "WorkbenchNavigation.tsx"
).read_text(encoding="utf-8")
assert "NATIONAL_WORKSPACE_PROJECT_NAME = 'Belgium and North Sea Workbench'" in focus
assert "NATIONAL_WORKSPACE_REGION = 'Belgie en Belgische Noordzee'" in focus
assert "NATIONAL_MAP_CENTER" in focus
assert "return nationalProject.id" in project_hook
assert "hasMappedAnalysisContext(data)" in project_hook
assert "dataset.dataset_type === 'raster'" in project_hook
assert "dataset.dataset_type === 'vector' || dataset.dataset_type === 'geojson'" in project_hook
assert "PRIMARY_FOCUS_AREA_NAME" not in project_hook
assert "PRIMARY_FOCUS_AREA_GEOJSON" not in project_hook
assert "center: NATIONAL_MAP_CENTER" in map_source
assert "zoom: NATIONAL_MAP_ZOOM" in map_source
assert "GeoIntel" in navigation
> assert "Atlas Workbench" in navigation
E AssertionError: assert 'Atlas Workbench' in 'import {\n Activity,\n Bot,\n Database,\n Download,\n Map,\n ScanSearch,\n Settings,\n ShieldCheck,\n type L... )\n })}\n </div>\n ))}\n </nav>\n <ItWorxSignature />\n </aside>\n )\n}\n'
backend\tests\test_sprint177_mol_primary_focus.py:38: AssertionError
______ test_product_docs_record_national_scope_and_mol_regression_focus _______
def test_product_docs_record_national_scope_and_mol_regression_focus() -> None:
readme = (ROOT / "README.md").read_text(encoding="utf-8")
vision = (ROOT / "docs" / "PRODUCT_VISION.md").read_text(encoding="utf-8")
> assert "Belgium and the Belgian North Sea" in readme
E assert 'Belgium and the Belgian North Sea' in '# GeoIntel\n\n<p align="center">\n <img src="frontend/public/geointel-icon.png" width="92" alt="GeoIntel logo">\n</p...\n\nActieve mijlpaal: **v1.0.0 Belgium and Belgian North Sea**.\n\nGeoIntel is een project van Jens / ITWorx.tech.\n'
backend\tests\test_sprint177_mol_primary_focus.py:62: AssertionError
_____________ test_map_first_explorer_is_the_default_product_flow _____________
def test_map_first_explorer_is_the_default_product_flow() -> None:
app = read("frontend/src/App.tsx")
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
assert "useState<WorkspaceKey>('map')" in app
assert "Gebied analyseren" in workspace
> assert "<h3>Focus op de kaart <small>optioneel</small></h3>" in workspace
E assert '<h3>Focus op de kaart <small>optioneel</small></h3>' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint186_map_first_geographic_explorer.py:19: AssertionError
___________ test_map_rectangle_drag_is_wired_to_automatic_analysis ____________
def test_map_rectangle_drag_is_wired_to_automatic_analysis() -> None:
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
geomap = read("frontend/src/components/GeoMap.tsx")
styles = read("frontend/src/styles/app.css")
assert "onMapBboxPreview={handleMapBboxPreview}" in workspace
assert "onMapBboxSelect={handleMapBboxSelect}" in workspace
assert "void analyzeSelection(bbox, areaIdForSelection(bbox))" in workspace
assert "const areaIdForSelection" in workspace
assert "bbox && selectedMapArea ? selectedMapArea.id : undefined" in workspace
> assert "void analyzeSelection(selectedAreaBbox, selectedMapArea?.id)" in workspace
E assert 'void analyzeSelection(selectedAreaBbox, selectedMapArea?.id)' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint186_map_first_geographic_explorer.py:44: AssertionError
__ test_evolution_theme_catalog_distinguishes_history_from_current_only_data __
def test_evolution_theme_catalog_distinguishes_history_from_current_only_data() -> None:
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
assert "analysisMode === 'current'" in workspace
> assert "Boolean(dataset || onDemandProduct)" in workspace
E assert 'Boolean(dataset || onDemandProduct)' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint200_temporal_explorer_handoff.py:25: AssertionError
_____ test_regional_map_uses_logical_partition_groups_and_exact_analysis ______
def test_regional_map_uses_logical_partition_groups_and_exact_analysis() -> None:
app = (ROOT / "frontend/src/App.tsx").read_text(encoding="utf-8")
workspace = (ROOT / "frontend/src/components/map/MapWorkspace.tsx").read_text(encoding="utf-8")
hook = (ROOT / "frontend/src/hooks/useMapThemeSelectionInsights.ts").read_text(encoding="utf-8")
api = (ROOT / "frontend/src/services/api/datasets.ts").read_text(encoding="utf-8")
assert "regionalScopeSelected" in workspace
assert "rasterPartitionsForDataset" in workspace
assert "imageOverlays={activeImageOverlays}" in workspace
> assert "de juiste gemeentelijke rasters worden automatisch gecombineerd" in workspace
E assert 'de juiste gemeentelijke rasters worden automatisch gecombineerd' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint219_regional_raster_explorer.py:30: AssertionError
___ test_frontend_uses_partitioned_bathymetry_selection_for_regional_scope ____
def test_frontend_uses_partitioned_bathymetry_selection_for_regional_scope() -> None:
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
index = (ROOT / "frontend" / "index.html").read_text(encoding="utf-8")
focus = (
ROOT / "frontend" / "src" / "config" / "primaryFocus.ts"
).read_text(encoding="utf-8")
map_workspace = (
ROOT / "frontend" / "src" / "components" / "map" / "MapWorkspace.tsx"
).read_text(encoding="utf-8")
theme_hook = (
ROOT / "frontend" / "src" / "hooks" / "useMapThemeSelectionInsights.ts"
).read_text(encoding="utf-8")
dataset_api = (
ROOT / "frontend" / "src" / "services" / "api" / "datasets.ts"
).read_text(encoding="utf-8")
assert "isPartitionedBathymetry" in map_workspace
assert "regionalPartitionedThemeActive" in map_workspace
> assert "datasetAvailabilityLabel(dataset, partitions)" in map_workspace
E assert 'datasetAvailabilityLabel(dataset, partitions)' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint236_bathymetry_expansion.py:478: AssertionError
____ test_flanders_workspace_exposes_governed_thematic_products_on_demand _____
def test_flanders_workspace_exposes_governed_thematic_products_on_demand() -> None:
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
product_hook = read("frontend/src/hooks/useOfficialMapProducts.ts")
selection_hook = read("frontend/src/hooks/useMapThemeSelectionInsights.ts")
api = read("frontend/src/services/api/datasets.ts")
assert "activeScopeProject?.name === FLANDERS_WORKSPACE_PROJECT_NAME" in workspace
assert "new Map<DataThemeId, OnDemandMapProduct>" in workspace
> assert "'Automatisch'" in workspace
E assert "'Automatisch'" in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint237_flanders_thematic_on_demand.py:19: AssertionError
________ test_selection_reads_and_bounded_acquires_all_relevant_themes ________
def test_selection_reads_and_bounded_acquires_all_relevant_themes() -> None:
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
app = read("frontend/src/App.tsx")
selection_hook = read("frontend/src/hooks/useMapThemeSelectionInsights.ts")
> assert "for (const theme of [activeTheme])" in workspace
E assert 'for (const theme of [activeTheme])' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint237_flanders_thematic_on_demand.py:37: AssertionError
______ test_regional_on_demand_sources_require_a_bounded_drawn_selection ______
def test_regional_on_demand_sources_require_a_bounded_drawn_selection() -> None:
workspace = read("frontend/src/components/map/MapWorkspace.tsx")
assert "regionalOnDemandThemeActive" in workspace
> assert "regionalRasterThemeActive || regionalOnDemandThemeActive" in workspace
E assert 'regionalRasterThemeActive || regionalOnDemandThemeActive' in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint237_flanders_thematic_on_demand.py:56: AssertionError
_____ test_grb_frontend_and_contracts_use_only_the_governed_backend_path ______
def test_grb_frontend_and_contracts_use_only_the_governed_backend_path() -> None:
selection_hook = (ROOT / "frontend/src/hooks/useMapThemeSelectionInsights.ts").read_text(encoding="utf-8")
catalog_hook = (ROOT / "frontend/src/hooks/useOfficialMapProducts.ts").read_text(encoding="utf-8")
workspace = (ROOT / "frontend/src/components/map/MapWorkspace.tsx").read_text(encoding="utf-8")
contracts = (ROOT / "docs/API_CONTRACTS.md").read_text(encoding="utf-8")
assert "datasetsApi.acquireGrb" in selection_hook
assert "datasetsApi.listGrbProducts" in catalog_hook
assert "officialMapProducts.grb" in workspace
assert "result[product.key] = null" in workspace
assert ": onDemandThemeActive\n ? null\n : mapFeatureCollection" in workspace
assert "onSetContextLayerLabel" in workspace
> assert "'Automatisch'" in workspace
E assert "'Automatisch'" in "import { useCallback, useEffect, useMemo, useRef, useState, type KeyboardEvent } from 'react'\nimport { BoxSelect, Ch...ijken.</p>\n )}\n </div>\n </div>\n </details>\n </div>\n </section>\n )\n}\n"
backend\tests\test_sprint239_bounded_grb_acquisition.py:394: AssertionError
__________ test_app_entrypoint_has_clean_encoding_and_react_imports ___________
def test_app_entrypoint_has_clean_encoding_and_react_imports() -> None:
app_path = ROOT / "frontend" / "src" / "App.tsx"
app_bytes = app_path.read_bytes()
app = app_path.read_text(encoding="utf-8")
assert not app_bytes.startswith(b"\xef\xbb\xbf")
assert "import { useEffect, useMemo, useRef, useState } from 'react'" in app
assert "FormEvent" not in app
> assert app.count("useEffect(") == 1
E assert 3 == 1
E + where 3 = <built-in method count of str object at 0x000001FED98D8C30>('useEffect(')
E + where <built-in method count of str object at 0x000001FED98D8C30> = "import { useEffect, useMemo, useRef, useState } from 'react'\nimport { CircleAlert, LogOut, ShieldCheck, UserRound } ...ator' : 'open')}\n loggingOut={loggingOut}\n onLogout={handleLogout}\n />\n )\n}\n\nexport default App\n".count
backend\tests\test_sprint39_frontend_orchestration_hooks.py:40: AssertionError
- generated xml file: C:\Projects\geointel\artifacts\evidence\accuracy\P1\backend-full-suite.junit.xml -
=========================== short test summary info ===========================
FAILED backend\tests\test_rc4_national_coverage.py::test_frontend_prefers_materialized_national_workspace_and_resolves_drawn_bbox
FAILED backend\tests\test_rc5_release_deployment.py::test_runtime_configuration_is_validated_before_container_replacement
FAILED backend\tests\test_rc9_ux_release_contract.py::test_rc9_loading_and_accessibility_states_are_explicit
FAILED backend\tests\test_rc_runtime_observability.py::test_all_in_one_deploy_embeds_immutable_build_identity
FAILED backend\tests\test_sprint106_map_bbox_extract.py::test_frontend_exposes_map_bbox_selection_contracts
FAILED backend\tests\test_sprint177_mol_primary_focus.py::test_frontend_declares_national_scope_as_primary_operating_focus
FAILED backend\tests\test_sprint177_mol_primary_focus.py::test_product_docs_record_national_scope_and_mol_regression_focus
FAILED backend\tests\test_sprint186_map_first_geographic_explorer.py::test_map_first_explorer_is_the_default_product_flow
FAILED backend\tests\test_sprint186_map_first_geographic_explorer.py::test_map_rectangle_drag_is_wired_to_automatic_analysis
FAILED backend\tests\test_sprint200_temporal_explorer_handoff.py::test_evolution_theme_catalog_distinguishes_history_from_current_only_data
FAILED backend\tests\test_sprint219_regional_raster_explorer.py::test_regional_map_uses_logical_partition_groups_and_exact_analysis
FAILED backend\tests\test_sprint236_bathymetry_expansion.py::test_frontend_uses_partitioned_bathymetry_selection_for_regional_scope
FAILED backend\tests\test_sprint237_flanders_thematic_on_demand.py::test_flanders_workspace_exposes_governed_thematic_products_on_demand
FAILED backend\tests\test_sprint237_flanders_thematic_on_demand.py::test_selection_reads_and_bounded_acquires_all_relevant_themes
FAILED backend\tests\test_sprint237_flanders_thematic_on_demand.py::test_regional_on_demand_sources_require_a_bounded_drawn_selection
FAILED backend\tests\test_sprint239_bounded_grb_acquisition.py::test_grb_frontend_and_contracts_use_only_the_governed_backend_path
FAILED backend\tests\test_sprint39_frontend_orchestration_hooks.py::test_app_entrypoint_has_clean_encoding_and_react_imports
17 failed, 1180 passed in 70.63s (0:01:10)
@@ -0,0 +1,266 @@
# Phase 1 command and result ledger
Captured: 2026-08-01
Audited repository baseline: `0c019bb22f816db1e4b7a68379bcad08924d9a21`
Branch: `codex/geointel-accuracy-program`
This ledger records the commands and claim boundaries behind the retained
evidence. JSON, JUnit, SQL and full text logs in this directory are the source
of truth when this summary and a raw artifact differ.
## Repository and static inventory
```powershell
python scripts/run_accuracy_phase1_baseline.py --output-dir artifacts/evidence/accuracy/P1
```
Result: completed. The baseline found 2,495 tracked files, including a tracked
`geointel/` mirror with 1,153 files; 68 paired files differ from root. No model
checkpoint is tracked in the local checkout. The mirror is excluded by the root
`.dockerignore`; the residual risk is source/import/maintenance ambiguity, not
official all-in-one build-context inclusion.
Evidence:
- `phase1-baseline-summary.json`
- `repository-inventory.json`
- `local-artifact-inventory.json`
- `static-risk-signals.json`
## Deterministic contract reproductions
```powershell
python scripts/reproduce_accuracy_phase1_findings.py
```
Result: 7 of 7 expected violations reproduced. They cover cross-theme coverage
contamination, metres-as-degrees buffering, Lambert-as-4326 persistence,
caller-spoofed source authority, mutable-name model scope, mutable-name legal
scope and silently ignored Area PATCH geometry.
Evidence: `forensic-reproductions.json`.
## Tower runtime, database and storage references
The collector was streamed into the running `geointel` container and executed
with read-only SQL and a 30-second statement timeout:
```text
docker exec -i geointel env PYTHONPATH=/app/backend python -
```
Result:
- Python 3.11.2, PyTorch 2.11.0+cu128, CUDA 12.8, Ultralytics 8.4.99;
- NVIDIA GeForce RTX 4080 SUPER visible on `cuda:0`;
- Alembic head `202607260001`;
- 5,816 direct database storage references checked, 0 missing;
- four Geel detections contain Lambert-domain coordinates while the geometry
column reports SRID 4326;
- no database or storage row was modified.
A broader recursive `audit_data_operations.py` storage scan was stopped by its
244-second execution timeout and produced no retained result. It is not counted
as a pass. The bounded, direct-reference collector above completed and is the
only storage-completeness claim made here.
Evidence:
- `tower-runtime-database-snapshot.json`
- `tower-runtime-database-snapshot-detailed.json`
## Real GPU inference smoke
The read-only collector used the production `YoloDetectionAdapter`, the active
model and one existing Geel tile:
```text
python - --model-path /app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt \
--tile-path /app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif \
--manifest-path /app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/manifest.json \
--confidence 0.5 --image-size 640 --max-detections 1000 --device cuda:0 --seed 20260801
```
Result: passed; 17 raw building detections; 0.883694486 s synchronized
inference; model SHA-256
`a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1`.
Claim boundary: this proves one runtime execution. It does not prove that any
box is correct, that confidence is calibrated, or that the model generalizes.
Evidence: `tower-gpu-inference-smoke.json`.
## ML/data-lineage inventory
The bounded collector read V56/V58/V62/V66 plus model, checkpoint, report and
manifest metadata from the mounted Tower volume:
```text
docker exec -i geointel python - --app-root /app
```
Result:
- 26 model assets, 229 training checkpoints, 424 training JSON reports and
36 operator manifests inventoried;
- V56 has 180 AOIs and 0 completed human reviews;
- three pure-empty background-test AOIs: Flanders 2, Wallonia 1, Brussels 0;
- zero exact cross-split raster-hash duplicates;
- bounded 64-bit dHash screen: 180 rasters, minimum Hamming distance 17,
zero cross-split pairs at or below 4;
- minimum cross-split AOI bbox distance 95.720336 m and 24 pairs below 2 km;
- V58/V62 evidence is calibration-only; at threshold 0.15 aggregate F1 is
0.512905 while Flanders recall and F1 are 0;
- no protected-test, background-test promotion or national-release evidence.
Claim boundary: exact/dHash and bbox-distance screens do not establish
municipality, flight-strip, instance, semantic or imagery-edition independence.
Evidence: `tower-ml-data-lineage-snapshot.json` and
`tower-key-artifact-hashes.json` (V62 best/last checkpoints and V56 tile audit).
## Backend tests
### Full root-context suite
```powershell
$env:PYTHONPATH='C:\Projects\geointel\backend;C:\Projects\geointel'
python -m pytest backend/tests -q -p no:cacheprovider \
-W error::DeprecationWarning \
--junitxml=artifacts/evidence/accuracy/P1/backend-full-suite.junit.xml
```
Result: exit 1; 1,180 passed and 17 failed in 70.63 seconds. The 17 failures are
stale source/contract assertions, including expectations that conflict with the
new explicit user-selected model flow. They remain release-blocking until
replaced with reviewed behavior tests.
Evidence:
- `backend-full-suite.txt`
- `backend-full-suite.junit.xml`
### Actual backend CI working directory
```powershell
cd backend
python -m pytest -W error::DeprecationWarning
```
Result: exit 2 during collection; 1,194 items collected plus one import error:
```text
ModuleNotFoundError: No module named 'scripts.render_operator_polygon_label_qa'
```
Evidence: `backend-ci-entrypoint.txt`.
### Phase 1 tooling
```powershell
python -m pytest tests/test_accuracy_phase1_baseline.py -q -p no:cacheprovider
```
Result: 4 passed.
Evidence: `phase1-tooling-tests.txt`.
## Lint
```powershell
python -m ruff check scripts/collect_accuracy_phase1_inference_smoke.py \
scripts/collect_accuracy_phase1_ml_lineage.py \
scripts/collect_accuracy_phase1_runtime.py \
scripts/reproduce_accuracy_phase1_findings.py \
scripts/run_accuracy_phase1_baseline.py tests/test_accuracy_phase1_baseline.py
```
Result: all new Phase 1 code passed.
```powershell
python -m ruff check backend scripts tests
```
Result: exit 1; 112 findings: E402 13, E701 2, E702 69, F401 23, F403 1,
F811 2 and F841 2.
Evidence:
- `repository-ruff-baseline.txt`
- `repository-ruff-baseline.json`
## Frontend
```powershell
cd frontend
npm run test:unit
npm run typecheck
npm run build
```
Results:
- Vitest: 16 files, 51 tests passed;
- TypeScript typecheck: passed;
- production build: passed, 1,896 modules transformed.
The attempted generic `npm test -- --run` failed because no `test` script
exists; the configured command is `test:unit`. The test strategy also calls
for lint, but `npm run lint` fails with `Missing script: "lint"`.
Evidence:
- `frontend-vitest.txt` (failed non-existent generic command, retained)
- `frontend-vitest-unit.txt` (correct configured command, passed)
- `frontend-typecheck.txt`
- `frontend-build.txt`
- `frontend-lint.txt`
## API, migrations and golden QA
```powershell
python scripts/audit_api_contracts.py
```
Result: 147 implemented routes match documentation; 10 explicitly tracked
non-envelope endpoints.
Evidence: `openapi-contract-audit.txt`.
```powershell
cd backend
python -m alembic heads
python -m alembic upgrade head --sql
```
Result: one head, `202607260001`; complete offline upgrade rendered 496 SQL/log
lines. This is not a local live-PostGIS migration test.
Evidence:
- `alembic-heads.txt`
- `alembic-offline-upgrade.sql`
```powershell
python scripts/run_golden_qa_benchmark.py --json
```
Result: two runs have semantically identical metric results but different file
hashes because run identities use UUID4.
Evidence:
- `golden-qa-run-1.json`
- `golden-qa-run-2.json`
- `golden-qa-reproducibility.json`
## Explicitly not executed as a success gate
- no protected test or background-test portfolio was opened;
- no training, calibration fitting, checkpoint promotion or active-model change;
- no label was accepted on behalf of a human reviewer;
- no production database migration or data repair;
- no dataset, checkpoint, cache, output or user-owned untracked file deleted,
rewritten or moved;
- no segmentation, SAM or solar asset was inferred to be production-ready from
file presence.
@@ -0,0 +1,116 @@
{
"findings": [
{
"expected": "A small buildings partition remains partial; a roads bbox cannot complete buildings coverage.",
"id": "P1-COV-001",
"observed": {
"fully_covered": true,
"matched_dataset_ids": [
"00000000-0000-4000-8000-000000000001"
]
},
"reproduced": true,
"severity": "critical",
"source": "backend/app/services/coverage_registry_service.py:481-505"
},
{
"expected": "A 100 metre buffer is projected to a metric CRS and spans roughly hundreds of metres.",
"id": "P1-CRS-001",
"observed": {
"bounds_epsg4326": [
-95.0,
-49.0,
105.0,
151.0
],
"longitude_span_degrees": 200.0
},
"reproduced": true,
"severity": "critical",
"source": "backend/app/services/vector_operations_service.py:179-203"
},
{
"expected": "Non-WGS84 input is transformed to EPSG:4326 or rejected before persistence.",
"id": "P1-CRS-002",
"observed": {
"stored_coordinates": [
150000.0,
210000.0
],
"stored_srid": 4326
},
"reproduced": true,
"severity": "critical",
"source": "backend/app/services/vector_feature_service.py:271-299"
},
{
"expected": "Only server-attested source identities can produce authoritative operational coverage.",
"id": "P1-AUTH-001",
"observed": {
"caller_controlled_source_name": "grb",
"coverage_status": "operational",
"reported_authority": "authoritative"
},
"reproduced": true,
"severity": "critical",
"source": "backend/app/api/routes/datasets.py:142-163; backend/app/services/coverage_registry_service.py:463-559"
},
{
"expected": "Validation scope is bound to immutable geometry/source/checksum evidence.",
"id": "P1-AI-001",
"observed": {
"accepted": true,
"area_name": "Mol validation bypass",
"geometry_bounds": [
-75.0,
35.0,
-74.9,
35.1
]
},
"reproduced": true,
"severity": "critical",
"source": "backend/app/services/detection_service.py:223-232"
},
{
"expected": "Renaming an Area cannot change its legal coverage-zone identity.",
"id": "P1-COV-002",
"observed": {
"canonical": {
"outside": false,
"zones": [
"flanders"
]
},
"renamed_same_geometry": {
"outside": true,
"zones": []
}
},
"reproduced": true,
"severity": "high",
"source": "backend/app/services/coverage_registry_service.py:56-65,425-447"
},
{
"expected": "PATCH /areas/{area_id} either validates and applies geometry or rejects the field.",
"id": "P1-API-001",
"observed": {
"geometry_silently_ignored": true,
"parsed_payload": {
"crs": null,
"name": "Renamed"
}
},
"reproduced": true,
"severity": "high",
"source": "backend/app/schemas/area.py:15-17; backend/app/services/area_service.py:154-171"
}
],
"purpose": "Read-only deterministic reproductions of Phase-1 contract violations.",
"schema_version": 1,
"summary": {
"all_reproduced": true,
"reproduced": 7,
"total": 7
}
}
@@ -0,0 +1,31 @@
command=npm run build
exit_code=0
captured_at=2026-08-01T18:34:50.3212385+02:00
> geointel-frontend@1.0.0 build
> tsc -b && vite build
vite v7.3.6 building client environment for production...
transforming...
✓ 1896 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html  0.98 kB │ gzip: 0.49 kB
dist/assets/manrope-latin-500-normal-BYYD-dBL.woff2  14.04 kB
dist/assets/manrope-latin-600-normal-4f0koTD-.woff2  14.17 kB
dist/assets/manrope-latin-700-normal-BZp_XxE4.woff2  14.21 kB
dist/assets/public-sans-latin-600-normal-Fru-LXNs.woff2  14.59 kB
dist/assets/public-sans-latin-400-normal-8Rpg0ruU.woff2  14.63 kB
dist/assets/public-sans-latin-500-normal-NlrCPXnF.woff2  14.66 kB
dist/assets/manrope-latin-500-normal-DMZssgOp.woff  18.24 kB
dist/assets/manrope-latin-600-normal-BqgrALkZ.woff  18.38 kB
dist/assets/manrope-latin-700-normal-DGRFkw-m.woff  18.41 kB
dist/assets/public-sans-latin-400-normal-SBbinRkI.woff  18.49 kB
dist/assets/public-sans-latin-500-normal-vCxiVFAq.woff  18.52 kB
dist/assets/public-sans-latin-600-normal-BR59oU-I.woff  18.56 kB
dist/assets/index-BNS8Tp4f.css 426.59 kB │ gzip: 69.40 kB
dist/assets/vendor-CrqJdhs-.js 140.80 kB │ gzip: 45.27 kB
dist/assets/index-DR8RUeAl.js 457.16 kB │ gzip: 119.71 kB
dist/assets/maplibre-DEBTaTl_.js 802.71 kB │ gzip: 217.71 kB
✓ built in 9.80s
@@ -0,0 +1,12 @@
command=npm run lint
exit_code=1
captured_at=2026-08-01T18:36:26.6162306+02:00
npm error Missing script: "lint"
npm error
npm error Did you mean this?
npm error npm link # Symlink a package folder
npm error
npm error To see a list of scripts, run:
npm error npm run
npm error A complete log of this run can be found in: C:\Users\Jens\AppData\Local\npm-cache\_logs\2026-08-01T16_36_25_353Z-debug-0.log
@@ -0,0 +1,8 @@
command=npm run typecheck
exit_code=0
captured_at=2026-08-01T18:34:27.3623155+02:00
> geointel-frontend@1.0.0 typecheck
> tsc -p tsconfig.json --noEmit
@@ -0,0 +1,35 @@
command=npm run test:unit
exit_code=0
captured_at=2026-08-01T18:35:24.4298867+02:00
> geointel-frontend@1.0.0 test:unit
> vitest run
 RUN  v3.2.6 C:/Projects/geointel/frontend
✓ src/lib/datasetCapabilities.test.ts (2 tests) 5ms
✓ src/lib/performanceBudget.test.ts (3 tests) 41ms
✓ src/components/map/mapWorkspaceUtils.test.ts (14 tests) 36ms
✓ src/hooks/useMapThemeSelectionInsights.test.ts (2 tests) 43ms
✓ src/hooks/useCoverageResolver.test.tsx (4 tests) 47ms
✓ src/hooks/useTemporalComparison.test.tsx (3 tests) 36ms
✓ src/components/WorkbenchStatusStrip.test.tsx (2 tests) 151ms
✓ src/hooks/useWorkbenchBootstrap.test.tsx (3 tests) 60ms
✓ src/components/map/LiveAnalysisJourney.test.tsx (3 tests) 59ms
✓ src/components/overview/ProjectAtlasIllustration.test.tsx (2 tests) 267ms
✓ src/components/models/ModelSelector.test.tsx (2 tests) 342ms
✓ src/components/detection/AiPipelineIllustration.test.tsx (1 test) 296ms
✓ src/components/auth/LandingProjectStory.test.tsx (2 tests) 332ms
✓ src/components/map/MunicipalitySearch.test.tsx (2 tests) 483ms
✓ MunicipalitySearch > searches the official municipality catalog and activates a result  468ms
✓ src/components/auth/LandingPage.test.tsx (4 tests) 825ms
✓ LandingPage > presents the professionalised landing page and submits the operator login  471ms
✓ src/lib/bathymetryRaster.test.ts (2 tests) 3ms
 Test Files  16 passed (16)
 Tests  51 passed (51)
 Start at  18:35:16
 Duration  7.37s (transform 2.45s, setup 0ms, collect 14.66s, tests 3.03s, environment 45.46s, prepare 8.07s)
@@ -0,0 +1,9 @@
command=npm test -- --run
exit_code=1
captured_at=2026-08-01T18:34:11.9904224+02:00
npm error Missing script: "test"
npm error
npm error To see a list of scripts, run:
npm error npm run
npm error A complete log of this run can be found in: C:\Users\Jens\AppData\Local\npm-cache\_logs\2026-08-01T16_34_11_785Z-debug-0.log
@@ -0,0 +1,11 @@
{
"schema_version": 1,
"command": "python scripts/run_golden_qa_benchmark.py --json",
"run_1_exit_code": 0,
"run_2_exit_code": 0,
"run_1_sha256": "ec96862b024987b59e56579920361582e718126b07885732335ac1b4d51b61bc",
"run_2_sha256": "4f900711a706dd56dd16b368e261761051f6d52a38bfd421e7d1c5f66ee51e49",
"byte_identical": false,
"semantic_results_equal": true,
"interpretation": "Metric values are stable, but UUID4-backed run identity makes retained JSON byte-nondeterministic."
}
@@ -0,0 +1,177 @@
{
"benchmark_id": "golden-buildings-partial-match-v1",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings.geojson",
"reference": "fixtures/golden/reference_buildings.geojson"
},
"metrics": {
"f1": 0.5,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": 0.8339768339652592,
"precision": 0.5,
"recall": 0.5
},
"persistence": {
"commit_count": 4,
"metric_count": 24,
"metric_keys": [
"f1",
"false_negative_count",
"false_positive_count",
"mean_iou",
"precision",
"recall"
],
"quality_check_count": 4
},
"scenario_count": 4,
"scenarios": [
{
"benchmark_id": "golden-buildings-partial-match-v1",
"description": "Two reference building polygons and two candidate building polygons: one candidate matches ref-1, one candidate is a false positive, and ref-2 is a false negative.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings.geojson",
"reference": "fixtures/golden/reference_buildings.geojson"
},
"metrics": {
"f1": 0.5,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": 0.8339768339652592,
"precision": 0.5,
"recall": 0.5
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "5fe92da9-2d8d-46a4-9992-2de89e3cf511",
"result_counts": {
"candidate_feature_count": 2,
"matches": 1,
"reference_feature_count": 2
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-perfect-match-v1",
"description": "One candidate building polygon exactly matches one reference polygon.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_perfect.geojson",
"reference": "fixtures/golden/reference_buildings_perfect.geojson"
},
"metrics": {
"f1": 1.0,
"false_negative_count": 0,
"false_positive_count": 0,
"mean_iou": 1.0,
"precision": 1.0,
"recall": 1.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "7b8c1444-31e6-4780-92cb-f2060f4a4048",
"result_counts": {
"candidate_feature_count": 1,
"matches": 1,
"reference_feature_count": 1
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-no-overlap-v1",
"description": "One candidate polygon and one reference polygon do not overlap.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_no_overlap.geojson",
"reference": "fixtures/golden/reference_buildings_no_overlap.geojson"
},
"metrics": {
"f1": null,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": null,
"precision": 0.0,
"recall": 0.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "1ffb1817-b237-4ca8-aad7-ff3312ac7e03",
"result_counts": {
"candidate_feature_count": 1,
"matches": 0,
"reference_feature_count": 1
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-multipolygon-match-v1",
"description": "One candidate MultiPolygon exactly matches one reference MultiPolygon.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_multipolygon.geojson",
"reference": "fixtures/golden/reference_buildings_multipolygon.geojson"
},
"metrics": {
"f1": 1.0,
"false_negative_count": 0,
"false_positive_count": 0,
"mean_iou": 1.0,
"precision": 1.0,
"recall": 1.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "60e6a321-2aaf-467b-9281-f30dd4179333",
"result_counts": {
"candidate_feature_count": 1,
"matches": 1,
"reference_feature_count": 1
},
"status": "passed"
}
],
"status": "passed",
"version": 1
}
@@ -0,0 +1,177 @@
{
"benchmark_id": "golden-buildings-partial-match-v1",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings.geojson",
"reference": "fixtures/golden/reference_buildings.geojson"
},
"metrics": {
"f1": 0.5,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": 0.8339768339652592,
"precision": 0.5,
"recall": 0.5
},
"persistence": {
"commit_count": 4,
"metric_count": 24,
"metric_keys": [
"f1",
"false_negative_count",
"false_positive_count",
"mean_iou",
"precision",
"recall"
],
"quality_check_count": 4
},
"scenario_count": 4,
"scenarios": [
{
"benchmark_id": "golden-buildings-partial-match-v1",
"description": "Two reference building polygons and two candidate building polygons: one candidate matches ref-1, one candidate is a false positive, and ref-2 is a false negative.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings.geojson",
"reference": "fixtures/golden/reference_buildings.geojson"
},
"metrics": {
"f1": 0.5,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": 0.8339768339652592,
"precision": 0.5,
"recall": 0.5
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "8d030591-a701-46ee-ae59-7f529db053d3",
"result_counts": {
"candidate_feature_count": 2,
"matches": 1,
"reference_feature_count": 2
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-perfect-match-v1",
"description": "One candidate building polygon exactly matches one reference polygon.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_perfect.geojson",
"reference": "fixtures/golden/reference_buildings_perfect.geojson"
},
"metrics": {
"f1": 1.0,
"false_negative_count": 0,
"false_positive_count": 0,
"mean_iou": 1.0,
"precision": 1.0,
"recall": 1.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "bc99f243-ee42-40bf-ad71-22da29e5278f",
"result_counts": {
"candidate_feature_count": 1,
"matches": 1,
"reference_feature_count": 1
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-no-overlap-v1",
"description": "One candidate polygon and one reference polygon do not overlap.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_no_overlap.geojson",
"reference": "fixtures/golden/reference_buildings_no_overlap.geojson"
},
"metrics": {
"f1": null,
"false_negative_count": 1,
"false_positive_count": 1,
"mean_iou": null,
"precision": 0.0,
"recall": 0.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "b12249f0-24e3-4bbf-837a-e4a962d1bca9",
"result_counts": {
"candidate_feature_count": 1,
"matches": 0,
"reference_feature_count": 1
},
"status": "passed"
},
{
"benchmark_id": "golden-buildings-multipolygon-match-v1",
"description": "One candidate MultiPolygon exactly matches one reference MultiPolygon.",
"fixtures": {
"candidate": "fixtures/golden/predicted_buildings_multipolygon.geojson",
"reference": "fixtures/golden/reference_buildings_multipolygon.geojson"
},
"metrics": {
"f1": 1.0,
"false_negative_count": 0,
"false_positive_count": 0,
"mean_iou": 1.0,
"precision": 1.0,
"recall": 1.0
},
"persistence": {
"commit_count": 1,
"metric_count": 6,
"metric_keys": [
"precision",
"recall",
"f1",
"mean_iou",
"false_positive_count",
"false_negative_count"
],
"quality_check_count": 1
},
"quality_check_id": "4dabce04-4c65-4dac-807d-9f9cbaa8c72f",
"result_counts": {
"candidate_feature_count": 1,
"matches": 1,
"reference_feature_count": 1
},
"status": "passed"
}
],
"status": "passed",
"version": 1
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,5 @@
command=python scripts/audit_api_contracts.py
exit_code=0
captured_at=2026-08-01T18:37:24.4984309+02:00
API contract audit OK: 147 implemented routes match docs; 10 explicit non-envelope endpoints tracked.
@@ -0,0 +1,36 @@
{
"baseline_scope": [
"tracked repository state",
"static code/test/migration inventory",
"tracked mirror comparison",
"local artifact inventory",
"mock/fixture/placeholder/fallback triage signals"
],
"finding_count": 2,
"findings": [
{
"evidence": {
"paired_different_file_count": 68,
"tracked_mirror_file_count": 1153
},
"id": "P1-REPO-001",
"severity": "high",
"title": "Tracked nested repository mirror creates ambiguous source state"
},
{
"id": "P1-ML-LOCAL-001",
"interpretation": "Production model truth must be verified on the mounted Tower volume.",
"severity": "info",
"title": "No local checkpoint is available in the repository checkout"
}
],
"generated_at": "2026-08-01T15:53:53.482303+00:00",
"schema_version": 1,
"separate_required_evidence": [
"Tower database/storage audit",
"Tower CUDA/model preflight and representative inference",
"corpus leakage/duplicate/label/time review",
"independent human visual review"
],
"status": "findings_present"
}
@@ -0,0 +1,6 @@
command=python -m pytest tests/test_accuracy_phase1_baseline.py -q -p no:cacheprovider
exit_code=0
captured_at=2026-08-01T18:33:32.0526074+02:00
.... [100%]
4 passed in 1.24s
@@ -0,0 +1,651 @@
{
"code": {
"api_route_decorator_count": 148,
"frontend_test_file_count": 16,
"groups": {
"backend": {
"file_count": 129,
"line_count": 32583
},
"backend_tests": {
"file_count": 235,
"line_count": 36067
},
"frontend": {
"file_count": 112,
"line_count": 23534
},
"frontend_e2e": {
"file_count": 2,
"line_count": 734
},
"migrations": {
"file_count": 11,
"line_count": 610
},
"root_tests": {
"file_count": 7,
"line_count": 261
},
"scripts": {
"file_count": 158,
"line_count": 43180
}
},
"pytest_test_function_count": 1182
},
"generated_at": "2026-08-01T15:53:27.980241+00:00",
"git": {
"branch": "codex/geointel-accuracy-program",
"head": "0c019bb22f816db1e4b7a68379bcad08924d9a21",
"status_porcelain": [
" M .gitignore",
"?? .codex-artifacts/",
"?? scripts/run_accuracy_phase1_baseline.py"
],
"top_level_tracked_counts": {
".codex-input": 109,
".dockerignore": 1,
".env.example": 1,
".gitattributes": 1,
".gitea": 1,
".github": 4,
".gitignore": 1,
".gitkeep": 1,
".playwright-mcp": 1,
"AGENTS.md": 1,
"CHANGELOG.md": 1,
"CODEX_START.md": 1,
"M10_UPDATE_MANIFEST.txt": 1,
"M11_UPDATE_MANIFEST.txt": 1,
"M12_UPDATE_MANIFEST.txt": 1,
"M13_UPDATE_MANIFEST.txt": 1,
"M14_UPDATE_MANIFEST.txt": 1,
"M5_UPDATE_MANIFEST.txt": 1,
"M9_UPDATE_MANIFEST.txt": 1,
"Makefile": 1,
"README.md": 1,
"RELEASE_NOTES": 8,
"VERSION": 1,
"adr": 7,
"backend": 406,
"checklists": 2,
"contracts": 7,
"data": 27,
"datasets": 4,
"demo": 7,
"deploy": 13,
"docker-compose.unraid.yml": 1,
"docker-compose.yml": 1,
"docs": 263,
"exports": 1,
"fixtures": 12,
"frontend": 154,
"geointel": 1153,
"knowledge": 6,
"models": 1,
"output": 1,
"prompts": 57,
"release": 1,
"rfc": 5,
"scripts": 167,
"security": 1,
"skills": 7,
"storage": 11,
"test-results": 4,
"tests": 21,
"tickets": 14
},
"tracked_file_count": 2495
},
"migrations": {
"count": 11,
"heads_from_static_chain": [
"202607260001"
],
"missing_revision_identifiers": 0,
"records": [
{
"down_revision": null,
"path": "backend/alembic/versions/202601110001_initial.py",
"revision": "202601110001"
},
{
"down_revision": "202601110001",
"path": "backend/alembic/versions/202601120001_dataset_storage_metadata.py",
"revision": "202601120001"
},
{
"down_revision": "202601120001",
"path": "backend/alembic/versions/20260611212435_add_jobs_table.py",
"revision": "20260611212435"
},
{
"down_revision": "20260611212435",
"path": "backend/alembic/versions/202606120001_add_dataset_reference_metadata.py",
"revision": "202606120001"
},
{
"down_revision": "202606120001",
"path": "backend/alembic/versions/202606120700_sprint7a_persistence_foundation.py",
"revision": "202606120700"
},
{
"down_revision": "202606120700",
"path": "backend/alembic/versions/202606120800_sprint8_detection_foundation.py",
"revision": "202606120800"
},
{
"down_revision": "202606120800",
"path": "backend/alembic/versions/202606120900_sprint9_segmentation_foundation.py",
"revision": "202606120900"
},
{
"down_revision": "202606120900",
"path": "backend/alembic/versions/202607140001_temporal_dataset_foundation.py",
"revision": "202607140001"
},
{
"down_revision": "202607140001",
"path": "backend/alembic/versions/202607150001_detection_reviews.py",
"revision": "202607150001"
},
{
"down_revision": "202607150001",
"path": "backend/alembic/versions/202607160001_vector_feature_municipality_index.py",
"revision": "202607160001"
},
{
"down_revision": "202607160001",
"path": "backend/alembic/versions/202607260001_aoi_operations.py",
"revision": "202607260001"
}
]
},
"repo_root": "C:\\Projects\\geointel",
"schema_version": 1,
"tracked_mirror": {
"different_files": [
{
"mirror_sha256": "74a27de50351950c6fa64cea9761f20f88f94500afaa5b0a83d750e260d07139",
"mirror_size_bytes": 261,
"path": ".dockerignore",
"root_sha256": "d6ef949ac81b034249bf8907a47d7fba1265e3cde0abd679a0884f321a57143a",
"root_size_bytes": 1059
},
{
"mirror_sha256": "68b3c2a8c7cbf56c16ab809af1a40f88aa4bf97f7071f004fe9651ae69952cff",
"mirror_size_bytes": 6558,
"path": ".env.example",
"root_sha256": "53c822e80b04bcc752eb41c5020a2f57345df4c7b7af53054cb6df6320b631da",
"root_size_bytes": 6657
},
{
"mirror_sha256": "6c6952d6e5fd0f763216617e3bd1ea9e5dbc91174a001a9293dcd54e49b552e7",
"mirror_size_bytes": 893,
"path": ".gitignore",
"root_sha256": "cc7a9c3ee59df1f72789b7e24d195bfce53854fb5be89ba1fd90afb7b9ef41df",
"root_size_bytes": 1166
},
{
"mirror_sha256": "077058b5c46d1f4069be44cd21deaddce669cf31f04f8ec8f0d2d6d57302be28",
"mirror_size_bytes": 253593,
"path": "CHANGELOG.md",
"root_sha256": "a46d9ca5f69ce5d806d76b30c156d5801fea0158c696004ceb83e0a2fa0548d7",
"root_size_bytes": 253841
},
{
"mirror_sha256": "b7ad2801709886035ae9b57130d4fb1808d4ee0520fee346bb8553fea7444340",
"mirror_size_bytes": 9662,
"path": "README.md",
"root_sha256": "9834f00b7439b49e6b9b976c1c12a6f94d30231ea10ecb69e7fe48029471bce1",
"root_size_bytes": 9504
},
{
"mirror_sha256": "fac098f49a784c2c7faff0dec7ab50f7dc9ffe3decdc48d05596d3fb72e7ecff",
"mirror_size_bytes": 21710,
"path": "backend/app/core/config.py",
"root_sha256": "6ac8dce2fcc32a9b47ca7d6bd9355ec5257476a90be7ea10052ff7b6e545cbaa",
"root_size_bytes": 21547
},
{
"mirror_sha256": "3f8282014fbc66059a7147aee9672a285227c1b5fc596cdc45edff4493ab4246",
"mirror_size_bytes": 15395,
"path": "backend/app/main.py",
"root_sha256": "27947e7b7762ca2226d9710a8438ff0b484cd142d3dbc51d76114d0447362634",
"root_size_bytes": 18001
},
{
"mirror_sha256": "f6a21cbc3d644d6cee922c8ddfe9ab41e35e9749cfcef2fc77095047fcb53a5e",
"mirror_size_bytes": 7546,
"path": "backend/tests/test_auth.py",
"root_sha256": "df31b406424b96884be1c7427e46a6caad78b6535a5c19924f4a12674ff0dcbf",
"root_size_bytes": 9638
},
{
"mirror_sha256": "860adf4f218de693856d52e2a31683754e218391643230623f3f02c61a663e40",
"mirror_size_bytes": 4313,
"path": "backend/tests/test_belgium_training_loop.py",
"root_sha256": "f77121b687ecd3fef50782a47a39fb361c3829fbf610fe3937b15c7d06d1fbc2",
"root_size_bytes": 10919
},
{
"mirror_sha256": "c89fd7a641b2969c72b96fedd1aff23f6c88eec56bfdd3581184365b86c6f0c1",
"mirror_size_bytes": 1344,
"path": "backend/tests/test_belgium_training_portfolio.py",
"root_sha256": "b93152cdf4c5894dbc614529fe9823bb6472fc45cebe24be8ad9cf900d5e98c9",
"root_size_bytes": 2021
},
{
"mirror_sha256": "8a40fd3f5daa010b203639c5114ff4c080294eb82316a2c3a06aac500cdd2c2e",
"mirror_size_bytes": 7556,
"path": "backend/tests/test_building_label_normalization.py",
"root_sha256": "6236040626f8ab770a1495052fa5c6f25739cef3a2d1d04d7cc3e232e3839421",
"root_size_bytes": 10317
},
{
"mirror_sha256": "9912c38ef5e24efc7048945dc9e7035c904f504972b56d3b6081561e42b07943",
"mirror_size_bytes": 20311,
"path": "backend/tests/test_docker_runtime_config.py",
"root_sha256": "1e6aea61938d9bb90707d724a186312a4a7475b15b891d69555b52187590b057",
"root_size_bytes": 20315
},
{
"mirror_sha256": "a91d378320b20ebe1ae5223d2049445802de81df26e86378e2ad33a032a9c643",
"mirror_size_bytes": 4827,
"path": "backend/tests/test_failure_driven_yolo_sampling.py",
"root_sha256": "c4343f42509189ea867b7cf285473b2e1687e55c5238fa7022b44edae06eec37",
"root_size_bytes": 16948
},
{
"mirror_sha256": "3cf7c2979234bfcb6095630d586731e8b9f2053fbced328c5820997db1bd2fdf",
"mirror_size_bytes": 4973,
"path": "backend/tests/test_rc6_supply_chain.py",
"root_sha256": "d4f0e29bc3a5820b378ffa904052bc0d56c3ccd2133b8406cebadad9ad702d59",
"root_size_bytes": 4973
},
{
"mirror_sha256": "a175e97aaa2adfc28a37ab175040fd3c4e1c37bf0e28d733564ffd30bc689600",
"mirror_size_bytes": 1016,
"path": "backend/tests/test_sam_roof_label_refinement.py",
"root_sha256": "c4fbab6d9ab2e94ee3014a46979e8489471b7eb375aaccbd7f2ae204c6b6f647",
"root_size_bytes": 1473
},
{
"mirror_sha256": "fc301f89b6c149d7b012bac3d2942902e74794d84fa18090e5485f1f7102f823",
"mirror_size_bytes": 12548,
"path": "backend/tests/test_sprint130_operator_yolo_tile_dataset.py",
"root_sha256": "ae3caa4d74a5e7ba4db3628ce5dd403b20fc08e37c522a7b85e657d75e11a1b6",
"root_size_bytes": 12941
},
{
"mirror_sha256": "c6b3f5a1f283c7940140734d35bbc44ec31c6eaadb6363abcb6fcdad4a97f176",
"mirror_size_bytes": 10437,
"path": "backend/tests/test_sprint31_unraid_template.py",
"root_sha256": "cf5f0eaf93510a7ebf70386691513275d0cca69b59d6a86b35d6ba486aa35f21",
"root_size_bytes": 10611
},
{
"mirror_sha256": "a8fff182a2968b2dae2c561bd23ebc6732b5d3a45fe886641ca9538550a126ce",
"mirror_size_bytes": 12232,
"path": "deploy/unraid/Dockerfile.all-in-one",
"root_sha256": "b30d16b8ac28acef25961674e1cacdb067bd43e3925adcb68a605f0a505eed80",
"root_size_bytes": 12326
},
{
"mirror_sha256": "cb4f487125c750137420f71b1b31309f596693186dc7e8b0d3f6a49afb69a6b9",
"mirror_size_bytes": 13687,
"path": "deploy/unraid/README.md",
"root_sha256": "8c72e0aa8448f83db73fbf3862280f414d4d31056ee5e8b2176c4356d996c38c",
"root_size_bytes": 13866
},
{
"mirror_sha256": "9851cb85ae5904b1def720055037ee1dbe3a405b767e76b0cf5c592a84afed7f",
"mirror_size_bytes": 5541,
"path": "deploy/unraid/deploy-release.sh",
"root_sha256": "21c358def5773975e0bfb37a1b2be441b616291a3f62944862abed7d799d3611",
"root_size_bytes": 7885
},
{
"mirror_sha256": "041d1cfc5d184a93650d650487db9b86d52a80d2ef4ee5fd7528d0ef4ba76459",
"mirror_size_bytes": 40243,
"path": "deploy/unraid/geointel-unraid-template.xml",
"root_sha256": "4d3da0654a308ed938ec745087e6484b710444a08ca5a54304f17934bba8a21f",
"root_size_bytes": 40252
},
{
"mirror_sha256": "d6ac993c9c08972a521b58136cb2029b89df34c67eb76818d1eeb631d42d3149",
"mirror_size_bytes": 7839,
"path": "deploy/unraid/geointel.env.example",
"root_sha256": "85d7f899827fd17debc1d8cffbe672337b470e5f18c390e587b5341d12c485d5",
"root_size_bytes": 8329
},
{
"mirror_sha256": "4839b5fd2ddd4d0c2e35b3dee6ae04d1f12ecf17cfe3a07a32d5accca64915b1",
"mirror_size_bytes": 23318,
"path": "deploy/unraid/run-dockerman-container.sh",
"root_sha256": "b5a348f0cd96eb09e81239d1fcbd5ad1395451c1371f0ef3af40446f027a0d2b",
"root_size_bytes": 23483
},
{
"mirror_sha256": "e5def10ebc15cf796fdbc3de3583fe6b8a761fb90e91ac61300ea363b5503d75",
"mirror_size_bytes": 10203,
"path": "docker-compose.unraid.yml",
"root_sha256": "30d4a6d809306e6ce8cdf5d9cbc5e0f510612db32a9398100e45e09d439f3d25",
"root_size_bytes": 10202
},
{
"mirror_sha256": "a9071fd2a61c8cfe9a43aed4a378770939d2ae3b35888c433356e017cb8aec48",
"mirror_size_bytes": 11887,
"path": "docker-compose.yml",
"root_sha256": "7e4f93a2ec69548a94556e06d71623e652e23acc311ca24cd56fefd7cda8fcd3",
"root_size_bytes": 11886
},
{
"mirror_sha256": "427a484990ade76e85d9d7cbba2835095ea4ca08a1b3b9836193ce9835f77231",
"mirror_size_bytes": 101810,
"path": "docs/API_CONTRACTS.md",
"root_sha256": "305db12f3f44fe6287f7b48543df5b4e461e3c22b54fa40f2e900470b9258ae7",
"root_size_bytes": 102260
},
{
"mirror_sha256": "694f87467374352486c9f134d08a432d94ec15fb3c85d9dbbc69f47a57fc8407",
"mirror_size_bytes": 6732,
"path": "docs/BELGIUM_BUILDING_TRAINING_LOOP.md",
"root_sha256": "39b5032a6d7983fd816440ddcf6fb79d3c4be822145e954aeb3c7f46c2f82701",
"root_size_bytes": 11239
},
{
"mirror_sha256": "665e8f21c3988909d4428ccc736479111f6118d6c470827f9399d53857f4a204",
"mirror_size_bytes": 818967,
"path": "docs/CODEX_EXECUTION_LOG.md",
"root_sha256": "a91e4c95d30e26eb075f7977ed25f435685f45d54fb889d085274273ef782451",
"root_size_bytes": 858488
},
{
"mirror_sha256": "e7b135e9550a79472be7ae4974bc699811b4ca4a257f6fcc1ae7ced1781c9e68",
"mirror_size_bytes": 2785,
"path": "docs/DEPENDENCY_POLICY.md",
"root_sha256": "3c2fd4680091c642c4429b5ec68a0d403aaf3cce44c7712c368fc0fbb61ad5c5",
"root_size_bytes": 2987
},
{
"mirror_sha256": "1cc29d86c7acdf76ebe62782e9aa66ae1dc179f6e6e017d80b6df21217feb05a",
"mirror_size_bytes": 9480,
"path": "docs/PROJECT_PROFESSIONALIZATION_AUDIT_2026-07-27.md",
"root_sha256": "836de43d4c81bdc5748b44a50848226d434dffb05a26fc2813e4abe318d1e537",
"root_size_bytes": 9597
},
{
"mirror_sha256": "c052edad0eff3e6042642d3e33e75bb5ea718baa49cc562cc4566aa3a3308441",
"mirror_size_bytes": 66244,
"path": "docs/TODO.md",
"root_sha256": "76834351437c69ef63838c6f802e73b844eb0e8c774b3709016b4b8de43ac239",
"root_size_bytes": 75459
},
{
"mirror_sha256": "70d5fccd4be3f5568b8d022a76aafcd30806366090d3c841e72fd3e80fa7b2cb",
"mirror_size_bytes": 59353,
"path": "frontend/src/App.tsx",
"root_sha256": "05c367d0f321d7f5787825943cd61c07e85742a017567436dd80eaf1d9d60746",
"root_size_bytes": 59689
},
{
"mirror_sha256": "e6a15ffc9a95c57a2c9710822385e0d7fdf48115b2109cca2ba1533d494a9f7f",
"mirror_size_bytes": 21860,
"path": "frontend/src/components/GeoMap.tsx",
"root_sha256": "64a2fe78846f51c9227ed5927dff9f7b9df4ee3ce04a17cf0d18b4d1595a149f",
"root_size_bytes": 22935
},
{
"mirror_sha256": "c5202c44be3154ce2cb395681c65d3bde3866603cdbf6f7da8c30a77969e6471",
"mirror_size_bytes": 6371,
"path": "frontend/src/components/assistant/GeoAssistantPanel.tsx",
"root_sha256": "250d8781246a3e7d218699de38c80a9816cf1718fbea8d45b46b1a58bd91768a",
"root_size_bytes": 7963
},
{
"mirror_sha256": "ab91189c74d1af534334855957f308e48846f1184c4862017c2472c29b687724",
"mirror_size_bytes": 16246,
"path": "frontend/src/components/auth/LandingPage.tsx",
"root_sha256": "dbd1f3df060c62c7340d711db24d0f17444406923a5c05dd32fc56fdeba9fc85",
"root_size_bytes": 16489
},
{
"mirror_sha256": "a41b9221ba39f1e1f6e07a12e800eaa94ee877a38d550cb48bdb5617dccb85c8",
"mirror_size_bytes": 50857,
"path": "frontend/src/components/detection/DetectionLab.tsx",
"root_sha256": "366e65b6d0aabb50da8b18a9e7c9769ddc03de5f841c367eb8db8b1b54efa171",
"root_size_bytes": 51643
},
{
"mirror_sha256": "c5a1595e2799d848852f8891856323faa4863f8c1bfcbfbc7f5e6b64cee4d2ed",
"mirror_size_bytes": 175335,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"root_sha256": "6f57d1ea8201cd97e228a9b562173457a98caf0231b7439b71abdd1a1bef43aa",
"root_size_bytes": 175688
},
{
"mirror_sha256": "012608ad5ea891bcaeb920c279720aa8f6091a0c6d8735dcf9e33210301a5c84",
"mirror_size_bytes": 7614,
"path": "frontend/src/components/overview/OverviewWorkspace.tsx",
"root_sha256": "4b091b6c3fd4d3a7065604a92267521d549abe8217de2d899fe37405d941d1ce",
"root_size_bytes": 10080
},
{
"mirror_sha256": "80898f659302de06b50d66d2a54b99c4262f13f574eaaad95a2c6d75c0081d36",
"mirror_size_bytes": 19502,
"path": "frontend/src/components/segmentation/SegmentationLab.tsx",
"root_sha256": "5e4ee646bc6e998d0dc83b0dfc76e055ef39981024b7d00efdafe7cdef9a2dae",
"root_size_bytes": 19571
},
{
"mirror_sha256": "00a189596cd8752d24392707288d9b557c411738bb860f19c0983db39dd9cd1c",
"mirror_size_bytes": 2657,
"path": "frontend/src/components/shell/WorkbenchNavigation.tsx",
"root_sha256": "2216e8a6158b314ee0ab1661e7ff34dadcb4a5f2917f0f88ce4cc895cfda76e7",
"root_size_bytes": 2616
},
{
"mirror_sha256": "ef09733b1ba174c9f02dd84eb9e5e1cee87ce3bcfbaf7d5f09c9a16f967ec784",
"mirror_size_bytes": 4153,
"path": "frontend/src/hooks/useDemoWorkflow.ts",
"root_sha256": "15d1b3db25b941285b2ab3460ca4b886e382062550e8a9d2377a62c9fe09a06c",
"root_size_bytes": 4076
},
{
"mirror_sha256": "074f3e0dc7f94c39899b3c456bbde3c78f9fdd26cbf5664b7af3ad7a048eee58",
"mirror_size_bytes": 23013,
"path": "frontend/src/hooks/useDetectionWorkflow.ts",
"root_sha256": "6a75f632a4b66fdb43c78e4a77b71c21566813b94af07ec49bb9fc9658c438ff",
"root_size_bytes": 23097
},
{
"mirror_sha256": "a3f4b018086b86364db6adfac28633d6a4d8feaca4f873fabc82bfb45c650a20",
"mirror_size_bytes": 7570,
"path": "frontend/src/hooks/useExportWorkflow.ts",
"root_sha256": "a04b02ea9604ba294f94e2df8a289fdf45f4e014bef2721d1270b28239bff36c",
"root_size_bytes": 7818
},
{
"mirror_sha256": "05fd1dea79a335a6607a5994bbd39bd83b5c215a352abb2747a02ec1dda0d2fb",
"mirror_size_bytes": 3695,
"path": "frontend/src/hooks/useGeoAssistant.ts",
"root_sha256": "af8d707c8639dca1fe2df735e965c36d74b2696057f82f318ac7dff78564107e",
"root_size_bytes": 4771
},
{
"mirror_sha256": "b38fda4b32212a3bf12b89183d23c3dadeceb104ae40952bf539785f565273ea",
"mirror_size_bytes": 3463,
"path": "frontend/src/hooks/useMapSelectionQa.ts",
"root_sha256": "0785c198d3860ed330538bbb56ba4745262c3b32fab099164f1ab2d8421526fc",
"root_size_bytes": 3482
},
{
"mirror_sha256": "75efa3a406a5cfe400a209eadc23317086b4742068599fa492b6f20c075a0a9e",
"mirror_size_bytes": 4923,
"path": "frontend/src/hooks/useQualityWorkflow.ts",
"root_sha256": "662377348c1cfaa462955792166d5752a25056c38d3ce8375799ae46a5c4df11",
"root_size_bytes": 4942
},
{
"mirror_sha256": "52cf7dd8fae31ec2bcc0f1dbec124319c389bd2c45dea5c6f6aad5b9960a43d5",
"mirror_size_bytes": 9426,
"path": "frontend/src/hooks/useSegmentationWorkflow.ts",
"root_sha256": "1864807b63ecaf778df7f53218fa06a6f30a3fa40e39830e32aad81e9cbedbb4",
"root_size_bytes": 9491
},
{
"mirror_sha256": "153296d88e9549a9227adc552c614ccbe931658e0174061313ad819e7ff9136b",
"mirror_size_bytes": 3528,
"path": "frontend/src/hooks/useWorkbenchBootstrap.test.tsx",
"root_sha256": "150d755f5f6dbb70404a410eee4ab447a36ce86c90c65ed3528afdd9a2cb1fc2",
"root_size_bytes": 3565
},
{
"mirror_sha256": "9c19508fd628f004f095e9f29cfaec608c91282dc0b42bb6a96f2fa36da64142",
"mirror_size_bytes": 3084,
"path": "frontend/src/hooks/useWorkbenchBootstrap.ts",
"root_sha256": "86646f79ac20672fe1ba04b8d97c899b8dbad37b53b94a03b9778035fda3a953",
"root_size_bytes": 2946
},
{
"mirror_sha256": "7441e17e4c9bee54847317fcde7d4520c2c96bc5c78a0c9ceaac7a63cf81186c",
"mirror_size_bytes": 2536,
"path": "frontend/src/services/api/detection.ts",
"root_sha256": "a56da21fb640431b49b1a77530d4b993d1852b9a4adf2811c0f800a9b0a9288b",
"root_size_bytes": 2682
},
{
"mirror_sha256": "287165ff54e427b30ec574ed995213ad02e7e94220874c8064a57cf6facc417a",
"mirror_size_bytes": 1804,
"path": "frontend/src/services/api/exports.ts",
"root_sha256": "7f9f1da4694143d1c3a768950fb13b894d89f0c37b9cf6160362d1db55c939a3",
"root_size_bytes": 2253
},
{
"mirror_sha256": "11637de6de25f2830f600d01c4a1a45dedfcdc75ffa9121a218d7e5c7f857d64",
"mirror_size_bytes": 1725,
"path": "frontend/src/services/api/qa.ts",
"root_sha256": "fa3fcfd0a9e0e123bf2b821ae2b2a0d98062eaaae15a0a49dd13f3caed9bfb3c",
"root_size_bytes": 1788
},
{
"mirror_sha256": "24be3bf6499337864ae2d99fac6409c908b473926e7b31bb61624e2f2563e0ae",
"mirror_size_bytes": 2178,
"path": "frontend/src/services/api/segmentation.ts",
"root_sha256": "f4666f07aea007513a915e30f2c487b54e7eb5f3da171f8aac634c09a60558b2",
"root_size_bytes": 2324
},
{
"mirror_sha256": "a2aba5359ff65b328a9c01ed966ed29e235bf7020083a086c6815978229a4c6f",
"mirror_size_bytes": 137520,
"path": "frontend/src/styles/app.css",
"root_sha256": "bacced4a7ef1a8253ed4cf6999140230d434f8efcf8654691bbafb1595a7bb44",
"root_size_bytes": 137816
},
{
"mirror_sha256": "f60090c6ea5046cb8db4bb3e72105baf4b5e4e1aceeae7bee08619d237859c60",
"mirror_size_bytes": 34362,
"path": "frontend/src/styles/landing.css",
"root_sha256": "a21b6568d9a9394cd513107b1b3e2ea616b5e8ea117107264607dcefdcbe74a8",
"root_size_bytes": 34383
},
{
"mirror_sha256": "ef6c5e988a0558cf5f25a158bcbf968b5a23fa0f2256ea802ffc29776f773dbf",
"mirror_size_bytes": 4935,
"path": "scripts/assess_belgium_building_training_iteration.py",
"root_sha256": "3eb022330efd838bac23f4af1d6b70f3f589f8133797a22a25c20b8a0f9a27ef",
"root_size_bytes": 4954
},
{
"mirror_sha256": "b50620a8b8d179d2d91a129db50609939f8f28ee272bd5380bca9a11bc6518d4",
"mirror_size_bytes": 7110,
"path": "scripts/build_failure_driven_yolo_sampling.py",
"root_sha256": "35d662a838b78873b6298145f722bc41b38aa96af47be5e4e9f01f96e98422e6",
"root_size_bytes": 15234
},
{
"mirror_sha256": "22e8c202b49fc3c31fbc3c74fae79855474e3c9fbb9c61710dbbbda7626ba787",
"mirror_size_bytes": 2986,
"path": "scripts/build_regional_yolo_dataset.py",
"root_sha256": "c28f677ff81f94b4a7d0337cec26995b646c2d576da9a0079fb9007e78b5edf8",
"root_size_bytes": 6874
},
{
"mirror_sha256": "d0f859e810839fc34585f0f65877808bef952452b87c78b236450a1b3107ba4a",
"mirror_size_bytes": 2652,
"path": "scripts/deploy_tower.ps1",
"root_sha256": "5470e5a7ef9ca513e29050d9cc3bc5cff32395420c4c78ae4685302a75cb5196",
"root_size_bytes": 2967
},
{
"mirror_sha256": "ccef16aaf01ec16a297eec423f993afa705f45dd052919b005a231f087ff7469",
"mirror_size_bytes": 1471,
"path": "scripts/deploy_tower.sh",
"root_sha256": "77e04343e60bd1ef3846a459f8c4b70c0cd539f1900fb8c24fb3964b7062d785",
"root_size_bytes": 1925
},
{
"mirror_sha256": "c96d6c3bb70a59256870bbbf464e5b5ba1c599e24c38a5c0b8ff19d57fff5930",
"mirror_size_bytes": 15603,
"path": "scripts/evaluate_belgium_building_candidate.py",
"root_sha256": "640312d1de91362b7b906f7e468e9ebf09c80958d11c8cda5e3b1663b85fafde",
"root_size_bytes": 17832
},
{
"mirror_sha256": "96fe2345e35eeceb5b11c15760b61a33070a2ab2602d623af5cb99b20f37270e",
"mirror_size_bytes": 28472,
"path": "scripts/export_operator_yolo_tile_dataset.py",
"root_sha256": "5e84eae418c5f855bc8bff10f9967a331df40c7736d93ea2ed0905f59fab04a5",
"root_size_bytes": 29051
},
{
"mirror_sha256": "91275894803fb0913c0786bedd8ff1e3ac46d0e52c28edb2ecd7e4c4f1698cf1",
"mirror_size_bytes": 13510,
"path": "scripts/normalize_belgium_building_labels.py",
"root_sha256": "e231f6e34585531c162807b67fa24721455a56af66fab5b1d72835a8f46db774",
"root_size_bytes": 14792
},
{
"mirror_sha256": "ba0b5fa26c01c739e74d8791bf17db7159159aceaac79d485cc4e8d61d2c6bba",
"mirror_size_bytes": 17734,
"path": "scripts/provision_belgium_building_training_portfolio.py",
"root_sha256": "17da30d3ea480b4d0d86d5c2a454264202cb02443e4dbef9c082342ccfca08ca",
"root_size_bytes": 26891
},
{
"mirror_sha256": "5deb04f2563cb30028a34dcd7d5b275855822076495e5d36560ab6674a2a86a2",
"mirror_size_bytes": 8777,
"path": "scripts/refine_yolo_labels_with_sam.py",
"root_sha256": "472985d75d8800e5e15634477bf9f7fcd01ecbf5c67985e25d3ca0872a8dc603",
"root_size_bytes": 11442
},
{
"mirror_sha256": "5820d017710dae0b4ae518e2db22d8cbab6b72e708be0e7f9c68a9f631f5e6ef",
"mirror_size_bytes": 16456,
"path": "scripts/render_operator_yolo_label_qa_contact_sheets.py",
"root_sha256": "e1a16e5ab2d0b0d50144ac49d7805eb9a1814cc31471c19d109cfa83a295d243",
"root_size_bytes": 17322
},
{
"mirror_sha256": "06a7f7ba3c067de259c8fce62d3949979fb9296d1665f14a4e6f41039dadc9ae",
"mirror_size_bytes": 9516,
"path": "scripts/rotate_belgium_building_holdouts.py",
"root_sha256": "e0d35afe7c719715b19d7a6b7be75ae64d2c2c65e006cfc798eea3bbf18bedf9",
"root_size_bytes": 9920
},
{
"mirror_sha256": "2d3677e57c3089fe8a9b9f1d999589d4d938b94b193f24adcfc15f343287df35",
"mirror_size_bytes": 12958,
"path": "scripts/run_belgium_building_training_loop.py",
"root_sha256": "2ec1d535fc7bf41b6278acf7132eff7b91a081067590f2a6949b4a92781d8f3a",
"root_size_bytes": 20572
}
],
"paired_different_file_count": 68,
"paired_identical_file_count": 1085,
"risk": "The tracked geointel/ repository mirror can create ambiguous imports, stale tests and local/deployment drift; Docker excludes it but local tools may not.",
"tracked_mirror_file_count": 1153
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,663 @@
{
"counts": {
"fallback": 27,
"fixture": 94,
"heuristic": 1,
"mock": 31,
"not_configured": 24,
"placeholder": 39,
"todo": 2
},
"examples": {
"fallback": [
{
"line": 1046,
"path": "backend/app/services/export_service.py",
"text": "def _filename(name: str | None, fallback: str, suffix: str) -> str:"
},
{
"line": 1047,
"path": "backend/app/services/export_service.py",
"text": "raw_name = name or fallback"
},
{
"line": 1050,
"path": "backend/app/services/export_service.py",
"text": "cleaned = fallback"
},
{
"line": 29,
"path": "backend/app/services/mdk_bathymetry_acquisition_service.py",
"text": "No depth values are ever synthesized, no insecure TLS fallback exists and the"
},
{
"line": 173,
"path": "backend/app/services/mdk_bathymetry_probe_service.py",
"text": "message=\"MDK WCS TLS certificate validation failed; insecure fallback is prohibited.\","
},
{
"line": 186,
"path": "backend/app/services/mdk_bathymetry_probe_service.py",
"text": "\"MDK WCS TLS certificate validation failed; insecure fallback is prohibited.\""
},
{
"line": 440,
"path": "backend/app/services/raster_operations_service.py",
"text": "# best effort fallback; keep computed dimensions."
},
{
"line": 19,
"path": "backend/app/services/raster_service.py",
"text": "except Exception as exc: # pragma: no cover - exercised via API-level fallback tests"
},
{
"line": 26,
"path": "backend/app/services/storage_service.py",
"text": "fallback = \"upload\""
},
{
"line": 28,
"path": "backend/app/services/storage_service.py",
"text": "return fallback"
},
{
"line": 37,
"path": "backend/app/services/storage_service.py",
"text": "return cleaned or fallback"
},
{
"line": 76,
"path": "frontend/src/hooks/useGeoAssistant.ts",
"text": "const fallback = result.default_model && result.items.some((model) => model.name === result.default_model)"
},
{
"line": 79,
"path": "frontend/src/hooks/useGeoAssistant.ts",
"text": "setDefaultModel(fallback)"
},
{
"line": 9,
"path": "frontend/src/lib/authError.ts",
"text": "export function formatAuthError(error: unknown, fallback: string): string {"
},
{
"line": 10,
"path": "frontend/src/lib/authError.ts",
"text": "if (!(error instanceof Error)) return fallback"
},
{
"line": 21,
"path": "frontend/src/lib/authError.ts",
"text": "return fallback"
},
{
"line": 24,
"path": "frontend/src/lib/authError.ts",
"text": "return error.message || fallback"
},
{
"line": 1,
"path": "frontend/src/lib/formatError.ts",
"text": "export function formatError(error: unknown, fallback: string): string {"
},
{
"line": 6,
"path": "frontend/src/lib/formatError.ts",
"text": "return fallback"
},
{
"line": 501,
"path": "scripts/provision_belgium_north_sea_scope.py",
"text": "def _max_admin_modification(payloads: dict[str, dict[str, Any]], fallback: str) -> str:"
},
{
"line": 507,
"path": "scripts/provision_belgium_north_sea_scope.py",
"text": "value = max(values) if values else fallback"
},
{
"line": 111,
"path": "scripts/refine_yolo_labels_with_sam.py",
"text": "parser.add_argument(\"--fallback-policy\", choices=(\"retain\", \"drop\"), default=\"retain\")"
},
{
"line": 42,
"path": "scripts/run_accuracy_phase1_baseline.py",
"text": "\"fallback\": re.compile(r\"\\b(?:fallback|fall back)\\b\", re.IGNORECASE),"
},
{
"line": 347,
"path": "scripts/run_accuracy_phase1_baseline.py",
"text": "\"mock/fixture/placeholder/fallback triage signals\","
},
{
"line": 52,
"path": "scripts/run_golden_qa_benchmark.py",
"text": "# Backwards-compatible fallback for older checkouts and local smoke scripts."
}
],
"fixture": [
{
"line": 3,
"path": "backend/app/providers/__init__.py",
"text": "from app.providers import base, fixture, grb, manual, osm, registry"
},
{
"line": 5,
"path": "backend/app/providers/__init__.py",
"text": "__all__ = [\"base\", \"fixture\", \"grb\", \"manual\", \"osm\", \"registry\"]"
},
{
"line": 9,
"path": "backend/app/providers/fixture.py",
"text": "provider_name=\"fixture\","
},
{
"line": 10,
"path": "backend/app/providers/fixture.py",
"text": "display_name=\"Fixture data\","
},
{
"line": 11,
"path": "backend/app/providers/fixture.py",
"text": "authority_level=\"fixture\","
},
{
"line": 14,
"path": "backend/app/providers/fixture.py",
"text": "supported_query_modes=[\"fixture\"],"
},
{
"line": 15,
"path": "backend/app/providers/fixture.py",
"text": "fetch_signature=\"tests/fixtures and demo fixture upload flow\","
},
{
"line": 16,
"path": "backend/app/providers/fixture.py",
"text": "limitation_message=\"Fixture provider represents local test/demo fixtures only.\","
},
{
"line": 7,
"path": "backend/app/providers/registry.py",
"text": "from app.providers.fixture import FixtureProvider"
},
{
"line": 37,
"path": "backend/app/providers/registry.py",
"text": "\"fixture\": FixtureProvider(),"
},
{
"line": 112,
"path": "backend/app/providers/registry.py",
"text": "provider_name=\"fixture\","
},
{
"line": 114,
"path": "backend/app/providers/registry.py",
"text": "message=\"Fixture provider data must use checked-in demo/test fixture flows.\","
},
{
"line": 122,
"path": "backend/app/services/demo_workflow_service.py",
"text": ".filter(Dataset.source_name == \"fixture\")"
},
{
"line": 129,
"path": "backend/app/services/demo_workflow_service.py",
"text": ".filter(Dataset.source_name == \"fixture\")"
},
{
"line": 148,
"path": "backend/app/services/demo_workflow_service.py",
"text": ".filter(Dataset.source_name == \"fixture\")"
},
{
"line": 213,
"path": "backend/app/services/demo_workflow_service.py",
"text": "source=\"fixture\","
},
{
"line": 218,
"path": "backend/app/services/demo_workflow_service.py",
"text": "\"fixture\": True,"
},
{
"line": 298,
"path": "backend/app/services/demo_workflow_service.py",
"text": "source=\"fixture\","
},
{
"line": 300,
"path": "backend/app/services/demo_workflow_service.py",
"text": "source_name=\"fixture\","
},
{
"line": 303,
"path": "backend/app/services/demo_workflow_service.py",
"text": "\"fixture\": True,"
},
{
"line": 423,
"path": "backend/app/services/demo_workflow_service.py",
"text": ".filter(Dataset.source_name == \"fixture\")"
},
{
"line": 430,
"path": "backend/app/services/demo_workflow_service.py",
"text": ".filter(Dataset.source_name == \"fixture\")"
},
{
"line": 472,
"path": "backend/app/services/demo_workflow_service.py",
"text": "description=\"Offline fixture workflow: reference buildings, predicted buildings and persisted QA metrics.\","
},
{
"line": 497,
"path": "backend/app/services/demo_workflow_service.py",
"text": "source_name=\"fixture\","
},
{
"line": 509,
"path": "backend/app/services/demo_workflow_service.py",
"text": "source_name=\"fixture\","
}
],
"heuristic": [
{
"line": 39,
"path": "scripts/run_accuracy_phase1_baseline.py",
"text": "\"heuristic\": re.compile(r\"\\bheuristic(?:s)?\\b\", re.IGNORECASE),"
}
],
"mock": [
{
"line": 7,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mock('../../services/api/auth', () => ({"
},
{
"line": 34,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mocked(login).mockReset()"
},
{
"line": 35,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mocked(loginAsGuest).mockReset()"
},
{
"line": 42,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mocked(login).mockResolvedValue(operatorSession)"
},
{
"line": 57,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mocked(loginAsGuest).mockResolvedValue(guestSession)"
},
{
"line": 75,
"path": "frontend/src/components/auth/LandingPage.test.tsx",
"text": "vi.mocked(login).mockRejectedValue(new Error('Gebruikersnaam of wachtwoord is onjuist.'))"
},
{
"line": 8,
"path": "frontend/src/components/map/MunicipalitySearch.test.tsx",
"text": "vi.mock('../../services/api/areas', () => ({"
},
{
"line": 14,
"path": "frontend/src/components/map/MunicipalitySearch.test.tsx",
"text": "vi.mocked(areasApi.searchMunicipalities).mockResolvedValue({"
},
{
"line": 5,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "const mocks = vi.hoisted(() => ({"
},
{
"line": 9,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "vi.mock('../services/api', () => ({"
},
{
"line": 11,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "resolveCoverage: mocks.resolveCoverage,"
},
{
"line": 35,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "mocks.resolveCoverage.mockResolvedValue(coverageResult)"
},
{
"line": 51,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "expect(mocks.resolveCoverage).not.toHaveBeenCalled()"
},
{
"line": 58,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "expect(mocks.resolveCoverage).not.toHaveBeenCalled()"
},
{
"line": 64,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "expect(mocks.resolveCoverage).toHaveBeenCalledWith({"
},
{
"line": 89,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "mocks.resolveCoverage.mockRejectedValueOnce(new Error('provider unavailable'))"
},
{
"line": 102,
"path": "frontend/src/hooks/useCoverageResolver.test.tsx",
"text": "mocks.resolveCoverage.mockImplementationOnce("
},
{
"line": 5,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "const mocks = vi.hoisted(() => ({"
},
{
"line": 9,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "vi.mock('../services/api/temporal', () => ({"
},
{
"line": 11,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "compare: mocks.compare,"
},
{
"line": 34,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "expect(mocks.compare).not.toHaveBeenCalled()"
},
{
"line": 43,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "expect(mocks.compare).not.toHaveBeenCalled()"
},
{
"line": 53,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "mocks.compare.mockResolvedValueOnce(comparison)"
},
{
"line": 64,
"path": "frontend/src/hooks/useTemporalComparison.test.tsx",
"text": "expect(mocks.compare).toHaveBeenCalledWith('project-1', {"
},
{
"line": 37,
"path": "scripts/run_accuracy_phase1_baseline.py",
"text": "\"mock\": re.compile(r\"\\bmock(?:ed|ing|s)?\\b\", re.IGNORECASE),"
}
],
"not_configured": [
{
"line": 166,
"path": "backend/app/api/routes/external.py",
"text": "status=response.get(\"status\", \"not_configured\"),"
},
{
"line": 149,
"path": "backend/app/api/routes/health.py",
"text": "yolo_status = configured_yolo.status if configured_yolo else \"not_configured\""
},
{
"line": 79,
"path": "backend/app/providers/base.py",
"text": "status=\"configured\" if self.is_configured else \"not_configured\","
},
{
"line": 94,
"path": "backend/app/providers/base.py",
"text": "\"status\": \"not_configured\","
},
{
"line": 96,
"path": "backend/app/providers/registry.py",
"text": "status=\"not_configured\","
},
{
"line": 9,
"path": "backend/app/schemas/coverage.py",
"text": "CoverageStatus = Literal[\"operational\", \"partial\", \"not_configured\", \"unsupported\"]"
},
{
"line": 53,
"path": "backend/app/services/coverage_registry_service.py",
"text": "STATUS_ORDER = (\"unsupported\", \"not_configured\", \"partial\", \"operational\")"
},
{
"line": 340,
"path": "backend/app/services/coverage_registry_service.py",
"text": "integration_status=\"not_configured\","
},
{
"line": 572,
"path": "backend/app/services/coverage_registry_service.py",
"text": "\"not_configured\""
},
{
"line": 266,
"path": "backend/app/services/geo_assistant_service.py",
"text": "status=\"not_configured\","
},
{
"line": 42,
"path": "backend/app/services/model_registry_service.py",
"text": "status=\"not_configured\","
},
{
"line": 98,
"path": "backend/app/services/model_registry_service.py",
"text": "status=\"not_configured\","
},
{
"line": 127,
"path": "backend/app/services/model_registry_service.py",
"text": "status = \"not_configured\""
},
{
"line": 169,
"path": "backend/app/services/model_registry_service.py",
"text": "status = \"not_configured\""
},
{
"line": 211,
"path": "backend/app/services/model_registry_service.py",
"text": "status = \"not_configured\""
},
{
"line": 36,
"path": "backend/app/services/yolo_preflight_service.py",
"text": "\"status\": \"not_configured\","
},
{
"line": 40,
"path": "frontend/src/components/detection/DetectionModelManagement.tsx",
"text": "if (value === 'not_configured') return 'niet geconfigureerd'"
},
{
"line": 295,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"text": "not_configured: 'Niet gekoppeld',"
},
{
"line": 1050,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"text": "{ operational: 0, partial: 0, not_configured: 0, unsupported: 0 },"
},
{
"line": 1051,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"text": ") ?? { operational: 0, partial: 0, not_configured: 0, unsupported: 0 },"
},
{
"line": 3365,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"text": "<span>{coverageCounts.not_configured} niet gekoppeld</span>"
},
{
"line": 6,
"path": "frontend/src/components/models/modelOptions.ts",
"text": "const configured = model.configured && model.status !== 'not_configured'"
},
{
"line": 1072,
"path": "frontend/src/types.ts",
"text": "export type CoverageStatus = 'operational' | 'partial' | 'not_configured' | 'unsupported'"
},
{
"line": 40,
"path": "scripts/run_accuracy_phase1_baseline.py",
"text": "\"not_configured\": re.compile(r\"\\bnot_configured\\b\", re.IGNORECASE),"
}
],
"placeholder": [
{
"line": 36,
"path": "backend/app/services/model_registry_service.py",
"text": "model_id=\"yolo-placeholder\","
},
{
"line": 37,
"path": "backend/app/services/model_registry_service.py",
"text": "display_name=\"YOLO detector placeholder\","
},
{
"line": 92,
"path": "backend/app/services/model_registry_service.py",
"text": "model_id=\"segmentation-placeholder\","
},
{
"line": 93,
"path": "backend/app/services/model_registry_service.py",
"text": "display_name=\"Segmentation placeholder\","
},
{
"line": 94,
"path": "backend/app/services/model_registry_service.py",
"text": "framework=\"placeholder\","
},
{
"line": 99,
"path": "backend/app/services/model_registry_service.py",
"text": "limitation_message=\"Segmentation inference is not configured for this placeholder; no model is downloaded or executed.\","
},
{
"line": 187,
"path": "frontend/src/components/assistant/GeoAssistantPanel.tsx",
"text": "placeholder=\"Bijvoorbeeld: hoeveel bos verdween er sinds 2013?\""
},
{
"line": 246,
"path": "frontend/src/components/datasets/DatasetPanel.tsx",
"text": "placeholder=\"bijvoorbeeld eigen luchtbeeld\""
},
{
"line": 306,
"path": "frontend/src/components/datasets/DatasetPanel.tsx",
"text": "placeholder=\"Naam, bron, gemeente of type\""
},
{
"line": 276,
"path": "frontend/src/components/datasets/RasterControls.tsx",
"text": "placeholder=\"EPSG:31370\""
},
{
"line": 345,
"path": "frontend/src/components/datasets/RasterControls.tsx",
"text": "placeholder=\"optioneel\""
},
{
"line": 44,
"path": "frontend/src/components/detection/DetectionLab.tsx",
"text": "if (modelName === 'yolo-placeholder') return 'Niet-geconfigureerd gebouwmodel'"
},
{
"line": 516,
"path": "frontend/src/components/detection/DetectionLab.tsx",
"text": "placeholder=\"Pad naar de aangemaakte beeldtegels\""
},
{
"line": 583,
"path": "frontend/src/components/detection/DetectionLab.tsx",
"text": "placeholder=\"0.50 0.25 0.15\""
},
{
"line": 715,
"path": "frontend/src/components/detection/DetectionLab.tsx",
"text": "placeholder=\"bijvoorbeeld gebouw\""
},
{
"line": 28,
"path": "frontend/src/components/detection/DetectionModelManagement.tsx",
"text": "if (model.model_id === 'yolo-placeholder') return 'Gebouwmodel nog niet geconfigureerd'"
},
{
"line": 402,
"path": "frontend/src/components/exports/ExportCenter.tsx",
"text": "placeholder=\"Type, id of pad\""
},
{
"line": 2312,
"path": "frontend/src/components/map/MapWorkspace.tsx",
"text": "placeholder=\"Zoek themas\""
},
{
"line": 82,
"path": "frontend/src/components/map/MunicipalitySearch.tsx",
"text": "placeholder=\"Gemeentenaam of NIS-code\""
},
{
"line": 98,
"path": "frontend/src/components/project/AreaPanel.tsx",
"text": "placeholder=\"Naam van het gebied\""
},
{
"line": 106,
"path": "frontend/src/components/project/AreaPanel.tsx",
"text": "placeholder=\"EPSG:4326\""
},
{
"line": 142,
"path": "frontend/src/components/project/AreaPanel.tsx",
"text": "placeholder=\"Bijvoorbeeld Brussel, Namen of Noordzee\""
},
{
"line": 119,
"path": "frontend/src/components/project/ProjectPanel.tsx",
"text": "placeholder=\"Naam van de werkruimte\""
},
{
"line": 127,
"path": "frontend/src/components/project/ProjectPanel.tsx",
"text": "placeholder=\"Korte beschrijving\""
},
{
"line": 135,
"path": "frontend/src/components/project/ProjectPanel.tsx",
"text": "placeholder=\"Regio\""
}
],
"todo": [
{
"line": 23,
"path": "scripts/codex_pass_end_check.sh",
"text": "\"TODO: implement later\\|placeholder only\\|fake completed\" \\"
},
{
"line": 6,
"path": "scripts/contract_drift_grep.sh",
"text": "if grep -R \"TODO: decide\\|TBD\\|placeholder only\\|fake real\" -n docs contracts backend frontend prompts 2>/dev/null; then"
}
]
},
"interpretation": "Triage signals only; production impact requires a traced contract/runtime path."
}
@@ -0,0 +1,215 @@
{
"captured_at": "2026-08-01T18:13:54.6553+02:00",
"claim_boundary": "One production-adapter inference completed on one existing tile. No accuracy, calibration, geographic-generalization, or release claim follows from this smoke.",
"configuration": {
"confidence": 0.5,
"deterministic_algorithms": true,
"device": "cuda:0",
"image_size": 640,
"max_detections": 1000,
"seed": 20260801
},
"input": {
"manifest_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/manifest.json",
"manifest_sha256": "6ab8a96bf2a1405e224932afb90255311a09bbeaed4e9a2fdcdf8b1bc2230abd",
"raster": {
"available": true,
"bounds": [
193277.53584918313,
205708.27443503588,
193777.53584918313,
206208.27443503588
],
"count": 3,
"crs": "EPSG:31370",
"dtypes": [
"uint8",
"uint8",
"uint8"
],
"height": 512,
"nodata": null,
"transform": [
0.9765625,
0.0,
193277.53584918313,
0.0,
-0.9765625,
206208.27443503588,
0.0,
0.0,
1.0
],
"width": 512
},
"tile_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif",
"tile_sha256": "134a9e86850c92c577c73bc6ee57a9df7d4c1c513ae6450263e800b6dd47b6ee",
"tile_size_bytes": 669227
},
"model": {
"path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"size_bytes": 22516074
},
"output": {
"class_counts": {
"building": 17
},
"confidence": {
"maximum": 0.8144345879554749,
"mean": 0.5594814244438621,
"minimum": 0.5008771419525146
},
"count": 17,
"sample": [
{
"bbox": [
125.5418930053711,
157.9995880126953,
187.2771453857422,
232.72903442382812
],
"class_name": "building",
"confidence": 0.8144345879554749,
"properties": {
"class_id": 0
}
},
{
"bbox": [
38.20725631713867,
487.8446350097656,
56.458614349365234,
510.8298034667969
],
"class_name": "building",
"confidence": 0.6531882286071777,
"properties": {
"class_id": 0
}
},
{
"bbox": [
177.36990356445312,
229.9929656982422,
248.5861053466797,
267.96173095703125
],
"class_name": "building",
"confidence": 0.6213690638542175,
"properties": {
"class_id": 0
}
},
{
"bbox": [
367.4935607910156,
474.3263244628906,
407.673828125,
498.2358093261719
],
"class_name": "building",
"confidence": 0.6148342490196228,
"properties": {
"class_id": 0
}
},
{
"bbox": [
435.2783203125,
131.2145233154297,
453.61016845703125,
166.76919555664062
],
"class_name": "building",
"confidence": 0.5637134313583374,
"properties": {
"class_id": 0
}
},
{
"bbox": [
407.32525634765625,
317.380126953125,
416.885009765625,
326.8919982910156
],
"class_name": "building",
"confidence": 0.547556459903717,
"properties": {
"class_id": 0
}
},
{
"bbox": [
395.66558837890625,
356.8952331542969,
413.51416015625,
377.1672668457031
],
"class_name": "building",
"confidence": 0.5378748774528503,
"properties": {
"class_id": 0
}
},
{
"bbox": [
394.0309143066406,
143.1604461669922,
408.4023132324219,
167.8805389404297
],
"class_name": "building",
"confidence": 0.5360639095306396,
"properties": {
"class_id": 0
}
},
{
"bbox": [
125.3250503540039,
56.1500358581543,
157.87998962402344,
68.70291900634766
],
"class_name": "building",
"confidence": 0.5342658162117004,
"properties": {
"class_id": 0
}
},
{
"bbox": [
213.7998504638672,
77.86518859863281,
230.8061065673828,
90.1888198852539
],
"class_name": "building",
"confidence": 0.5319290161132812,
"properties": {
"class_id": 0
}
}
]
},
"read_only": true,
"runtime": {
"cuda_available": true,
"cuda_device_index": 0,
"cuda_device_name": "NVIDIA GeForce RTX 4080 SUPER",
"cuda_peak_memory_bytes": 82307072,
"cuda_runtime": "12.8",
"python": "3.11.2 (main, May 12 2026, 05:17:27) [GCC 12.2.0]",
"torch": "2.11.0+cu128",
"ultralytics": "8.4.99"
},
"schema_version": 1,
"status": "passed",
"timing_seconds": {
"inference": 0.8836944859940559,
"model_load": 0.48524460900807753,
"total": 1.3689390950021334
}
}
@@ -0,0 +1,25 @@
{
"schema_version": 1,
"captured_at": "2026-08-01T18:46:19.288288+02:00",
"read_only": true,
"artifacts": [
{
"path": "/app/storage/training/building-be-v62-v58-flanders-balanced-transfer-r1/runs/flanders/weights/best.pt",
"exists": true,
"size_bytes": 456136473,
"sha256": "889ee5b3bfe722803542d15a53a51a716872cf0e8516da5e8291e0a2605adbdb"
},
{
"path": "/app/storage/training/building-be-v62-v58-flanders-balanced-transfer-r1/runs/flanders/weights/last.pt",
"exists": true,
"size_bytes": 456136985,
"sha256": "08d12061f017c45c123c824ffa043bc07794beef251c903299eb1e0954636c8b"
},
{
"path": "/app/storage/training/building-be-v56-rotated-quality-audit-r1/operator_yolo_dataset_quality_audit.json",
"exists": true,
"size_bytes": 153659,
"sha256": "da0d4648ee2365ab949f1b00518ddba0a17cb722a41cb228525b4d2e7657ce36"
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,503 @@
{
"active_model": {
"classes": "building",
"configured_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"device": "cuda:0",
"exists": true,
"model_id": "yolo-configured",
"model_version": "",
"require_cuda": "true",
"sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"size_bytes": 22516074,
"validated_area_names": "Mol,Kempen",
"validation_scope_enforced": "true"
},
"database": {
"analysis_statuses": [
{
"count": 2,
"status": "failed"
},
{
"count": 1144,
"status": "success"
}
],
"confidence_integrity": [
{
"detections_outside_unit_interval": 0,
"segmentations_outside_unit_interval": 0
}
],
"dataset_lineage_gaps": [
{
"missing_checksum": 0,
"missing_crs": 0,
"missing_imported_at": 0,
"missing_observed_at": 2377,
"missing_provenance_metadata": 0,
"missing_source_metadata": 0,
"missing_source_version": 1761,
"total": 3377
}
],
"dataset_statuses": [
{
"count": 3377,
"status": "ready"
}
],
"dataset_version_gaps": [
{
"missing_checksum": 0,
"missing_provenance_metadata": 0,
"missing_source_metadata": 0,
"missing_storage_path": 0,
"total": 1671
}
],
"geometry_integrity": {
"areas": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 387,
"wrong_srid": 0
}
],
"status": "ok"
},
"detections": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 4,
"populated": 299233,
"wrong_srid": 0
}
],
"status": "ok"
},
"segmentations": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 0,
"wrong_srid": 0
}
],
"status": "ok"
},
"vector_features": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 6689447,
"wrong_srid": 0
}
],
"status": "ok"
}
},
"job_statuses": [
{
"count": 135,
"status": "failed"
},
{
"count": 4325,
"status": "success"
}
],
"metric_nulls": [
{
"metric_key": "f1",
"null_values": 58,
"total": 697
},
{
"metric_key": "false_negative_count",
"null_values": 0,
"total": 697
},
{
"metric_key": "false_positive_count",
"null_values": 0,
"total": 697
},
{
"metric_key": "mean_iou",
"null_values": 90,
"total": 697
},
{
"metric_key": "precision",
"null_values": 58,
"total": 697
},
{
"metric_key": "recall",
"null_values": 1,
"total": 697
}
],
"migration_heads": [
"202607260001"
],
"model_run_summary": [
{
"analysis_type": "detection",
"count": 1144,
"model_name": "yolo-configured",
"model_version": "",
"status": "success"
},
{
"analysis_type": "detection",
"count": 2,
"model_name": "yolo-configured",
"model_version": "",
"status": "failed"
}
],
"outside_domain_detection_records": [
{
"analysis_run_id": "7ba34274-411d-45e3-8f54-c37baec598b1",
"analysis_status": "success",
"analysis_type": "detection",
"bbox_json": {
"x_max": 376.3067321777344,
"x_min": 256.26025390625,
"y_max": 273.9410705566406,
"y_min": 157.967041015625
},
"class_name": "building",
"confidence": 0.6873681545257568,
"created_at": "2026-07-06 23:58:50.968501+00:00",
"dataset_id": "ae0ff76d-70c0-404f-b777-54d14517179a",
"dataset_name": "geel_orthophoto_wms_512.tif",
"dataset_source_name": "manual",
"detection_id": "18f27c89-3793-429c-8fc4-41f8801a9c31",
"max_x": 193645.02289232545,
"max_y": 206054.00974654406,
"min_x": 193527.79000338845,
"min_y": 205940.75385832042,
"model_name": "yolo-configured",
"model_version": "",
"project_name": "GeoIntel Real Data Validation 20260706T235847Z",
"source_tile_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif"
},
{
"analysis_run_id": "7ba34274-411d-45e3-8f54-c37baec598b1",
"analysis_status": "success",
"analysis_type": "detection",
"bbox_json": {
"x_max": 353.90289306640625,
"x_min": 252.73110961914062,
"y_max": 352.81695556640625,
"y_min": 319.88580322265625
},
"class_name": "building",
"confidence": 0.5060421824455261,
"created_at": "2026-07-06 23:58:50.968501+00:00",
"dataset_id": "ae0ff76d-70c0-404f-b777-54d14517179a",
"dataset_name": "geel_orthophoto_wms_512.tif",
"dataset_source_name": "manual",
"detection_id": "2d6aed95-d8b0-488b-87dd-59b242bf2426",
"max_x": 193623.1441431933,
"max_y": 205895.88595532626,
"min_x": 193524.34357342057,
"min_y": 205863.72662686557,
"model_name": "yolo-configured",
"model_version": "",
"project_name": "GeoIntel Real Data Validation 20260706T235847Z",
"source_tile_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif"
},
{
"analysis_run_id": "7ba34274-411d-45e3-8f54-c37baec598b1",
"analysis_status": "success",
"analysis_type": "detection",
"bbox_json": {
"x_max": 508.56524658203125,
"x_min": 330.76678466796875,
"y_max": 511.4638671875,
"y_min": 380.63653564453125
},
"class_name": "building",
"confidence": 0.581618070602417,
"created_at": "2026-07-06 23:58:50.968501+00:00",
"dataset_id": "ae0ff76d-70c0-404f-b777-54d14517179a",
"dataset_name": "geel_orthophoto_wms_512.tif",
"dataset_source_name": "manual",
"detection_id": "6e9eadb8-a3c5-4f12-b5ef-d00c00571428",
"max_x": 193774.1815977984,
"max_y": 205836.55906819552,
"min_x": 193600.55028733544,
"min_y": 205708.7980022356,
"model_name": "yolo-configured",
"model_version": "",
"project_name": "GeoIntel Real Data Validation 20260706T235847Z",
"source_tile_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif"
},
{
"analysis_run_id": "7ba34274-411d-45e3-8f54-c37baec598b1",
"analysis_status": "success",
"analysis_type": "detection",
"bbox_json": {
"x_max": 54.1800422668457,
"x_min": 0.481353759765625,
"y_max": 511.86688232421875,
"y_min": 456.6719665527344
},
"class_name": "building",
"confidence": 0.5783078670501709,
"created_at": "2026-07-06 23:58:50.968501+00:00",
"dataset_id": "ae0ff76d-70c0-404f-b777-54d14517179a",
"dataset_name": "geel_orthophoto_wms_512.tif",
"dataset_source_name": "manual",
"detection_id": "bec4f3af-5ca2-4a38-a547-21aeb19a70fd",
"max_x": 193330.44604670934,
"max_y": 205762.30571769923,
"min_x": 193278.00592121415,
"min_y": 205708.40443276614,
"model_name": "yolo-configured",
"model_version": "",
"project_name": "GeoIntel Real Data Validation 20260706T235847Z",
"source_tile_path": "/app/storage/tiles/cb80638d-dbef-48ac-b19c-cec7c3efc96e/ae0ff76d-70c0-404f-b777-54d14517179a/b191c968-7d56-4e0d-afbb-8b5baaa62470/tile_0000.tif"
}
],
"postgis_version": "POSTGIS=\"3.6.4 94d984b\" [EXTENSION] PGSQL=\"160\" GEOS=\"3.11.1-CAPI-1.17.1\" PROJ=\"9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db\" LIBXML=\"2.9.14\" LIBJSON=\"0.16\" LIBPROTOBUF=\"1.4.1\" WAGYU=\"0.5.0 (Internal)\" (core procs from \"3.4.3 e365945\" need upgrade) TOPOLOGY (topology procs from \"3.4.3 e365945\" need upgrade)",
"source_summary": [
{
"count": 1751,
"reference_count": 660,
"source_name": "manual",
"status": "ready"
},
{
"count": 339,
"reference_count": 0,
"source_name": "vmm_flood_hazard",
"status": "ready"
},
{
"count": 273,
"reference_count": 273,
"source_name": "vmm_vha_bathymetry_profiles",
"status": "ready"
},
{
"count": 210,
"reference_count": 0,
"source_name": "department_omgeving_thematic_raster",
"status": "ready"
},
{
"count": 179,
"reference_count": 179,
"source_name": "grb",
"status": "ready"
},
{
"count": 168,
"reference_count": 0,
"source_name": "digitaal_vlaanderen_orthophoto",
"status": "ready"
},
{
"count": 107,
"reference_count": 0,
"source_name": "spw_orthophoto",
"status": "ready"
},
{
"count": 68,
"reference_count": 68,
"source_name": "spw_picc",
"status": "ready"
},
{
"count": 60,
"reference_count": 0,
"source_name": "digitaal_vlaanderen_dhmv",
"status": "ready"
},
{
"count": 36,
"reference_count": 36,
"source_name": "urbis",
"status": "ready"
},
{
"count": 26,
"reference_count": 0,
"source_name": "urbis_orthophoto",
"status": "ready"
},
{
"count": 26,
"reference_count": 26,
"source_name": "waterinfo",
"status": "ready"
},
{
"count": 25,
"reference_count": 25,
"source_name": "department_omgeving_land_use",
"status": "ready"
},
{
"count": 21,
"reference_count": 21,
"source_name": "historical_landuse",
"status": "ready"
},
{
"count": 18,
"reference_count": 18,
"source_name": "agentschap_landbouw_zeevisserij_agricultural_parcels",
"status": "ready"
},
{
"count": 15,
"reference_count": 15,
"source_name": "statbel",
"status": "ready"
},
{
"count": 13,
"reference_count": 13,
"source_name": "dov_soil_map",
"status": "ready"
},
{
"count": 12,
"reference_count": 12,
"source_name": "inbo_bwk_natura2000",
"status": "ready"
},
{
"count": 7,
"reference_count": 0,
"source_name": "spw_walous_land_cover",
"status": "ready"
},
{
"count": 6,
"reference_count": 0,
"source_name": "vrbg",
"status": "ready"
},
{
"count": 5,
"reference_count": 1,
"source_name": "fixture",
"status": "ready"
},
{
"count": 4,
"reference_count": 4,
"source_name": "ngi_adminvector",
"status": "ready"
},
{
"count": 3,
"reference_count": 0,
"source_name": "map_selection",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "digitaal_vlaanderen_buildings_addresses_register",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "rbins_marine_reporting_units",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "rbins_msp_2026",
"status": "ready"
},
{
"count": 1,
"reference_count": 0,
"source_name": "spw_bathymetry",
"status": "ready"
},
{
"count": 1,
"reference_count": 0,
"source_name": "spw_terrain",
"status": "ready"
}
],
"table_counts": {
"analysis_runs": 1146,
"aoi_operation_partitions": 61,
"aoi_operations": 4,
"areas": 387,
"dataset_versions": 1671,
"datasets": 3377,
"detection_reviews": 0,
"detections": 299233,
"exports": 768,
"jobs": 4460,
"metrics": 4182,
"projects": 1097,
"quality_checks": 697,
"segmentations": 0,
"vector_features": 6689447
},
"version": "PostgreSQL 16.14 (Debian 16.14-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit"
},
"generated_at": "2026-08-01T16:06:01.768127+00:00",
"mode": "read_only",
"runtime": {
"cuda": {
"available": true,
"device_count": 1,
"device_names": [
"NVIDIA GeForce RTX 4080 SUPER"
],
"runtime_version": "12.8"
},
"packages": {
"fastapi": "0.139.2",
"geoalchemy2": "0.20.0",
"geointel-backend": "0.1.0",
"geopandas": "1.1.4",
"pyproj": "3.7.2",
"rasterio": "1.4.4",
"shapely": "2.1.2",
"sqlalchemy": "2.0.51",
"torch": "2.11.0+cu128",
"torchvision": "0.26.0+cu128",
"ultralytics": "8.4.99"
},
"platform": "Linux-6.12.54-Unraid-x86_64-with-glibc2.36",
"python": "3.11.2"
},
"schema_version": 1,
"statement_timeout_ms": 30000,
"storage_references": {
"checked_count": 5816,
"missing_count": 0,
"missing_records": [],
"records_truncated": false,
"scope": "direct datasets, dataset_versions and exports storage_path columns"
},
"storage_root": "/app/storage"
}
@@ -0,0 +1,397 @@
{
"active_model": {
"classes": "building",
"configured_path": "/app/models/geointel-building-yolov8s-smallbld-minpx3-img640-ft30.pt",
"device": "cuda:0",
"exists": true,
"model_id": "yolo-configured",
"model_version": "",
"require_cuda": "true",
"sha256": "a9088b8491dfae36694b53e9e9406cb4e3511d334a5712fa34f75078a47759c1",
"size_bytes": 22516074,
"validated_area_names": "Mol,Kempen",
"validation_scope_enforced": "true"
},
"database": {
"analysis_statuses": [
{
"count": 2,
"status": "failed"
},
{
"count": 1144,
"status": "success"
}
],
"confidence_integrity": [
{
"detections_outside_unit_interval": 0,
"segmentations_outside_unit_interval": 0
}
],
"dataset_lineage_gaps": [
{
"missing_checksum": 0,
"missing_crs": 0,
"missing_imported_at": 0,
"missing_observed_at": 2377,
"missing_provenance_metadata": 0,
"missing_source_metadata": 0,
"missing_source_version": 1761,
"total": 3377
}
],
"dataset_statuses": [
{
"count": 3377,
"status": "ready"
}
],
"dataset_version_gaps": [
{
"missing_checksum": 0,
"missing_provenance_metadata": 0,
"missing_source_metadata": 0,
"missing_storage_path": 0,
"total": 1671
}
],
"geometry_integrity": {
"areas": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 387,
"wrong_srid": 0
}
],
"status": "ok"
},
"detections": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 4,
"populated": 299233,
"wrong_srid": 0
}
],
"status": "ok"
},
"segmentations": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 0,
"wrong_srid": 0
}
],
"status": "ok"
},
"vector_features": {
"rows": [
{
"empty": 0,
"invalid": 0,
"outside_epsg4326_domain": 0,
"populated": 6689447,
"wrong_srid": 0
}
],
"status": "ok"
}
},
"job_statuses": [
{
"count": 135,
"status": "failed"
},
{
"count": 4325,
"status": "success"
}
],
"metric_nulls": [
{
"metric_key": "f1",
"null_values": 58,
"total": 697
},
{
"metric_key": "false_negative_count",
"null_values": 0,
"total": 697
},
{
"metric_key": "false_positive_count",
"null_values": 0,
"total": 697
},
{
"metric_key": "mean_iou",
"null_values": 90,
"total": 697
},
{
"metric_key": "precision",
"null_values": 58,
"total": 697
},
{
"metric_key": "recall",
"null_values": 1,
"total": 697
}
],
"migration_heads": [
"202607260001"
],
"model_run_summary": [
{
"analysis_type": "detection",
"count": 1144,
"model_name": "yolo-configured",
"model_version": "",
"status": "success"
},
{
"analysis_type": "detection",
"count": 2,
"model_name": "yolo-configured",
"model_version": "",
"status": "failed"
}
],
"postgis_version": "POSTGIS=\"3.6.4 94d984b\" [EXTENSION] PGSQL=\"160\" GEOS=\"3.11.1-CAPI-1.17.1\" PROJ=\"9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/proj.db\" LIBXML=\"2.9.14\" LIBJSON=\"0.16\" LIBPROTOBUF=\"1.4.1\" WAGYU=\"0.5.0 (Internal)\" (core procs from \"3.4.3 e365945\" need upgrade) TOPOLOGY (topology procs from \"3.4.3 e365945\" need upgrade)",
"source_summary": [
{
"count": 1751,
"reference_count": 660,
"source_name": "manual",
"status": "ready"
},
{
"count": 339,
"reference_count": 0,
"source_name": "vmm_flood_hazard",
"status": "ready"
},
{
"count": 273,
"reference_count": 273,
"source_name": "vmm_vha_bathymetry_profiles",
"status": "ready"
},
{
"count": 210,
"reference_count": 0,
"source_name": "department_omgeving_thematic_raster",
"status": "ready"
},
{
"count": 179,
"reference_count": 179,
"source_name": "grb",
"status": "ready"
},
{
"count": 168,
"reference_count": 0,
"source_name": "digitaal_vlaanderen_orthophoto",
"status": "ready"
},
{
"count": 107,
"reference_count": 0,
"source_name": "spw_orthophoto",
"status": "ready"
},
{
"count": 68,
"reference_count": 68,
"source_name": "spw_picc",
"status": "ready"
},
{
"count": 60,
"reference_count": 0,
"source_name": "digitaal_vlaanderen_dhmv",
"status": "ready"
},
{
"count": 36,
"reference_count": 36,
"source_name": "urbis",
"status": "ready"
},
{
"count": 26,
"reference_count": 0,
"source_name": "urbis_orthophoto",
"status": "ready"
},
{
"count": 26,
"reference_count": 26,
"source_name": "waterinfo",
"status": "ready"
},
{
"count": 25,
"reference_count": 25,
"source_name": "department_omgeving_land_use",
"status": "ready"
},
{
"count": 21,
"reference_count": 21,
"source_name": "historical_landuse",
"status": "ready"
},
{
"count": 18,
"reference_count": 18,
"source_name": "agentschap_landbouw_zeevisserij_agricultural_parcels",
"status": "ready"
},
{
"count": 15,
"reference_count": 15,
"source_name": "statbel",
"status": "ready"
},
{
"count": 13,
"reference_count": 13,
"source_name": "dov_soil_map",
"status": "ready"
},
{
"count": 12,
"reference_count": 12,
"source_name": "inbo_bwk_natura2000",
"status": "ready"
},
{
"count": 7,
"reference_count": 0,
"source_name": "spw_walous_land_cover",
"status": "ready"
},
{
"count": 6,
"reference_count": 0,
"source_name": "vrbg",
"status": "ready"
},
{
"count": 5,
"reference_count": 1,
"source_name": "fixture",
"status": "ready"
},
{
"count": 4,
"reference_count": 4,
"source_name": "ngi_adminvector",
"status": "ready"
},
{
"count": 3,
"reference_count": 0,
"source_name": "map_selection",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "digitaal_vlaanderen_buildings_addresses_register",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "rbins_marine_reporting_units",
"status": "ready"
},
{
"count": 1,
"reference_count": 1,
"source_name": "rbins_msp_2026",
"status": "ready"
},
{
"count": 1,
"reference_count": 0,
"source_name": "spw_bathymetry",
"status": "ready"
},
{
"count": 1,
"reference_count": 0,
"source_name": "spw_terrain",
"status": "ready"
}
],
"table_counts": {
"analysis_runs": 1146,
"aoi_operation_partitions": 61,
"aoi_operations": 4,
"areas": 387,
"dataset_versions": 1671,
"datasets": 3377,
"detection_reviews": 0,
"detections": 299233,
"exports": 768,
"jobs": 4460,
"metrics": 4182,
"projects": 1097,
"quality_checks": 697,
"segmentations": 0,
"vector_features": 6689447
},
"version": "PostgreSQL 16.14 (Debian 16.14-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14+deb12u1) 12.2.0, 64-bit"
},
"generated_at": "2026-08-01T16:03:11.003029+00:00",
"mode": "read_only",
"runtime": {
"cuda": {
"available": true,
"device_count": 1,
"device_names": [
"NVIDIA GeForce RTX 4080 SUPER"
],
"runtime_version": "12.8"
},
"packages": {
"fastapi": "0.139.2",
"geoalchemy2": "0.20.0",
"geointel-backend": "0.1.0",
"geopandas": "1.1.4",
"pyproj": "3.7.2",
"rasterio": "1.4.4",
"shapely": "2.1.2",
"sqlalchemy": "2.0.51",
"torch": "2.11.0+cu128",
"torchvision": "0.26.0+cu128",
"ultralytics": "8.4.99"
},
"platform": "Linux-6.12.54-Unraid-x86_64-with-glibc2.36",
"python": "3.11.2"
},
"schema_version": 1,
"statement_timeout_ms": 30000,
"storage_references": {
"checked_count": 5816,
"missing_count": 0,
"missing_records": [],
"records_truncated": false,
"scope": "direct datasets, dataset_versions and exports storage_path columns"
},
"storage_root": "/app/storage"
}