Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
e568e69
release(P10.9): restore proven RCB exporter and seven-tab shell; reta…
masarray Oct 13, 2026
dd36d98
fix(release): decouple SOE drawer from deferred RCB inspector model
masarray Oct 13, 2026
b040c54
fix(release): restore trusted SCL identity authority under original p…
masarray Oct 13, 2026
d1a2184
fix(release): restore original production RCB dialog for mouse, keybo…
masarray Oct 13, 2026
8a8b466
test(release): assert original RCB production route and keep experime…
masarray Oct 13, 2026
1c87e43
test(release): pin original RCB dialog across click and preview input…
masarray Oct 13, 2026
98edd5a
release(v1.6.41): show actual assembly version in native title bar an…
masarray Oct 13, 2026
ba647a6
test(v1.6.41): correct release-manifest JSON literal in title-version…
masarray Oct 13, 2026
d5eb693
ci(release): run Ubuntu release-ready fixtures with POSIX paths and r…
masarray Oct 13, 2026
6285867
ci(release): normalize Linux PowerShell Python script and source-dir …
masarray Oct 13, 2026
8467023
release(v1.6.41): bind operator-approved installed scope to pinned en…
masarray Oct 13, 2026
c02ccce
ci(release): resolve exact v1.6.41 operator scope consistently withou…
masarray Oct 13, 2026
e581a26
release(v1.6.41): request exact-main stable publication after operato…
masarray Oct 13, 2026
4138401
chore: record published ARSAS 1.6.41 release
github-actions[bot] Oct 13, 2026
94d61c7
docs(site): synchronize ARSAS v1.6.41 landing, release notes and repo…
masarray Oct 13, 2026
1e65280
fix(site): remove duplicated v1.6.41 release-note headings and guard …
masarray Oct 13, 2026
45348ec
fix(ci): integrate SV and IO/FAT domain routing (#565)
masarray Oct 15, 2026
6cc3aa1
integration(rc0): stage exact FAT Write and post-Write SSOT proof ove…
masarray Oct 24, 2026
77c6cd2
docs(handoff): freeze ARSAS all-thread RC0 integration gates and prot…
masarray Oct 24, 2026
5a40c34
integration(rc1): preserve accepted SSOT v2/Write and adopt final SMV…
masarray Oct 24, 2026
416d01e
test(smv): reconcile final twin-grid measurement acceptance without w…
masarray Oct 24, 2026
f177f34
integration(rc): land accepted SMV + SSOT v2/Write onto single PR #72…
masarray Oct 24, 2026
0c00b8d
fix(ied-browser): restore operator navigation order and emphasize sel…
masarray Oct 24, 2026
68c99e5
chore(rc): satisfy clean-room source guard for IED Browser navigation…
masarray Oct 24, 2026
4eb28c1
test(ied-browser): import presentation model namespace in operator-or…
masarray Oct 24, 2026
d327e0a
test(ied-browser): align six collapsed-root RCB regression with accep…
masarray Oct 24, 2026
fd135c2
ui(smart-ip): compact balanced Add IED dialog with full-width editor …
masarray Oct 24, 2026
1f1a471
test(smart-ip): reconcile startup and dialog visual contracts with co…
masarray Oct 24, 2026
086a396
integration(rc): reconcile public v1.6.41 lineage and release CI with…
masarray Oct 24, 2026
2d4b6bc
fix(release): isolate public RC prereleases from latest stable update…
masarray Oct 24, 2026
42fe389
test(mainline): isolate R10 fixture refs from hosting main-target pro…
masarray Oct 24, 2026
f27ca68
ci(canonical): bind IO/SV evidence reuse to PR identity on shared rel…
masarray Oct 24, 2026
dbfda09
P0 UI: replace warm greige palette with shared SMV-aligned cool-blue …
masarray Oct 24, 2026
a10d3dc
P0 UI: stop forcing maximize or overwriting MainWindow DataGrid row s…
masarray Oct 24, 2026
5a0efec
P0 UX: align shared cool-blue styles and one-time startup placement (…
masarray Oct 24, 2026
3a624cb
P0 UX: open workstation as centered normal resizable window (#730)
masarray Oct 24, 2026
23578d5
P0 UX: open workstation as centered normal resizable window (#730)
masarray Oct 24, 2026
2bec050
P0 UX: align shared cool-blue styles and one-time startup placement (…
masarray Oct 24, 2026
cadbce6
P0 UX: clamp centered initial window bounds once without disabling us…
masarray Oct 24, 2026
054b0e9
test(P0 UX): lock SMV-aligned cool-blue theme and normal centered sta…
masarray Oct 24, 2026
01ffbc1
test(P0 UX): lock SMV-aligned cool-blue theme and normal centered sta…
masarray Oct 24, 2026
d9b97c4
test(P0 UX): guard cool-blue tokens, grid headers, normal first paint…
masarray Oct 24, 2026
392db4a
P0 UX: preserve explicit SMV headers and eliminate warm scrollbar sur…
masarray Oct 24, 2026
909e899
P0 UX: preserve explicit SMV headers and eliminate warm scrollbar sur…
masarray Oct 24, 2026
743ab48
P0 UX: unify shared search and utility buttons; protect primary hover…
masarray Oct 24, 2026
e463212
fix(test): declare App.xaml source in centered startup regression tes…
masarray Oct 24, 2026
fab10ec
P1 UI: canonical textbox, dropdown, editable safety, empty state and …
masarray Oct 24, 2026
e2d1666
P1 UX: consolidate cool-blue reusable input, empty state and dialog c…
masarray Oct 24, 2026
88acf87
P1 UX: consolidate cool-blue reusable input, empty state and dialog c…
masarray Oct 24, 2026
82a6ab4
P1 UX: consolidate cool-blue reusable input, empty state and dialog c…
masarray Oct 24, 2026
420ca77
test(P1 UX): lock shared input, editable command, dropdown, empty sta…
masarray Oct 24, 2026
115655a
fix(release): hash manual portable using same-step local path before …
masarray Oct 24, 2026
c47a622
test(P1 UX): resolve canonical dynamic dialog colors before WCAG cont…
masarray Oct 24, 2026
4de4df4
merge(ui): stage P0+P1 premium visual unification onto current RC0 wi…
masarray Oct 24, 2026
ebd0eff
fix(P0 UI): optimize normal startup bounds and restore truthful activ…
masarray Oct 24, 2026
eeb62a7
fix(P0 UI): optimize normal startup bounds and restore truthful activ…
masarray Oct 24, 2026
667b109
fix(P0 UI): optimize normal startup bounds and restore truthful activ…
masarray Oct 24, 2026
e2603df
fix(P0 UI): optimize normal startup bounds and restore truthful activ…
masarray Oct 24, 2026
4ab779c
perf(GOOSE): offload native NIC discovery and keep SCL catalog rebuil…
masarray Oct 24, 2026
8392d4d
test(RC0): assert wide normal startup, active RCB proof, and nonblock…
masarray Oct 24, 2026
c11f5c1
perf(GOOSE): deduplicate async Npcap enumeration between nav and card…
masarray Oct 24, 2026
52ab298
perf(GOOSE): keep IED-card quick start NIC discovery and routing off …
masarray Oct 24, 2026
5236263
test(RC0): protect nonblocking GOOSE IED-card quick-start and shared …
masarray Oct 24, 2026
2bdb6c0
fix(sv): first received SV discovery and ARStack M3.H interoperabilit…
masarray Oct 24, 2026
41d3569
test(RC0): preserve MMS read truth and accept caller-owned RCB icon; …
masarray Oct 24, 2026
4a07aad
test(RC0): preserve MMS read truth and accept caller-owned RCB icon; …
masarray Oct 24, 2026
e1e1517
test(RC0): keep RCB evidence assertion precise and nullable-safe
masarray Oct 24, 2026
5b0060a
fix(GOOSE): discard stale quick-start adapter results when active IED…
masarray Oct 24, 2026
48808f8
Integrate RC0 operator GUI fixes into P0+P1 candidate (#735)
masarray Oct 24, 2026
f436ccc
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
fdc396f
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
1725072
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
d42620a
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
4fe547f
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
70d4ffa
fix(operator UX): render SNTP IPv4, responsive GOOSE timeline, safe a…
masarray Oct 24, 2026
cbaf829
fix(browser): preserve per-IED tree and per-page section expansion ac…
masarray Oct 24, 2026
8691b09
fix(GOOSE layout): default collapsed shared Command Dock on passive c…
masarray Oct 24, 2026
ecd3d73
test(RC0 UX): GOOSE bounded timeline/filter and adaptive height, SNTP…
masarray Oct 24, 2026
c0f425e
fix(GOOSE): actionable filtered-empty timeline to reveal all verified…
masarray Oct 24, 2026
1140c35
fix(GOOSE): actionable filtered-empty timeline to reveal all verified…
masarray Oct 24, 2026
4e03e87
fix(GOOSE): actionable filtered-empty timeline to reveal all verified…
masarray Oct 24, 2026
cdfa9b2
fix(GOOSE): actionable filtered-empty timeline to reveal all verified…
masarray Oct 24, 2026
209e31c
perf(browser): capture expansion preferences only on device/model rep…
masarray Oct 24, 2026
39ad335
test(browser): update legacy expansion assertions for user-requested …
masarray Oct 24, 2026
f2a9b40
test(browser): update legacy expansion assertions for user-requested …
masarray Oct 24, 2026
4b1614b
Merge P2 operator GOOSE, SNTP and IED Browser UI refinements (#736)
masarray Oct 24, 2026
c76de05
Consolidate operator-approved P0 P1 P2 GUI into ARSAS v1.6.42 RC (#733)
masarray Oct 24, 2026
2cae74c
release reconcile: preserve main SV first-received passive auto captu…
masarray Oct 24, 2026
9f06347
test(release): preserve main ARStack M3.H and SCL-independent SV regr…
masarray Oct 24, 2026
23a658a
test(release): preserve main ARStack M3.H and SCL-independent SV regr…
masarray Oct 24, 2026
56d8c2e
Release RC: preserve accepted main-only first-SV discovery and ARStac…
masarray Oct 24, 2026
badfdfe
fix(ui): render ctlModel choice label instead of C# record
masarray Oct 24, 2026
4f308e1
fix(ui): give ctlModel labels readable width in compact write dialog
masarray Oct 24, 2026
415bfba
test(ui): regression coverage for all ctlModel picker enum labels
masarray Oct 24, 2026
087b9bc
fix(test): use app Models ctlModel enum namespace in dialog regression
masarray Oct 24, 2026
754908b
RC P0 fix ctlModel choice rendering and compact write dialog (#738)
masarray Oct 24, 2026
6304984
fix(P0): reinspect exact independent CSWI after ctlModel Write; remov…
masarray Oct 24, 2026
0b4b032
ui: wider premium workstation default at 1880 DIP; runtime clamps to …
masarray Oct 24, 2026
835a27c
test(P0): reproduce independent CSWI post-Write stuck Reading and res…
masarray Oct 24, 2026
cd970af
test: update obsolete full-dock post-Write expectation to exact CSWI …
masarray Oct 24, 2026
3abde5f
RC P0 recover independent ctlModel after verified CF Write and adapt …
masarray Oct 25, 2026
6b67f0b
docs(release): capture five-IED FAT and exact ctlModel/SBO proof with…
masarray Oct 25, 2026
44dffe3
evidence: machine-readable five-IED FAT summary with explicit non-cer…
masarray Oct 25, 2026
8b09ee3
RC evidence: preserve five-IED operator FAT and qualified release dec…
masarray Oct 25, 2026
c682414
fix(rc-smv): retain main #734 first-received SV option without overwr…
masarray Oct 25, 2026
2bf9767
test(rc-smv): guard against empty first-received SV catalog and keep …
masarray Oct 25, 2026
42eb449
RC: reconcile main #734 unfiltered first-received SV without revertin…
masarray Oct 25, 2026
1406b93
release(rc): simplify manual Windows preview and document latest acce…
masarray Oct 25, 2026
3db2ca9
test(release): preserve stable latest-flag regression while using pre…
masarray Oct 25, 2026
aa0b3d9
merge(mainline): reconcile latest SV/M3.H with accepted v1.6.42 RC wi…
masarray Oct 25, 2026
02b85a8
docs(site): synchronize v1.6.42 stable downloads, README and bilingua…
masarray Oct 25, 2026
4f1b812
docs(site): correctly label historical screenshot instead of implying…
masarray Oct 25, 2026
56bf9fe
docs(site): correctly label historical screenshot instead of implying…
masarray Oct 25, 2026
4e6a4c7
docs(changelog): record exact public stable v1.6.42 and qualification…
masarray Oct 25, 2026
976d54c
merge(rc): reconcile exact v1.6.42 source with public-stable docs main
masarray Oct 25, 2026
817c391
fix(release): align staged Windows manifest with already-published st…
masarray Oct 25, 2026
3f2b277
ci(P4): fail-closed docs-only Windows admission and opt-in field capture
masarray Oct 26, 2026
6065c6e
docs(ci): record 24 offline gate scenarios and inaccessible branch-pr…
masarray Oct 26, 2026
e0c9724
test(ci): execute actual P4 workflow expressions against 26 fail-clos…
masarray Oct 26, 2026
fc8712c
field(P7): restore bounded dual-ingress diagnostic intake with fail-c…
masarray Oct 26, 2026
43b7eed
fix(p7.6): verify RCB binding totals and fail closed on malformed num…
masarray Oct 27, 2026
2c95d0c
ci(p3j): bind canonical COMTRADE native proof to triggering PR identity
masarray Oct 27, 2026
d2d0ca7
Integrate P7.6 read-only dual-ingress diagnostic validator (#759)
masarray Oct 27, 2026
2b64e12
Integrate exact-PR COMTRADE native-shadow provenance guard (#760)
masarray Oct 27, 2026
d459861
Integrate fail-closed CI P4 docs-only gate and opt-in field capture (…
masarray Oct 27, 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
51 changes: 51 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,59 @@ concurrency:
cancel-in-progress: true

jobs:
pr-scope:
name: Verify documentation-only PR scope (fail closed)
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
needs_windows: ${{ steps.files.outputs.needs_windows }}
steps:
- id: files
name: Read all changed PR paths without checkout or Windows
uses: actions/github-script@v7
with:
script: |
// Fail closed on missing/ambiguous/renamed inputs and any API/job error.
let needsWindows = true;
try {
const files = await github.paginate(github.rest.pulls.listFiles, {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
per_page: 100
});
const documentationOnly = files.length > 0 && files.length < 3000 &&
files.every(({ filename, status, previous_filename }) => {
const allowedPath = filename === 'README.md' ||
(filename.startsWith('docs/') && filename.endsWith('.md') &&
filename !== 'docs/INTEROPERABILITY_REFERENCE_CONTRACT.md');
// Renamed and deleted documents can conceal source removals.
return allowedPath && (status === 'added' || status === 'modified') &&
!previous_filename;
});
needsWindows = !documentationOnly;
core.info(`Changed paths=${files.length}, Windows required=${needsWindows}`);
} catch (error) {
core.warning(`Cannot certify docs-only PR: ${error.message}; full Windows required.`);
}
core.setOutput('needs_windows', needsWindows ? 'true' : 'false');

build-windows:
name: Build, test, validate and package Windows application
needs: [pr-scope]
# The classifier may fail before emitting outputs. Anything except an
# explicit verified 'false' still triggers the full canonical Windows job.
# Push/manual do not run pr-scope, but MUST run canonical Windows proof.
if: >-
${{
always() &&
(github.event_name != 'pull_request' ||
needs.pr-scope.result != 'success' ||
needs.pr-scope.outputs.needs_windows != 'false')
}}
runs-on: windows-latest
steps:
- name: Checkout exact triggering ARSAS revision
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/ci-p0-workflow-integrity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ on:
- ".github/workflows/**"
- "scripts/audit-ci-workflows.py"
- "scripts/test-ci-workflows.py"
- "scripts/verify-p7-dual-ingress-diagnostic.py"
- "scripts/test-p7-dual-ingress-diagnostic.py"
- "scripts/classify-ci-changes.py"
- "scripts/test-classify-ci-changes.py"
- "scripts/write-ci-canonical-proof.py"
Expand All @@ -32,6 +34,8 @@ on:
- ".github/workflows/**"
- "scripts/audit-ci-workflows.py"
- "scripts/test-ci-workflows.py"
- "scripts/verify-p7-dual-ingress-diagnostic.py"
- "scripts/test-p7-dual-ingress-diagnostic.py"
- "scripts/classify-ci-changes.py"
- "scripts/test-classify-ci-changes.py"
- "scripts/write-ci-canonical-proof.py"
Expand Down Expand Up @@ -78,6 +82,9 @@ jobs:
- name: Run offline CI workflow guard tests
run: python3 scripts/test-ci-workflows.py

- name: Validate sanitized P7.6 dual-ingress diagnostic parser (read-only)
run: python3 scripts/test-p7-dual-ingress-diagnostic.py

- name: Run conservative CI P1 classifier fixtures
run: python3 scripts/test-classify-ci-changes.py

Expand Down
80 changes: 63 additions & 17 deletions .github/workflows/release-windows.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: Release ARSAS Windows packages
run-name: "ARSAS Windows · ${{ github.ref_name }} · ${{ github.event_name }}"

on:
push:
Expand All @@ -10,9 +11,9 @@ on:
workflow_dispatch:
inputs:
version:
description: "Release version, for example 1.6.19"
required: true
default: "1.6.20"
description: "Optional: blank = VERSION from selected branch (recommended)"
required: false
default: ""
type: string
publish_release:
description: "Create or update a GitHub Release"
Expand Down Expand Up @@ -63,11 +64,11 @@ jobs:
python-version: '3.12'

- name: Run offline release-ready and installer-verifier fixtures
shell: bash
run: |
python .\ArIED61850Tester\scripts\test-ci-release-ready.py
if ($LASTEXITCODE -ne 0) { throw 'Release-ready metadata gate fixtures failed.' }
python .\ArIED61850Tester\scripts\test-ci-installer-reuse.py
if ($LASTEXITCODE -ne 0) { throw 'Validated-installer verifier fixtures failed.' }
set -euo pipefail
python ./ArIED61850Tester/scripts/test-ci-release-ready.py
python ./ArIED61850Tester/scripts/test-ci-installer-reuse.py

- name: Wait for exact immutable release dependencies
id: ready
Expand All @@ -76,9 +77,9 @@ jobs:
GITHUB_TOKEN: ${{ github.token }}
run: |
$proofPath = Join-Path $env:RUNNER_TEMP 'arsas-release-ready.json'
python .\ArIED61850Tester\scripts\wait-ci-release-ready.py `
python ./ArIED61850Tester/scripts/wait-ci-release-ready.py `
--repository $env:GITHUB_REPOSITORY `
--source-dir .\ArIED61850Tester `
--source-dir ./ArIED61850Tester `
--source-sha $env:GITHUB_SHA `
--ref-type $env:GITHUB_REF_TYPE `
--ref-name $env:GITHUB_REF_NAME `
Expand Down Expand Up @@ -166,9 +167,16 @@ jobs:
- name: Resolve release identity and immutable engine locks
id: release
shell: powershell
env:
MANUAL_VERSION: ${{ inputs.version }}
run: |
if ($env:GITHUB_EVENT_NAME -eq "workflow_dispatch") {
$rawVersion = "${{ inputs.version }}"
# Package the checked-out revision by default. This avoids stale
# hardcoded workflow versions and operator/main metadata mismatches.
$rawVersion = [string]$env:MANUAL_VERSION
if ([string]::IsNullOrWhiteSpace($rawVersion)) {
$rawVersion = (Get-Content ".\ArIED61850Tester\VERSION" -Raw).Trim()
}
}
elseif ($env:GITHUB_REF_TYPE -eq "tag") {
$rawVersion = $env:GITHUB_REF_NAME
Expand Down Expand Up @@ -478,8 +486,15 @@ jobs:
-EngineProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" `
-NpcapProject "$env:GITHUB_WORKSPACE\ARIEC61850\src\AR.Iec61850.Transports.Npcap\AR.Iec61850.Transports.Npcap.csproj" `
-ArdIrecSource "$env:GITHUB_WORKSPACE\ArdIrec"
"RELEASE_PORTABLE_PATH=$env:GITHUB_WORKSPACE\ArIED61850Tester\dist\ARSAS-$env:RELEASE_VERSION-win-x64-portable.exe" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
$manualPortableSha = (Get-FileHash $env:RELEASE_PORTABLE_PATH -Algorithm SHA256).Hash.ToLowerInvariant()
# GITHUB_ENV is applied only to SUBSEQUENT steps. The path must be
# computed, verified and hashed locally in this same step before
# exporting it for downstream release smoke/provenance checks.
$releasePortable = Join-Path $env:GITHUB_WORKSPACE "ArIED61850Tester\dist\ARSAS-$env:RELEASE_VERSION-win-x64-portable.exe"
if (-not (Test-Path $releasePortable -PathType Leaf)) {
throw "Manual release portable EXE is missing: $releasePortable"
}
$manualPortableSha = (Get-FileHash $releasePortable -Algorithm SHA256).Hash.ToLowerInvariant()
"RELEASE_PORTABLE_PATH=$releasePortable" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
"RELEASE_CANONICAL_PORTABLE_SHA256=$manualPortableSha" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append

- name: Stage unified release regression evidence
Expand Down Expand Up @@ -863,20 +878,51 @@ jobs:
"release", "create", $env:RELEASE_TAG,
"--repo", $env:GITHUB_REPOSITORY,
"--target", $env:GITHUB_SHA,
"--title", "ARSAS $env:RELEASE_VERSION",
"--generate-notes",
"--latest"
"--title", "ARSAS $env:RELEASE_VERSION"
)
if ($env:RELEASE_VERSION.Contains("-") -or ($env:GITHUB_REF_TYPE -ne "tag" -and $env:GITHUB_REF -ne "refs/heads/main" -and $env:MANUAL_PRERELEASE -eq "true")) {
# A manual publish from a staging branch is ALWAYS a public preview.
# A preview must never take over /releases/latest, even if a caller
# accidentally supplies prerelease=false in the workflow dialog.
$isStagingManual = $env:GITHUB_EVENT_NAME -eq "workflow_dispatch" -and
$env:GITHUB_REF -ne "refs/heads/main"
$isPreview = $env:RELEASE_VERSION.Contains("-") -or $isStagingManual -or
$env:MANUAL_PRERELEASE -eq "true"
if ($isPreview) {
$arguments += "--prerelease"
# The current release candidate has independently accepted
# operator FAT scope and equally explicit unresolved limitations.
# Never replace those notes with automated commit-title noise.
$notes = Join-Path $env:GITHUB_WORKSPACE "ArIED61850Tester\docs\release\ARSAS_V1642_PUBLIC_PREVIEW_NOTES.md"
if ($env:RELEASE_VERSION -eq "1.6.42" -and (Test-Path $notes -PathType Leaf)) {
$arguments += @("--notes-file", $notes)
}
else {
# Future preview versions remain packagable without a
# version-specific document; don't create another workflow gate.
$arguments += "--generate-notes"
}
}
else {
$arguments += "--latest"
$arguments += "--generate-notes"
}
$arguments += $assets

& gh @arguments
if ($LASTEXITCODE -ne 0) { throw "Failed to create GitHub Release." }

- name: Record verified release publication
if: ((github.event_name == 'push' && (github.ref_type == 'tag' || github.ref == 'refs/heads/main')) || (github.event_name == 'workflow_dispatch' && inputs.publish_release == true)) && env.RELEASE_ALREADY_PUBLISHED != 'true'
# Stable updater evidence is MAINLINE-ONLY. Never overwrite
# .release/published.json after a preview release on an RC branch.
if: >-
${{
env.RELEASE_ALREADY_PUBLISHED != 'true' &&
!contains(steps.release.outputs.version, '-') &&
(
(github.event_name == 'push' && (github.ref_type == 'tag' || github.ref == 'refs/heads/main')) ||
(github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' && inputs.publish_release == true && inputs.prerelease != true)
)
}}
shell: powershell
env:
GH_TOKEN: ${{ github.token }}
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/smart-discovery-capture-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Smart Discovery Field Capture Build

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
types: [opened, synchronize, reopened, ready_for_review, labeled]
paths:
# Fast PR routing: only Smart Discovery authority/dependencies trigger this gate.
- "Services/NativeIec61850Client*.cs"
Expand Down Expand Up @@ -48,7 +48,9 @@ jobs:
if: >-
${{
always() &&
(github.event_name != 'pull_request' || !github.event.pull_request.draft) &&
(github.event_name != 'pull_request' ||
(!github.event.pull_request.draft &&
contains(github.event.pull_request.labels.*.name, 'ci-field-capture'))) &&
(github.event_name != 'workflow_dispatch' ||
needs.manual-regression.result == 'success')
}}
Expand Down
19 changes: 13 additions & 6 deletions .github/workflows/sync-release-documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,23 @@ jobs:
with:
fetch-depth: 0

- name: Resolve canonical stable version
- name: Resolve latest published stable release from GitHub
id: version
env:
GH_TOKEN: ${{ github.token }}
shell: bash
run: |
set -euo pipefail
version="$(tr -d '[:space:]' < VERSION)"
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Invalid VERSION value: $version" >&2
# Documentation follows the already-published GitHub stable channel,
# not the main branch's potentially older application VERSION.
tag="$(gh api "repos/$GITHUB_REPOSITORY/releases/latest" --jq .tag_name)"
if [[ ! "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "GitHub latest stable tag is invalid: $tag" >&2
exit 1
fi
version="${tag#v}"
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "tag=v$version" >> "$GITHUB_OUTPUT"
echo "tag=$tag" >> "$GITHUB_OUTPUT"

- name: Read exact GitHub Release metadata and checksums
env:
Expand Down Expand Up @@ -202,7 +207,9 @@ jobs:
git add landing/latest.json landing/release-notes.json
git commit -m "docs: synchronize ARSAS ${{ steps.version.outputs.version }} release landing"
git fetch origin main
git rebase origin/main
# Preserve unrelated, tracked generated-state edits when rebasing.
# Only the two checked-in release records above are committed.
git -c rebase.autoStash=true rebase origin/main
git push origin HEAD:main
fi

Expand Down
22 changes: 15 additions & 7 deletions .github/workflows/validate-io-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@ name: Validate IO List Testing
on:
pull_request:
paths:
- "MainWindow.IoTesting.cs"
# Exact IO/FAT owners; Browser/RCB/SV changes use canonical Build ARSAS.
- "MainWindow.IoTesting*.cs"
- "MainWindow.NativeFat*.cs"
- "MainWindow.P0Fat*.cs"
- "IoListTestingWindow.xaml"
- "IoListTestingWindow.xaml.cs"
- "IoListTestingWindow*.cs"
- "Models/IoTesting/**"
- "Models/NativeFat*.cs"
- "Services/IoTesting/**"
- "tests/ARSAS.Tests/IoTest*"
- "tests/ARSAS.Tests/IoList*"
- "tests/ARSAS.Tests/IoFat*"
- "tests/ARSAS.Tests/FatDataSet*"
- "tests/ARSAS.Tests/FatScl*"
- "tests/ARSAS.Tests/Io*.cs"
- "tests/ARSAS.Tests/Fat*.cs"
- "tests/ARSAS.Tests/NativeFat*.cs"
# Canonical test-evidence and immutable engine authority changes.
- "engines/ARIEC61850.lock.json"
- ".github/actions/resolve-ariec-engine/**"
- ".github/workflows/build.yml"
- ".github/workflows/validate-io-testing.yml"
- "scripts/write-ci-canonical-proof.py"
- "scripts/verify-ci-canonical-reuse.py"
- "scripts/test-ci-canonical-reuse.py"
workflow_dispatch:
Expand Down Expand Up @@ -59,6 +65,7 @@ jobs:
PR_HEAD_BRANCH: ${{ github.event.pull_request.head.ref }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_MERGE_SHA: ${{ github.sha }}
PR_TITLE: ${{ github.event.pull_request.title }}
ENGINE_SHA: ${{ steps.engine.outputs.commit }}
run: |
set -euo pipefail
Expand All @@ -69,6 +76,7 @@ jobs:
--head-sha "$PR_HEAD_SHA" \
--merge-sha "$PR_MERGE_SHA" \
--engine-sha "$ENGINE_SHA" \
--pr-title "$PR_TITLE" \
--wait-seconds 960 \
--allow-in-progress-artifact \
--require-test-substring IoTest \
Expand Down
19 changes: 15 additions & 4 deletions .github/workflows/validate-sv-evidence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,22 @@ name: Validate SV evidence bundles
on:
pull_request:
paths:
# Domain-owned sources; unrelated Browser/RCB/IO tests remain covered
# by the canonical Build ARSAS gate without a redundant SV waiter.
- "MainWindow.IedSmvQuickStart.cs"
- "SmvViewerWindow.xaml"
- "Services/SmvViewerWindow.P1Evidence.cs"
- "Services/SmvSnapshotEvidenceExporter.cs"
- "Services/SmvSnapshotCaptureService.cs"
- "tests/ARSAS.Tests/**"
- "SmvViewerWindow*.cs"
- "Services/Smv*.cs"
- "tests/ARSAS.Tests/Smv*.cs"
- "tests/ARSAS.Tests/Sv*.cs"
- "tests/ARSAS.Tests/SampledValue*.cs"
- "tests/ARSAS.Tests/ProcessBus*.cs"
# Changes to shared evidence authority still force SV revalidation.
- "engines/ARIEC61850.lock.json"
- ".github/actions/resolve-ariec-engine/**"
- ".github/workflows/build.yml"
- ".github/workflows/validate-sv-evidence.yml"
- "scripts/write-ci-canonical-proof.py"
- "scripts/verify-ci-canonical-reuse.py"
- "scripts/test-ci-canonical-reuse.py"
workflow_dispatch:
Expand Down Expand Up @@ -54,6 +63,7 @@ jobs:
PR_HEAD_BRANCH: ${{ github.event.pull_request.head.ref }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_MERGE_SHA: ${{ github.sha }}
PR_TITLE: ${{ github.event.pull_request.title }}
ENGINE_SHA: ${{ steps.engine.outputs.commit }}
run: |
set -euo pipefail
Expand All @@ -64,6 +74,7 @@ jobs:
--head-sha "$PR_HEAD_SHA" \
--merge-sha "$PR_MERGE_SHA" \
--engine-sha "$ENGINE_SHA" \
--pr-title "$PR_TITLE" \
--wait-seconds 960 \
--allow-in-progress-artifact \
--require-test-substring SmvSnapshotEvidenceExporterTests \
Expand Down
Loading
Loading