Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1636 commits
Select commit Hold shift + click to select a range
9127f10
ux(write): typed current values on open, Boolean/ctlModel selection, …
masarray Oct 23, 2026
9997f11
test(write): preserve earlier FAT controls and static write caption a…
masarray Oct 23, 2026
6fe2761
test(write): preserve earlier FAT controls and static write caption a…
masarray Oct 23, 2026
40a2200
test(write): regression guards for scalar, batch and unified native e…
masarray Oct 23, 2026
6ee863d
test(write): enforce read-backed Boolean and ctlModel editors, explic…
masarray Oct 23, 2026
b896e77
fix(cleanroom): keep UX code and comments independent of named extern…
masarray Oct 23, 2026
ae6421e
fix(cleanroom): keep UX code and comments independent of named extern…
masarray Oct 23, 2026
73af5bb
fix(cleanroom): keep UX code and comments independent of named extern…
masarray Oct 23, 2026
5789cf1
fix(write): exact vector of user-provided Material edit icon in unifi…
masarray Oct 23, 2026
6748b4e
fix(sg7): prioritize discovered CSWI.Pos despite unresolved live CDC …
masarray Oct 23, 2026
6dee339
fix(sg7): show verification-required role only for non-operable CSWI …
masarray Oct 23, 2026
5e1c9b2
test(sg7): four discovered CSWI prioritized before GGIO without bypas…
masarray Oct 23, 2026
ac13b6c
ux(write): unify two legacy and native config workflows behind one fi…
masarray Oct 23, 2026
0e99827
ux(write): hide duplicate config button; native editor remains reacha…
masarray Oct 23, 2026
102b1b1
test(write): protect one visible fixed Write button and all native ro…
masarray Oct 23, 2026
acafcef
fix(sg7): do not treat local ctlModel text as independent CO-service …
masarray Oct 23, 2026
e00f76d
fix(sg7): allow read-only typed CSWI Open/Close preflight while retai…
masarray Oct 23, 2026
673cc8a
fix(build): remove orphaned duplicate single-DA class tail and initia…
masarray Oct 23, 2026
a189eba
test(integration): lock CSWI-first CommandSignals and runtime-owned c…
masarray Oct 23, 2026
9eec4ab
test(integration): lock CSWI-first CommandSignals and runtime-owned c…
masarray Oct 23, 2026
ddffe0e
test(integration): lock CSWI-first CommandSignals and runtime-owned c…
masarray Oct 23, 2026
5613db3
feat(sg7): replace generic pending text with exact static DataSet/RCB…
masarray Oct 23, 2026
cf2460d
test(sg7): separate missing initial-image evidence from proven routed…
masarray Oct 23, 2026
3dd52c3
sync(fat): preserve concurrent SG7 command, report scheduling and sor…
masarray Oct 23, 2026
71847f4
sync(fat): preserve concurrent SG7 command, report scheduling and sor…
masarray Oct 23, 2026
6d76437
sync(fat): preserve concurrent SG7 command, report scheduling and sor…
masarray Oct 23, 2026
85a8c4f
sync(fat): preserve concurrent SG7 command, report scheduling and sor…
masarray Oct 23, 2026
722445d
sync(fat): preserve concurrent SG7 command, report scheduling and sor…
masarray Oct 23, 2026
b614738
sync(fat): include concurrent SG7 safety regression tests from FAT so…
masarray Oct 23, 2026
f52cc93
sync(fat): include concurrent SG7 safety regression tests from FAT so…
masarray Oct 23, 2026
7671bac
sync(fat): keep latest SG7 MainWindow source and preserve single stab…
masarray Oct 23, 2026
e865237
fix(sg7): prevent name-only DPC label from bypassing CSWI service-evi…
masarray Oct 23, 2026
8561212
test(write): follow compact grid row and pinned footer after removing…
masarray Oct 23, 2026
c4cc381
ux(write): keep Browser toolbar caption and footprint stable as Write
masarray Oct 23, 2026
2e48dc6
ux(write): use supplied Material pencil vector and fixed Write label
masarray Oct 23, 2026
b519a1b
ux(write): replace bulky single-DA form with compact IEDScout-style N…
masarray Oct 23, 2026
58452e1
ux(write): type-driven Boolean dropdown and current-value prefill; pr…
masarray Oct 23, 2026
c840032
ux(write): compact multi-DA editor with Name/Current/Value and type-d…
masarray Oct 23, 2026
c8c8f0d
ux(write): bind multi-DA Boolean dropdown after live GVA and prefill …
masarray Oct 23, 2026
e5a9739
test(write-ux): enforce stable pencil Write button and live typed IED…
masarray Oct 23, 2026
93dfa25
fix(write-ux): preserve Material pencil button content through select…
masarray Oct 23, 2026
a261c94
test(write-ux): assert selection refresh never destroys pencil visual
masarray Oct 23, 2026
459df5e
ux(write): lock multi-DA inputs until live GVA/Read, no empty or inve…
masarray Oct 23, 2026
6a08c2f
ux(write): enable per-DA typed input only after inspected GVA
masarray Oct 23, 2026
d0ce733
test(write-ux): preserve selector routing while toolbar keeps fixed M…
masarray Oct 23, 2026
4cf9d6f
test(write-ux): preserve selector routing while toolbar keeps fixed M…
masarray Oct 23, 2026
53c20ce
test(write): enforce typed inline editor behavior and fixed pencil ac…
masarray Oct 23, 2026
442134e
chore(cleanroom): remove external product name from test path
masarray Oct 23, 2026
5ed6b6b
test(write): verify all batch editors stay locked until live MMS insp…
masarray Oct 23, 2026
24734b9
fix(build): reconstruct single-DA typed Write UI code from intact FAT…
masarray Oct 23, 2026
9e781aa
fix(build): regenerate batch editor from healthy base with verified G…
masarray Oct 23, 2026
524751a
fix(ssot): publish verified MMS reads before presentation with associ…
masarray Oct 23, 2026
4b3804f
fat(write): type-driven in-row value editing and stable Write toolbar
masarray Oct 23, 2026
c975f45
fix(sg7): project real prior MMS Read as static initial snapshot with…
masarray Oct 23, 2026
f69019c
fix(ci): recheck transient canonical Build status without ever accept…
masarray Oct 23, 2026
16184df
fix(ssot): reconcile explicit static MMS Read journal into monitor ro…
masarray Oct 23, 2026
d2a684c
fix(sg7): format verified MMS snapshots as IEC process states without…
masarray Oct 23, 2026
564e344
test(ci): serialize real WPF STA regressions without disabling domain…
masarray Oct 23, 2026
2117ba7
fix(sg7): expose per-RCB initial image and exact ingress diagnostics;…
masarray Oct 23, 2026
6dc45c4
test(sg7): require real receive timestamp in per-RCB ingress fixture
masarray Oct 23, 2026
89b3fa4
perf(sg7): freeze static report point membership once per monitor, el…
masarray Oct 23, 2026
014dc92
fix(control): require exact same-object stVal for SG7 DPC Boolean ctl…
masarray Oct 23, 2026
88ac63e
test(control): assert stricter exact DPC Boolean feedback gate in nat…
masarray Oct 23, 2026
85a4fba
feat(write): compact ctlModel Name/Value picker with pinned Material …
masarray Oct 23, 2026
5ca60e6
fix(write): fence live ctlModel inspection across reconnect and requi…
masarray Oct 23, 2026
133bd67
test(write): guard compact CF picker, Material icons, live-associatio…
masarray Oct 23, 2026
423d976
test(write): correct XAML document root assertion and exact fail-clos…
masarray Oct 23, 2026
05acb4c
test(write): align legacy commissioning UI regression with Material i…
masarray Oct 23, 2026
2eb5cce
fix(ci): keep reference-application names out of clean-room XAML source
masarray Oct 23, 2026
54a5696
test(write): assert pinned footer row on parent Grid rather than its …
masarray Oct 23, 2026
83e3820
fix(sg7): fail closed for prefixed CSWI until engine verified; fence …
masarray Oct 23, 2026
e9b2904
test(control): assert final typed CDC plus exact DPC feedback gate be…
masarray Oct 23, 2026
53b95de
merge(FAT): reconcile SG7 native control fixes with isolated ctlModel…
masarray Oct 23, 2026
9758d05
perf(report): index static DataSet selection by exact IEC ancestor an…
masarray Oct 23, 2026
e575869
merge(FAT): retain newest report projection cache and scoped ctlModel…
masarray Oct 23, 2026
466f121
fix(sg7): observe all RCBs for bounded report proof window with assoc…
masarray Oct 23, 2026
0fd88f1
merge(FAT): preserve SG7 bounded RCB evidence and isolated ctlModel W…
masarray Oct 23, 2026
e50bd74
test(report): bind indexed THD fixture to exact canonical model identity
masarray Oct 23, 2026
33b07ff
fix(report): keep ambiguous aggregate parents fail-closed in indexed …
masarray Oct 23, 2026
575cca8
merge(FAT): verified ctlModel Write UX and fresh fail-closed SG7 repo…
masarray Oct 23, 2026
9e73fd1
merge(FAT): rebase guarded Browser multi-DA editor without overwritin…
masarray Oct 23, 2026
ff02f12
fix(write): forbid generic ctlModel and unverified enum encoding; exp…
masarray Oct 23, 2026
d95d44a
feat(write): surface verified enum-mapping absence in inline placeholder
masarray Oct 23, 2026
93241c7
fix(safety): enforce native ctlModel/CO ownership at final primitive …
masarray Oct 23, 2026
d6775c8
test(safety): prove dedicated ctlModel dispatch and fail-closed nonve…
masarray Oct 23, 2026
91a0583
test(write): reject missing enum metadata and generic ctlModel while …
masarray Oct 23, 2026
b66b09c
feat(write): fixed Material pencil+Write and Material Cancel in compa…
masarray Oct 23, 2026
e0c5ca3
feat(write): unify batch Inspect/Write/Close with registry Material a…
masarray Oct 23, 2026
45e895d
test(write): assert pinned Material pencil action and stable label on…
masarray Oct 23, 2026
d72b6f7
fix(write): restrict generic ctlModel/CO ban to Write entry; restore …
masarray Oct 23, 2026
7a2d911
merge(write): integrate verified ctlModel editor and live association…
masarray Oct 23, 2026
b8dba5a
merge(FAT): harmonize typed Browser Write, native service safety and …
masarray Oct 23, 2026
82a0178
merge(write): integrate type-aware MMS DA editors and final native wr…
masarray Oct 23, 2026
7ae53e1
fix(ui): preserve IEC BSC signed step posVal and align command dock d…
masarray Oct 23, 2026
e090613
fix(bsc): keep Command Dock tap position as typed signed INT8 despite…
masarray Oct 23, 2026
8c1c6ab
trial(control): pin code-green ARIEC staging typed same-DO control wi…
masarray Oct 23, 2026
be0d2a1
fix(build): restore clean formatter source with exact signed BSC step…
masarray Oct 23, 2026
3d86fcf
ci(control): qualify exact staged typed engine SHA across protected t…
masarray Oct 23, 2026
d8903ba
test(control): prove typed same-DO DPC is name independent and enhanc…
masarray Oct 23, 2026
98fad11
test(integration): qualify immutable staging ancestry, native RIO sid…
masarray Oct 23, 2026
3b1149b
feat(write): one-click ctlModel with automatic live readback and inli…
masarray Oct 23, 2026
873e4d1
ui(write): compact Inter ctlModel editor and inline readback notifica…
masarray Oct 23, 2026
63e94d0
feat(browser): explicit Write DO path for multiple attributes while p…
masarray Oct 23, 2026
5882e2d
ui(browser): expose Write DO beside single-leaf Write for multi-leaf …
masarray Oct 23, 2026
30918e0
feat(write): single DA click dispatch with bounded live readback and …
masarray Oct 23, 2026
ed28f4f
feat(write): batch DA live preload, one-click typed multi-write and p…
masarray Oct 23, 2026
0251792
ui(write): compact Inter Name/Value multi-DA editor with Read and rea…
masarray Oct 23, 2026
2fde706
ui(typography): use packaged Inter for application code/reference tex…
masarray Oct 23, 2026
9c6d5e6
test(write): guard explicit click, live ctlModel readback and no moda…
masarray Oct 23, 2026
ae1babf
ui(write): replace verbose single-DA failure wording with compact inl…
masarray Oct 23, 2026
e4464cf
ui(write): green verified and amber refused readback toast for single DA
masarray Oct 23, 2026
e2a825c
ui(write): compact nonmodal batch readback and rejection toast
masarray Oct 23, 2026
5429da8
feat(write): batch toast state and explicit Read of unchanged selecte…
masarray Oct 23, 2026
d24affc
fix(write): reuse reviewed fail-closed Boolean preselection guard fro…
masarray Oct 23, 2026
55e7484
test(write): single/multi access, no modal, live readback and embedde…
masarray Oct 23, 2026
3407a7c
test(write): correct C# quote escapes in source-based UI assertions
masarray Oct 23, 2026
0b54db7
ux(write): useful Read without editing and concise batch refusal reason
masarray Oct 23, 2026
247239e
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
8249028
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
2e7b61d
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
d716c0d
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
2c174cf
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
f142cce
ui(typography): replace system monospace font with embedded Inter res…
masarray Oct 23, 2026
cc3aed9
ux(write): remove legacy Config Write modal; preserve per-DA readback…
masarray Oct 23, 2026
5b5fc4e
test(write): enforce no redundant confirmation in legacy config editor
masarray Oct 23, 2026
bc5ab2c
test(write): enforce no redundant confirmation in legacy config editor
masarray Oct 23, 2026
3bc17cc
ui(write): compact inline result banner in legacy config multi-write
masarray Oct 23, 2026
e6c80b5
ux(write): color-coded verified/refused result and terse IED reason i…
masarray Oct 23, 2026
8cf9ca5
fix(write): tolerate missing native refusal detail in compact toast
masarray Oct 23, 2026
8508514
fix(write): require independent multi-DA readback to match requested …
masarray Oct 23, 2026
a1b5c0b
test(write): regression guard on independent multi-DA MMS byte readba…
masarray Oct 23, 2026
18848f7
fix(write): disable unsupported live MMS types and unknown Booleans i…
masarray Oct 23, 2026
e6e8e72
fix(write): fail closed if multi-DA live value or GVA changed since o…
masarray Oct 23, 2026
25a62ba
test(write): guard old live value and GVA evidence across operator ed…
masarray Oct 23, 2026
aefa464
fix(build): compare native ctlModel enum across API types using valid…
masarray Oct 23, 2026
14ef564
test(write): replace obsolete modal confirmation assertion with live …
masarray Oct 23, 2026
2768bc4
Merge pull request #718 from masarray/staging/fat-smart-write-inline-…
masarray Oct 23, 2026
d481907
fix(command-dock): prioritize typed tap commands and park status-only…
masarray Oct 23, 2026
7de019f
test(command-dock): derive read-only LN identity from object referenc…
masarray Oct 23, 2026
44a35e1
test(command-dock): assert tap-first status-only-last, move-only auth…
masarray Oct 23, 2026
05361f5
Merge 44a35e150137c4dce3854cd4139e7ed13cb595e5 into bfbab8b43231146f6…
masarray Oct 23, 2026
fb7ae16
fix(command-dock): unify WPF visual priority with verified live model…
masarray Oct 24, 2026
55ee722
Merge fb7ae16f07a0715924a88a8bd33245e8765b1353 into 05361f5aa699d5cf9…
masarray Oct 24, 2026
e0c3bdd
perf(static-report): preserve SSOT while slicing WPF selection and ex…
masarray Oct 24, 2026
55f107b
test(static-report): preserve exact indexed selection contracts and m…
masarray Oct 24, 2026
fb4932d
fix(static-progress): remove duplicate serialization annotation and s…
masarray Oct 24, 2026
b1d1778
Merge P0 SSOT responsive Static DataSet reporting (field accepted)
masarray Oct 24, 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
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
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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
295 changes: 279 additions & 16 deletions .github/workflows/_ci-p1-windows-build-test.yml

Large diffs are not rendered by default.

75 changes: 68 additions & 7 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,70 @@ on:
push:
branches: [ main ]
pull_request:
# A trial-manifest-only PR already runs FAST CI-P1; don't duplicate a
# full Windows application build, native bridge build or package upload.
paths-ignore:
- "engines/ARIEC61850.trial.json"
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
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 Expand Up @@ -187,8 +242,12 @@ jobs:
$main -notmatch '<Viewbox Width="50" Height="50" Stretch="Uniform"' -or
$main -notmatch 'x:Name="MonitorStateBadge"' -or
$main -match '<Control\.Effect><DropShadowEffect BlurRadius="5" ShadowDepth="1" Opacity="0\.22" Color="#26313B"/></Control\.Effect>' -or
$main -notmatch 'LucideSquare.*Stroke="\{StaticResource Warning\}"' -or
$main -notmatch 'LucideX.*Stroke="\{StaticResource Danger\}"' -or
# Material migration changes glyph identity, never action tone.
# Keep both the stop and remove semantic color invariants.
$main -notmatch 'Click="IedStopAction_Click"' -or
$main -notmatch 'MaterialStopIcon.*Fill="\{StaticResource Warning\}"' -or
$main -notmatch 'Click="IedRemove_Click"' -or
$main -notmatch 'MaterialCloseIcon.*Fill="\{StaticResource Danger\}"' -or
$app -notmatch 'x:Key="CommandOpenGradient"' -or
$app -notmatch 'x:Key="CommandCloseGradient"' -or
$app -notmatch 'x:Key="CommandActionButtonBase"' -or
Expand Down Expand Up @@ -672,11 +731,13 @@ jobs:
if-no-files-found: error
retention-days: 30

- name: Upload portable single EXE
# GitHub Actions upload-artifact v7: a SINGLE file plus archive:false
# makes the artifact itself download as a real .exe in the browser.
# Keep the canonical sealed Windows package (previous upload) unchanged:
# it carries portable-build-identity.json, manifests and release evidence.
- name: Upload directly downloadable portable EXE (no ZIP)
uses: actions/upload-artifact@v7
with:
name: ARSAS-win-x64-portable-single-exe
path: |
ArIED61850Tester\dist\ARSAS-*-win-x64-portable.exe
ArIED61850Tester\dist\ARSAS-*-win-x64-portable-build-identity.json
path: ArIED61850Tester\dist\ARSAS-*-win-x64-portable.exe
archive: false
if-no-files-found: error
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
48 changes: 47 additions & 1 deletion .github/workflows/ci-p1-shadow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,20 @@ on:
- "*.xaml"
- "MainWindow*.cs"
workflow_dispatch:
inputs:
fast_dev:
description: 'FAST DEV compile + scoped regression; never release qualified'
type: boolean
default: false
focus:
description: 'Focused regression group'
type: choice
options: [quality-browser, smv, command-read, all]
default: quality-browser
engine_trial_sha:
description: 'Optional exact 40-char experimental ARIEC SHA; FAST DEV only, never FAT'
type: string
default: ''

permissions:
contents: read
Expand All @@ -43,6 +57,7 @@ jobs:
packaging: ${{ steps.changed.outputs.packaging }}
ci: ${{ steps.changed.outputs.ci }}
risk: ${{ steps.changed.outputs.risk }}
engine_trial_sha: ${{ steps.trial.outputs.sha }}
steps:
- name: Checkout PR merge source
uses: actions/checkout@v7
Expand All @@ -69,6 +84,30 @@ jobs:
--summary "$GITHUB_STEP_SUMMARY"
fi

- id: trial
name: Resolve explicit nonrelease engine trial (label-gated)
if: ${{ github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'ci-p1-shadow') }}
shell: bash
run: |
if [[ -f engines/ARIEC61850.trial.json ]]; then
python3 - <<'PY' >> "$GITHUB_OUTPUT"
import json
import re

with open("engines/ARIEC61850.lock.json", encoding="utf-8") as handle:
production = json.load(handle)
with open("engines/ARIEC61850.trial.json", encoding="utf-8") as handle:
trial = json.load(handle)
sha = str(trial.get("commit", ""))
if (not re.fullmatch(r"[0-9a-f]{40}", sha)
or trial.get("runMode") != "fast-dev-nonpromotion"
or trial.get("scope") != "command-read"
or sha == production.get("commit")):
raise SystemExit("Invalid or non-isolated engine trial manifest")
print("sha=" + sha)
PY
fi

windows-shadow:
name: Compare reusable build/test with legacy authority
needs: classify
Expand All @@ -82,6 +121,13 @@ jobs:
}}
uses: ./.github/workflows/_ci-p1-windows-build-test.yml
with:
source_sha: ${{ github.sha }}
# PR validation must package the immutable branch HEAD, not GitHub's
# synthetic refs/pull/<n>/merge SHA. The synthetic merge remains covered
# independently by canonical PR CI; FAST DEV evidence must match the
# exact operator-downloaded source revision.
source_sha: ${{ github.event.pull_request.head.sha || github.sha }}
shadow_mode: true
fast_dev: ${{ (github.event_name == 'workflow_dispatch' && inputs.fast_dev == true) || (github.event_name == 'pull_request' && needs.classify.outputs.engine_trial_sha != '') }}
focus: ${{ github.event_name == 'workflow_dispatch' && inputs.fast_dev == true && inputs.focus || needs.classify.outputs.engine_trial_sha != '' && 'command-read' || 'all' }}
engine_trial_sha: ${{ github.event_name == 'workflow_dispatch' && inputs.fast_dev == true && inputs.engine_trial_sha || needs.classify.outputs.engine_trial_sha || '' }}
secrets: {}
51 changes: 50 additions & 1 deletion .github/workflows/installer-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ on:
- "engines/ARIEC61850.lock.json"
- "engines/ARDIREC.lock.json"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- "installer/**"
- "scripts/build-windows-installer.ps1"
Expand Down Expand Up @@ -83,7 +84,7 @@ concurrency:
jobs:
package-ready:
name: Wait for exact canonical package metadata
if: github.event_name != 'workflow_dispatch'
if: github.event_name != 'workflow_dispatch' && (github.event_name != 'pull_request' || !github.event.pull_request.draft)
runs-on: ubuntu-latest
timeout-minutes: 25
outputs:
Expand Down Expand Up @@ -185,6 +186,7 @@ jobs:
if: >-
${{
always() &&
(github.event_name != 'pull_request' || !github.event.pull_request.draft) &&
(github.event_name == 'workflow_dispatch' ||
needs.package-ready.result == 'success')
}}
Expand Down Expand Up @@ -484,6 +486,53 @@ jobs:
) -Wait -PassThru
if ($uninstall.ExitCode -ne 0) { throw "Uninstaller exited with code $($uninstall.ExitCode)." }

# Preserve the retired SMV preview workflow's protected-folder upgrade
# qualification inside the canonical installer workflow (no extra CI runner).
- name: Verify protected Program Files in-place DLL repair and uninstall
shell: powershell
run: |
$exe = ".\\ArIED61850Tester\\dist\\ARSAS-$env:APP_VERSION-win-x64-setup.exe"
if (-not (Test-Path $exe -PathType Leaf)) { throw 'Canonical installer missing.' }
$target = Join-Path $env:ProgramFiles 'ARSAS-FAT-ProtectedFolder-CI'
$dirArgument = '/DIR="' + $target + '"'
$params = @('/VERYSILENT','/SUPPRESSMSGBOXES','/NORESTART','/SP-','/CLOSEAPPLICATIONS',$dirArgument)
$installed = $false
try {
$install = Start-Process -FilePath $exe -ArgumentList $params -Wait -PassThru
if ($install.ExitCode -ne 0) { throw "Protected-folder install failed: $($install.ExitCode)." }
$installed = $true
if (-not (Test-Path (Join-Path $target 'ARSAS.exe') -PathType Leaf)) {
throw "Silent install did not use requested Program Files directory: $target"
}
$legacyAccessibility = Join-Path $target 'Accessibility.dll'
$publishedAccessibility = Join-Path $env:INSTALLER_INPUT_DIR 'Accessibility.dll'
if (-not (Test-Path $legacyAccessibility) -and -not (Test-Path $publishedAccessibility)) {
[System.IO.File]::WriteAllBytes($legacyAccessibility, [byte[]](65,82,83,65,83,83,45,79,76,68))
Write-Host 'Seeded a legacy Accessibility.dll as a prior-install fixture.'
}
$repairName = if (Test-Path $publishedAccessibility -PathType Leaf) { 'Accessibility.dll' } else { 'AR.Iec61850.Transports.Npcap.dll' }
$repairPath = Join-Path $target $repairName
if (-not (Test-Path $repairPath -PathType Leaf)) { throw "Shipped upgrade-test DLL is missing: $repairName" }
$expectedHash = (Get-FileHash $repairPath -Algorithm SHA256).Hash
[System.IO.File]::WriteAllBytes($repairPath, [byte[]](65,82,83,65,83,45,79,76,68,45,68,76,76))
$upgrade = Start-Process -FilePath $exe -ArgumentList $params -Wait -PassThru
if ($upgrade.ExitCode -ne 0) { throw "In-place Program Files upgrade failed: $($upgrade.ExitCode)." }
$actualHash = (Get-FileHash $repairPath -Algorithm SHA256).Hash
if ($actualHash -ne $expectedHash) { throw "Upgrade did not restore shipped DLL: $repairName" }
Write-Host "SMART_INNO_UPGRADE_PASS: Protected Program Files upgrade restored exact $repairName bytes."
foreach ($file in @('ARSAS.exe','AR.Iec61850.Transports.Npcap.dll','SharpPcap.dll','PacketDotNet.dll','Tools\\ArdIrec\\ardirec_bridge.dll')) {
if (-not (Test-Path (Join-Path $target $file) -PathType Leaf)) { throw "Installed runtime missing: $file" }
}
}
finally {
$uninstaller = Join-Path $target 'unins000.exe'
if ($installed -or (Test-Path $uninstaller -PathType Leaf)) {
if (-not (Test-Path $uninstaller -PathType Leaf)) { throw 'Uninstaller missing.' }
$uninstall = Start-Process -FilePath $uninstaller -ArgumentList @('/VERYSILENT','/SUPPRESSMSGBOXES','/NORESTART') -Wait -PassThru
if ($uninstall.ExitCode -ne 0) { throw "Uninstall failed: $($uninstall.ExitCode)." }
}
}

- name: Create release checksums
shell: powershell
run: |
Expand Down
33 changes: 32 additions & 1 deletion .github/workflows/interoperability-reference-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,15 @@ jobs:
throw 'Accepted post-baseline SCL association authority drifted or lost physical evidence.'
}
. .\ARSAS\scripts\test-p10-9f-core-routing-trial.ps1
. .\ARSAS\scripts\test-m217k-typed-status-trial.ps1
$coreRoutingTrialValid = Test-P109FCoreRoutingTrial -Lock $lock
$m217KTrialValid = Test-M217KTypedStatusTrial -Lock $lock
. .\ARSAS\scripts\test-p0-a-identity-trial.ps1
$p0AIdentityTrialValid = Test-P0AIdentityTrial -Lock $lock
. .\ARSAS\scripts\test-p0-b-rcb-trial.ps1
$p0BRcbTrialValid = Test-P0BRcbPlannerTrial -Lock $lock
. .\ARSAS\scripts\test-p0-c-typed-read-trial.ps1
$p0CTypedReadTrialValid = Test-P0CTypedReadTrial -Lock $lock
$trial = $lock.smartInteroperabilityCodeTrial
$serverAt = $lock.sclServerAtTrial
$originalTrial = $lock.commit -eq $trial.exactCommit -and
Expand Down Expand Up @@ -129,11 +137,34 @@ jobs:
[bool]$serverAt.physicalQualificationRequired -and
[bool]$serverAt.noAutomaticMmsFailover -and
$lock.ref -eq 'main'
# An exact typed-control trial on the existing staging ancestry:
# do not promote it, and never reinterpret it as physical R7/R10.
$typedControl = $lock.globalTypedControlStageTrial
$typedControlTrialValid = (
$null -ne $typedControl -and
$lock.commit -ceq 'f75e323e9f8443aa20e0a3818a1d5d77255b2c0f' -and
$lock.ref -ceq 'main' -and
[int]$lock.sourcePullRequest -eq 192 -and
$typedControl.baseEngineCommit -ceq '9c7cb40364023a7b217e5ec31ab3105ba90142eb' -and
$typedControl.exactCommit -ceq $lock.commit -and
[int]$typedControl.enginePullRequest -eq 192 -and
[long]$typedControl.engineCiRun -eq 39909260816L -and
$typedControl.status -ceq 'engine-ci-success-consumer-trial-not-physical' -and
[bool]$typedControl.typedStatusReadRequired -and
[bool]$typedControl.sameDataObjectFeedbackRequired -and
[bool]$typedControl.ctlModelAndOperShapeRequired -and
[bool]$typedControl.sbowEnhancedSafetyRequired -and
[bool]$typedControl.noAutomaticOperate -and
[bool]$typedControl.physicalQualificationRequired -and
[bool]$typedControl.mainlinePromotionForbidden -and
$lock.p0CStageObservationTrial.exactCommit -ceq $typedControl.baseEngineCommit -and
$env:GITHUB_BASE_REF -ne 'main' -and $env:GITHUB_REF_NAME -ne 'main'
)
if ($null -ne $trial) {
if ($trial.status -ne 'code-verified-not-physical' -or
[int]$trial.issue -ne 144 -or
[int]$trial.integrationPullRequest -ne 148 -or
-not ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid) -or
-not ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid -or $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid -or $typedControlTrialValid) -or
-not [bool]$trial.fullDiscoveryFallbackForbidden -or
-not [bool]$trial.vendorBranchingForbidden -or
-not [bool]$trial.physicalPromotionRequired) {
Expand Down
Loading
Loading