Closes out Phase 6 with the two pieces a release engineer needs before
tagging v2 GA:
1. scripts/compliance/phase-6-all.ps1 — meta-runner that invokes every
per-phase Phase 6.N compliance script in sequence + aggregates results.
Each sub-script runs in its own powershell.exe child process so per-script
$ErrorActionPreference + exit semantics can't interfere with the parent.
Exit 0 = every phase passes; exit 1 = one or more phases failed. Prints a
PASS/FAIL summary matrix at the end.
2. docs/v2/v2-release-readiness.md — single-view dashboard of everything
shipped + everything still deferred + release exit criteria. Called out
explicitly:
- Three release BLOCKERS (must close before v2 GA):
* Phase 6.2 Stream C dispatch wiring — AuthorizationGate exists but no
DriverNodeManager Read/Write/etc. path calls it (task #143).
* Phase 6.1 Stream D follow-up — ResilientConfigReader + sealed-cache
hook not yet consumed by any read path (task #136).
* Phase 6.3 Streams A/C/F — coordinator + UA-node wiring + client
interop still deferred (tasks #145, #147, #150).
- Three nice-to-haves (not release-blocking) — Admin UI polish, background
services, multi-host dispatch.
- Release exit criteria: all 4 compliance scripts exit 0, dotnet test ≤ 1
known flake, blockers closed or v2.1-deferred with written decision,
Fleet Admin signoff on deployment checklist, live-Galaxy smoke test,
OPC UA CTT pass, redundancy cutover validated with at least one
production client.
- Change log at the bottom so future ships of deferred follow-ups just
append dates + close out dashboard rows.
Meta-runner verified locally:
Phase 6.1 — PASS
Phase 6.2 — PASS
Phase 6.3 — PASS
Phase 6.4 — PASS
Aggregate: PASS (elapsed 340 s — most of that is the full solution
`dotnet test` each phase runs).
Net counts at capstone time: 906 baseline → 1159 passing across Phase 6
(+253). 15 deferred follow-up tasks tracked with IDs (#134-137, #143-144,
#145, #147, #149-150, #153, #155-157). v2 is NOT YET release-ready —
capstone makes that explicit rather than letting the "shipped" label on
each phase imply full readiness.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
78 lines
2.9 KiB
PowerShell
78 lines
2.9 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Meta-runner that invokes every per-phase Phase 6.x compliance script and
|
|
reports an aggregate verdict.
|
|
|
|
.DESCRIPTION
|
|
Runs phase-6-1-compliance.ps1, phase-6-2, phase-6-3, phase-6-4 in sequence.
|
|
Each sub-script returns its own exit code; this wrapper aggregates them.
|
|
Useful before a v2 release tag + as the `dotnet test` companion in CI.
|
|
|
|
.NOTES
|
|
Usage: pwsh ./scripts/compliance/phase-6-all.ps1
|
|
Exit: 0 = every phase passed; 1 = one or more phases failed
|
|
#>
|
|
[CmdletBinding()]
|
|
param()
|
|
|
|
$ErrorActionPreference = 'Continue'
|
|
|
|
$phases = @(
|
|
@{ Name = 'Phase 6.1 - Resilience & Observability'; Script = 'phase-6-1-compliance.ps1' },
|
|
@{ Name = 'Phase 6.2 - Authorization runtime'; Script = 'phase-6-2-compliance.ps1' },
|
|
@{ Name = 'Phase 6.3 - Redundancy runtime'; Script = 'phase-6-3-compliance.ps1' },
|
|
@{ Name = 'Phase 6.4 - Admin UI completion'; Script = 'phase-6-4-compliance.ps1' }
|
|
)
|
|
|
|
$results = @()
|
|
$startedAt = Get-Date
|
|
|
|
foreach ($phase in $phases) {
|
|
Write-Host ""
|
|
Write-Host ""
|
|
Write-Host "=============================================================" -ForegroundColor DarkGray
|
|
Write-Host ("Running {0}" -f $phase.Name) -ForegroundColor Cyan
|
|
Write-Host "=============================================================" -ForegroundColor DarkGray
|
|
|
|
$scriptPath = Join-Path $PSScriptRoot $phase.Script
|
|
if (-not (Test-Path $scriptPath)) {
|
|
Write-Host (" [MISSING] {0}" -f $phase.Script) -ForegroundColor Red
|
|
$results += @{ Name = $phase.Name; Exit = 2 }
|
|
continue
|
|
}
|
|
|
|
# Invoke each sub-script in its own powershell.exe process so its local
|
|
# $ErrorActionPreference + exit-code semantics can't interfere with the meta-runner's
|
|
# state. Slower (one process spawn per phase) but makes aggregate PASS/FAIL match
|
|
# standalone runs exactly.
|
|
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $scriptPath
|
|
$exitCode = $LASTEXITCODE
|
|
$results += @{ Name = $phase.Name; Exit = $exitCode }
|
|
}
|
|
|
|
$elapsed = (Get-Date) - $startedAt
|
|
|
|
Write-Host ""
|
|
Write-Host ""
|
|
Write-Host "=============================================================" -ForegroundColor DarkGray
|
|
Write-Host "Phase 6 compliance aggregate" -ForegroundColor Cyan
|
|
Write-Host "=============================================================" -ForegroundColor DarkGray
|
|
|
|
$totalFailures = 0
|
|
foreach ($r in $results) {
|
|
$colour = if ($r.Exit -eq 0) { 'Green' } else { 'Red' }
|
|
$tag = if ($r.Exit -eq 0) { 'PASS' } else { "FAIL (exit=$($r.Exit))" }
|
|
Write-Host (" [{0}] {1}" -f $tag, $r.Name) -ForegroundColor $colour
|
|
if ($r.Exit -ne 0) { $totalFailures++ }
|
|
}
|
|
|
|
Write-Host ""
|
|
Write-Host ("Elapsed: {0:N1} s" -f $elapsed.TotalSeconds) -ForegroundColor DarkGray
|
|
|
|
if ($totalFailures -eq 0) {
|
|
Write-Host "Phase 6 aggregate: PASS" -ForegroundColor Green
|
|
exit 0
|
|
}
|
|
Write-Host ("Phase 6 aggregate: {0} phase(s) FAILED" -f $totalFailures) -ForegroundColor Red
|
|
exit 1
|