docs(accuracy): refresh governed scan and training evidence

This commit is contained in:
Jens
2026-08-30 06:00:57 +02:00
parent c272220277
commit 0e3c1b20e9
27 changed files with 88787 additions and 318 deletions
File diff suppressed because it is too large Load Diff
@@ -1,15 +1,15 @@
{
"anomaly_category_counts": {
"freshness.missing": 9,
"lineage.missing": 58,
"freshness.missing": 29,
"lineage.missing": 577,
"manifest.zero_bbox": 6,
"raster.unreadable": 96,
"scope.unreachable": 3
},
"datasets": {
"geointel.artifact.generic": {
"anomaly_count": 57,
"item_count": 106,
"anomaly_count": 491,
"item_count": 620,
"paths": [
"artifacts/codex-review/v31/contact_sheet_001.png",
"artifacts/codex-review/v31/qa.json",
@@ -73,6 +73,510 @@
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260801T214300Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260801T214300Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T102427Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T102427Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T104514Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T104514Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T105815Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T105815Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T110331Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T110331Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T111348Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T111348Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T111836Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T111836Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T112539Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T112539Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T112647Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T112647Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T115647Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T115647Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T120018Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T120018Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T120441Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T120441Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T121027Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T121027Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T123611Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T123611Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124019Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T124019Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124513Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T124513Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T124803Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T124803Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T125438Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T125438Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T125917Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T125917Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130040Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130040Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130155Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130155Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130259Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130259Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130445Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130445Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130734Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130734Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T130844Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T130844Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T131017Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T131017Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T131311Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T131311Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T132031Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T132031Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T132646Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T132646Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T135219Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T135219Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T135655Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T135655Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T141523Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T141523Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163418Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T163418Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163634Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T163634Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T163758Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T163758Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T164824Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T164824Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165120Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T165120Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165349Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T165349Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T165522Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T165522Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170052Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T170052Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170548Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T170548Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T170746Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T170746Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T171039Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T171039Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T172555Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T172555Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T173304Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T173304Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T173618Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T173618Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T174225Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T174225Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T174604Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T174604Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T183714Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T183714Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T184216Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T184216Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T184531Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T184531Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T191008Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T191008Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T191239Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T191239Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T194442Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T194442Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T195723Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T195723Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T200243Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T200243Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T200507Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T200507Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T201658Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T201658Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T202637Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T202637Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T202903Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T202903Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203146Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T203146Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203349Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T203349Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203532Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T203532Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T203714Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T203714Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T212235Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T212235Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213013Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T213013Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213303Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T213303Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T213500Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T213500Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T220721Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T220721Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T221248Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T221248Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260822T225049Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260822T225049Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260829T235505Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260829T235505Z/summary/detection-calibration-summary.json",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/calibration_evidence_requests.tsv",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/calibration_evidence_review.html",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/calibration_evidence_summary.json",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/threshold_0p15_qc-low_evidence_response.json",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/threshold_0p35_qc-high_evidence_response.json",
"artifacts/detection-calibration-smoke/20260829T235746Z/mock-bin/curl",
"artifacts/detection-calibration-smoke/20260829T235746Z/summary/detection-calibration-summary.json",
"artifacts/evidence/accuracy/P1/alembic-heads.txt",
"artifacts/evidence/accuracy/P1/alembic-offline-upgrade.sql",
"artifacts/evidence/accuracy/P1/backend-ci-entrypoint.txt",
@@ -92,6 +596,16 @@
"artifacts/evidence/accuracy/P1/repository-ruff-baseline.json",
"artifacts/evidence/accuracy/P1/repository-ruff-baseline.txt",
"artifacts/evidence/accuracy/P1/static-risk-signals.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/reference-implementation-baseline.json",
"artifacts/evidence/accuracy/P4/reference-implementation-baseline.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/reference-implementation-baseline.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/reference-implementation-baseline.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/internal-spatial-leakage-audit.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/visual-review-summary.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/internal-spatial-leakage-audit.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/operator_yolo_label_qa_summary_r2.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-source-expanded-summary.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-source-summary.json",
"artifacts/model-review/building-be-v1-candidate/corpus-spec.json",
"artifacts/model-review/building-be-v1-pilot/corpus-spec.json",
"artifacts/v42-review/contact_sheet_001.png",
@@ -119,7 +633,7 @@
"storage/uploads/.gitkeep"
],
"severity_counts": {
"major": 56,
"major": 490,
"minor": 1
}
},
@@ -170,8 +684,8 @@
}
},
"geointel.manifest.json": {
"anomaly_count": 3,
"item_count": 13,
"anomaly_count": 35,
"item_count": 141,
"paths": [
"artifacts/evidence/accuracy/P1/evidence-manifest.json",
"artifacts/evidence/accuracy/P1/forensic-reproductions.json",
@@ -185,16 +699,149 @@
"artifacts/evidence/accuracy/P1/tower-runtime-database-snapshot.json",
"artifacts/evidence/accuracy/P2/evidence-manifest.json",
"artifacts/evidence/accuracy/P2/postgres-migration-guards.json",
"artifacts/evidence/accuracy/P2/source-contract-inventory.json"
"artifacts/evidence/accuracy/P2/source-contract-inventory.json",
"artifacts/evidence/accuracy/P4/baseline-raw-predictions.json",
"artifacts/evidence/accuracy/P4/benchmark-manifest.json",
"artifacts/evidence/accuracy/P4/development-split-manifest.json",
"artifacts/evidence/accuracy/P4/evidence-manifest.json",
"artifacts/evidence/accuracy/P4/failure-gallery.json",
"artifacts/evidence/accuracy/P4/leakage-gate-report.json",
"artifacts/evidence/accuracy/P4/metric-report.json",
"artifacts/evidence/accuracy/P4/protected-split-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/acceptance-gates.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/aoi-metrics.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/baseline-raw-predictions.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/benchmark-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/calibration-metrics.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/candidate-vs-incumbent.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/development-split-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/error-taxonomy.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/evaluation-contract.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/evidence-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/failure-gallery.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/generation-status.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/human-review-summary.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/input-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/latency-and-reliability.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/leakage-gate-report.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/metric-report.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/object-metrics.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/protected-split-manifest.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/release-gate-report.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/split-and-leakage-audit.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/stratified-metrics.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/tile-metrics.json",
"artifacts/evidence/accuracy/P4/reference-harness-v2/workflow-summary.json",
"artifacts/evidence/accuracy/P4/release-gate-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/acceptance-gates.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/aoi-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/baseline-raw-predictions.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/benchmark-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/calibration-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/candidate-vs-incumbent.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/development-split-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/error-taxonomy.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/evaluation-contract.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/evidence-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/failure-gallery.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/generation-status.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/human-review-summary.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/input-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/latency-and-reliability.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/leakage-gate-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/metric-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/object-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/protected-split-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/release-gate-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/split-and-leakage-audit.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/stratified-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/tile-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.0-e9dd2b6e3c1a9a12a222/workflow-summary.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/acceptance-gates.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/aoi-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/baseline-raw-predictions.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/benchmark-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/calibration-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/candidate-vs-incumbent.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/development-split-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/error-taxonomy.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/evaluation-contract.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/evidence-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/failure-gallery.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/generation-status.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/human-review-summary.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/input-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/latency-and-reliability.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/leakage-gate-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/metric-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/object-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/protected-split-manifest.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/release-gate-report.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/split-and-leakage-audit.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/stratified-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/tile-metrics.json",
"artifacts/evidence/accuracy/P4/runs/p4-2.0.1-9677d0ef37db82bcf39b/workflow-summary.json",
"artifacts/evidence/accuracy/P4/workflow-summary.json",
"artifacts/evidence/accuracy/model-training/20260809-ai-assisted-visual-review.json",
"artifacts/evidence/accuracy/model-training/20260809-reviewedexp6-ai-assisted-review-ledger.json",
"artifacts/evidence/accuracy/model-training/20260809-reviewedexp6-minpx4-derived-corpus.json",
"artifacts/evidence/accuracy/model-training/20260809-reviewedexp6-provenance-migration-audit.json",
"artifacts/evidence/accuracy/model-training/20260809-v67-training-decision.json",
"artifacts/evidence/accuracy/model-training/20260809-v68-checkpoint-and-threshold-review.json",
"artifacts/evidence/accuracy/model-training/20260809-v69-nonoverlap-checkpoint-review.json",
"artifacts/evidence/accuracy/model-training/20260809-v70-evaluation-independence-gate.json",
"artifacts/evidence/accuracy/model-training/20260809-v71-full-lineage-independence-gate.json",
"artifacts/evidence/accuracy/model-training/20260809-v71-model-lineage-receipt.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration-summary.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/active-stratified.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/active-threshold-extension.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/challenger-stratified.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/checkpoint-matrix.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/corpus-NO_TRAINING.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/corpus-freeze.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/operator_samples_manifest.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/provisioning-spec.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/spatial-independence.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/yolo-NO_TRAINING.json",
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/yolo_tile_dataset_summary.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/EXPERIMENTAL_ONLY.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/aggressive-training-summary.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/aggressive-v72-evaluation-matrix.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/controlled-v72-evaluation-matrix.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/corpus-freeze.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/experimental_dataset_summary.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/operator_samples_manifest.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/outcome.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/provisioning-spec.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/v72-v73-spatial-independence.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/visual-review.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/active-error-report.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/decision.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/filter-0.10.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/filter-0.15.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/filter-0.20.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/filter-0.30.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/filter-0.50.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/proposal-filter.experimental.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-auto-optimizer.experimental.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-auto-v72-matrix.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-low-lr-v72-matrix.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-low-lr.experimental.json",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/rehearsal-v74.experimental.json"
],
"severity_counts": {
"minor": 3
"major": 12,
"minor": 23
}
},
"geointel.model.pytorch": {
"anomaly_count": 0,
"item_count": 6,
"anomaly_count": 1,
"item_count": 10,
"paths": [
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/contact_sheet_001.png",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/contact_sheet_001.png",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/contact_sheet_002.png",
"artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/active-error-contact-sheet.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-background.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-cal.png",
"artifacts/model-review/building-be-v1-pilot/building-be-v2-contact.png",
@@ -202,7 +849,9 @@
"artifacts/model-review/building-be-v1-pilot/contact_sheet_001.png",
"models/.gitkeep"
],
"severity_counts": {}
"severity_counts": {
"major": 1
}
},
"geointel.raster.geotiff": {
"anomaly_count": 101,
@@ -350,8 +999,8 @@
}
},
"geointel.vector.geojson": {
"anomaly_count": 8,
"item_count": 8,
"anomaly_count": 80,
"item_count": 80,
"paths": [
"artifacts/detection-calibration-smoke/20260801T130251Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T154642Z/evidence/calibration_evidence.geojson",
@@ -360,13 +1009,85 @@
"artifacts/detection-calibration-smoke/20260801T210556Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213357Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T213707Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence.geojson"
"artifacts/detection-calibration-smoke/20260801T214300Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T102427Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T104514Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T105815Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T110331Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T111348Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T111836Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T112539Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T112647Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T115647Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T120018Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T120441Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T121027Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T123611Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T124019Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T124513Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T124803Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T125438Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T125917Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130040Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130155Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130259Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130445Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130734Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T130844Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T131017Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T131311Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T132031Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T132646Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T135219Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T135655Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T141523Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T163418Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T163634Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T163758Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T164824Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T165120Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T165349Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T165522Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T170052Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T170548Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T170746Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T171039Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T172555Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T173304Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T173618Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T174225Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T174604Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T183714Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T184216Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T184531Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T191008Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T191239Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T194442Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T195723Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T200243Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T200507Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T201658Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T202637Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T202903Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T203146Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T203349Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T203532Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T203714Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T212235Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T213013Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T213303Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T213500Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T220721Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T221248Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260822T225049Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260829T235505Z/evidence/calibration_evidence.geojson",
"artifacts/detection-calibration-smoke/20260829T235746Z/evidence/calibration_evidence.geojson"
],
"severity_counts": {
"major": 8
"major": 80
}
}
},
"scan_id": "p3-46ee3f8d3a2dc52b",
"scan_id": "p3-eb67185e61107cc7",
"schema_version": 1
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -9,9 +9,12 @@
"split_independence_proven": false
},
"same_checksum_across_splits": {},
"scan_id": "p3-46ee3f8d3a2dc52b",
"scan_id": "p3-eb67185e61107cc7",
"schema_version": 1,
"source_spatial_audit_files": [],
"source_spatial_audit_files": [
"artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/internal-spatial-leakage-audit.json",
"artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/internal-spatial-leakage-audit.json"
],
"spatial_overlap_checks": "not_proven_without_AOI_split_geometry",
"status": "attention"
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,12 +1,12 @@
{
"items": {
"DHMV|unknown": 5,
"GRB|unknown": 4,
"DHMV|unknown": 11,
"GRB|unknown": 18,
"Orthophoto|unknown": 34,
"unknown|declared": 6,
"unknown|declared": 7,
"unknown|unavailable": 3,
"unknown|unknown": 246
"unknown|unknown": 943
},
"scan_id": "p3-46ee3f8d3a2dc52b",
"scan_id": "p3-eb67185e61107cc7",
"schema_version": 1
}
@@ -0,0 +1,84 @@
{
"schema_version": 1,
"review_id": "20260830-independent-ai-visual-review",
"reviewed_at": "2026-08-30T00:00:00+02:00",
"reviewer_kind": "independent_ai_visual_inspection",
"human_reviewer": false,
"claim_boundary": "Visual inspection evidence only. This is not a human acceptance ledger, protected-test result, accuracy measurement or model-promotion approval.",
"inputs": [
{
"path": "artifacts/evidence/accuracy/model-training/20260809-v72-fresh-calibration/contact_sheet_001.png",
"sha256": "f7734c5a9db8837adeda7f8e0f1a2942148330abfcb588d41dc245017ec2435a"
},
{
"path": "artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/contact_sheet_001.png",
"sha256": "4e092afac6bbff820908f73acd2a29b6d327d7476c3b2ae5001302a0bde4a24f"
},
{
"path": "artifacts/evidence/accuracy/model-training/20260810-v73-flanders-remediation/contact_sheet_002.png",
"sha256": "ef4e4a9663b4ac1920bee76bf0ca40c69d6232ddeb40d75c6963a17540b8d211"
},
{
"path": "artifacts/evidence/accuracy/model-training/20260810-v74-root-cause/active-error-contact-sheet.png",
"sha256": "bb5e4809802643cc8b673a86f3027ed06aa0430fbe79b1d33718c21d5feb269d"
},
{
"path": "storage/operator-data/model-review/reviewedexp6-corpus/full-ai-review-r1/contact_sheet_001.png",
"sha256": "688b97a6e82e6b906b7966ed3e2b43685786e89d50549188bfdcc3837d042eb2"
},
{
"path": "storage/operator-data/model-review/reviewedexp6-corpus/nested-pairs-review-r2/contact_sheet_001.png",
"sha256": "2a6bdd542b8ac49bcd5ac4d9c84999982461463ddd3c2fe0dc7332ceeb7a5e60"
},
{
"path": "storage/operator-data/model-review/reviewedexp6-corpus/tile-edge-review-r1/contact_sheet_001.png",
"sha256": "5d96c5a0a732077ed16b22d33bed998b37bd33b5536b1491e778999a2a6638dd"
}
],
"findings": [
{
"severity": "blocker",
"category": "reference_geometry_semantics",
"observation": "Many yellow reference rectangles are coarse axis-aligned extents rather than roof or building footprints; several include vegetation, roads, fields or multiple structures.",
"impact": "A detector trained against these boxes is penalized for geometrically correct roof localization and rewarded for oversized detections."
},
{
"severity": "blocker",
"category": "dense_and_nested_labels",
"observation": "Dense urban and industrial samples contain strongly overlapping, nested and grouped boxes without an unambiguous single-object labelling rule.",
"impact": "Label conflict and inconsistent object granularity make precision, recall and NMS behaviour unreliable."
},
{
"severity": "critical",
"category": "tile_edge_and_visibility",
"observation": "Multiple labelled structures are clipped by tile boundaries or only partly visible, while edge inclusion rules are not consistently evident.",
"impact": "This creates avoidable false-negative and duplicate-detection pressure at inference tile seams."
},
{
"severity": "critical",
"category": "hard_negative_coverage",
"observation": "Industrial rails, paved surfaces, tree canopy and tree-shadow remain recurrent false-positive contexts in the active-error sheet; representative pure-background coverage remains insufficient, especially for Brussels.",
"impact": "The candidate has no defensible low-false-positive operating point across Belgium."
},
{
"severity": "critical",
"category": "model_error_balance",
"observation": "The active-error review shows simultaneous false positives and false negatives across industrial, vegetated and sparse-rural contexts.",
"impact": "Threshold tuning alone cannot repair the observed error pattern."
}
],
"decision": {
"corpus_accepted": false,
"training_gate": "blocked",
"promotion_allowed": false,
"human_review_satisfied": false,
"required_before_next_governed_training": [
"re-extract building labels from task-appropriate authoritative geometry with an explicit object-granularity rule",
"resolve dense and nested labels and publish a checksum-bound review ledger",
"apply deterministic tile-edge visibility and ownership rules",
"add independent pure-background and hard-negative strata for Flanders, Wallonia and Brussels",
"prove AOI and derived-image independence across train, validation, test and challenge splits",
"obtain representative human acceptance before opening protected evaluation"
]
}
}
@@ -9,7 +9,13 @@ from pathlib import Path
SCRIPT = Path(__file__).resolve().parents[2] / "scripts" / "run_accuracy_phase3_full_data_scan.py"
def run_scan(repo: Path, output: Path, *, resume: bool = False) -> dict:
def run_scan(
repo: Path,
output: Path,
*,
resume: bool = False,
unreachable_scopes: tuple[str, ...] = (),
) -> dict:
command = [
sys.executable,
str(SCRIPT),
@@ -24,6 +30,8 @@ def run_scan(repo: Path, output: Path, *, resume: bool = False) -> dict:
]
if resume:
command.append("--resume")
for scope in unreachable_scopes:
command.extend(("--unreachable-scope", scope))
completed = subprocess.run(command, check=True, capture_output=True, text=True)
return json.loads(completed.stdout)
@@ -57,8 +65,18 @@ def test_phase3_scan_reconciles_and_resumes_deterministically(tmp_path: Path) ->
(data / "broken.tif").write_bytes(b"not a geotiff")
output = tmp_path / "evidence"
first = run_scan(tmp_path, output)
second = run_scan(tmp_path, output, resume=True)
unreachable_scopes = (
"external://tower-corpora=Tower corpora are not mounted in this fixture",
"external://mounted-model-volumes=Model volumes are not mounted in this fixture",
"external://production-postgis-or-api=Production database is not configured in this fixture",
)
first = run_scan(tmp_path, output, unreachable_scopes=unreachable_scopes)
second = run_scan(
tmp_path,
output,
resume=True,
unreachable_scopes=unreachable_scopes,
)
manifest = json.loads((output / "full-scan-manifest.json").read_text(encoding="utf-8"))
quarantine = json.loads((output / "quarantine-manifest.json").read_text(encoding="utf-8"))
@@ -68,3 +86,46 @@ def test_phase3_scan_reconciles_and_resumes_deterministically(tmp_path: Path) ->
assert any(item["path"] == "data/broken.tif" for item in quarantine["items"])
assert any(item["path"] == "data/invalid.geojson" for item in quarantine["items"])
assert len(manifest["duplicates"]["exact_duplicate_groups"]) == 1
def test_phase3_scan_does_not_invent_unreachable_production_boundaries(
tmp_path: Path,
) -> None:
data = tmp_path / "data"
data.mkdir()
(data / "present.json").write_text("{}", encoding="utf-8")
output = tmp_path / "evidence"
result = run_scan(tmp_path, output)
assert result["reconciliation"] == {
"examined": 1,
"skipped": 0,
"unreachable": 0,
"inventory_total": 1,
"reconciles": True,
}
def test_phase3_scan_records_a_missing_requested_root(tmp_path: Path) -> None:
output = tmp_path / "evidence"
completed = subprocess.run(
[
sys.executable,
str(SCRIPT),
"--repo-root",
str(tmp_path),
"--output-dir",
str(output),
"--roots",
"missing-data",
],
check=True,
capture_output=True,
text=True,
)
result = json.loads(completed.stdout)
manifest = json.loads((output / "full-scan-manifest.json").read_text(encoding="utf-8"))
assert result["reconciliation"]["unreachable"] == 1
assert manifest["items"][0]["path"] == "root://missing-data"
@@ -175,6 +175,31 @@ def test_failed_iteration_builds_train_only_sampling_for_next_checkpoint(tmp_pat
assert command[command.index("--output-dir") + 1].endswith("failure-driven-training")
def test_protected_assessment_uses_frozen_threshold_and_configured_gates(
tmp_path: Path,
) -> None:
command = MODULE.protected_assessment_command(
scripts_dir=tmp_path / "scripts",
calibration=tmp_path / "calibration.json",
test=tmp_path / "test.json",
background=tmp_path / "background.json",
output=tmp_path / "assessment.json",
selected_threshold=0.275,
min_aggregate_f1=0.71,
min_region_f1=0.62,
min_region_precision=0.73,
min_region_recall=0.58,
max_pure_empty_fp=1,
)
assert command[command.index("--selected-threshold") + 1] == "0.275"
assert command[command.index("--min-aggregate-f1") + 1] == "0.71"
assert command[command.index("--min-region-f1") + 1] == "0.62"
assert command[command.index("--min-region-precision") + 1] == "0.73"
assert command[command.index("--min-region-recall") + 1] == "0.58"
assert command[command.index("--max-pure-empty-fp") + 1] == "1"
def test_partial_iteration_resume_uses_exact_checkpoint_and_cuda(tmp_path: Path) -> None:
checkpoint = tmp_path / "runs" / "iteration-002" / "weights" / "last.pt"
assert MODULE.resumable_training_command("yolo", checkpoint) == [
@@ -1,5 +1,6 @@
from __future__ import annotations
import hashlib
import json
import subprocess
from pathlib import Path
@@ -51,11 +52,27 @@ def _write_report(path: Path, *, promotion_status: str = "promote_candidate") ->
)
def _write_governed_release_gate(path: Path, model_file: Path, **overrides: object) -> None:
payload: dict[str, object] = {
"status": "pass",
"product_benchmark_status": "pass",
"promotion_allowed": True,
"phase_decision": "ready",
"candidate_key": CANDIDATE_KEY,
"candidate_model_sha256": hashlib.sha256(model_file.read_bytes()).hexdigest(),
"benchmark_manifest_sha256": "b" * 64,
}
payload.update(overrides)
path.write_text(json.dumps(payload), encoding="utf-8")
def _run_activation(tmp_path: Path, *extra_args: str) -> subprocess.CompletedProcess[str]:
models_dir = tmp_path / "models"
_write_model(models_dir)
model_file = _write_model(models_dir)
report_path = tmp_path / "promotion_report.json"
_write_report(report_path)
release_gate_path = tmp_path / "phase4-release-gate.json"
_write_governed_release_gate(release_gate_path, model_file)
env_file = tmp_path / ".env"
env_file.write_text("GEOINTEL_ENV=production\nYOLO_ENABLED=false\n", encoding="utf-8")
@@ -67,6 +84,8 @@ def _run_activation(tmp_path: Path, *extra_args: str) -> subprocess.CompletedPro
str(report_path),
"--candidate-key",
CANDIDATE_KEY,
"--phase4-release-gate-report",
str(release_gate_path),
"--models-dir",
str(models_dir),
"--container-model-dir",
@@ -94,6 +113,9 @@ def test_promoted_yolo_activation_dry_run_validates_report_and_model(tmp_path: P
assert payload["will_download_models"] is False
assert payload["candidate"]["candidate_key"] == CANDIDATE_KEY
assert payload["candidate"]["threshold"] == 0.35
assert payload["selected_model_sha256"] == hashlib.sha256(
(tmp_path / "models" / "geointel-building-yolov8s-aoi1024bg512r3e50.pt").read_bytes()
).hexdigest()
assert payload["env_updates"]["YOLO_ENABLED"] == "true"
assert payload["env_updates"]["YOLO_MODEL_PATH"] == "/app/models/geointel-building-yolov8s-aoi1024bg512r3e50.pt"
@@ -114,9 +136,11 @@ def test_promoted_yolo_activation_apply_updates_env_file(tmp_path: Path) -> None
def test_promoted_yolo_activation_rejects_non_promoted_report(tmp_path: Path) -> None:
models_dir = tmp_path / "models"
_write_model(models_dir)
model_file = _write_model(models_dir)
report_path = tmp_path / "promotion_report.json"
_write_report(report_path, promotion_status="reject")
release_gate_path = tmp_path / "phase4-release-gate.json"
_write_governed_release_gate(release_gate_path, model_file)
result = subprocess.run(
[
@@ -126,6 +150,8 @@ def test_promoted_yolo_activation_rejects_non_promoted_report(tmp_path: Path) ->
str(report_path),
"--candidate-key",
CANDIDATE_KEY,
"--phase4-release-gate-report",
str(release_gate_path),
"--models-dir",
str(models_dir),
"--env-file",
@@ -145,6 +171,52 @@ def test_promoted_yolo_activation_rejects_non_promoted_report(tmp_path: Path) ->
assert "rejection_reasons" in payload
def test_promoted_yolo_activation_rejects_failed_or_unbound_phase4_gate(
tmp_path: Path,
) -> None:
models_dir = tmp_path / "models"
model_file = _write_model(models_dir)
report_path = tmp_path / "promotion_report.json"
_write_report(report_path)
release_gate_path = tmp_path / "phase4-release-gate.json"
_write_governed_release_gate(
release_gate_path,
model_file,
status="fail",
promotion_allowed=False,
candidate_model_sha256="0" * 64,
)
result = subprocess.run(
[
"python",
str(SCRIPT),
"--promotion-report",
str(report_path),
"--phase4-release-gate-report",
str(release_gate_path),
"--candidate-key",
CANDIDATE_KEY,
"--models-dir",
str(models_dir),
"--env-file",
str(tmp_path / ".env"),
"--json",
],
cwd=ROOT,
capture_output=True,
text=True,
timeout=30,
check=False,
)
assert result.returncode == 3
payload = json.loads(result.stdout)
assert payload["status"] == "governed_release_not_approved"
assert "phase4_release_gate_not_passed" in payload["rejection_reasons"]
assert "governed_candidate_model_sha256_mismatch" in payload["rejection_reasons"]
def test_readiness_gate_compiles_promoted_activation_script() -> None:
readiness = (ROOT / "scripts" / "run_readiness_check.sh").read_text(encoding="utf-8")
@@ -18,7 +18,7 @@ def test_frontend_declares_national_scope_as_primary_operating_focus() -> None:
navigation = read_feature("shell")
assert "NATIONAL_WORKSPACE_PROJECT_NAME = 'Belgium and North Sea Workbench'" in focus
assert "NATIONAL_WORKSPACE_REGION = 'Belgie en Belgische Noordzee'" in focus
assert "NATIONAL_WORKSPACE_REGION = 'België en Belgische Noordzee'" in focus
assert "NATIONAL_MAP_CENTER" in focus
assert "return nationalProject.id" in project_hook
assert "hasMappedAnalysisContext(data)" in project_hook
+2 -1
View File
@@ -137,7 +137,8 @@ def test_kempen_scope_operator_is_packaged_and_exposed_in_map_flow() -> None:
assert "Kempen (28 gemeenten)" in workspace
assert 'aria-label="Regio"' not in workspace
assert 'aria-label="Ingeladen regiobereik"' in workspace
assert "Zoek optioneel een gemeente" in workspace
assert 'aria-label="Optioneel een gemeente zoeken"' in workspace
assert 'placeholder="Gemeentenaam of NIS-code"' in workspace
assert "projects={projects}" in app
map_props = app.split("<MapWorkspace", maxsplit=1)[1].split("/>", maxsplit=1)[0]
assert "onSelectProject={selectProject}" not in map_props
+37
View File
@@ -12970,3 +12970,40 @@ Open:
- Kept the historical evidence boundary explicit: this runtime receipt does not
invent human review, a historical training commit/container, protected-test
independence, national validity or a new promotion decision.
## 2026-08-30 - Accuracy-status en fail-closed modelactivatie
- Herhaalde de lokale Phase-3-scan deterministisch als
`p3-eb67185e61107cc7`: 1013 bestanden onderzocht, nul overgeslagen en drie
gedeclareerde externe productiegrenzen, met content-hash
`f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`.
- Corrigeerde de statusgrens naar `local_complete_production_inventory_pending`;
Tower-volumes en productie-PostGIS zijn nog niet als totale productie-
inventaris gereconcilieerd.
- Retireerde de stale tracked `geointel/`-mirror met immutable Git-recovery en
verplaatste 207 niet-getrackte runtimebestanden intact naar een genegeerde
recoverymap; productiegegevens en modelgewichten zijn niet verwijderd.
- Legde onafhankelijke AI-visuele triage vast met `human_reviewer=false`.
Referentiegeometrie, dense/nested labels, tile-edge-regels en regionale
hard-negative dekking blokkeren corpusacceptatie, training en promotie.
- Versterkte de activatiegrens: alleen een exact overeenkomende candidate key,
model-SHA-256 en benchmarkmanifest-SHA-256 in een geslaagd governed Phase-4/5
release-gaterapport kunnen activatie autoriseren. Een legacy diagnostisch
promotierapport is onvoldoende.
- De taakgeschikte officiële bron blijft doorslaggevend voor productresultaten.
Deze remediatie levert geen menselijke review, nationale validatie,
modelpromotie of 100%-accuratieclaim.
## 2026-08-30 - Fail-closed release-, backup- en rollbackpad
- Retireerde het aparte, niet-gegate Unraid-workflowpad; productie-deploy hangt
nu uitsluitend af van quality-, dependency- en AI-containergates.
- Bond controller, OCI-label, SBOM, Trivy-evidence en draaiende container aan
het exacte full-SHA en lokale Docker image-ID.
- Maakte storage/models byte-compleet, symlink-veilig en checksum-geverifieerd;
latere snapshots hardlinken alleen gelijke backup-naar-backup bytes.
- Bewees databaseherstel vóór productiecutover in een tijdelijke database,
behield de pre-restore database en bond same-revision rollback aan het
image-ID uit de specifieke pre-deploybackup.
- Maakte cleanup-quarantine en herstel interruption-safe en no-clobber, en
behield HTTPS-forwarding uitsluitend voor interne vertrouwde proxies.
+19
View File
@@ -1,5 +1,24 @@
# GeoIntel TODO
## Accuracy-remediatie (2026-08-30)
- [x] Herhaal de lokale Phase-3-scan deterministisch: scan
`p3-eb67185e61107cc7` onderzocht 1013 bestanden, sloeg er nul over en
registreerde drie externe productiegrenzen expliciet; content-hash
`f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`.
- [ ] Inventariseer de drie gedeclareerde Tower-/productiegrenzen gecontroleerd
en reconcileer servervolumes en productie-PostGIS; de lokale scan is geen
totale productie-inventaris.
- [x] Leg de onafhankelijke AI-visuele hercontrole vast met
`human_reviewer=false`; corpusacceptatie, training en promotie blijven
geblokkeerd.
- [x] Laat modelactivatie fail-closed vereisen dat candidate key, model-SHA-256
en benchmarkmanifest-SHA-256 exact overeenkomen met een geslaagd governed
Phase-4/5 release-gaterapport.
- [ ] Herstel de vastgestelde labelsemantiek, dense/nested conflicten,
tile-edge-regels en regionale hard-negative dekking; verkrijg daarna
representatieve menselijke acceptatie vóór een volgende governed training.
## CI-onderhoud (2026-08-29)
- [x] Vervang de Gitea-incompatibele TruffleHog-actionwrapper.
@@ -224,6 +224,22 @@ produce map geometry or location claims.
| DHMV | Contract requires product key, DTM/DSM semantics, EPSG:31370, native/analysis resolution, one-band numeric units, nodata, TAW vertical reference and 2013-2015 period for the currently configured DHMV II source. It is elevation evidence, not building truth. |
| Bathymetry | Vertical datum/reference plane, depth versus bed-elevation semantics, survey epoch and uncertainty are mandatory. No water volume is inferred. |
### 5.4 Inference tile-manifest contract
Raster tiling emits `geointel.raster.tile-manifest@2.0.0`. The manifest binds
the source Dataset id/checksum/size, the latest DatasetVersion identity and
checksum, registry/snapshot identities and snapshot checksum, data-contract
identity, source version and—when present—the Area identity and geometry hash.
Each tile has an explicit CRS/bounds, byte size and SHA-256.
Configured detection and segmentation validate that exact binding against the
requested live Dataset before model loading. They recompute every tile hash,
normalize the tile union to EPSG:4326 and require it to remain inside the
manifest and persisted Dataset extents and intersect the bound Area. Missing,
legacy or changed evidence is not inferred from filenames: it fails closed with
a typed dataset, provenance, tile-integrity or spatial-scope error.
## 6. Vector data contract
### 6.1 Required vector fields
+36 -10
View File
@@ -6,21 +6,30 @@ De reproduceerbare scan `scripts/run_accuracy_phase3_full_data_scan.py` is read-
| Telling | Aantal |
| --- | ---: |
| Onderzochte bestanden | 295 |
| Onderzochte bestanden | 1013 |
| Overgeslagen bestanden | 0 |
| Onbereikbare scope-items | 3 |
| Geïnventariseerd totaal | 298 |
| Reconciliatie | groen (`295 + 0 + 3 = 298`) |
| Geïnventariseerd totaal | 1016 |
| Reconciliatie | groen (`1013 + 0 + 3 = 1016`) |
De drie expliciet onbereikbare items zijn de niet-gemounte Tower-corpora, gemounte modelvolumes en een productie-PostGIS/API-endpoint. Elk staat als `unreachable` in het volledige manifest met concrete reden; er is geen stilzwijgende skip.
De drie expliciet onbereikbare items zijn grenzen van deze lokale
Windows-scan: de niet lokaal gemounte Tower-corpora, modelvolumes en het
productie-PostGIS/API-endpoint. Elk staat als `unreachable` in het volledige
manifest met concrete reden; er is geen stilzwijgende skip. Dit betekent niet
dat de server zelf onbereikbaar is. Een afzonderlijke gecontroleerde
productiescan moet die remote scopes beoordelen voordat een nationale
volledigheidsclaim mogelijk is.
De scan leverde 172 anomalieën op. Dat is geen geldigheidsclaim: 163 items zijn daarom in de logische quarantine-manifest opgenomen. De scanner promoot geen enkel foutief item tot ground truth en voert geen automatische reparatie uit. De huidige bevindingen zijn:
De scan leverde 711 anomalieën op. Dat is geen geldigheidsclaim: 682 items
zijn daarom in het logische quarantainemanifest opgenomen. De scanner promoot
geen enkel foutief item tot ground truth en voert geen automatische reparatie
uit. De huidige bevindingen zijn:
| Categorie | Aantal | Standaardactie |
| --- | ---: | --- |
| Onleesbare/corrupte GeoTIFF | 96 | quarantine |
| Afgeleide artefacten zonder expliciete lineage | 58 | quarantine |
| Bronlabel zonder declared freshness | 9 | requires review |
| Onleesbare/corrupte GeoTIFF | 96 | unavailable or unreadable |
| Afgeleide artefacten zonder expliciete lineage | 577 | quarantine |
| Bronlabel zonder declared freshness | 29 | requires review |
| Manifest met nul-bounding-box | 6 | quarantine |
| Niet-bereikbare externe scope | 3 | unavailable or unreadable |
@@ -43,7 +52,7 @@ Er zijn vijf vaste ernstniveaus (`blocker`, `critical`, `major`, `minor`, `infor
De scanner bouwt eerst een gesorteerde inventory-hash. Per batch wordt `scan-checkpoint.json` atomair bijgewerkt. Met dezelfde inventory en `--resume` worden onveranderde records hergebruikt; gewijzigde records worden opnieuw gelezen. De inhoudshash sluit alleen uitvoertimestamps uit. Twee opeenvolgende runs gaven dezelfde scan-ID en content-hash:
`p3-46ee3f8d3a2dc52b` / `1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e`
`p3-eb67185e61107cc7` / `f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a`
## Bewijsartefacten
@@ -69,9 +78,26 @@ De fixturetest controleert geldige en foutieve GeoJSON, corrupte rasterinput, ex
## Fasebeslissing
Fase 3 is `done` voor de afgebakende projectomgeving: alle 295 veilige lokale bestanden zijn verwerkt en de drie niet-bereikbare externe grenzen zijn expliciet geregistreerd. Fase 4 is `ready` voor verdere beoordeling van de gevonden quarantine- en leakage-signalen. Dit is geen modelpromotie- of nationale kwaliteitsclaim; de inhoudelijke anomalieën moeten eerst door de volgende fase worden hersteld of menselijk beoordeeld.
De lokale Fase-3-scan is volledig voor de afgebakende projectomgeving: alle
1013 veilige lokale bestanden zijn verwerkt en de drie niet-gemounte grenzen
zijn expliciet geregistreerd. Fase 3 blijft voor de totale operationele
omgeving `production_inventory_pending` totdat de servervolumes en database
in een gecontroleerde productiescan zijn gereconcilieerd. Fase 4 kan de lokale
quarantine- en leakage-signalen al beoordelen. Dit is geen modelpromotie- of
nationale kwaliteitsclaim; de inhoudelijke anomalieën moeten eerst worden
hersteld of representatief menselijk beoordeeld.
> **Historische handoff:** `ready` beschrijft het overdrachtsmoment direct na
> de Phase-3-scan. Het Phase-4-harnas is inmiddels geïmplementeerd, maar de
> actuele productbenchmark is nog `not_evaluable`; de normatieve actuele
> status staat in `docs/accuracy-program/status.json`.
## Accuracy-handoff na de scan
De onafhankelijke AI-visuele triage van 30 augustus is vastgelegd in
`artifacts/evidence/accuracy/model-training/20260830-independent-ai-visual-review.json`.
Daarin blijven `human_reviewer=false`, corpusacceptatie, training en promotie
expliciet geblokkeerd. Een model kan bovendien pas worden geactiveerd wanneer
de exacte candidate key en model-SHA-256 overeenkomen met een geslaagd governed
Phase-4/5 release-gaterapport dat ook de benchmarkmanifest-SHA-256 bindt. De
taakgeschikte officiële bron blijft doorslaggevend voor productresultaten.
+46 -31
View File
@@ -2,11 +2,12 @@
"schema_version": 1,
"program": "GeoIntel Accuracy Improvement Program",
"phase": "P4",
"generated_at": "2026-08-02T04:40:51+02:00",
"generated_at": "2026-08-30T05:58:29+02:00",
"scope": {
"product": "Belgium and the Belgian North Sea",
"active_building_model_claim": "Mol/Kempen only, operator review required",
"national_building_validation": false
"national_building_validation": false,
"result_authority_policy": "Task-appropriate official sources remain decisive for product results; AI output is a reviewable proposal unless a governed task-specific release gate proves otherwise."
},
"baseline": {
"branch": "codex/geointel-accuracy-program",
@@ -34,7 +35,8 @@
"promotion_allowed": false,
"scope_widening_allowed": false,
"training_allowed_now": false,
"training_unlock_gate": "P2-08 after P2-00 through P2-07 have passed",
"training_unlock_gate": "A corrected checksum-frozen corpus, independent splits, representative human acceptance and every applicable pre-registered training gate must pass before a new governed run.",
"activation_gate": "Activation requires the exact candidate key and model SHA-256 bound to a passing governed Phase-4/5 release-gate report and its benchmark-manifest SHA-256; a legacy diagnostic promotion report alone has no activation authority.",
"critical_risk_count": 8,
"high_risk_count": 17,
"medium_risk_count": 4
@@ -80,23 +82,24 @@
]
},
"phase3": {
"status": "done",
"meaning": "All 295 safe local files in the configured GeoIntel roots were scanned read-only; three known external boundaries were explicitly recorded as unreachable.",
"status": "local_complete_production_inventory_pending",
"meaning": "All 1013 safe local files in the configured GeoIntel roots were scanned read-only; three declared external production boundaries were recorded explicitly and still require a controlled server-side inventory.",
"scanner": "scripts/run_accuracy_phase3_full_data_scan.py",
"scanner_version": "3.0.3",
"scan_id": "p3-46ee3f8d3a2dc52b",
"scanner_version": "3.1.0",
"scan_id": "p3-eb67185e61107cc7",
"evidence_root": "artifacts/evidence/accuracy/P3",
"content_hash": "1a219362c6cb2ac00489625f1a9b36e2fd4809ab58ee55ab1f67c3cc34773f3e",
"content_hash": "f4ea193d2bdd96a5b391cf7d9d93685cc58e98742c40e4513bcbc434907e720a",
"reconciliation": {
"examined": 295,
"examined": 1013,
"skipped": 0,
"unreachable": 3,
"inventory_total": 298,
"inventory_total": 1016,
"reconciles": true
},
"anomaly_count": 172,
"quarantine_item_count": 163,
"anomaly_count": 711,
"quarantine_item_count": 682,
"does_not_mean": [
"the total production inventory is complete",
"all anomalies are repaired",
"AOI split independence is proven",
"GRB ground truth is locally available",
@@ -256,21 +259,31 @@
"promotion_evidence": false
},
"protected_test_isolation": false,
"human_label_acceptance": false
"human_label_acceptance": false,
"latest_independent_ai_visual_review": {
"review_id": "20260830-independent-ai-visual-review",
"evidence": "artifacts/evidence/accuracy/model-training/20260830-independent-ai-visual-review.json",
"human_reviewer": false,
"corpus_accepted": false,
"training_gate": "blocked",
"promotion_allowed": false,
"claim_boundary": "Independent AI visual inspection is triage evidence only; it is not representative human acceptance, protected-test evidence or an accuracy measurement."
}
},
"verification": {
"backend_full_suite": {
"status": "failed",
"passed": 1282,
"failed": 17,
"duration_seconds": 116.62,
"classification": "The canonical backend test import boundary now collects. Sixteen remaining failures are historical source-text assertions for changed UI/deployment/README behavior; one full Windows run also hit an intermittent WSL-backed bash.exe host failure in a shell-wrapper syntax test. This still prevents a whole-suite-green claim."
"status": "passed",
"passed": 1702,
"skipped": 1,
"failed": 0,
"duration_seconds": 279.63,
"classification": "The complete canonical backend suite passes with deprecations promoted to errors. The single skip is the Windows-host symlink fixture; the symlink refusal path remains covered by static and Linux-targeted release checks."
},
"backend_ci_entrypoint": {
"status": "collected_with_failures",
"collected": 1299,
"result": "1282 passed, 17 failed",
"note": "The former scripts.render_operator_polygon_label_qa collection failure is resolved by the canonical backend-test import boundary."
"status": "passed",
"collected": 1703,
"result": "1702 passed, 1 skipped",
"note": "The canonical backend test import boundary, deployment contracts, guest analysis flow and governed raster handoff all collect and pass."
},
"phase1_tooling_tests": {
"status": "passed",
@@ -280,14 +293,14 @@
"status": "passed"
},
"repository_ruff": {
"status": "failed",
"finding_count": 95,
"note": "P2-changed Python paths pass their scoped Ruff check; repository-wide remediation remains an explicit P2-01 gate."
"status": "passed",
"finding_count": 0,
"note": "Repository-wide Ruff validation passes across backend, scripts and tests without policy weakening."
},
"frontend_unit": {
"status": "passed",
"test_files": 16,
"tests": 51,
"test_files": 40,
"tests": 170,
"command": "npm run test:unit"
},
"frontend_typecheck": {
@@ -302,13 +315,13 @@
},
"openapi_contract": {
"status": "passed",
"implemented_routes": 147,
"explicit_non_envelope_endpoints": 10
"implemented_routes": 155,
"explicit_non_envelope_endpoints": 12
},
"alembic": {
"status": "passed_offline_and_disposable_postgis",
"heads": [
"202608010001"
"202608230001"
],
"offline_upgrade_rendered": true,
"offline_downgrade_rendered": true,
@@ -390,10 +403,12 @@
"docs/accuracy-program/09-full-data-scan.md",
"docs/accuracy-program/10-evaluation-protocol.md",
"docs/accuracy-program/11-baseline-benchmark.md",
"docs/accuracy-program/12-release-gates.md"
"docs/accuracy-program/12-release-gates.md",
"docs/accuracy-program/13-nested-mirror-retirement.md"
],
"evidence_root": "artifacts/evidence/accuracy/P1",
"evidence_manifest": "artifacts/evidence/accuracy/P1/evidence-manifest.json",
"latest_verification_evidence_manifest": "artifacts/evidence/accuracy/P1/evidence-manifest-20260830-verification.json",
"phase2_evidence_root": "artifacts/evidence/accuracy/P2",
"phase2_evidence_manifest": "artifacts/evidence/accuracy/P2/evidence-manifest.json",
"phase3_evidence_root": "artifacts/evidence/accuracy/P3",
@@ -1,6 +1,7 @@
from __future__ import annotations
import argparse
import hashlib
import json
import os
import re
@@ -13,6 +14,14 @@ SUPPORTED_MODEL_SUFFIXES = {".pt", ".onnx", ".engine"}
ENV_KEYS = ("GEOINTEL_INSTALL_AI", "YOLO_ENABLED", "YOLO_MODELS_DIR", "YOLO_MODEL_PATH")
def _sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as stream:
for chunk in iter(lambda: stream.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def _asset_id(path: Path) -> str:
raw = f"{path.stem}-{path.suffix.lower().lstrip('.')}"
normalized = re.sub(r"[^a-z0-9]+", "-", raw.lower()).strip("-")
@@ -116,6 +125,36 @@ def _gate_failures(report: dict[str, Any], candidate: dict[str, Any]) -> list[st
return failures
def _governed_release_failures(
release_gate: dict[str, Any],
*,
candidate_key: str,
model_sha256: str,
) -> list[str]:
"""Require the Phase-4/5 product decision that the legacy gate never had."""
failures: list[str] = []
if release_gate.get("status") != "pass":
failures.append("phase4_release_gate_not_passed")
if release_gate.get("product_benchmark_status") != "pass":
failures.append("product_benchmark_not_passed")
if release_gate.get("promotion_allowed") is not True:
failures.append("governed_promotion_not_allowed")
if release_gate.get("phase_decision") not in {"done", "ready", "complete"}:
failures.append("phase5_not_ready")
if release_gate.get("candidate_key") != candidate_key:
failures.append("governed_candidate_key_mismatch")
recorded_sha256 = str(release_gate.get("candidate_model_sha256") or "").lower()
if not re.fullmatch(r"[0-9a-f]{64}", recorded_sha256):
failures.append("governed_candidate_model_sha256_missing")
elif recorded_sha256 != model_sha256:
failures.append("governed_candidate_model_sha256_mismatch")
benchmark_sha256 = str(release_gate.get("benchmark_manifest_sha256") or "").lower()
if not re.fullmatch(r"[0-9a-f]{64}", benchmark_sha256):
failures.append("governed_benchmark_manifest_sha256_missing")
return failures
def _resolve_model_asset(models_dir: Path, model_asset_id: str) -> Path | None:
for path in _candidate_paths(models_dir):
if _asset_id(path) == model_asset_id:
@@ -126,6 +165,7 @@ def _resolve_model_asset(models_dir: Path, model_asset_id: str) -> Path | None:
def _base_payload(args: argparse.Namespace) -> dict[str, Any]:
return {
"promotion_report": str(Path(args.promotion_report).resolve()),
"phase4_release_gate_report": str(Path(args.phase4_release_gate_report).resolve()),
"candidate_key": args.candidate_key,
"models_dir": str(Path(args.models_dir).resolve()),
"env_file": str(Path(args.env_file).resolve()),
@@ -188,6 +228,33 @@ def activate(args: argparse.Namespace) -> tuple[int, dict[str, Any]]:
)
return 2, payload
model_sha256 = _sha256(selected_model)
try:
release_gate_path = Path(args.phase4_release_gate_report)
release_gate = _load_report(release_gate_path)
except (OSError, ValueError, json.JSONDecodeError) as exc:
payload.update({"status": "invalid_phase4_release_gate", "message": str(exc)})
return 2, payload
governance_failures = _governed_release_failures(
release_gate,
candidate_key=args.candidate_key,
model_sha256=model_sha256,
)
if governance_failures:
payload.update(
{
"status": "governed_release_not_approved",
"message": (
"Candidate passed the legacy diagnostic gates but lacks a matching "
"successful governed product benchmark and Phase-4/5 release decision."
),
"rejection_reasons": governance_failures,
"selected_host_model_path": str(selected_model),
"selected_model_sha256": model_sha256,
}
)
return 3, payload
selected_container_path = _container_path(selected_model, models_dir, args.container_model_dir)
updates = {
"GEOINTEL_INSTALL_AI": "true",
@@ -200,7 +267,9 @@ def activate(args: argparse.Namespace) -> tuple[int, dict[str, Any]]:
"status": "ready_to_apply",
"message": "Promoted YOLO candidate validated. Re-run with --apply to update the environment file.",
"selected_host_model_path": str(selected_model),
"selected_model_sha256": model_sha256,
"selected_container_model_path": selected_container_path,
"phase4_release_gate_sha256": _sha256(release_gate_path),
"env_updates": updates,
"docker_restart_required": True,
}
@@ -241,6 +310,14 @@ def parse_args(argv: list[str]) -> argparse.Namespace:
description="Activate an existing local YOLO model only after a promotion report recommends the exact candidate key."
)
parser.add_argument("--promotion-report", required=True, help="Path to detection_model_promotion_report.json.")
parser.add_argument(
"--phase4-release-gate-report",
required=True,
help=(
"Path to the governed Phase-4/5 release-gate report. It must bind the exact "
"candidate key and model SHA-256 and explicitly allow promotion."
),
)
parser.add_argument("--candidate-key", required=True, help="Exact promoted candidate key from the report.")
parser.add_argument(
"--models-dir",
+2 -2
View File
@@ -17,8 +17,8 @@ BACKEND_ROOT = ROOT / "backend" if (ROOT / "backend" / "app").is_dir() else ROOT
if str(BACKEND_ROOT) not in sys.path:
sys.path.insert(0, str(BACKEND_ROOT))
from app.db.session import SessionLocal
from app.models import Project
from app.db.session import SessionLocal # noqa: E402 - imported after backend path bootstrap
from app.models import Project # noqa: E402 - imported after backend path bootstrap
CANONICAL_PROJECT_NAMES = frozenset(
@@ -324,7 +324,14 @@ def build_decisions(args: argparse.Namespace) -> dict[str, Any]:
)
return {
"schema_version": 2,
"generated_at": datetime.now(timezone.utc).isoformat(),
"promotion_authority": "legacy_diagnostic_only",
"runtime_activation_allowed": False,
"activation_requirement": (
"A separate successful Phase-4/5 release-gate report must bind the exact "
"candidate key and model SHA-256 before activation."
),
"positive_portfolio_path": str(portfolio_path),
"hard_negative_summary_paths": [str(path) for path in background_paths],
"background_split_summary_paths": [str(path) for path in split_summary_paths],
@@ -350,6 +357,9 @@ def write_markdown(report: dict[str, Any], path: Path) -> None:
f"- Hard-negative summaries: {len(report['hard_negative_summary_paths'])}",
f"- Background split summaries: {len(report['background_split_summary_paths'])}",
f"- Candidates: {report['candidate_count']}",
f"- Authority: `{report['promotion_authority']}`",
"- Runtime activation: **not authorized by this report**",
f"- Activation requirement: {report['activation_requirement']}",
"",
"## Gates",
"",
@@ -23,7 +23,7 @@ from typing import Any
import requests
from requests.adapters import HTTPAdapter
from shapely.geometry import Point, mapping, shape
from shapely.geometry import shape
from urllib3.util.retry import Retry
+52 -13
View File
@@ -21,7 +21,7 @@ from datetime import datetime, timezone
from pathlib import Path
from typing import Any, Iterable
SCANNER_VERSION = "3.0.3"
SCANNER_VERSION = "3.1.0"
SCHEMA_VERSION = 1
DEFAULT_ROOTS = ("models", "datasets", "data", "storage", "artifacts", "output")
EXCLUDED_DIRS = {".git", "node_modules", ".next", "__pycache__", ".pytest_cache"}
@@ -101,13 +101,16 @@ def discover_files(repo_root: Path, roots: Iterable[str], evidence_dir: Path) ->
return sorted(set(files), key=lambda item: relative_path(item, repo_root))
def known_unreachable_items() -> list[dict[str, Any]]:
"""Boundaries identified by the Phase 1 inventory but not mounted locally."""
entries = (
("external://tower-corpora", "Tower corpora are not mounted in this project environment"),
("external://mounted-model-volumes", "Mounted model volumes are not available from this project environment"),
("external://production-postgis-or-api", "No production PostGIS/API endpoint is configured in the scan environment"),
)
def unreachable_items(entries: Iterable[tuple[str, str]]) -> list[dict[str, Any]]:
"""Create explicit scope records without inventing environment availability.
Older scanner versions always emitted three hard-coded unreachable items,
even when executed inside the production container where the corresponding
model and training mounts were available. Callers must now declare only
boundaries they have actually established as unavailable; requested roots
that do not exist are added automatically by :func:`missing_root_entries`.
"""
result = []
for path, reason in entries:
result.append(
@@ -140,6 +143,29 @@ def known_unreachable_items() -> list[dict[str, Any]]:
return result
def parse_unreachable_scope(value: str) -> tuple[str, str]:
path, separator, reason = value.partition("=")
if not separator or not path.strip() or not reason.strip():
raise argparse.ArgumentTypeError(
"--unreachable-scope must use PATH=CONCRETE_REASON"
)
return path.strip(), reason.strip()
def missing_root_entries(repo_root: Path, roots: Iterable[str]) -> list[tuple[str, str]]:
entries: list[tuple[str, str]] = []
for root in roots:
base = (repo_root / root).resolve(strict=False)
if not base.exists():
entries.append(
(
f"root://{root}",
f"Configured scan root is unavailable: {base}",
)
)
return entries
def infer_source(rel: str, payload: Any = None) -> str:
text = rel.lower()
if isinstance(payload, dict):
@@ -507,6 +533,17 @@ def parse_args() -> argparse.Namespace:
parser.add_argument("--batch-size", type=int, default=50)
parser.add_argument("--resume", action="store_true")
parser.add_argument("--roots", nargs="+", default=list(DEFAULT_ROOTS))
parser.add_argument(
"--unreachable-scope",
action="append",
default=[],
type=parse_unreachable_scope,
metavar="PATH=CONCRETE_REASON",
help=(
"Explicit non-filesystem or externally mounted boundary that was "
"verified as unavailable. May be repeated."
),
)
return parser.parse_args()
@@ -518,16 +555,18 @@ def main() -> int:
raise SystemExit("--batch-size must be positive")
paths = discover_files(repo_root, args.roots, output_dir)
inventory_entries = [{"path": relative_path(path, repo_root), "size_bytes": path.stat().st_size, "modified_ns": path.stat().st_mtime_ns} for path in paths]
unreachable_items = known_unreachable_items()
unavailable = unreachable_items(
[*missing_root_entries(repo_root, args.roots), *args.unreachable_scope]
)
inventory = {
"roots": list(args.roots),
"excluded_directories": sorted(EXCLUDED_DIRS),
"excluded_output_dir": relative_path(output_dir, repo_root),
"items": inventory_entries,
"unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unreachable_items],
"unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unavailable],
"accessible_item_count": len(inventory_entries),
"item_count": len(inventory_entries) + len(unreachable_items),
"inventory_hash": canonical_hash({"items": inventory_entries, "unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unreachable_items]}),
"item_count": len(inventory_entries) + len(unavailable),
"inventory_hash": canonical_hash({"items": inventory_entries, "unreachable_items": [{"path": item["path"], "reason": item["anomalies"][0]["message"]} for item in unavailable]}),
}
checkpoint_path = output_dir / "scan-checkpoint.json"
checkpoint: dict[str, Any] | None = None
@@ -550,7 +589,7 @@ def main() -> int:
records[rel] = make_item(path, repo_root)
atomic_json(checkpoint_path, {"schema_version": 1, "scanner_version": SCANNER_VERSION, "started_at": started_at, "inventory": inventory, "cursor": min(offset + args.batch_size, len(paths)), "records": sorted(records.values(), key=lambda item: item["path"])})
items = [records[relative_path(path, repo_root)] for path in paths if relative_path(path, repo_root) in records]
items.extend(unreachable_items)
items.extend(unavailable)
scan_id = "p3-" + inventory["inventory_hash"][:16]
report = report_payload(items, inventory, scan_id, started_at=started_at, completed_at=utc_now(), repo_root=repo_root)
output_dir.mkdir(parents=True, exist_ok=True)
+61 -8
View File
@@ -277,6 +277,54 @@ def failure_sampling_command(
return command
def protected_assessment_command(
*,
scripts_dir: Path,
calibration: Path,
test: Path,
background: Path,
output: Path,
selected_threshold: float,
min_aggregate_f1: float,
min_region_f1: float,
min_region_precision: float,
min_region_recall: float,
max_pure_empty_fp: int,
) -> list[str]:
"""Build the one-shot protected assessment command from frozen calibration gates.
The protected assessor must not silently reselect an operating point or
fall back to its own default gates. Keeping command construction in one
helper also makes the release boundary directly testable without opening
any protected inputs.
"""
return [
sys.executable,
str(scripts_dir / "assess_belgium_building_training_iteration.py"),
"--calibration",
str(calibration),
"--test",
str(test),
"--background",
str(background),
"--output",
str(output),
"--selected-threshold",
str(selected_threshold),
"--min-aggregate-f1",
str(min_aggregate_f1),
"--min-region-f1",
str(min_region_f1),
"--min-region-precision",
str(min_region_precision),
"--min-region-recall",
str(min_region_recall),
"--max-pure-empty-fp",
str(max_pure_empty_fp),
]
def resumable_training_command(yolo: str, checkpoint: Path) -> list[str]:
return [yolo, "train", f"resume={checkpoint}", "device=0"]
@@ -572,14 +620,19 @@ def main() -> int:
iteration_dir / f"{role}.log",
)
run(
[
sys.executable,
str(scripts_dir / "assess_belgium_building_training_iteration.py"),
"--calibration", str(reports["calibration"]),
"--test", str(reports["test"]),
"--background", str(reports["background"]),
"--output", str(assessment),
],
protected_assessment_command(
scripts_dir=scripts_dir,
calibration=reports["calibration"],
test=reports["test"],
background=reports["background"],
output=assessment,
selected_threshold=float(chosen["threshold"]),
min_aggregate_f1=args.min_aggregate_f1,
min_region_f1=args.min_region_f1,
min_region_precision=args.min_region_precision,
min_region_recall=args.min_region_recall,
max_pure_empty_fp=args.max_pure_empty_fp,
),
iteration_dir / "assessment.log",
allowed={0, 2},
)
+4 -2
View File
@@ -8,8 +8,10 @@ from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "backend"))
from app.db.session import SessionLocal
from app.services.demo_workflow_service import DemoWorkflowService
from app.db.session import SessionLocal # noqa: E402 - imported after backend path bootstrap
from app.services.demo_workflow_service import ( # noqa: E402 - imported after backend path bootstrap
DemoWorkflowService,
)
def main() -> int:
+13 -3
View File
@@ -1,6 +1,16 @@
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
required_docs = ["docs/M5_OPERATIONAL_READINESS.md","docs/BUILD_GOVERNANCE.md","docs/CI_CD_SPECIFICATION.md","docs/HEALTHCHECK_CONTRACTS.md","docs/TROUBLESHOOTING_RUNBOOK.md","docs/RELEASE_PROCESS.md","docs/ROLLBACK_AND_RECOVERY.md"]
missing=[p for p in required_docs if not (ROOT/p).exists()]
if missing: raise SystemExit("Missing docs:\n"+"\n".join(missing))
required_docs = [
"docs/M5_OPERATIONAL_READINESS.md",
"docs/BUILD_GOVERNANCE.md",
"docs/CI_CD_SPECIFICATION.md",
"docs/HEALTHCHECK_CONTRACTS.md",
"docs/TROUBLESHOOTING_RUNBOOK.md",
"docs/RELEASE_PROCESS.md",
"docs/ROLLBACK_AND_RECOVERY.md",
]
missing = [p for p in required_docs if not (ROOT / p).exists()]
if missing:
raise SystemExit("Missing docs:\n" + "\n".join(missing))
print("Documentation smoke OK")