After shipping the four Phase 6 plan drafts (PRs 77-80), the adversarial-review
adjustments lived only as trailing "Review" sections. An implementer reading
Stream A would find the original unadjusted guidance, then have to cross-reference
the review to reconcile. This PR makes the plans genuinely executable:
1. Merges every ACCEPTed review finding into the actual Scope / Stream / Compliance
sections of each phase plan:
- phase-6-1: Scope table rewrite (per-capability retry, (instance,host) pipeline key,
MemoryTracking vs MemoryRecycle split, hybrid watchdog formula, demand-aware
wedge detector, generation-sealed LiteDB). Streams A/B/D + Compliance rewritten.
- phase-6-2: AuthorizationDecision tri-state, control/data-plane separation,
MembershipFreshnessInterval (15 min), AuthCacheMaxStaleness (5 min),
subscription stamp-and-reevaluate. Stream C widened to 11 OPC UA operations.
- phase-6-3: 8-state ServiceLevel matrix (OPC UA Part 5 §6.3.34-compliant),
two-layer peer probe (/healthz + UaHealthProbe), apply-lease via await using,
publish-generation fencing, InvalidTopology runtime state, ServerUriArray
self-first + peers. New Stream F (interop matrix + Galaxy failover).
- phase-6-4: DraftRevisionToken concurrency control, staged-import via
EquipmentImportBatch with user-scoped visibility, CSV header version marker,
decision-#117-aligned identifier columns, 1000-row diff cap,
decision-#139 OPC 40010 fields, Identification inherits Equipment ACL.
2. Appends decisions #143 through #162 to docs/v2/plan.md capturing the
architectural commitments the adjustments created. Each decision carries its
dated rationale so future readers know why the choice was made.
3. Scaffolds scripts/compliance/phase-6-{1,2,3,4}-compliance.ps1 — PowerShell
stubs with Assert-Todo / Assert-Pass / Assert-Fail helpers. Every check
maps to a Stream task ID from the corresponding phase plan. Currently all
checks are TODO and scripts exit 0; each implementation task is responsible
for replacing its TODO with a real check before closing that task. Saved
as UTF-8 with BOM so Windows PowerShell 5.1 parses em-dash characters
without breaking.
Net result: the Phase 6.1 plan is genuinely ready to execute. Stream A.3 can
start tomorrow without reconciling Streams vs. Review on every task; the
compliance script is wired to the Stream IDs; plan.md has the architectural
commitments that justify the Stream choices.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
86 lines
3.5 KiB
PowerShell
86 lines
3.5 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Phase 6.3 exit-gate compliance check — stub. Each `Assert-*` either passes
|
|
(Write-Host green) or throws. Non-zero exit = fail.
|
|
|
|
.DESCRIPTION
|
|
Validates Phase 6.3 (Redundancy runtime) completion. Checks enumerated in
|
|
`docs/v2/implementation/phase-6-3-redundancy-runtime.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.3 is responsible for replacing its TODO
|
|
with a real check before closing that task.
|
|
|
|
.NOTES
|
|
Usage: pwsh ./scripts/compliance/phase-6-3-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.3 compliance — Redundancy runtime ===" -ForegroundColor Cyan
|
|
Write-Host ""
|
|
|
|
Write-Host "Stream A — Topology loader"
|
|
Assert-Todo "Transparent-mode rejection — sp_PublishGeneration blocks RedundancyMode=Transparent" "Stream A.3"
|
|
|
|
Write-Host ""
|
|
Write-Host "Stream B — Peer probe + ServiceLevel calculator"
|
|
Assert-Todo "OPC UA band compliance — 0=Maintenance / 1=NoData reserved; operational 2..255" "Stream B.2"
|
|
Assert-Todo "Authoritative-Primary ServiceLevel = 255" "Stream B.2"
|
|
Assert-Todo "Isolated-Primary (peer unreachable, self serving) = 230" "Stream B.2"
|
|
Assert-Todo "Primary-Mid-Apply = 200" "Stream B.2"
|
|
Assert-Todo "Recovering-Primary = 180 with dwell + publish witness enforced" "Stream B.2"
|
|
Assert-Todo "Authoritative-Backup = 100" "Stream B.2"
|
|
Assert-Todo "Isolated-Backup (primary unreachable) = 80 — no auto-promote" "Stream B.2"
|
|
Assert-Todo "InvalidTopology = 2 — >1 Primary self-demotes both nodes" "Stream B.2"
|
|
Assert-Todo "UaHealthProbe authority — HTTP-200 + UA-down peer treated as UA-unhealthy" "Stream B.1"
|
|
|
|
Write-Host ""
|
|
Write-Host "Stream C — OPC UA node wiring"
|
|
Assert-Todo "ServerUriArray — returns self + peer URIs, self first" "Stream C.2"
|
|
Assert-Todo "Client.CLI cutover — primary halt triggers reconnect to backup via ServerUriArray" "Stream C.4"
|
|
|
|
Write-Host ""
|
|
Write-Host "Stream D — Apply-lease + publish fencing"
|
|
Assert-Todo "Apply-lease disposal — leases close on exception, cancellation, watchdog timeout" "Stream D.2"
|
|
Assert-Todo "Role transition via operator publish — no restart; both nodes flip ServiceLevel on publish confirm" "Stream D.3"
|
|
|
|
Write-Host ""
|
|
Write-Host "Stream F — Interop matrix"
|
|
Assert-Todo "Client interoperability matrix — Ignition 8.1/8.3 / Kepware / Aveva OI Gateway findings documented" "Stream F.1-F.2"
|
|
Assert-Todo "Galaxy MXAccess failover — primary kill; Galaxy consumer reconnects within session-timeout budget" "Stream F.3"
|
|
|
|
Write-Host ""
|
|
Write-Host "Cross-cutting"
|
|
Assert-Todo "No regression in driver test suites; /healthz reachable under redundancy load" "Final exit-gate"
|
|
|
|
Write-Host ""
|
|
if ($script:failures -eq 0) {
|
|
Write-Host "Phase 6.3 compliance: scaffold-mode PASS (all checks TODO)" -ForegroundColor Green
|
|
exit 0
|
|
}
|
|
Write-Host "Phase 6.3 compliance: $script:failures FAIL(s)" -ForegroundColor Red
|
|
exit 1
|