Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
94 changes: 94 additions & 0 deletions .github/workflows/validate-sv-evidence.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Validate SV evidence bundles

on:
pull_request:
paths:
- "SmvViewerWindow.xaml"
- "Services/SmvViewerWindow.P1Evidence.cs"
- "Services/SmvSnapshotEvidenceExporter.cs"
- "Services/SmvSnapshotCaptureService.cs"
- "tests/ARSAS.Tests/**"
- "engines/ARIEC61850.lock.json"
- ".github/workflows/validate-sv-evidence.yml"
workflow_dispatch:

permissions:
contents: read

jobs:
validate-evidence:
name: Build and test deterministic SV evidence
runs-on: windows-latest

steps:
- name: Checkout ARSAS application
uses: actions/checkout@v4
with:
path: ARSAS

- name: Resolve immutable ARIEC61850 engine lock
shell: powershell
run: |
$lock = Get-Content ".\ARSAS\engines\ARIEC61850.lock.json" -Raw | ConvertFrom-Json
if ($lock.repository -notmatch '^[^/]+/[^/]+$' -or $lock.commit -notmatch '^[0-9a-f]{40}$') {
throw "ARIEC61850 lock metadata is invalid."
}
"ARIEC61850_REPOSITORY=$($lock.repository)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"ARIEC61850_COMMIT=$($lock.commit)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Checkout immutable ARIEC61850 engine revision
shell: powershell
run: |
git clone --quiet --filter=blob:none --no-checkout "https://github.com/$env:ARIEC61850_REPOSITORY.git" ARIEC61850
git -C .\ARIEC61850 fetch --quiet --depth 1 origin $env:ARIEC61850_COMMIT
git -C .\ARIEC61850 checkout --quiet --detach $env:ARIEC61850_COMMIT
$actual = (git -C .\ARIEC61850 rev-parse HEAD).Trim()
if ($actual -ne $env:ARIEC61850_COMMIT) {
throw "ARIEC61850 pin mismatch. Expected $env:ARIEC61850_COMMIT, got $actual."
}

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

- name: Restore focused test project
run: dotnet restore .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj

- name: Build focused test project
shell: powershell
run: |
$log = ".\ARSAS\sv-evidence-build.log"
dotnet build .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj -c Release --no-restore *> $log
$buildExitCode = $LASTEXITCODE
if ($buildExitCode -ne 0) {
Write-Host "=== Focused compiler errors ===" -ForegroundColor Red
$errors = @(Select-String -Path $log -Pattern ': error ')
if ($errors.Count -eq 0) {
Get-Content $log -Tail 80 | ForEach-Object { Write-Host $_ -ForegroundColor Red }
}
else {
$errors | ForEach-Object { Write-Host $_.Line -ForegroundColor Red }
}
exit $buildExitCode
}
Get-Content $log -Tail 12

- name: Upload focused compiler diagnostics
if: always()
uses: actions/upload-artifact@v4
with:
name: ARSAS-sv-evidence-compiler-log
path: ARSAS/sv-evidence-build.log
if-no-files-found: error

- name: Run SV evidence regression tests
run: dotnet test .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj -c Release --no-build --no-restore --filter "FullyQualifiedName~SmvSnapshotEvidenceExporterTests" --logger "trx;LogFileName=sv-evidence-tests.trx" --results-directory .\ARSAS\TestResults

- name: Upload focused evidence test results
if: always()
uses: actions/upload-artifact@v4
with:
name: ARSAS-sv-evidence-test-results
path: ARSAS/TestResults/*.trx
if-no-files-found: ignore
9 changes: 6 additions & 3 deletions ArIED61850Tester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
<Copyright>Copyright (C) 2026 Ari Sulistiono</Copyright>
<Product>ARSAS</Product>
<AssemblyTitle>ARSAS - IEC 61850 Engineering Workstation</AssemblyTitle>
<Description>Open-source Windows IEC 61850 engineering workstation for MMS model discovery, reporting, independent multi-IED monitoring, GOOSE subscription, fault-record file transfer, Sampled Values engineering, SCL workflows, diagnostics, sequence of events, and guarded control validation.</Description>
<Description>Open-source Windows IEC 61850 engineering workstation for MMS model discovery, reporting, independent multi-IED monitoring, GOOSE subscription, fault-record file transfer, Sampled Values engineering and evidence export, SCL workflows, diagnostics, sequence of events, and guarded control validation.</Description>
<Version>1.6.19</Version>
<AssemblyVersion>1.6.19.0</AssemblyVersion>
<FileVersion>1.6.19.0</FileVersion>
<PackageProjectUrl>https://github.com/masarray/arsas</PackageProjectUrl>
<RepositoryUrl>https://github.com/masarray/arsas</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageTags>iec61850;iec-61850;mms;goose;sampled-values;smv;iec-61850-file-transfer;comtrade;scl;scl-generator;ied-explorer;multi-ied-monitoring;relay-testing;substation-automation;digital-substation;report-control-block;sequence-of-events;smart-control;wpf;dotnet</PackageTags>
<PackageTags>iec61850;iec-61850;mms;goose;sampled-values;smv;sv-evidence;iec-61850-file-transfer;comtrade;scl;scl-generator;ied-explorer;multi-ied-monitoring;relay-testing;substation-automation;digital-substation;report-control-block;sequence-of-events;smart-control;wpf;dotnet</PackageTags>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<ArIec61850Project Condition="'$(ArIec61850Project)' == '' and '$(ARIEC61850_PROJECT)' != ''">$(ARIEC61850_PROJECT)</ArIec61850Project>
<ArIec61850Project Condition="'$(ArIec61850Project)' == ''">..\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj</ArIec61850Project>
Expand All @@ -41,6 +41,9 @@
<Resource Include="Assets\app-icon-256.png" />
<Resource Include="Assets\gateway-hero.png" />
<None Include="README.md" Pack="true" PackagePath="\" />
<None Update="engines\ARIEC61850.lock.json"
CopyToOutputDirectory="PreserveNewest"
CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>

<ItemGroup>
Expand All @@ -56,4 +59,4 @@
<Error Condition="!Exists('$(ArIec61850NpcapProject)')"
Text="ARIEC61850 Npcap transport project was not found at '$(ArIec61850NpcapProject)'. Place this folder beside the ARIEC61850 repository, or build with -p:ArIec61850NpcapProject=FULL_PATH_TO_AR.Iec61850.Transports.Npcap.csproj." />
</Target>
</Project>
</Project>
15 changes: 12 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,23 @@ Notable public changes to ARSAS are recorded here. Application releases must ide
### Added

- `ARSAS.Tests`, the first application-layer regression-test project.
- Regression coverage for clean and incomplete SV windows, gap/duplicate/out-of-order/restart handling, continuity evidence, and immutable stream-selection identity.
- Regression coverage for clean and incomplete SV windows, gap/duplicate/out-of-order/restart handling, continuity evidence, immutable stream-selection identity, and deterministic evidence export.
- Canonical `Directory.Build.props` version metadata aligned with the project, `VERSION`, packaging, and CI.
- Test-result artifacts in the Windows build workflow.
- Portable Sampled Values engineering evidence bundles containing:
- structured `manifest.json` capture identity and verdict;
- separate application/engine `provenance.json`;
- invariant-culture raw `samples.csv`;
- rendered `waveform.png`;
- explicit `diagnostics.txt` and evidence boundary;
- deterministic `SHA256SUMS.txt` integrity records.
- Runtime publication of the immutable `ARIEC61850.lock.json` provenance used by exported evidence.

### Changed

- Windows CI restores and builds the complete solution, runs application regression tests, and only then publishes the portable package.
- Development version advanced to `1.6.19`. The currently published stable release remains `1.6.18` until a separately validated and tagged release is produced.
- The SV viewer can export a reviewed evidence package after a bounded snapshot without claiming current, voltage, engineering units, calibration, formal conformance, or universal interoperability.
- Development version remains `1.6.19`. The currently published stable release remains `1.6.18` until a separately validated and tagged release is produced.

## 1.6.18

Expand Down Expand Up @@ -55,4 +64,4 @@ Notable public changes to ARSAS are recorded here. Application releases must ide

## Historical licensing boundary

Revisions through `0df1007d9538b978edba67218136bc5c4f8019ad` remain available under their original terms on branch `archive/apache-2.0-final`. Current `main` and current community release packages are GPL-3.0-or-later only. See `docs/LICENSING.md`.
Revisions through `0df1007d9538b978edba67218136bc5c4f8019ad` remain available under their original terms on branch `archive/apache-2.0-final`. Current `main` and current community release packages are GPL-3.0-or-later only. See `docs/LICENSING.md`.
Loading
Loading