Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
279 commits
Select commit Hold shift + click to select a range
2544fee
Bench: add progressive static RCB plus MX fallback patch
masarray Sep 5, 2026
cd94a3c
CI: build Progressive Static IED bench executable
masarray Sep 5, 2026
b754c98
Fix dual-role static Pos status projection
masarray Sep 5, 2026
3fc52a8
Register dual-role static control status rows
masarray Sep 5, 2026
6085e8d
Keep exact static Pos control companions selected
masarray Sep 5, 2026
943333a
Add Q0 Pos dual-role static regression guards
masarray Sep 5, 2026
10f38c7
Sync static RCB regression wording
masarray Sep 5, 2026
b20c12a
Generalize static DataSet control companion projection by CDC
masarray Sep 5, 2026
af34703
Retain exact static controls independently of feedback rows
masarray Sep 5, 2026
d2c2615
Report generalized static control projection evidence
masarray Sep 5, 2026
4ef6f4d
Guard generalized static DataSet control retention
masarray Sep 5, 2026
6482886
Add shared Engineering/FAT command bridge
masarray Sep 5, 2026
2dadaab
Add command panel to FAT workspace
masarray Sep 5, 2026
09e9194
Guard shared FAT command panel contract
masarray Sep 5, 2026
a82b0d2
Fix FAT command panel lifecycle hook
masarray Sep 5, 2026
4691e3b
Harden FAT command feedback and Stop UX
masarray Sep 5, 2026
712e2c5
Guard FAT field UX defaults and failure feedback
masarray Sep 5, 2026
9f5a15e
P0 preserve shared Static DataSet selection authority
masarray Sep 5, 2026
cde0d95
P0 restore FAT live authority and shared SCL fast-connect
masarray Sep 5, 2026
fe636f7
P0 default Engineering control checks on signal creation
masarray Sep 5, 2026
cc4bb22
P0 keep appended Static DataSet mode authoritative
masarray Sep 5, 2026
3aeec02
Add Build #1888 P0 recovery regression gates
masarray Sep 5, 2026
0c6d548
Fix FAT runtime projection thread affinity and live binding bridge
masarray Sep 6, 2026
583c607
Stabilize FAT value templates and reflow header actions
masarray Sep 6, 2026
37bc974
Bind structured static DataSet members to resolved live leaves
masarray Sep 6, 2026
7676661
Quiesce FAT live projection before close persistence
masarray Sep 6, 2026
557e71b
Cover bench regressions from Build 1912
masarray Sep 6, 2026
04188d0
Keep FAT projection active when close is cancelled
masarray Sep 6, 2026
c5fc74e
Fix FAT close lifecycle compile shadowing
masarray Sep 6, 2026
b2db5d4
Install FAT V2 schema before first paint
masarray Sep 6, 2026
bcf663f
Guard FAT V2 first-paint schema
masarray Sep 6, 2026
9634132
Fix P1 first-paint regression guard
masarray Sep 6, 2026
e1045eb
Scope P1 first-paint test to Loaded handler
masarray Sep 6, 2026
6cffe3c
Compact FAT header action hierarchy
masarray Sep 6, 2026
c589878
Apply P2 compaction through existing P0 header pass
masarray Sep 6, 2026
ca050fe
Compact FAT clock status captions
masarray Sep 6, 2026
2d5ec0c
Compact FAT evidence action captions
masarray Sep 6, 2026
fc82cad
Guard P2 compact FAT header scope
masarray Sep 6, 2026
bdea756
Fix report-backed FAT analog evidence latency
masarray Sep 6, 2026
4007aeb
Remove per-event FAT evidence disk barriers
masarray Sep 6, 2026
318771d
Guard relay-bench FAT immediate evidence behavior
masarray Sep 6, 2026
74289c3
Keep final FAT evidence durability without per-event fsync
masarray Sep 6, 2026
8e2429f
Preserve FAT capture status contract for immediate report evidence
masarray Sep 6, 2026
db81148
Align FAT V2 regressions with immediate report evidence
masarray Sep 6, 2026
ad2c4b1
Fast-path already-live Engineering FAT signal matching
masarray Sep 6, 2026
a2592af
Guard already-live Engineering FAT fast attach
masarray Sep 6, 2026
992de77
P0: project FAT command live values from shared process image
masarray Sep 6, 2026
c39ec8c
P0: keep FAT command rows stable during live updates
masarray Sep 6, 2026
2fd1426
test: complete relay-bench fast-path fixture
masarray Sep 6, 2026
c1063c7
test: lock stable FAT command live projection
masarray Sep 6, 2026
90c62d7
fix(fat): keep Value1/Value2 rolling with latest process change
masarray Sep 6, 2026
cb79103
fix(fat): advance completed evidence pair on every new condition
masarray Sep 6, 2026
6716fce
test(fat): lock rolling Value1/Value2 regression
masarray Sep 6, 2026
0f20e27
fix(fat): remove preparation progress visual-tree hot loop
masarray Sep 6, 2026
f3a122d
test(fat): lock preparation progress off hot visual loop
masarray Sep 6, 2026
c56a945
fix(fat-report): remove optional download gate wording
masarray Sep 6, 2026
478909f
test(fat-report): lock concise COMTRADE evidence layout
masarray Sep 6, 2026
d89c61c
Fix FAT rolling capture operator override regression
masarray Sep 6, 2026
ef168e6
Align FAT progress regression with P0 responsiveness guard
masarray Sep 6, 2026
38cf760
Defer FAT close journal sealing off UI thread
masarray Sep 6, 2026
ff77630
Keep FAT close responsive while sealing journals
masarray Sep 6, 2026
f89a2c5
Guard responsive FAT close journal sealing
masarray Sep 6, 2026
991ef5b
Fix FAT P0 first-frame canonical templates
masarray Sep 6, 2026
3352a7f
Lock P0 first-frame and SCL connect-only regressions
masarray Sep 6, 2026
1340a0b
Fix FAT close lifecycle compile guard
masarray Sep 6, 2026
484c5a5
Fix deferred FAT seal record count typing
masarray Sep 6, 2026
612e1b5
Test Engineering Play static dataset connect-only path
masarray Sep 6, 2026
31b8c1b
P0: coalesce FAT journal flushes during UI resume
masarray Sep 6, 2026
cb0d411
P0: keep FAT resume and stop responsive
masarray Sep 6, 2026
33aa8b5
P0: cache FAT live projection index
masarray Sep 6, 2026
3e281d7
P0: project realtime IED connection health into FAT cards
masarray Sep 6, 2026
7b73e23
Fix P0 runtime action model import
masarray Sep 6, 2026
1c5f2a3
P0: roll composite FAT Value2 on any phase change
masarray Sep 6, 2026
0698f3c
Test composite FAT Value2 rolling
masarray Sep 6, 2026
b1c0bcb
Lock P0 FAT responsiveness and connection-health contracts
masarray Sep 6, 2026
4e86a61
P0: paint Start Continue busy state before FAT work
masarray Sep 6, 2026
4c07a3c
P0: instrument FAT command latency
masarray Sep 6, 2026
a53cc38
Test Start Continue responsive button path
masarray Sep 6, 2026
728404e
P0: align FAT command bridge regression with timing instrumentation
masarray Sep 6, 2026
4d87db7
P0: suppress stale poll flicker after confirmed control feedback
masarray Sep 6, 2026
520dac9
P0: cover command feedback freshness fence
masarray Sep 6, 2026
fd928d8
P0: tighten freshness fence source contract
masarray Sep 6, 2026
d84bcca
P0: keep stale command verification out of SOE
masarray Sep 6, 2026
38d9b1d
P0: cover freshness fence SOE integrity
masarray Sep 6, 2026
7158412
P0: preserve exact report provenance through command freshness fence
masarray Sep 6, 2026
a1dad1e
P0: lock exact SOE origin through freshness fence
masarray Sep 6, 2026
9eb8d1d
P0: behavior-test command freshness and SOE authority
masarray Sep 6, 2026
e35f420
P0: bind freshness fence to active control transaction
masarray Sep 6, 2026
35734a0
P0: behavior-test active command transaction fence
masarray Sep 6, 2026
f91abd0
P0: lock freshness fence to active command scope
masarray Sep 6, 2026
6d6628e
fix(fat): keep coherent completed transitions PASS across resume
masarray Sep 6, 2026
e6937db
fix(fat): keep current Value2 rolling after snapshot and recapture
masarray Sep 6, 2026
a435743
fix(fat): move evidence journal I/O off WPF hot path
masarray Sep 6, 2026
da7ff2e
fix(fat): remove FAT tooltips and compact actions to one row
masarray Sep 6, 2026
26f88c8
perf(fat): remove progress tooltip work from dispatcher ticks
masarray Sep 6, 2026
ef221e3
fix(fat): wrap full IEC references in report preview
masarray Sep 6, 2026
0307c08
feat(fat): append final tested witnessed approved sign-off page
masarray Sep 6, 2026
8f43baf
fix: accept coherent FAT pairs across source sequence resets
masarray Sep 6, 2026
8070110
fix: make rolling FAT capture decision journal-first
masarray Sep 6, 2026
f6307d3
fix(fat): preserve explicit operator evidence while rolling live pairs
masarray Sep 6, 2026
54424b7
fix(fat): review partial transition after reconnect gap
masarray Sep 6, 2026
36c6241
test(fat): align P0 invariants with compact one-row header
masarray Sep 6, 2026
bf0c52c
test(fat): lock one-row compact header layout
masarray Sep 6, 2026
773ceba
test(fat): verify queued journal writer instead of retired flush shim
masarray Sep 6, 2026
34db374
test(fat): lock nonblocking queued evidence journal path
masarray Sep 6, 2026
bfeb767
fix(fat): scope continuity review to explicit resume gaps
masarray Sep 6, 2026
396996e
test(fat): keep resume continuity regression non-destructive
masarray Sep 6, 2026
4eaa63b
test(fat): promote complete rolling pair journal-first
masarray Sep 6, 2026
618daca
fix(fat): advance rolling pair before current-pair assessment
masarray Sep 6, 2026
849be91
test(fat): align stale recapture review with current-pair semantics
masarray Sep 6, 2026
da16eac
fix(fat): reassert shared process image after control
masarray Sep 6, 2026
32aefab
fix(fat): bypass legacy blocking relay-bench hot paths
masarray Sep 6, 2026
1d24bfc
perf(fat): stop amplifying every evidence notification
masarray Sep 6, 2026
a7ea91b
fix(fat): make report preview a usable FAT record
masarray Sep 6, 2026
7037515
fix(fat): issue report as FAT record with sign-off
masarray Sep 6, 2026
9a00f9d
test(fat): lock physical bench non-blocking hot paths
masarray Sep 6, 2026
86fe907
fix(fat): keep current Value1 Value2 rolling after recapture
masarray Sep 6, 2026
267646f
test(fat): keep latest process pair after operator recapture
masarray Sep 6, 2026
b205c7c
fix(fat): coalesce legacy window notification fanout
masarray Sep 6, 2026
a9793b7
perf(fat): consume Engineering process image instead of raw runtime t…
masarray Sep 6, 2026
5f4e64e
fix(fat): keep LIVE VALUE owned by shared process image
masarray Sep 6, 2026
58fadff
perf(fat): route evidence from shared Engineering process image
masarray Sep 6, 2026
6d1286a
test(fat): lock shared Engineering process image authority
masarray Sep 6, 2026
4ebc86d
test(fat): lock freeze and live-value authority regressions
masarray Sep 6, 2026
69e192c
test(fat): complete operator rolling point fixture
masarray Sep 6, 2026
468e370
fix(fat): do not enqueue evidence for sequence-only churn
masarray Sep 6, 2026
18f9904
fix(fat): forward only changed session projection properties
masarray Sep 6, 2026
801073e
fix(fat): keep shared-live path free of legacy preparation call
masarray Sep 6, 2026
bbe929f
fix(fat): keep completed pair stable while polled candidate settles
masarray Sep 6, 2026
82b23dd
fix(fat): prime shared image before evidence session activation
masarray Sep 6, 2026
0fa8ceb
test(fat): prevent post-start full-image evidence burst
masarray Sep 6, 2026
fda7587
polish(fat-report): simplify customer-facing report text
masarray Sep 6, 2026
36b4c8c
test(fat-report): lock customer-facing report polish
masarray Sep 6, 2026
98500b9
feat(fat-report): unify preview typography
masarray Sep 7, 2026
e6ab04c
feat(fat-report): add Inter-first typography policy
masarray Sep 7, 2026
3bfe845
feat(fat-report): embed unified Inter or Segoe PDF font
masarray Sep 7, 2026
034f080
refactor(fat-report): improve evidence readability and hierarchy
masarray Sep 7, 2026
d87daac
polish(fat-report): align supplemental footer typography
masarray Sep 7, 2026
abb640c
feat(fat-ui): add per-IED session close and Lucide report toolbar
masarray Sep 7, 2026
b8ae3f0
feat(fat-report): add phase-aware signal display names
masarray Sep 7, 2026
031ec9c
feat(fat-report): polish signal labels and micro typography
masarray Sep 7, 2026
4c79bf6
fix(fat-ui): make report polish self-contained
masarray Sep 7, 2026
307b5e7
feat(fat-report): apply customer-facing report polish
masarray Sep 7, 2026
9209a66
feat(fat-report): support arbitrary per-IED report scopes
masarray Sep 7, 2026
f13339d
test(fat-report): lock professional PDF and per-IED behavior
masarray Sep 7, 2026
5d62eaf
fix(fat-ui): reuse existing visual-tree helper
masarray Sep 7, 2026
708753d
fix(fat-report): keep scoped IED collection strongly typed
masarray Sep 7, 2026
79ab48a
test(fat-report): lock Inter with Segoe UI fallback
masarray Sep 7, 2026
4ee46ab
test(fat-report): align executive typography contract
masarray Sep 7, 2026
8d5e52e
fix(fat): keep complete good state pairs PASS across sessions
masarray Sep 7, 2026
8850a12
fix(fat): hide removed signals from active FAT grid
masarray Sep 7, 2026
8bde411
fix(fat-report): use Lucide save and refresh icons
masarray Sep 7, 2026
16e864f
fix(comtrade): make re-download selectable and overwrite via staging
masarray Sep 7, 2026
77ae7b4
Phase B: add per-IED progress identity fingerprints
masarray Sep 7, 2026
6bd32b2
Phase B: restore FAT progress per IED identity
masarray Sep 7, 2026
f8ac6ba
Phase B: regress per-IED FAT progress restore isolation
masarray Sep 7, 2026
a51c0d3
test(fat-report): align preview icon regression with lucide save
masarray Sep 7, 2026
047ccfd
test(fat): align current evidence regressions with reconnect provenan…
masarray Sep 7, 2026
e7c99bc
Phase C: freeze per-IED FAT report snapshots
masarray Sep 7, 2026
eb1143b
Phase C: use immutable report scope for preview and PDF
masarray Sep 7, 2026
075679c
Phase C: regress immutable per-IED report isolation
masarray Sep 7, 2026
d836caf
Phase C: fail closed on ambiguous report IED ownership
masarray Sep 7, 2026
10090b4
test: align IED report scope with immutable snapshot
masarray Sep 7, 2026
fddffac
fix: establish Engineering SCL authority before FAT publish
masarray Sep 7, 2026
b68046d
test: lock Engineering-first SCL append authority
masarray Sep 7, 2026
978e4ee
Fix shared command safety defaults for Engineering and FAT
masarray Sep 7, 2026
1cf676e
Publish FAT live process image before evidence capture
masarray Sep 7, 2026
7e8ecc6
Make removed FAT signals leave the active grid immediately
masarray Sep 7, 2026
df94c23
Make FAT signal names IEC phase-aware without changing identity
masarray Sep 7, 2026
acb6b3b
Make downloaded COMTRADE rows reliably selectable for re-download
masarray Sep 7, 2026
fa72bb6
Detect offline IEDs and reconnect automatically from shared Engineeri…
masarray Sep 7, 2026
c39aa5d
Add multi-select RCB export window for generic SCL
masarray Sep 7, 2026
9b741f5
Export multiple selected RCBs with native IED DataSets
masarray Sep 7, 2026
2bf5993
Lock FAT live-before-evidence ordering regression
masarray Sep 7, 2026
d2698be
Add regression coverage for latest field-reported fixes
masarray Sep 7, 2026
611e35f
Fix shared process regression assertions for deferred route owner
masarray Sep 7, 2026
d482bea
Avoid auto-reconnect after an intentional manual disconnect
masarray Sep 7, 2026
4768b2e
Keep multi-RCB export continuations on the WPF dispatcher
masarray Sep 7, 2026
020e688
P0: use semantic IEC signal names in live grids
masarray Sep 7, 2026
1897576
P0: compact FAT live IED subtitle
masarray Sep 7, 2026
210eed6
P0: detect proven IED loss after ICMP transport errors
masarray Sep 7, 2026
d80f6dd
P0: make downloaded COMTRADE selection single-authority
masarray Sep 7, 2026
d2246de
P0: include downloaded records in COMTRADE select-all
masarray Sep 7, 2026
e17951e
P0: route production RCB button directly to multi-select export
masarray Sep 7, 2026
71c734a
fix: remove invalid FAT row presentation hook
masarray Sep 7, 2026
c95174d
fix: preserve field presentation regressions with semantic names
masarray Sep 7, 2026
0ac7168
fix(fat): never auto-toggle operator test selection
masarray Sep 7, 2026
5bac219
fix(comtrade): make row click and checkbox share one selection authority
masarray Sep 7, 2026
879a6e1
fix(rcb): guarantee production button routes to true multi-select export
masarray Sep 7, 2026
4354ede
Fix production RCB export routing initialization
masarray Sep 7, 2026
4134988
Allow FAT IEC reference column to expand
masarray Sep 7, 2026
61c63b9
Make Engineering semantic signal names deterministic
masarray Sep 7, 2026
4d3d867
Gate FAT evidence behind committed LIVE projection
masarray Sep 7, 2026
6cf42ed
Restore IED Explorer header home navigation
masarray Sep 7, 2026
30d0b77
Lock latest field bench UX contracts
masarray Sep 7, 2026
d854e97
Fix FAT column sizing compile and late apply
masarray Sep 7, 2026
fe4be16
Fix FAT live commit index rebuild compile
masarray Sep 7, 2026
5e9b949
Update shared FAT process image regression contract
masarray Sep 7, 2026
3693cbb
Align latest field regressions with production fixes
masarray Sep 7, 2026
a64db5e
Fix FAT signal column semantic phase labels
masarray Sep 7, 2026
9866f9f
Force production RCB multi-select pointer workflow
masarray Sep 7, 2026
9da75f9
Fix COMTRADE redownload checkbox visual selection
masarray Sep 7, 2026
5f58d2b
Make FAT LIVE mirror immediate before evidence
masarray Sep 7, 2026
7205fe0
Add regression guards for latest relay bench fixes
masarray Sep 7, 2026
1f083cd
Apply FAT semantic signal template after V2 column rebuild
masarray Sep 7, 2026
8d83f3e
Align relay bench semantic regression with final template authority
masarray Sep 7, 2026
6f68d4b
P0: make RCB inclusion truly multi-select
masarray Sep 7, 2026
f50a523
P0: keep RCB multi-select authority self-contained
masarray Sep 7, 2026
db7b5ff
P0: add behavioral selection and FAT authority regressions
masarray Sep 7, 2026
07c8172
test: satisfy IoTestPointPlan contract in P0 recovery tests
masarray Sep 7, 2026
27850b3
fix: enforce monotonic LIVE-before-evidence publication
masarray Sep 7, 2026
8137d53
test: gate evidence on monotonic LIVE publication
masarray Sep 7, 2026
d62a485
fix: reject transient ARSAS DataSets from SCL export
masarray Sep 7, 2026
bd31a8e
test: prove runtime DataSet export containment
masarray Sep 7, 2026
788a23c
feat: persist closed IED FAT evidence checkpoints
masarray Sep 7, 2026
d2c9a5c
P0: add Engineering close-Ied transaction
masarray Sep 7, 2026
a2eb7da
P0: wire Close IED and reimport evidence restore
masarray Sep 7, 2026
19472f1
P0: add closed-Ied checkpoint behavioral regressions
masarray Sep 7, 2026
9e8a640
P0: fix closed-Ied lifecycle compile import
masarray Sep 7, 2026
7446554
P0: align LIVE evidence regressions to monotonic gate
masarray Sep 7, 2026
4c09880
P0: align field regressions to centralized selection and evidence gates
masarray Sep 7, 2026
7bc76da
P0: assert deterministic LIVE-before-evidence publication
masarray Sep 7, 2026
226df32
P1: unify COMTRADE row selection authority
masarray Sep 7, 2026
3c0de5e
P1: route COMTRADE pointer selection through row model
masarray Sep 7, 2026
de8639a
P1: remove dual COMTRADE selection state
masarray Sep 7, 2026
443ee95
P1: centralize semantic signal display naming
masarray Sep 7, 2026
42c4c40
P1: make FAT naming formatter a canonical facade
masarray Sep 7, 2026
29da565
P1: route Engineering semantic names through shared authority
masarray Sep 7, 2026
1cc40eb
P1: use semantic signal names in FAT report
masarray Sep 7, 2026
9bfbfa7
P1: preserve IEC reference width across FAT reopen
masarray Sep 7, 2026
8ced385
P1: migrate P0 regressions to unified authorities
masarray Sep 7, 2026
4d65f7a
P1: unify COMTRADE header selection authority
masarray Sep 7, 2026
36fd3cb
P1: update field regressions for unified COMTRADE selection
masarray Sep 7, 2026
423d009
P1 bench: make command safety defaults registration deterministic
masarray Sep 7, 2026
74680f2
P1 bench: route legacy RCB selections through generic multi exporter
masarray Sep 7, 2026
84277f7
P1 bench: make legacy RCB filter independently multi-select
masarray Sep 7, 2026
a30189e
P1 bench: fence stale command feedback before Engineering and FAT pro…
masarray Sep 7, 2026
d37b7a4
P1 bench: add operator supplied relay fascia SVG
masarray Sep 7, 2026
98ae381
P1 bench: replace IED fascia with supplied SVG vector
masarray Sep 7, 2026
5fc43b1
P1 bench: update fascia regression for supplied SVG artwork
masarray Sep 7, 2026
a858211
P1 bench: lock physical relay hotfix contracts
masarray Sep 7, 2026
adec9a7
P1 bench: keep freshness enum internal in regression theory
masarray Sep 7, 2026
1b33476
P1 bench: migrate legacy fascia test to supplied relay artwork
masarray Sep 7, 2026
9e89779
P1 bench: keep legacy SCL XML out of JSON reports
masarray Sep 7, 2026
0b1d815
P1 bench: regress legacy SCL JSON cycle
masarray Sep 7, 2026
a3e6501
P1 bench: disambiguate SCL export regression shim
masarray Sep 7, 2026
39505d2
release: bump VERSION to 1.6.34
masarray Sep 8, 2026
4cea4fa
release: bump shared version metadata to 1.6.34
masarray Sep 8, 2026
529238b
release: bump application version to 1.6.34
masarray Sep 8, 2026
816e774
release: request Windows publication for 1.6.34
masarray Sep 8, 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
114 changes: 114 additions & 0 deletions .github/workflows/progressive-static-bench.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: Build Progressive Static IED Bench

on:
push:
branches:
- fix/static-dataset-rcb-backed-acquisition
workflow_dispatch:

permissions:
contents: read

jobs:
build-progressive-static:
name: Build Progressive Static portable EXE
runs-on: windows-latest
steps:
- name: Checkout ARSAS branch
uses: actions/checkout@v4
with:
fetch-depth: 1

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

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

- name: Checkout exact ARIEC engine revision
shell: powershell
run: |
$engineRoot = Join-Path $env:RUNNER_TEMP 'ARIEC61850'
git clone --quiet --filter=blob:none --no-checkout "https://github.com/$env:ARIEC61850_REPOSITORY.git" $engineRoot
git -C $engineRoot fetch --quiet --depth 1 origin $env:ARIEC61850_COMMIT
git -C $engineRoot checkout --quiet --detach $env:ARIEC61850_COMMIT
$actual = (git -C $engineRoot rev-parse HEAD).Trim()
if ($actual -ne $env:ARIEC61850_COMMIT) {
throw "Engine pin mismatch: expected $env:ARIEC61850_COMMIT, got $actual"
}
$engineProject = Join-Path $engineRoot 'src\AR.Iec61850\AR.Iec61850.csproj'
$npcapProject = Join-Path $engineRoot 'src\AR.Iec61850.Transports.Npcap\AR.Iec61850.Transports.Npcap.csproj'
"ENGINE_PROJECT=$engineProject" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append
"NPCAP_PROJECT=$npcapProject" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append

- name: Apply Progressive Static bench policy
shell: powershell
run: |
.\scripts\apply-progressive-static-bench.ps1 -ProjectRoot $env:GITHUB_WORKSPACE
$runtime = Get-Content .\Services\Iec61850MonitorRuntime.cs -Raw
$selection = Get-Content .\Services\Iec61850StaticDataSetAuthoritySelection.cs -Raw
if ($runtime -notmatch 'Progressive Static acquisition ready' -or
$runtime -notmatch 'Static DataSet: MMS polling fallback' -or
$runtime -notmatch 'uncovered MX measurement' -or
$selection -match 'reportBackedDataSets.Contains') {
throw 'Progressive Static bench source verification failed.'
}

- name: Build patched bench source
shell: powershell
run: |
dotnet restore .\ArIED61850Tester.csproj `
-p:ArIec61850Project="$env:ENGINE_PROJECT" `
-p:ArIec61850NpcapProject="$env:NPCAP_PROJECT"
if ($LASTEXITCODE -ne 0) { throw "restore failed: $LASTEXITCODE" }

dotnet build .\ArIED61850Tester.csproj -c Release --no-restore `
-p:ArIec61850Project="$env:ENGINE_PROJECT" `
-p:ArIec61850NpcapProject="$env:NPCAP_PROJECT"
if ($LASTEXITCODE -ne 0) { throw "build failed: $LASTEXITCODE" }

- name: Publish portable Progressive Static EXE
shell: powershell
run: |
.\scripts\publish-windows-portable.ps1 `
-Version '1.6.33-progressive-static' `
-Runtime 'win-x64' `
-SingleFile $true `
-SelfContained $true `
-EngineProject $env:ENGINE_PROJECT `
-NpcapProject $env:NPCAP_PROJECT

$source = '.\dist\ARSAS-1.6.33-progressive-static-win-x64-portable.exe'
$target = '.\dist\ARSAS-1.6.33-Progressive-Static-IED-Test.exe'
if (!(Test-Path $source -PathType Leaf)) {
throw "Portable EXE was not produced: $source"
}
Move-Item $source $target -Force
$hash = (Get-FileHash $target -Algorithm SHA256).Hash.ToLowerInvariant()
$head = (git rev-parse HEAD).Trim()
@(
"ARSAS head: $head",
"ARIEC engine: $env:ARIEC61850_COMMIT",
'Bench policy: configured RCB first; uncovered MX/measurement -> bounded MMS polling; uncovered discrete -> fail-closed; dynamic DataSet writes -> disabled.',
"SHA256: $hash"
) | Set-Content .\dist\Progressive-Static-build-info.txt -Encoding utf8
Write-Host "SHA256=$hash"

- name: Upload Progressive Static IED test artifact
uses: actions/upload-artifact@v4
with:
name: ARSAS-Progressive-Static-IED-Test
path: |
dist/ARSAS-1.6.33-Progressive-Static-IED-Test.exe
dist/Progressive-Static-build-info.txt
if-no-files-found: error
retention-days: 14
4 changes: 2 additions & 2 deletions .release/windows.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"version": "1.6.33",
"version": "1.6.34",
"channel": "stable",
"platform": "windows-x64",
"primaryAsset": "ARSAS-Windows-x64-Setup.exe",
"publicationRequest": 21
"publicationRequest": 22
}
6 changes: 3 additions & 3 deletions ArIED61850Tester.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
<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 and evidence export, SCL workflows, diagnostics, sequence of events, and guarded control validation.</Description>
<Version>1.6.33</Version>
<AssemblyVersion>1.6.33.0</AssemblyVersion>
<FileVersion>1.6.33.0</FileVersion>
<Version>1.6.34</Version>
<AssemblyVersion>1.6.34.0</AssemblyVersion>
<FileVersion>1.6.34.0</FileVersion>
<PackageProjectUrl>https://github.com/masarray/arsas</PackageProjectUrl>
<RepositoryUrl>https://github.com/masarray/arsas</RepositoryUrl>
<RepositoryType>git</RepositoryType>
Expand Down
47 changes: 47 additions & 0 deletions Assets/RelayFascia.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<Version>1.6.33</Version>
<AssemblyVersion>1.6.33.0</AssemblyVersion>
<FileVersion>1.6.33.0</FileVersion>
<InformationalVersion>1.6.33</InformationalVersion>
<Version>1.6.34</Version>
<AssemblyVersion>1.6.34.0</AssemblyVersion>
<FileVersion>1.6.34.0</FileVersion>
<InformationalVersion>1.6.34</InformationalVersion>
</PropertyGroup>
</Project>
17 changes: 7 additions & 10 deletions FaultRecordWindow.HeaderSelection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
namespace ArIED61850Tester;

/// <summary>
/// Adds a tri-state select-all checkbox to the fault-record Get column. Selecting all
/// affects only rows that are currently eligible for download; clearing always clears
/// every row so stale disabled selections cannot remain hidden.
/// Adds a tri-state select-all checkbox to the fault-record Get column. A record with relay
/// files is selectable whether it is a first download or an intentional re-download.
/// FaultRecordRow.IsSelected is the single transfer-selection authority for every row.
/// </summary>
public partial class FaultRecordWindow
{
Expand Down Expand Up @@ -75,7 +75,7 @@ private void EnsureFaultRecordHeaderSelection()
VerticalAlignment = VerticalAlignment.Center,
Cursor = Cursors.Hand,
Focusable = true,
ToolTip = "Check / uncheck all downloadable fault records"
ToolTip = "Check / uncheck all downloadable or re-downloadable fault records"
};
AutomationProperties.SetName(headerCheckBox, "Toggle all downloadable fault records");
headerCheckBox.Click += FaultRecordHeaderSelectionCheckBox_Click;
Expand Down Expand Up @@ -104,19 +104,16 @@ private void FaultRecordHeaderSelectionCheckBox_Click(object sender, RoutedEvent
try
{
foreach (var row in Records)
{
if (target)
row.IsSelected = row.CanSelectForDownload;
else
row.IsSelected = false;
}
row.IsSelected = target && row.CanSelectForDownload;
}
finally
{
_faultRecordHeaderBulkUpdate = false;
}

RaiseSelectionState();
UpdateSmartSelectionUi();
ConfigureVisibleRecordRows();
RefreshFaultRecordHeaderSelection();
}

Expand Down
93 changes: 93 additions & 0 deletions FaultRecordWindow.RedownloadSelectionAuthority.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;

namespace ArIED61850Tester;

/// <summary>
/// One pointer-selection authority for the fault-record grid. Clicking either the SELECT
/// checkbox or anywhere on a transferable record row toggles FaultRecordRow.IsSelected exactly
/// once. Local Downloaded state never owns a second selection set; it only changes transfer
/// semantics from first download to staged atomic replacement.
/// </summary>
public partial class FaultRecordWindow
{
[ModuleInitializer]
internal static void RegisterRedownloadSelectionAuthority()
{
EventManager.RegisterClassHandler(
typeof(DataGrid),
UIElement.PreviewMouseLeftButtonDownEvent,
new MouseButtonEventHandler(RedownloadSelectionAuthority_Down),
handledEventsToo: true);
}

private static void RedownloadSelectionAuthority_Down(object sender, MouseButtonEventArgs e)
{
if (sender is not DataGrid grid ||
Window.GetWindow(grid) is not FaultRecordWindow window ||
!ReferenceEquals(grid, window.FaultRecordsGrid) ||
window.IsBusy ||
e.ChangedButton != MouseButton.Left ||
!TryResolveTransferRow(e.OriginalSource as DependencyObject, out var row) ||
!row.CanSelectForDownload)
{
return;
}

row.IsSelected = !row.IsSelected;

// Suppress the native checkbox/DataGrid toggle so one pointer action means exactly
// one selection change. Repaint after input processing; doing this synchronously in
// PreviewMouseDown lets the CheckBox template's pressed-state transition erase the
// visible tick even though the model already changed.
e.Handled = true;
window.Dispatcher.BeginInvoke(
DispatcherPriority.Input,
new Action(() =>
{
window.ConfigureRecordRow(row);
window.UpdateSmartSelectionUi();
}));
}

private static bool TryResolveTransferRow(DependencyObject? source, out FaultRecordRow row)
{
row = null!;
var dataGridRow = FindRedownloadSelectionAncestor<DataGridRow>(source);
if (dataGridRow?.DataContext is not FaultRecordRow candidate)
return false;

row = candidate;
return true;
}

private static T? FindRedownloadSelectionAncestor<T>(DependencyObject? source)
where T : DependencyObject
{
var current = source;
while (current != null)
{
if (current is T match)
return match;

DependencyObject? parent = null;
try
{
parent = VisualTreeHelper.GetParent(current);
}
catch (InvalidOperationException)
{
}

if (parent == null && current is FrameworkElement element)
parent = element.Parent;
current = parent;
}

return null;
}
}
Loading
Loading