Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
09940aa
P1D.3: add interaction performance helpers
masarray Sep 10, 2026
710aa6d
P1D.3: add cached disturbance interaction renderer
masarray Sep 10, 2026
0792e8e
P1D.3: add adaptive harmonics workstation view
masarray Sep 10, 2026
c2e0006
P1D.3: switch workspace to optimized renderers
masarray Sep 10, 2026
41902b7
P1D.3: cover snap and adaptive density math
masarray Sep 10, 2026
99d5c33
P1D.3: document performance and harmonics contract
masarray Sep 10, 2026
8e9f014
P1D.3: normalize COMTRADE data timestamps to record start
masarray Sep 10, 2026
af8a9ca
P1D.3: test non-zero DAT timestamp origin normalization
masarray Sep 10, 2026
458b2bf
P1D.3: add trigger-anchored shared timeline math
masarray Sep 10, 2026
5b3d9f4
P1D.3: cover trigger-anchored shell timeline ticks
masarray Sep 10, 2026
addba7b
P1D.3: add persistent SIGRA-style investigation timeline shell
masarray Sep 10, 2026
5f01051
P1D.3: align legacy DAT time origin and proxy optimized disturbance view
masarray Sep 10, 2026
f40957a
P1D.3: make investigation timeline the shared analysis context
masarray Sep 10, 2026
6bad759
P1D.3: add persistent investigation timeline above every analysis view
masarray Sep 10, 2026
71b252f
P1D.3: drive phasor and harmonics from shared timeline cursors
masarray Sep 10, 2026
9ad7100
P1D.3: synchronize event timing with shared trigger origin
masarray Sep 10, 2026
5813c1d
P1D.3: finalize persistent timeline control imports
masarray Sep 10, 2026
e8870d2
P1D.3: document shared timeline and trigger-origin correction
masarray Sep 10, 2026
15e2ce7
P1D.3.1: unify investigation cursor identity and scrub path
masarray Sep 10, 2026
d270fe3
P1D.3.1: align ruler geometry and add single analysis cursors
masarray Sep 10, 2026
d5e8beb
P1D.3.1: make Time Signals the cursor snap authority
masarray Sep 10, 2026
6184f93
P1D.4: add single-cursor frame-coalesced realtime analysis scrub
masarray Sep 10, 2026
c0b7653
P1D.4: snap single analysis cursors on the common timebase
masarray Sep 10, 2026
d4cc30d
P1D.4: restore WPF tooltip namespace for investigation ruler
masarray Sep 10, 2026
18f6054
P1D.4: unify snapped cursor identity and realtime analysis scrub
masarray Sep 10, 2026
4dd8855
P1D.4: mirror waveform cursor on every pointer frame
masarray Sep 10, 2026
ad3ca1c
P1D.4: match waveform cursor hit target exactly
masarray Sep 10, 2026
12cee3e
P1D.4: add SIGRA-style multi-channel harmonic comparison
masarray Sep 10, 2026
de30286
P1D.4: make harmonic value labels pixel-readable
masarray Sep 10, 2026
f3c36bd
P1D.4: keep analog tracks above digital timeline
masarray Sep 10, 2026
0670e6e
P1D.4: expose canonical track ordering for regression tests
masarray Sep 10, 2026
8f909f2
P1D.4: lock analog-before-digital track ordering
masarray Sep 10, 2026
a56ca0b
Architecture: add production-grade AGENTS guardrails
masarray Sep 10, 2026
cfa8fb5
P1D.4: remove LINQ allocations from harmonic axis math
masarray Sep 10, 2026
b50c98a
P1D.4: precompute harmonic render data off the redraw path
masarray Sep 10, 2026
16e8fac
P1D.4: lock zero-enumeration harmonic axis contract
masarray Sep 10, 2026
bafa63f
P1D.4: precompute phasor presentation outside render hot path
masarray Sep 10, 2026
a0d0125
P1D.4: add bounded asynchronous COMTRADE diagnostics
masarray Sep 10, 2026
d299808
P1D.4: translate live-analysis exceptions into structured outcomes
masarray Sep 10, 2026
5e5aff5
P1D.4: cache harmonic selection identity and remove presentation LINQ
masarray Sep 10, 2026
07f5179
P1D.4: isolate cursor motion from navigation churn
masarray Sep 10, 2026
0b5fa1e
P1D.4: lock bounded nonblocking diagnostic contract
masarray Sep 10, 2026
2b4c253
Architecture: add bounded incremental cache primitive
masarray Sep 10, 2026
1a5c2f8
P1D.4: use incremental bounded harmonic cache
masarray Sep 10, 2026
d5766b9
P1D.4: use incremental bounded phasor cache
masarray Sep 10, 2026
1c6cbae
Architecture: lock incremental bounded cache behavior
masarray Sep 10, 2026
ffb6591
Architecture: fail closed if bounded cache invariant is violated
masarray Sep 10, 2026
22669d7
P1D.5: own fault-record receive pump for association lifetime
masarray Sep 10, 2026
15071fa
P1D.5: add RMS traces cursor values and workstation controls
masarray Sep 10, 2026
f772d2b
P1D.5: fix workstation compile and remove Qt launcher path
masarray Sep 10, 2026
03a555a
P1D.5: integrate locus with global representation state
masarray Sep 10, 2026
71eb012
P1D.5: add native dual-panel protection locus workstation
masarray Sep 10, 2026
c2965dd
P1D.5: stage ArdIrec bridge without Qt desktop runtime
masarray Sep 11, 2026
52998fc
P1D.5: integration-test packaged distance locus bridge
masarray Sep 11, 2026
02286e4
P1D.5: qualify bridge-only COMTRADE workstation and locus
masarray Sep 11, 2026
3cbf829
P1D.5: qualify bridge-only Windows installer for field testing
masarray Sep 11, 2026
dc8b665
P1D.5: pin distance-capable ArdIrec native bridge
masarray Sep 11, 2026
cc7dc43
P1D.5: restore immutable IEC engine checkout in COMTRADE gate
masarray Sep 11, 2026
e6d3984
P1D.5: remove cursor scrub allocation from composition hot path
masarray Sep 11, 2026
4eced7a
P1D.5: fix secondary representation constant in locus integration test
masarray Sep 11, 2026
1fb1526
P1D.5: resolve native locus fixture from absolute workspace path
masarray Sep 11, 2026
8bddbe6
P1D.5: enforce bridge-only installer contract
masarray Sep 11, 2026
ca0971c
P1D.5: harden realtime cursor readouts
masarray Sep 11, 2026
3116588
P1D.5: add cursor readout latest-wins policy
masarray Sep 11, 2026
bcffd16
P1D.5: regress cursor readout blank and stale states
masarray Sep 11, 2026
1f8aa79
P1D.5: increase COMTRADE workspace height
masarray Sep 11, 2026
c657d1a
P1D.5: align COMTRADE controls with ARSAS visual language
masarray Sep 11, 2026
bdbed19
P1D.5: keep cursor readouts explicit before first sample
masarray Sep 11, 2026
70fde1d
P1D.5: keep cursor readout scheduler on UI dispatcher
masarray Sep 11, 2026
e7107b2
P1D.5: relay bounded interactive cursor updates
masarray Sep 11, 2026
dba4dec
P1D.5: cover rapid cursor revision supersession
masarray Sep 11, 2026
d321754
P1D.5: no-op qualification anchor
masarray Sep 11, 2026
8f327f8
P1D.5: preserve final qualification test content
masarray Sep 11, 2026
feae192
P1D.5: route Auto Clear through bounded selection transactions
masarray Sep 11, 2026
0f40786
P1D.5: preserve investigation state across empty selections
masarray Sep 11, 2026
083da03
P1D.5: make Auto Clear latest-wins and navigation-preserving
masarray Sep 11, 2026
f365da4
P1D.5: lock Clear Auto navigation regression
masarray Sep 11, 2026
8a51473
P1D.5: harden Clear Auto cancellation lifecycle
masarray Sep 11, 2026
cdece63
P1D.5: unify checkbox and Auto Clear selection lifecycle
masarray Sep 11, 2026
c9f4b56
P1D.5: route checkbox changes through selection scheduler
masarray Sep 11, 2026
46c9345
P1D.5: make rapid signal toggles latest-wins
masarray Sep 11, 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
159 changes: 73 additions & 86 deletions .github/workflows/comtrade-viewer-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,15 @@ on:
pull_request:
paths:
- "FaultRecordWindow.ComtradeOpen.cs"
- "ComtradeWorkspaceWindow*.cs"
- "ComtradeWorkspaceWindow.xaml"
- "ComtradeWorkspaceWindow.xaml.cs"
- "ComtradeWorkspaceWindow.Analysis.cs"
- "ComtradeWorkspaceWindow.Disturbance.cs"
- "Controls/ComtradeWaveformView.cs"
- "Controls/ComtradeDisturbanceView.cs"
- "Controls/ComtradePhasorView.cs"
- "Controls/ComtradeHarmonicsView.cs"
- "Services/ArdIrecNativeBridge.cs"
- "Services/ArdIrecViewerLauncher.cs"
- "Services/ComtradeNavigationMath.cs"
- "Services/ComtradeTimeMath.cs"
- "Services/ComtradeAbsoluteViewportMath.cs"
- "Services/ComtradeRangeDecimator.cs"
- "Services/ComtradeDecimatedSeriesBuilder.cs"
- "Properties/AssemblyInfo.Tests.cs"
- "tests/ARSAS.Tests/ArdIrecNativeBridgeIntegrationTests.cs"
- "tests/ARSAS.Tests/ArdIrecViewerLauncherTests.cs"
- "tests/ARSAS.Tests/ComtradeNavigationMathTests.cs"
- "tests/ARSAS.Tests/ComtradeTimeMathTests.cs"
- "tests/ARSAS.Tests/ComtradeAbsoluteViewportMathTests.cs"
- "tests/ARSAS.Tests/ComtradeRangeDecimatorTests.cs"
- "tests/ARSAS.Tests/ComtradeDecimatedSeriesBuilderTests.cs"
- "Controls/Comtrade*.cs"
- "Services/ArdIrec*.cs"
- "Services/Comtrade*.cs"
- "tests/ARSAS.Tests/ArdIrec*Tests.cs"
- "tests/ARSAS.Tests/Comtrade*Tests.cs"
- "scripts/stage-ardirec-viewer.ps1"
- "engines/ARIEC61850.lock.json"
- "engines/ARDIREC.lock.json"
- "docs/COMTRADE_VIEWER_INTEGRATION.md"
- ".github/workflows/comtrade-viewer-integration.yml"
Expand All @@ -38,7 +23,7 @@ permissions:

jobs:
windows-viewer-integration:
name: Build pinned ArdIrec P1C engine and smoke compatibility launch
name: Qualify native ARSAS COMTRADE workstation
runs-on: windows-latest
timeout-minutes: 35

Expand All @@ -48,32 +33,41 @@ jobs:
with:
path: ARSAS

- name: Resolve immutable ArdIrec integration lock
- name: Resolve immutable engine locks
shell: powershell
run: |
$lockPath = ".\ARSAS\engines\ARDIREC.lock.json"
$lock = Get-Content $lockPath -Raw | ConvertFrom-Json

if ($lock.schema -ne 2 -or $lock.repository -notmatch '^[^/]+/[^/]+$' -or $lock.ref -ne 'main') {
throw "ArdIrec repository/ref lock is invalid; P1 must pin merged main with schema 2."
}
if ($lock.commit -notmatch '^[0-9a-f]{40}$') {
throw "ArdIrec commit lock is invalid."
}
if ($lock.bridge.abi -ne 1 -or $lock.bridge.relativeLibrary -ne 'Tools/ArdIrec/ardirec_bridge.dll') {
throw "ArdIrec native bridge contract is invalid."
$iecLock = Get-Content ".\ARSAS\engines\ARIEC61850.lock.json" -Raw | ConvertFrom-Json
if ($iecLock.repository -notmatch '^[^/]+/[^/]+$' -or
$iecLock.commit -notmatch '^[0-9a-f]{40}$') {
throw "ARIEC61850 lock metadata is invalid."
}
if ($lock.qt.version -ne '6.8.3' -or $lock.qt.arch -ne 'win64_msvc2022_64') {
throw "ArdIrec Qt fallback lock must match the validated Windows recipe (Qt 6.8.3 / win64_msvc2022_64)."
}
if ($lock.runtime.relativeExecutable -ne 'Tools/ArdIrec/ardirec.exe' -or
$lock.runtime.launchArgument -ne '--arsas-open') {
throw "ArdIrec compatibility runtime contract is invalid."

$lock = Get-Content ".\ARSAS\engines\ARDIREC.lock.json" -Raw | ConvertFrom-Json
if ($lock.schema -ne 3 -or
$lock.repository -notmatch '^[^/]+/[^/]+$' -or
$lock.commit -notmatch '^[0-9a-f]{40}$' -or
$lock.bridge.abi -ne 1 -or
$lock.bridge.relativeLibrary -ne 'Tools/ArdIrec/ardirec_bridge.dll' -or
$lock.bridge.mode -ne 'native-only') {
throw "ArdIrec P1D.5 bridge-only lock metadata is invalid."
}

"ARIEC61850_REPOSITORY=$($iecLock.repository)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"ARIEC61850_COMMIT=$($iecLock.commit)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"ARDIREC_REPOSITORY=$($lock.repository)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"ARDIREC_COMMIT=$($lock.commit)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Checkout immutable ARIEC61850 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: Checkout immutable ArdIrec revision
shell: powershell
run: |
Expand All @@ -85,69 +79,62 @@ jobs:
throw "ArdIrec pin mismatch. Expected $env:ARDIREC_COMMIT, got $actual."
}

- name: Install Qt 6.8.3
uses: jurplel/install-qt-action@v4
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
version: '6.8.3'
arch: 'win64_msvc2022_64'
cache: true
dotnet-version: 8.0.x

- name: Build, test and stage ArdIrec P1C engine
- name: Build and test ARSAS
shell: powershell
run: |
dotnet restore .\ARSAS\ArIED61850Tester.sln
if ($LASTEXITCODE -ne 0) { throw "Solution restore failed." }
dotnet build .\ARSAS\ArIED61850Tester.sln -c Release --no-restore
if ($LASTEXITCODE -ne 0) { throw "Solution build failed." }
dotnet test .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj -c Release --no-build --no-restore
if ($LASTEXITCODE -ne 0) { throw "Application regression tests failed." }

- name: Build test and stage native ArdIrec bridge
shell: powershell
run: |
$publish = Join-Path $env:RUNNER_TEMP "arsas-viewer-publish"
$publish = Join-Path $env:RUNNER_TEMP "arsas-comtrade-publish"
if (Test-Path $publish) { Remove-Item $publish -Recurse -Force }
New-Item -ItemType Directory -Path $publish -Force | Out-Null

.\ARSAS\scripts\stage-ardirec-viewer.ps1 `
-ArdIrecSource "$env:GITHUB_WORKSPACE\ArdIrec" `
-PublishedDirectory $publish `
-BuildDirectory "$env:RUNNER_TEMP\ardirec-build"

"VIEWER_PUBLISH=$publish" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
-BuildDirectory "$env:RUNNER_TEMP\ardirec-bridge-build"
"COMTRADE_PUBLISH=$publish" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Verify native bridge and compatibility runtime
shell: pwsh
- name: Verify bridge-only deployment contract
shell: powershell
run: |
$viewer = Join-Path $env:VIEWER_PUBLISH "Tools\ArdIrec\ardirec.exe"
$bridge = Join-Path $env:COMTRADE_PUBLISH "Tools\ArdIrec\ardirec_bridge.dll"
if (-not (Test-Path $bridge -PathType Leaf)) { throw "Native bridge was not staged: $bridge" }
foreach ($relative in @(
"Tools\ArdIrec\ardirec_bridge.dll",
"Tools\ArdIrec\ardirec.exe",
"Tools\ArdIrec\Qt6Core.dll",
"Tools\ArdIrec\Qt6Gui.dll",
"Tools\ArdIrec\Qt6Qml.dll",
"Tools\ArdIrec\Qt6Quick.dll",
"Tools\ArdIrec\platforms\qwindows.dll"
)) {
$path = Join-Path $env:VIEWER_PUBLISH $relative
if (-not (Test-Path $path -PathType Leaf)) {
throw "Missing staged ArdIrec P1C runtime file: $path"
}
}

$fixtureDirectory = Join-Path $env:RUNNER_TEMP "COMTRADE fixture üñîçødé 日本 with spaces"
New-Item -ItemType Directory -Path $fixtureDirectory -Force | Out-Null
Copy-Item ".\ArdIrec\tests\data\binary.cfg" (Join-Path $fixtureDirectory "binary.cfg") -Force
Copy-Item ".\ArdIrec\tests\data\binary.dat" (Join-Path $fixtureDirectory "binary.dat") -Force
$fixtureCfg = Join-Path $fixtureDirectory "binary.cfg"
"NATIVE_BRIDGE_PATH=$(Join-Path $env:VIEWER_PUBLISH 'Tools\ArdIrec\ardirec_bridge.dll')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"COMTRADE_FIXTURE_CFG=$fixtureCfg" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

$startInfo = [System.Diagnostics.ProcessStartInfo]::new()
$startInfo.FileName = $viewer
$startInfo.UseShellExecute = $false
$startInfo.WorkingDirectory = Split-Path -Parent $viewer
$startInfo.ArgumentList.Add("--arsas-open")
$startInfo.ArgumentList.Add($fixtureCfg)
$startInfo.Environment["QT_QPA_PLATFORM"] = "offscreen"

$process = [System.Diagnostics.Process]::Start($startInfo)
if ($null -eq $process) { throw "Could not start staged ArdIrec compatibility viewer." }
Start-Sleep -Seconds 4
if ($process.HasExited) {
throw "ArdIrec compatibility viewer exited unexpectedly during launch smoke test (code $($process.ExitCode))."
$path = Join-Path $env:COMTRADE_PUBLISH $relative
if (Test-Path $path) { throw "Removed Qt/desktop fallback returned to package: $path" }
}
"ARSAS_ARDIREC_BRIDGE_PATH=$bridge" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

Stop-Process -Id $process.Id -Force
$process.WaitForExit()
Write-Host "P1C native bridge is staged; compatibility Qt launch also passed with a Unicode COMTRADE path containing spaces."
- name: Exercise managed bridge and distance locus against ArdIrec fixtures
shell: powershell
run: |
$basic = Join-Path $env:RUNNER_TEMP "COMTRADE üñîçødé 日本 with spaces"
New-Item -ItemType Directory -Path $basic -Force | Out-Null
Copy-Item ".\ArdIrec\tests\data\minimal_1999.cfg" (Join-Path $basic "minimal_1999.cfg") -Force
Copy-Item ".\ArdIrec\tests\data\minimal_1999.dat" (Join-Path $basic "minimal_1999.dat") -Force
$env:ARSAS_NATIVE_COMTRADE_TEST_CFG = Join-Path $basic "minimal_1999.cfg"
$env:ARSAS_NATIVE_LOCUS_TEST_CFG = Join-Path $env:GITHUB_WORKSPACE "ArdIrec\tests\data\distance_p1.cfg"

dotnet test .\ARSAS\tests\ARSAS.Tests\ARSAS.Tests.csproj `
-c Release --no-build --no-restore `
--filter "FullyQualifiedName~ArdIrecNativeBridgeIntegrationTests|FullyQualifiedName~ArdIrecLocusNativeSessionIntegrationTests"
if ($LASTEXITCODE -ne 0) { throw "Managed ArdIrec bridge/locus integration test failed." }
Loading
Loading