<# .SYNOPSIS Phase 6.4 exit-gate compliance check — stub. Each `Assert-*` either passes (Write-Host green) or throws. Non-zero exit = fail. .DESCRIPTION Validates Phase 6.4 (Admin UI completion) completion. Checks enumerated in `docs/v2/implementation/phase-6-4-admin-ui-completion.md` §"Compliance Checks (run at exit gate)". Current status: SCAFFOLD. Every check writes a TODO line and does NOT throw. Each implementation task in Phase 6.4 is responsible for replacing its TODO with a real check before closing that task. .NOTES Usage: pwsh ./scripts/compliance/phase-6-4-compliance.ps1 Exit: 0 = all checks passed (or are still TODO); non-zero = explicit fail #> [CmdletBinding()] param() $ErrorActionPreference = 'Stop' $script:failures = 0 function Assert-Todo { param([string]$Check, [string]$ImplementationTask) Write-Host " [TODO] $Check (implement during $ImplementationTask)" -ForegroundColor Yellow } function Assert-Pass { param([string]$Check) Write-Host " [PASS] $Check" -ForegroundColor Green } function Assert-Fail { param([string]$Check, [string]$Reason) Write-Host " [FAIL] $Check — $Reason" -ForegroundColor Red $script:failures++ } Write-Host "" Write-Host "=== Phase 6.4 compliance — Admin UI completion ===" -ForegroundColor Cyan Write-Host "" Write-Host "Stream A — UNS drag/move + impact preview" Assert-Todo "UNS drag/move — drag line across areas; modal shows correct impacted-equipment + tag counts" "Stream A.2" Assert-Todo "Concurrent-edit safety — session B saves draft mid-preview; session A Confirm returns 409" "Stream A.3 (DraftRevisionToken)" Assert-Todo "Cross-cluster drop disabled — actionable toast points to Export/Import" "Stream A.2" Assert-Todo "1000-node tree — drag-enter feedback < 100 ms" "Stream A.4" Write-Host "" Write-Host "Stream B — CSV import + staged-import + 5-identifier search" Assert-Todo "CSV header version — file missing '# OtOpcUaCsv v1' rejected pre-parse" "Stream B.1" Assert-Todo "CSV canonical identifier set — columns match decision #117 exactly" "Stream B.1" Assert-Todo "Staged-import atomicity — 10k-row FinaliseImportBatch < 30 s; user-scoped visibility; DropImportBatch rollback" "Stream B.3" Assert-Todo "Concurrent import + external reservation — finalize retries with conflict handling; no corruption" "Stream B.3" Assert-Todo "5-identifier search ranking — exact > prefix; published > draft for equal scores" "Stream B.4" Write-Host "" Write-Host "Stream C — DiffViewer sections" Assert-Todo "Diff viewer section caps — 2000-row subtree-rename summary-only; 'Load full diff' paginates" "Stream C.2" Write-Host "" Write-Host "Stream D — Identification (OPC 40010)" Assert-Todo "OPC 40010 field list match — rendered fields match decision #139 exactly; no extras" "Stream D.1" Assert-Todo "OPC 40010 exposure — Identification sub-folder shows when non-null; absent when all null" "Stream D.3" Assert-Todo "ACL inheritance for Identification — Equipment-grant reads; no-grant denies both" "Stream D.4" Write-Host "" Write-Host "Visual compliance" Assert-Todo "Visual parity reviewer — FleetAdmin signoff vs admin-ui.md §Visual-Design; screenshot set checked in under docs/v2/visual-compliance/phase-6-4/" "Visual review" Write-Host "" Write-Host "Cross-cutting" Assert-Todo "Full solution dotnet test passes; no test-count regression vs pre-Phase-6.4 baseline" "Final exit-gate" Write-Host "" if ($script:failures -eq 0) { Write-Host "Phase 6.4 compliance: scaffold-mode PASS (all checks TODO)" -ForegroundColor Green exit 0 } Write-Host "Phase 6.4 compliance: $script:failures FAIL(s)" -ForegroundColor Red exit 1