Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
409048c
ci(p0): stabilize workflow topology and freeze CI-sprawl baseline
masarray Oct 6, 2026
7ca3f3e
ci(p1): share immutable engine resolution and opt-in Windows test shadow
masarray Oct 7, 2026
95518c5
ci(p2a): reuse canonical exact-SHA regression in merge guard
masarray Oct 7, 2026
a70a268
ci(p2b): reuse canonical ARSAS tests while retaining R10 engine regre…
masarray Oct 7, 2026
e6b29e8
ci(p2c): reuse canonical tests in production route guard
masarray Oct 7, 2026
25c5d8d
ci(p2d): stop canonical consumers at exact regression artifact readiness
masarray Oct 7, 2026
73c677c
ci(p2e): reuse exact-main canonical ARSAS regression post-merge
masarray Oct 7, 2026
e4133cf
ci(p2f): reuse canonical regression while preserving Field Capture pa…
masarray Oct 7, 2026
c5946a2
ci(p3a): establish reproducible Windows portable build identity
masarray Oct 7, 2026
fd25836
ci(p3): seal canonical Windows package and reuse exact tested bits
masarray Oct 7, 2026
cd8d356
fix(ci-p3): retry transient sealed-artifact download readiness
masarray Oct 7, 2026
9fd31e9
ci(p3b): promote sealed canonical portable into Field Capture
masarray Oct 7, 2026
18a9ab1
ci(p3c): promote exact sealed package through production release
masarray Oct 7, 2026
0814793
ci(p3d): promote exact validated installer into production release
masarray Oct 7, 2026
f7e063e
ci(p3f): defer Windows installer until canonical package is ready
masarray Oct 8, 2026
75e3218
ci(p3g): defer Windows release until immutable dependencies are ready
masarray Oct 8, 2026
979b1ca
ci(p3h): cancel superseded Windows PR runs
masarray Oct 8, 2026
11ffc6a
ci(p3i): preserve exact main and manual verification runs
masarray Oct 8, 2026
17a18d2
ci(p3i): promote canonical domain-test proof into SV and IO lanes
masarray Oct 8, 2026
93a629f
ci(p3i): preserve exact main and manual verification evidence
masarray Oct 8, 2026
c81f790
ci(p3j-a): capture exact native CTest evidence in sealed Windows package
masarray Oct 8, 2026
42c666c
ci(p3j-a): seal canonical native CTest evidence without retiring COMT…
masarray Oct 8, 2026
827bc9a
ci(p3j-b): verify canonical native CTest proof fail-closed in package…
masarray Oct 8, 2026
2ff7848
test(ci-p3j-b): exercise malformed native archive proof and locked co…
masarray Oct 8, 2026
0ce6052
ci(p3j-b): require verified native CTest proof in canonical consumers
masarray Oct 8, 2026
4f1d94d
ci(p3j-c): observe exact-source independent native CTest/bridge parit…
masarray Oct 8, 2026
d852f28
fix(ci-p3j-c): keep explicit shadow ZIP safety failures intact
masarray Oct 8, 2026
4fbe914
fix(ci-p3j-c): resolve exact engine lock SHA for independent native c…
masarray Oct 8, 2026
903ed4c
test(ci-p3j-c): lock exact cross-lane engine identity in independent …
masarray Oct 8, 2026
8e978a9
fix(ci-p3j-c): restore single valid COMTRADE workflow with exact engi…
masarray Oct 8, 2026
ced4179
test(ci-p3j-c): reject duplicated COMTRADE workflow blocks
masarray Oct 8, 2026
b2797f4
ci(p3j-c): capture independent COMTRADE native CTest and byte parity
masarray Oct 8, 2026
6247906
ci(p3j-d): move native parity waiting off required Windows COMTRADE r…
masarray Oct 8, 2026
5ae5cd9
test(ci-p3j-d): track renamed Ubuntu shadow observer instead of remov…
masarray Oct 8, 2026
86b6e91
ci(p3j-d): offload native shadow observation from mandatory COMTRADE …
masarray Oct 8, 2026
502d97f
ci(p3j-e): only accept completed canonical success for final native s…
masarray Oct 8, 2026
7d8d802
ci(p3j-e): require completed canonical success before final native pa…
masarray Oct 8, 2026
09aff65
fix(goose-ui): align compact event header, fixed count badge and scop…
masarray Oct 10, 2026
9add501
feat(identity): verify SCL-backed IED/LD before Discovery display and…
masarray Oct 11, 2026
439e067
test(p10): preserve old physical baseline and qualify exact code-tria…
masarray Oct 11, 2026
424a108
ci(p10): recognize exact code-only identity pin without weakening ref…
masarray Oct 11, 2026
357170a
merge(ci): reconcile mainline CI/package lineage with verified P10 st…
masarray Oct 11, 2026
6179df3
fix(ci): keep P10 engine TRX separate from exact canonical ARSAS proof
masarray Oct 11, 2026
6d19727
fix(ci): admit only exact P10 engine trial in shared resolver, prove …
masarray Oct 11, 2026
2369c28
fix(ci): honor 35-artifact budget and retain isolated P10 engine test…
masarray Oct 11, 2026
9b19abc
feat(p10.4): offline SHA-pinned GE Edition 1 discovery SCL structural…
masarray Oct 11, 2026
92460e9
test(p10.4): verify GE SCL gate fail-closed and never promotes synthe…
masarray Oct 11, 2026
620b04a
docs(p10.4): GE Edition1 field acceptance and SHA-pinned offline SCL …
masarray Oct 11, 2026
cf2fb06
ci(p10.4): run 16 bounded offline GE field SCL acceptance gate regres…
masarray Oct 11, 2026
2db58bf
docs(p10.4): insist on independently pinned IID intake hash, not self…
masarray Oct 11, 2026
4c469e6
fix(p10.4): reject cross-IED FCDA rather than assuming local MMS refe…
masarray Oct 11, 2026
280f294
test(p10.4): prove cross-IED FCDA rejection in local-wire identity ve…
masarray Oct 11, 2026
34f6f16
fix(p10.5): compute static semantic coverage as unique IEC reference+…
masarray Oct 11, 2026
c45cc7c
test(p10.5): exercise overlapping GE BRCB/URCB references and fail-cl…
masarray Oct 11, 2026
60d09f7
fix(p10.5 ux): qualify duplicate signal captions by exact LN instance…
masarray Oct 11, 2026
8ff2ba7
perf(p10.5): avoid transient LINQ/string allocation in virtualized si…
masarray Oct 11, 2026
af4cd10
fix(p10.5 ux): show exact logical-node instance in Live Signal Values…
masarray Oct 11, 2026
87788ab
test(p10.5 ux): preserve canonical reference and uniquely show CSWI1–…
masarray Oct 11, 2026
6f71789
fix(p10.5): reconstruct valid literal LN-label formatter from exact P…
masarray Oct 11, 2026
2ecf3dd
feat(p10.6): persist exact successfully connected SCL source path and…
masarray Oct 11, 2026
1a77e88
feat(p10.6): revalidate prior SHA-pinned operator IID and unique AP/d…
masarray Oct 11, 2026
1222b8a
feat(p10.6): retain only fresh association-scoped high-confidence ide…
masarray Oct 11, 2026
4474e49
fix(p10.6): promote IP Discovery IEDName only from SHA-rechecked prio…
masarray Oct 11, 2026
e6ba4ed
feat(p10.6): remember the actual SHA-verified operator IID source aft…
masarray Oct 11, 2026
d9ae5e4
fix(p10.6): recognize fresh high-confidence SCL identity proof in Dis…
masarray Oct 11, 2026
cb19ce4
test(p10.6): verify remembered GE IID identity and fail closed for un…
masarray Oct 11, 2026
a883510
test(p10.6): prove trusted IP Discovery semantic fingerprint equals e…
masarray Oct 11, 2026
aa3aaf9
feat(p10.7): classify per-RCB SqNum findings by EntryID, GI and BufOv…
masarray Oct 11, 2026
355de3d
feat(p10.7): include bounded BRCB SqNum–EntryID/GI/BufOvfl correlatio…
masarray Oct 11, 2026
52ca1e7
test(p10.7): preserve BufOvfl warnings and classify overlapping BRCB …
masarray Oct 11, 2026
96c0b9b
fix(p10.7): require raw OptFlds provenance on both BRCB EntryIDs befo…
masarray Oct 11, 2026
36a68ad
test(p10.7): classify opaque BRCB cursors only with two consecutive r…
masarray Oct 11, 2026
415d1db
fix(p10.7): label shared RCB diagnostics correctly for both BRCB and …
masarray Oct 11, 2026
d8b51ee
feat(p10.8): bounded post-finding per-RCB receive-order evidence with…
masarray Oct 11, 2026
c27da84
feat(p10.8): report real post-anomaly frame count and first/last rece…
masarray Oct 11, 2026
a7f4edb
test(p10.8): verify per-RCB post-finding observed traffic, timestamp …
masarray Oct 11, 2026
dfa65b8
feat(p10.8b): bounded first-32/last-8 BRCB metadata chronology with i…
masarray Oct 11, 2026
789bff2
fix(p10.8b): compare EntryID provenance against previous frame before…
masarray Oct 11, 2026
f05a992
feat(p10.8b): surface bounded, raw-payload-free BRCB chronology in di…
masarray Oct 11, 2026
f04a189
perf(p10.8b): use allocation-free readonly struct for bounded per-rep…
masarray Oct 11, 2026
f458494
test(p10.8b): first/head and tail chronology rollover, wire-proven cu…
masarray Oct 11, 2026
3c58a47
test(p10.8b): correct 50-frame head-plus-tail omitted count to 10
masarray Oct 11, 2026
6efd0fc
feat(p10.8c): preserve bounded last-eight anomalous BRCB metadata acr…
masarray Oct 11, 2026
f5ffc43
feat(p10.8c): expose last anomalous RCB frames even when omitted from…
masarray Oct 11, 2026
b013dfc
test(p10.8c): retain anomalies omitted by bounded first/last chronolo…
masarray Oct 11, 2026
a10eae2
test(p10.8c): use explicit immutable decoder metadata fixture without…
masarray Oct 11, 2026
ed6d7cf
feat(p10.8d): fail-closed offline comparator for exact BRCB slots and…
masarray Oct 11, 2026
ed5ae6a
test(p10.8d): nine fixture gates reject false cross-slot, model, engi…
masarray Oct 11, 2026
ce73df3
ci(p10.8d): exercise offline same-BRCB-slot comparison negative fixtu…
masarray Oct 11, 2026
b129e7d
test(p10.8e): guard and expose same-slot BRCB BufOvfl evidence
masarray Oct 11, 2026
a27d108
feat(p10.9a): independent cross-slot BRCB evidence triage without rel…
masarray Oct 11, 2026
38dc422
feat(p10.9b): qualify complete BRCB decoder receive chronology and po…
masarray Oct 11, 2026
6bc21ff
test(p10.9b): reuse non-test chronology fixture and trim correctly
masarray Oct 11, 2026
83e3ac4
fix(discovery-ux): remember last submitted IED IP and port without ch…
masarray Oct 11, 2026
3e84d69
chore(p10.9e): pin validated ARIEC core RptID/DataSet routing consist…
masarray Oct 11, 2026
e62b42b
ci(p10.9f): qualify exact ARIEC core routing SHA as non-physical stag…
masarray Oct 11, 2026
80d1a89
ci(p10.9g): integrate loss-detecting ARIEC report subscriber via exac…
masarray Oct 11, 2026
9a52679
fix(diagnostics): distinguish same-NIC IPv4 aliases and contextualize…
masarray Oct 12, 2026
1439936
fix(diagnostics): avoid unreachable wording when gateway route is unv…
masarray Oct 12, 2026
60783e7
feat(p10.9i): qualify bounded canonical report ingress engine under C…
masarray Oct 12, 2026
0d00fe3
test(provenance): retain P10.9G lineage and assert P10.9I current con…
masarray Oct 12, 2026
bf6fcea
fix(control): map BSC TapChg as direction-only Tcmd with verified pro…
masarray Oct 12, 2026
858289e
feat(p10.9j): pin ZIV SCL/BSC engine under exact code-only lineage an…
masarray Oct 12, 2026
6d4c953
P10.9K-A: fail-closed CDC semantics, safe control UI and feedback
masarray Oct 12, 2026
72bc841
P10.9K: pin verified engine #168 with exact additive fail-closed ance…
masarray Oct 12, 2026
069890d
P10.9K: preserve F650 qualified identities and exact historical engin…
masarray Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/actions/resolve-ariec-engine/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Resolve immutable ARIEC61850 engine lock
description: Validate the tracked ARIEC61850 exact SHA and expose it without rewriting historical field authority.
inputs:
lock-path:
description: Path to tracked engine lock, relative to the runner workspace
required: false
default: ARSAS/engines/ARIEC61850.lock.json
outputs:
repository:
description: Trusted pinned engine repository
value: ${{ steps.resolve.outputs.repository }}
ref:
description: Canonical repository ref metadata
value: ${{ steps.resolve.outputs.ref }}
commit:
description: Exact immutable integration engine SHA
value: ${{ steps.resolve.outputs.commit }}
physical-tested-commit:
description: Historical physical engine head; never substituted for integration SHA
value: ${{ steps.resolve.outputs.physical_tested_commit }}
merged-main-commit:
description: Historical merged-main engine head
value: ${{ steps.resolve.outputs.merged_main_commit }}
baseline-is-current:
description: Whether integration SHA equals historical merged-main baseline
value: ${{ steps.resolve.outputs.baseline_is_current }}

runs:
using: composite
steps:
- id: resolve
name: Validate pinned engine lock without remote lookups
shell: pwsh
env:
CI_LOCK_PATH: ${{ inputs.lock-path }}
run: |
$ErrorActionPreference = 'Stop'
$resolver = Join-Path $env:GITHUB_ACTION_PATH '..\..\..\scripts\resolve-ariec-lock.ps1'
$lockPath = Join-Path $env:GITHUB_WORKSPACE $env:CI_LOCK_PATH
& $resolver -LockPath $lockPath -GitHubOutput $env:GITHUB_OUTPUT | Out-Null
148 changes: 148 additions & 0 deletions .github/workflows/_ci-p1-windows-build-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
name: Reusable ARSAS Windows Build and Test

on:
workflow_call:
inputs:
source_sha:
description: Exact ARSAS source SHA (PR merge tree or main commit)
type: string
required: true
shadow_mode:
description: Prevent this primitive from being mistaken for release/promotion authority
type: boolean
default: true

permissions:
contents: read

jobs:
windows-build-and-test:
name: Shared exact-SHA Windows compilation and regression
runs-on: windows-latest
timeout-minutes: 45
steps:
- name: Checkout exact ARSAS source
uses: actions/checkout@v7
with:
path: ARSAS
ref: ${{ inputs.source_sha }}
persist-credentials: false
fetch-depth: 1

- name: Assert source identity and shadow-only execution
shell: pwsh
env:
EXPECTED_SOURCE_SHA: ${{ inputs.source_sha }}
SHADOW_ONLY: ${{ inputs.shadow_mode }}
run: |
$ErrorActionPreference = 'Stop'
if ($env:SHADOW_ONLY -ne 'true') {
throw 'CI-P1 reusable job is not approved as production/release authority.'
}
if ($env:EXPECTED_SOURCE_SHA -cnotmatch '^[0-9a-f]{40}$') {
throw 'CI-P1 source_sha must be an immutable 40-character Git SHA.'
}
$actual = (git -C .\ARSAS rev-parse HEAD).Trim().ToLowerInvariant()
if ($actual -cne $env:EXPECTED_SOURCE_SHA) {
throw "ARSAS source SHA mismatch: expected $env:EXPECTED_SOURCE_SHA, got $actual."
}

- name: Verify immutable engine resolver synthetic fixtures
shell: pwsh
run: .\ARSAS\scripts\test-resolve-ariec-lock.ps1

- id: engine
name: Resolve exact pinned ARIEC61850 engine identity
uses: ./ARSAS/.github/actions/resolve-ariec-engine
with:
lock-path: ARSAS/engines/ARIEC61850.lock.json

- name: Checkout exact engine SHA
uses: actions/checkout@v7
with:
repository: ${{ steps.engine.outputs.repository }}
ref: ${{ steps.engine.outputs.commit }}
path: ARIEC61850
fetch-depth: 1
persist-credentials: false

- name: Verify exact engine and immutable history provenance
shell: pwsh
env:
EXPECTED_ENGINE_SHA: ${{ steps.engine.outputs.commit }}
run: |
$ErrorActionPreference = 'Stop'
$actual = (git -C .\ARIEC61850 rev-parse HEAD).Trim().ToLowerInvariant()
if ($actual -cne $env:EXPECTED_ENGINE_SHA) {
throw "ARIEC61850 pinned checkout drifted: expected $env:EXPECTED_ENGINE_SHA, got $actual."
}
Write-Host "Reproducible compilation authority: ARSAS + pinned ARIEC61850."

- name: Setup .NET 8
uses: actions/setup-dotnet@v6
with:
dotnet-version: 8.0.x

- name: Cache immutable NuGet packages only
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ci-p1-nuget-win-x64-${{ hashFiles('ARSAS/**/*.csproj', 'ARIEC61850/**/*.csproj', 'ARSAS/Directory.Packages.props', 'ARIEC61850/Directory.Packages.props') }}
restore-keys: |
ci-p1-nuget-win-x64-

- name: Restore solution once
run: dotnet restore .\ARSAS\ArIED61850Tester.sln

- name: Build solution once
run: dotnet build .\ARSAS\ArIED61850Tester.sln -c Release --no-restore

- name: Run full ARSAS regression suite once
run: dotnet test .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj -c Release --no-build --no-restore --logger "trx;LogFileName=ci-p1-shadow.trx" --results-directory .\ARSAS\TestResults

- name: Write non-promotion build authority manifest
if: always()
shell: pwsh
env:
ENGINE_SHA: ${{ steps.engine.outputs.commit }}
ENGINE_REPOSITORY: ${{ steps.engine.outputs.repository }}
HISTORICAL_ENGINE_SHA: ${{ steps.engine.outputs.merged-main-commit }}
PHYSICAL_TESTED_ENGINE_SHA: ${{ steps.engine.outputs.physical-tested-commit }}
run: |
$ErrorActionPreference = 'Stop'
$sourceSha = (git -C .\ARSAS rev-parse HEAD).Trim().ToLowerInvariant()
$engineActual = if (Test-Path -LiteralPath .\ARIEC61850\.git) {
(git -C .\ARIEC61850 rev-parse HEAD).Trim().ToLowerInvariant()
} else { '' }
$reportFiles = @(Get-ChildItem -Path .\ARSAS\TestResults -Filter '*.trx' -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Name)
$manifest = [ordered]@{
schemaVersion = 1
kind = 'ci-p1-nonpromotion-shadow'
exactArsasSha = $sourceSha
exactEngineSha = $engineActual
expectedEngineSha = $env:ENGINE_SHA
engineRepository = $env:ENGINE_REPOSITORY
historicalMergedEngineSha = $env:HISTORICAL_ENGINE_SHA
historicalPhysicalTestedSha = $env:PHYSICAL_TESTED_ENGINE_SHA
engineExactShaVerified = ($engineActual -ceq $env:ENGINE_SHA)
testReports = $reportFiles
workflowRunId = $env:GITHUB_RUN_ID
noReleaseOrPromotion = $true
}
$path = Join-Path $env:RUNNER_TEMP 'ci-p1-shadow-manifest.json'
$manifest | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $path -Encoding UTF8
if ($manifest.engineExactShaVerified -ne $true -or $reportFiles.Count -eq 0) {
throw 'CI-P1 shadow SHA/TRX proof is incomplete; fail closed.'
}

- name: Upload inspectable shadow TRX and SHA manifest
if: always()
uses: actions/upload-artifact@v7
with:
name: ci-p1-shadow-${{ github.run_id }}-${{ github.run_attempt }}
path: |
ARSAS/TestResults/*.trx
${{ runner.temp }}/ci-p1-shadow-manifest.json
if-no-files-found: warn
retention-days: 7
Loading
Loading