docs(accuracy): refresh governed scan and training evidence
This commit is contained in:
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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},
|
||||
)
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user