Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
477 commits
Select commit Hold shift + click to select a range
7ed9aa7
fix(control): require operator authorization for Test=true as well as…
masarray Oct 23, 2026
177b872
test(control): verify Test=true still requires explicit authorization…
masarray Oct 23, 2026
aaf9562
fix(control): update primary action label immediately on Test toggle
masarray Oct 23, 2026
29d5eff
fix(control): freeze editable command parameters throughout a native …
masarray Oct 23, 2026
1f857bb
fix(control): disable value, checks and origin edits while executing
masarray Oct 23, 2026
1837348
fix(control): distinguish ambiguous wire/timeout outcomes from confir…
masarray Oct 23, 2026
f39dee9
ux(ip): 265px input, Material circle chevrons, rounded port, no full-…
masarray Oct 23, 2026
5a921b7
fix(ip): preserve automatic IPv6/history raw fallback without visible…
masarray Oct 23, 2026
f162e26
test(ip): verify stable fixed dialog, 265px field and automatic IPv6 …
masarray Oct 23, 2026
33eadaa
test(ip): verify stable fixed dialog, 265px field and automatic IPv6 …
masarray Oct 23, 2026
58d9410
test(ip): verify stable fixed dialog, 265px field and automatic IPv6 …
masarray Oct 23, 2026
a7b6eee
test(control): preserve local NotSent vs ambiguous wire outcome class…
masarray Oct 23, 2026
2d80dfe
perf(ssot): immutable current-page DO-scoped canonical dirty-key row …
masarray Oct 23, 2026
096df5e
perf(ssot): invert viewport dependency index for O(dirty DO scope) ro…
masarray Oct 23, 2026
6e35382
perf(ssot): per-IED per-page reactive cursor adapter with conservativ…
masarray Oct 23, 2026
27a2e3d
perf(browser): apply only canonical dirty DO-scoped rows; retain full…
masarray Oct 23, 2026
56fb8e3
test(ssot): prove per-DO reactive viewport updates, opaque/metadata f…
masarray Oct 23, 2026
0f9ab71
fix(build): use distinct phase plan local in nested browser viewport …
masarray Oct 23, 2026
3b1b257
Merge compact Material Smart IP and prepaint dialog stability (#697)
masarray Oct 23, 2026
6731549
test(ssot): initialize visible detail fixture to app's pending dash s…
masarray Oct 23, 2026
ab22f1d
stage: sync latest FAT Smart IP and startup fixes without control reg…
masarray Oct 23, 2026
f230d7c
feat(control): separate MMS request acceptance, termination and indep…
masarray Oct 23, 2026
d636542
test(control): fail closed on accepted-without-feedback, timeout and …
masarray Oct 23, 2026
095537f
fix(control): one-shot explicit command, truthful result classificati…
masarray Oct 23, 2026
4eeb1b7
feat(control): add explicit Reinspect action in pinned footer without…
masarray Oct 23, 2026
26907b3
test(control): assert feedback truth from outcome classifier rather t…
masarray Oct 23, 2026
79279ae
test(control): disarm after dispatch and require reinspection plus de…
masarray Oct 23, 2026
6aa9b70
feat(control): report actual Select/SBOw/Operate/termination stages w…
masarray Oct 23, 2026
124aab4
feat(control): display only real native Select/Operate/Termination wi…
masarray Oct 23, 2026
51dccb7
feat(control): show compact service-stage evidence below result witho…
masarray Oct 23, 2026
fa7d940
test(control): only display actual native SBOw/Operate/termination st…
masarray Oct 23, 2026
ba5b711
integration(ssot): carry exact FAT-approved Smart IP form without mod…
masarray Oct 23, 2026
36fbe4c
integration(ssot): add exact approved Smart IP form without changing …
masarray Oct 23, 2026
cc6ee37
Merge approved Smart IP form into SSOT Phase 1 (#700)
masarray Oct 23, 2026
990ce47
Merge approved Smart IP into SSOT Phase 2 (#701)
masarray Oct 23, 2026
f6465df
merge(ssot): record approved Phase 1 UI ancestry in reactive Phase 2 …
masarray Oct 23, 2026
c19dd45
fat(stage): integrate tested typed Global MMS Write and Browser Control
masarray Oct 23, 2026
84ad646
fix(control-fat): distinguish already-at-target no-op and unknown con…
masarray Oct 23, 2026
9f24bd4
test(control-fat): protect no-op/readback and wire-unknown classifica…
masarray Oct 23, 2026
c224dc0
fat(control): correct already-in-position and wire-unknown outcomes
masarray Oct 23, 2026
35d3d5c
perf(ssot): identity-only concurrent realized Explorer and Global vie…
masarray Oct 23, 2026
56bd6e1
perf(ui): prioritize actually realized virtual DataGrid rows with fai…
masarray Oct 23, 2026
fff51fa
perf(ssot): route canonical point snapshots through realized viewport…
masarray Oct 23, 2026
77b7f69
perf(ui): attach virtualization LoadingRow priority to Explorer and G…
masarray Oct 23, 2026
ae9b1f4
test(perf): guard fair realized viewport priority instead of hardcode…
masarray Oct 23, 2026
de52da2
test(ssot): verify 32k-row scrolling hints, concurrency, shared grid …
masarray Oct 23, 2026
a3f3960
fix(perf): attach initial viewport before layout and rebuild owner in…
masarray Oct 23, 2026
967be84
feat(control-fat): create copy-only structured IED control evidence s…
masarray Oct 23, 2026
65ca39e
feat(control-fat): add safe one-click copy of full control evidence w…
masarray Oct 23, 2026
d85b2f0
feat(control-fat): place compact Copy evidence action inside pinned r…
masarray Oct 23, 2026
6e5d48e
fix(control-fat): clear old evidence and copy indicator on reinspection
masarray Oct 23, 2026
d98bc6c
test(control-fat): validate copied exact origin/termination, no stale…
masarray Oct 23, 2026
952b101
perf(global): eliminate Dispatcher natural sort for fat Explorer and …
masarray Oct 23, 2026
8f5941a
perf(explorer): debounce only large-model search typing; immediate cl…
masarray Oct 23, 2026
d558d92
perf(explorer): route native search TextChanged through shared large-…
masarray Oct 23, 2026
d17abaa
perf(global): detach old small-list sort as GlobalPoints grows withou…
masarray Oct 23, 2026
11fcbf8
perf(global): trigger WPF sorting only at large/small mode transition…
masarray Oct 23, 2026
9a397f5
test(perf): WPF large Global/Explorer sort safeguards and bounded uni…
masarray Oct 23, 2026
dd2dc86
test(perf): assert pattern threshold and exclude WPF new-item placeho…
masarray Oct 23, 2026
f51f44f
test(perf): assert pattern threshold and exclude WPF new-item placeho…
masarray Oct 23, 2026
00afef5
test(perf): validate both Explorer and Global large-grid guards in P0…
masarray Oct 23, 2026
8dfb43b
fix(wpf): use OneWay for ctlNum and CommandTermination display bindings
masarray Oct 23, 2026
d418925
fix(browser): route only live CO Oper/SBOw ctlVal leaf to verified na…
masarray Oct 23, 2026
658d66e
fix(ui): lock status footer at 34px single-line regardless of diagnos…
masarray Oct 23, 2026
91908a3
feat(browser): resolve exact live ctlModel CF leaf to existing guarde…
masarray Oct 23, 2026
b039947
feat(browser): enable ctlModel leaf Write using existing validated CF…
masarray Oct 23, 2026
400ca92
fix(browser): permit explicit typed DA write during report monitoring…
masarray Oct 23, 2026
e0d1a36
fix(mms-write): allow explicit confirmed DA writes while passive RCB …
masarray Oct 23, 2026
bc34a10
fix(mms-write): preserve same association approval while RCB monitor …
masarray Oct 23, 2026
31cc734
fix(ui): always condense status text to one bounded line; preserve fu…
masarray Oct 23, 2026
69e732a
test(fat): reproduce read-only ctlNum WPF crash, CO ctlVal and CF ctl…
masarray Oct 23, 2026
2e9369a
fix(build): rebuild exact Browser Control/ctlModel selector from heal…
masarray Oct 23, 2026
895bdaa
test(browser): verify exact ctlVal suffix admission rather than obsol…
masarray Oct 23, 2026
3a84d0f
test(browser): validate priority Write ctlModel label and preserved m…
masarray Oct 23, 2026
c6a1856
fat(p0): fix real IED Control binding, ctlVal/ctlModel UI and single-…
masarray Oct 23, 2026
1dca097
fix(sg7): unify visible CSWI catalog, typed command gate, runtime-fir…
masarray Oct 23, 2026
e31595d
fix(integration): restore full FAT repository tree while retaining SG…
masarray Oct 23, 2026
d643657
merge(sg7): unify FAT Command/Smart IP and full SSOT v2 performance s…
masarray Oct 23, 2026
f946ae1
fix(merge): separate FAT typed DA Write and native config Write butto…
masarray Oct 23, 2026
40927cd
ux(write): carry verified compact typed legacy editor onto newest int…
masarray Oct 23, 2026
d2f2b5c
ux(write): carry verified compact typed legacy editor onto newest int…
masarray Oct 23, 2026
bcc95f8
ux(write): carry verified compact typed legacy editor onto newest int…
masarray Oct 23, 2026
4723ad2
ux(write): carry verified compact typed legacy editor onto newest int…
masarray Oct 23, 2026
dd5fc46
ux(write): carry verified compact typed legacy editor onto newest int…
masarray Oct 23, 2026
ac333db
ux(write): keep BOTH Browser Write entry points stable Material penci…
masarray Oct 23, 2026
e3df40a
ux(write): live-read-backed typed row presentation with per-row Boole…
masarray Oct 23, 2026
c44ff8c
ux(write): restore IEDScout-like unified native typed inline editor, …
masarray Oct 23, 2026
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
c86629c
feat(browser): exact association-fenced post-write read request from …
masarray Oct 24, 2026
a7d62b4
feat(browser): dispatch exact post-write DA read via canonical typed …
masarray Oct 24, 2026
9e5382e
fix(write): close ctlModel editor on attempted write and hand off exa…
masarray Oct 24, 2026
9d32670
fix(write): single leaf closes immediately, leaving exact post-write …
masarray Oct 24, 2026
15d3454
fix(write): batch editor auto-closes and transfers exact attempted DA…
masarray Oct 24, 2026
8794e75
feat(browser): close write dialogs then exact-read written leaves int…
masarray Oct 24, 2026
2ae87a2
fix(write): legacy Config Write closes after attempt and hands exact …
masarray Oct 24, 2026
c093057
feat(browser): legacy Config Write auto-refreshes DA in canonical Dat…
masarray Oct 24, 2026
6b0a05a
test(write): expect editor auto-close and Browser-owned exact leaf po…
masarray Oct 24, 2026
caa2449
test(browser): guard auto-close and canonical SSOT exact DA post-writ…
masarray Oct 24, 2026
394e847
fix(browser): do not lose post-Write DA refresh when prior read fligh…
masarray Oct 24, 2026
1d3ca25
test(browser): post-Write exact DA Read survives existing bounded Bro…
masarray Oct 24, 2026
66af465
fix(browser): exact post-Write readback supports live SG/SE setting l…
masarray Oct 24, 2026
fb65455
test(browser): preserve SG/SE exact post-write setting readback
masarray Oct 24, 2026
a8a88b9
Merge pull request #720 from masarray/staging/fat-write-close-browser…
masarray Oct 24, 2026
ede1c05
fix(browser): prove fresh per-leaf SSOT MMS readback after Write and …
masarray Oct 24, 2026
932ebfe
test(browser): reject stale post-Write snapshots and require fresh ex…
masarray Oct 24, 2026
18e27b6
fix(browser): preserve actual Write outcome across SSOT postwrite rea…
masarray Oct 24, 2026
53cde02
fix(browser): hand write refusal/verified status into readback workflow
masarray Oct 24, 2026
785b7cc
fix(browser): show both real Write result and independent exact-leaf …
masarray Oct 24, 2026
2c7658f
test(browser): preserve refused Write reason alongside SSOT readback …
masarray Oct 24, 2026
96ba201
fix(test): keep canonical 15s background Read while granting explicit…
masarray Oct 24, 2026
04350e1
Merge pull request #723 from masarray/staging/fat-postwrite-browser-s…
masarray Oct 24, 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
295 changes: 279 additions & 16 deletions .github/workflows/_ci-p1-windows-build-test.yml

Large diffs are not rendered by default.

16 changes: 11 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ 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:
Expand Down Expand Up @@ -676,11 +680,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
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: {}
165 changes: 0 additions & 165 deletions .github/workflows/fat-direct-exe.yml

This file was deleted.

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
25 changes: 24 additions & 1 deletion .github/workflows/interoperability-reference-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,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 $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid) -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