Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
511 commits
Select commit Hold shift + click to select a range
8a71e0b
test(ptp): retain SOURCE Pdelay hardware rejection after safety STOP;…
masarray Oct 20, 2026
c427c23
test(studio): require explicit Pdelay capability and physical START r…
masarray Oct 20, 2026
afd4250
feat(ptp): shared IEC/IEEE 61850-9-3 SOURCE cadence admission for Stu…
masarray Oct 20, 2026
4ff9cd3
fix(ptp): fail preflight locally on mismatched 61850-9-3 SOURCE profi…
masarray Oct 20, 2026
7a3e862
fix(studio): enforce SOURCE profile contract and display PTP STARTING…
masarray Oct 20, 2026
518e227
ux(studio): amber PTP switch pending state, green only for real board…
masarray Oct 20, 2026
597c4d0
feat(ptp): expose compact read-only profile-rejection reason
masarray Oct 20, 2026
795bea4
fix(ptp): classify profile admission failures without changing time-c…
masarray Oct 20, 2026
d822728
fix(ptp): report actual firmware configuration rejection code to Studio
masarray Oct 20, 2026
25818c3
fix(ptp): PTPROLE rejection uses firmware-owned cause
masarray Oct 20, 2026
24c64db
test(studio): reject SOURCE Pdelay/cadence mismatch before PTP serial…
masarray Oct 20, 2026
2908e7f
test(ptp): confirm identical portable 9-3 admission from scalar Studi…
masarray Oct 20, 2026
654dd42
test(studio): guard stable switch and board-specific PTP configuratio…
masarray Oct 20, 2026
836c881
test(studio): update advanced PTP profile contract for explicit SOURC…
masarray Oct 20, 2026
0835dae
ux(studio): preserve amber PTP STARTING intent in both Main tray and …
masarray Oct 20, 2026
ef4de7a
ux(ptp): lock SOURCE cadence to 1s in standard Studio profile; keep c…
masarray Oct 20, 2026
ce5ffac
test(studio): standard SOURCE cannot accidentally send nonstandard hi…
masarray Oct 20, 2026
df73fea
ux(ptp): hide SOURCE-only non-editable timing fields, show one true 9…
masarray Oct 20, 2026
de610a2
Make Studio clipboard result explicit instead of silently assuming su…
masarray Oct 20, 2026
27d9c73
Verify native clipboard round trip, refuse false copy confirmation
masarray Oct 20, 2026
6dacffb
Import registered clipboard singleton in timing panel and offer selec…
masarray Oct 20, 2026
405ebc8
Share full selectable diagnostics snapshot and truthful clipboard res…
masarray Oct 20, 2026
567b2d0
Add independent Windows clipboard positive/negative regression mode
masarray Oct 20, 2026
8ee83a9
Add PTP preflight board readback stage and observable start phase
masarray Oct 20, 2026
d83705b
Verify board STOPPED before PTP role/config START; stage-tag genuine …
masarray Oct 20, 2026
5c52ec6
Include authoritative firmware START transaction phase in copied fiel…
masarray Oct 20, 2026
41bc39d
Regress true preflight STOPPED proof, active board recovery, missing …
masarray Oct 20, 2026
a99a899
Regress visible Timing clipboard binding, copy success checking, fall…
masarray Oct 20, 2026
ec6a9d3
Run native clipboard roundtrip on actual Windows Studio binary and in…
masarray Oct 20, 2026
24fddc9
Offer unobtrusive firmware update action when Studio/board PTP builds…
masarray Oct 20, 2026
b4c4327
fix(studio): expose authoritative SV scenario transaction state to QML
masarray Oct 20, 2026
870ea88
fix(studio): signal SV START transaction lifecycle only from device c…
masarray Oct 20, 2026
efc90b2
fix(studio): remove competing injection START watchdog and unrelated-…
masarray Oct 20, 2026
b70074f
test(studio): assert native single-owner SV START state and remove UI…
masarray Oct 20, 2026
9169f89
fix(ptp): adopt readback-matched active SOURCE without restart and pr…
masarray Oct 20, 2026
cbd8aba
test(ptp): prove active runtime adoption and never-fake-OFF on stale-…
masarray Oct 20, 2026
bd922da
test(clipboard): consolidate native OS readback regression from PR 266
masarray Oct 20, 2026
c987bd5
ci(studio): port production clipboard harness from PR 266 to consolid…
masarray Oct 20, 2026
cc1e6c0
ci(studio): port production clipboard harness from PR 266 to consolid…
masarray Oct 20, 2026
af25366
ci(preview): require native clipboard roundtrip alongside installed G…
masarray Oct 20, 2026
0300fba
fix(ptp firmware): report physical SOURCE runtime separately from fre…
masarray Oct 20, 2026
927da08
test(ptp): active SOURCE runtime never licenses stale/unqualified tim…
masarray Oct 20, 2026
4871e8d
test(studio): structurally guard separation of PTP physical runtime a…
masarray Oct 20, 2026
e34206c
test(studio): reference repo-root firmware facade via resolved Studio…
masarray Oct 20, 2026
6c97195
fix(studio): atomic-visible SV START ACK handoff prevents transient b…
masarray Oct 20, 2026
1b6eb46
feat(sync): qualify warm LOCAL only after preflight phase and real MA…
masarray Oct 21, 2026
f84819b
feat(esp32p4): carry phase-only warm preflight into bounded live MAC …
masarray Oct 21, 2026
65fbe45
test(sync): guard warm preflight promotion against fake MAC, role cha…
masarray Oct 21, 2026
76b1468
feat(studio): trace exact SV START/STOP transaction causality in boun…
masarray Oct 21, 2026
51ca844
fix(serial): reserve one bounded coalesced control lease heartbeat slot
masarray Oct 21, 2026
3774c4d
fix(serial): schedule lease heartbeat ahead of CFG queue without bypa…
masarray Oct 21, 2026
2497192
test(studio): heartbeat reserved outside saturated CFG FIFO; STOP sti…
masarray Oct 21, 2026
c7aa795
fix(studio): timestamp lifecycle evidence in millisecond UTC for PCAP…
masarray Oct 21, 2026
810d637
test(studio): enforce cold 10-live and warm 10-phase + 3-MAC safety i…
masarray Oct 21, 2026
6a85ee7
fix(studio): distinguish forced firmware STOP and lease expiry from o…
masarray Oct 21, 2026
d21d66e
test(studio): distinguish physical lease/fail-safe STOP from operator…
masarray Oct 21, 2026
a1fccc2
fix(esp32p4): replace racing one-shot heartbeat rearm with periodic s…
masarray Oct 21, 2026
e9d083a
feat(studio): expose authoritative board STOP cause in native GUI state
masarray Oct 21, 2026
1194e92
fix(studio): correlate STOP with latched board SVLIFE cause, never si…
masarray Oct 21, 2026
39532ab
fix(qml): show board STOP provenance instead of misleading green READ…
masarray Oct 21, 2026
81b2b99
test(studio): reproduce board STOP readback, latched cause and safe r…
masarray Oct 21, 2026
ea447c1
test(contract): assert periodic board lease watchdog, STOP provenance…
masarray Oct 21, 2026
03db007
fix(diagnostics): retain board SV STOP cause in operator Copy diagnos…
masarray Oct 21, 2026
bee7218
feat(studio): preserve last physical STOP cause even after operator r…
masarray Oct 21, 2026
377c134
fix(studio): keep latched stop history across verified START, reset o…
masarray Oct 21, 2026
5e92a96
fix(diagnostics): show active STOP condition separately from latched …
masarray Oct 21, 2026
8ee7d6b
test(studio): verify last board STOP cause survives RUNNING resume in…
masarray Oct 21, 2026
3971557
fix(gui): bind actual Studio footer and operator alert to board STOP …
masarray Oct 21, 2026
7f30f99
test(gui): prevent dead STOP warning property; require visible main s…
masarray Oct 21, 2026
c656222
fix(ptp): require real driver START + PHY CONNECTED before enabling E…
masarray Oct 21, 2026
979db2b
feat(ptp): expose real PHY/link readiness and classified preflight fa…
masarray Oct 21, 2026
84c0acf
fix(ptp): preserve ESP_ERR_INVALID_STATE TX root cause and allow boun…
masarray Oct 21, 2026
9892e12
feat(console): report physical EMAC+PHY state on PTP SHOW and precise…
masarray Oct 21, 2026
b9f82c3
fix(studio): explain LINK_DOWN versus MAC_INVALID_STATE and avoid red…
masarray Oct 21, 2026
fd7704b
test(studio): reproduce PTP ETHERNET_LINK_DOWN and ESP_ERR_INVALID_ST…
masarray Oct 21, 2026
d314217
test(contract): require real Ethernet PHY and driver evidence before …
masarray Oct 21, 2026
6fcfc39
test(contract): check C function signature and actual PTP SHOW invoca…
masarray Oct 21, 2026
b27574b
test(contract): initialize PTP console evidence before new ETH prefli…
masarray Oct 21, 2026
8387731
feat(studio): expose measured EMAC driver and PHY link to native Time…
masarray Oct 21, 2026
180b854
feat(studio): parse board PTP ETH driver/link snapshot without derivi…
masarray Oct 21, 2026
59f7165
feat(ui): display real ESP32-P4 driver/PHY readiness directly in Adva…
masarray Oct 21, 2026
37cabe9
feat(diagnostics): include exact board ETH driver and physical PHY li…
masarray Oct 21, 2026
8033976
test(studio): verify PTP board ETH driver/link state on live GUI read…
masarray Oct 21, 2026
e44cf25
test(contract): enforce visible PTP PHY state and diagnostics, not on…
masarray Oct 21, 2026
b6a45ca
feat(gui): actionable center-screen timed toasts in Studio and Advanc…
masarray Oct 21, 2026
2cda834
style(toast): centered readable 2-4 line engineering alerts with calm…
masarray Oct 21, 2026
2736431
test(ui): require centered transient actionable error guidance on bot…
masarray Oct 21, 2026
7583906
feat(ux): show transient recovery message only when physical Ethernet…
masarray Oct 21, 2026
9bbe201
test(toast): assert single physical Ethernet DOWN-to-UP recovery notice
masarray Oct 21, 2026
f52f677
feat(ux): add operator-provided lightning icon for physical RUN/STOP …
masarray Oct 21, 2026
f724e20
feat(ribbon): physical RUN/STOP lightning CTA bound to board RUNNING …
masarray Oct 21, 2026
2de8fd2
fix(layout): balanced professional default 1150px studio with bounded…
masarray Oct 21, 2026
0dd29af
fix(start): bounded same-boot first-click intent through profile prep…
masarray Oct 21, 2026
bbd036c
fix(start): bind deferred first-click identity to actual exposed boot…
masarray Oct 21, 2026
61bc899
feat(ux): dedicated board RUN and muted STOP lightning asset
masarray Oct 21, 2026
1fb40d9
feat(ux): dedicated board RUN and muted STOP lightning asset
masarray Oct 21, 2026
8ada9f5
style(ribbon): green live lightning and muted red stopped lightning a…
masarray Oct 21, 2026
8c74602
fix(start): double-check exact board boot identity across deferred Qt…
masarray Oct 21, 2026
4068d4d
test(ui): guard balanced layout, physical lightning status and bounde…
masarray Oct 21, 2026
5d20a09
test(ui): require STOP while native ACK pending or same-boot deferred…
masarray Oct 21, 2026
2c48299
fix(package): bundle both physical RUN/STOP bolt SVGs in Qt resource …
masarray Oct 21, 2026
b628f2a
test(package): enforce embedded Qt bolt assets, not missing icons in …
masarray Oct 21, 2026
67e3a85
fix(studio): track bounded coalesced readbacks behind exclusive devic…
masarray Oct 21, 2026
1658560
fix(studio): defer coalesced readbacks across CFG and binary transact…
masarray Oct 21, 2026
d4d8955
fix(studio): commit setpoint drafts once on Enter, Tab or focus loss
masarray Oct 21, 2026
a9635a4
fix(studio): compact 1024 workbench, equal phasor waveform, safe nume…
masarray Oct 21, 2026
c6a09a1
fix(studio): make PTP details a compact accessible icon control
masarray Oct 21, 2026
dd0d31a
fix(studio): enforce single width fill and 50/50 resizable chart geom…
masarray Oct 21, 2026
a732b7d
test(studio): verify coalesced busy polling and STOP unconfirmed afte…
masarray Oct 21, 2026
45bfecf
test(studio): update compact UX contracts and reject early commits/hi…
masarray Oct 21, 2026
2be8b4a
test(studio): expose real chart bounds for Qt viewport regression
masarray Oct 21, 2026
4c04f4f
test(studio): enforce real five-width Qt geometry and best-effort lar…
masarray Oct 21, 2026
62fcec4
ci(studio): inspect five widths and multiple DPI; upload available 10…
masarray Oct 21, 2026
f5d3548
build(studio): include cmath for explicit viewport proportion check
masarray Oct 21, 2026
58fe1a4
fix(studio): preserve PTP board authority while STOP readback is defe…
masarray Oct 21, 2026
d0216e8
test(studio): stale PTP OFF telemetry cannot confirm pending STOP
masarray Oct 21, 2026
6554461
fix(studio): discard coalesced telemetry across session generation an…
masarray Oct 21, 2026
857e309
fix(studio): suspend health probe misses during ordered CFG transaction
masarray Oct 21, 2026
ce195c1
test(studio): health misses deferred only while CFG owns serial; real…
masarray Oct 21, 2026
3db28f0
test(studio): fail native screenshots when phasor or waveform is missing
masarray Oct 21, 2026
8d0a558
fix(studio): restore visible phasor and waveform on first run and mig…
masarray Oct 21, 2026
b3cc1bf
test(studio): lock both chart docks visible on first run and legacy p…
masarray Oct 21, 2026
f423fa6
fix(studio): size injection controls by narrow panel, not desktop; re…
masarray Oct 21, 2026
9159db6
fix(studio): fit PTP role, smpSynch and details within 405px injectio…
masarray Oct 21, 2026
67f5491
fix(studio): compact IEC quality controls without truncating 32-bit mask
masarray Oct 21, 2026
e7ee461
test(studio): reject injection child overflow even if it remains insi…
masarray Oct 21, 2026
6d81ad3
ci(studio): test 125% DPI alongside 100, 150 and 175%
masarray Oct 21, 2026
3d9a26f
fix(ptp): accept IEC power-profile VLAN zero priority tag
masarray Oct 22, 2026
5f66012
fix(ptp): default to IEC 61850-9-3 priority-tagged VLAN0 PCP4
masarray Oct 22, 2026
d734cc6
fix(firmware): enable PTP priority tagging to match SV VLAN0 PCP4
masarray Oct 22, 2026
09ee04f
fix(studio): permit power-profile priority-tagged VLAN 0
masarray Oct 22, 2026
4fb1819
fix(studio): offer power-profile VID0 PCP4 by default
masarray Oct 22, 2026
d74a583
refactor(studio): remove redundant zero-VLAN validation clause
masarray Oct 22, 2026
b099d26
test(ptp): assert priority-tagged VLAN0 PCP4 on actual PTP Announce b…
masarray Oct 22, 2026
9530f07
test(ptp): run PTP VLAN0 PCP4 wire regression
masarray Oct 22, 2026
8db8a70
ci(ptp): enforce VLAN0 PCP4 tagging in matched ESP32-P4 preview firmware
masarray Oct 22, 2026
43e0a65
fix(test): avoid implicit 32-to-16-bit narrowing in MSVC PTP VLAN vec…
masarray Oct 22, 2026
ec54321
fix(test): avoid MSVC optional narrowing when asserting VID0 decoded …
masarray Oct 22, 2026
f6c2505
feat(studio): declare canonical SV VLAN override for each SCL stream
masarray Oct 22, 2026
4ce1001
feat(studio): per-stream VLAN editing survives SCL recompilation and …
masarray Oct 22, 2026
8897bef
feat(studio): edit SV Ethernet VLAN PCP/VID per SCL stream and requir…
masarray Oct 22, 2026
4f19e63
feat(studio): expose canonical SV profile to PTP Expert
masarray Oct 22, 2026
f8343fa
feat(studio): independently set PTP VLAN or explicitly match SV VLAN …
masarray Oct 22, 2026
f9c6692
fix(studio): verify SV VLAN on canonical binary device profile before…
masarray Oct 22, 2026
abf80d3
feat(ptp): typed isolated bench GM epoch and quality profile configur…
masarray Oct 22, 2026
11b846a
feat(esp32p4): isolated GNSS-like bench GM wire qualities gated on EM…
masarray Oct 22, 2026
c7e9e4f
feat(ptp): monotonic compensated Studio UTC seed for emulated PTP/TAI…
masarray Oct 22, 2026
6fc757c
feat(firmware): transactional PTP CONFIG accepts explicit bench GM mo…
masarray Oct 22, 2026
2000194
feat(sv): promote smpSynch 2 only with measured SV MAC lock and fresh…
masarray Oct 22, 2026
9582291
feat(firmware): expose bench GM mode capability to native Studio
masarray Oct 22, 2026
2f5ac67
feat(studio): explicit PTP Grandmaster simulation option for relay in…
masarray Oct 22, 2026
cb92851
feat(studio): send fresh UTC-epoch BENCH GM PTP CONFIG to supporting …
masarray Oct 22, 2026
c267260
feat(sv): model optional IEC 61850 Ed2.1 gmIdentity synchronization s…
masarray Oct 22, 2026
791636b
feat(sv): encode/decode standard context tag 0x89 eight-byte PTP gmId…
masarray Oct 22, 2026
3371f19
feat(esp32p4): include matching PTP GrandmasterIdentity in SV Ed2.1 b…
masarray Oct 22, 2026
dcb0402
test(sv): Ed2.1 gmIdentity wire tag 0x89, roundtrip and malformed length
masarray Oct 22, 2026
6baa66c
test(studio): native canonical SV VLAN edit, binary profile, invalid …
masarray Oct 22, 2026
63ea71e
fix(esp32): include portable PTP EUI-64 clock identity helper header
masarray Oct 22, 2026
ce79ef0
fix(test): initialize optional gmIdentity in existing strict aggregat…
masarray Oct 22, 2026
530d531
fix(studio): reload VLAN editor on active SCL stream change; avoid cr…
masarray Oct 22, 2026
a1cf936
fix(ptp): validate UTC seed freshness at source START, not role handoff
masarray Oct 22, 2026
95e8c76
test(ptp): GNSS-profile simulator Announce wire flags, class, accurac…
masarray Oct 22, 2026
d56f0f6
fix(studio): include span for native VLAN binary regression
masarray Oct 22, 2026
94b8c14
fix(studio): gate advanced BENCH GM configuration on verified compati…
masarray Oct 22, 2026
60165e6
fix(sv): preserve aggregate source compatibility by appending gmIdent…
masarray Oct 22, 2026
3f4cb20
fix(ptp): preserve millisecond UTC epoch fraction in bench Grandmaste…
masarray Oct 22, 2026
f4e4eb4
fix(esp32): accept host milliseconds in PTP CONFIG and preserve legac…
masarray Oct 22, 2026
854c69e
fix(ptp): hardware EMAC TAI seeding retains sub-second host epoch and…
masarray Oct 22, 2026
62c92c7
fix(studio): send millisecond UTC seed to simulated Grandmaster inste…
masarray Oct 22, 2026
bbe830a
fix(sv): tolerate transient 2.5s host UART stalls, preserve bounded l…
masarray Oct 22, 2026
3c99e06
feat(sv): expose maximum heartbeat gap and slow heartbeat events in l…
masarray Oct 22, 2026
fd7aeae
feat(sv): fast SOURCE-only AUTO lock after real phase and MAC evidenc…
masarray Oct 22, 2026
47738d3
fix(esp32): SOURCE AUTO uses measured self-clock fast acquisition, ex…
masarray Oct 22, 2026
79e2224
test(sv): self-GM AUTO lock at second live measured phase/MAC epoch a…
masarray Oct 22, 2026
d34e909
feat(sv): expose SOURCE_FAST acquisition progress and clear gate on p…
masarray Oct 22, 2026
1846fd0
ci(studio): rebuild matched Windows installer on firmware-only PTP/SV…
masarray Oct 22, 2026
3994f78
feat(sv): encode SCL-specific Ed2.1 smpRate/smpMod semantics on 4I4V …
masarray Oct 22, 2026
17a4fec
feat(studio): preview exact SCL wire metadata without modifying legac…
masarray Oct 22, 2026
3ca1ff9
test(studio): accept measured SOURCE_FAST telemetry while retaining c…
masarray Oct 22, 2026
fa80cef
ci(studio): publish direct SHA-pinned PTP/SV bench Inno EXE only afte…
masarray Oct 22, 2026
88575b8
feat(ptp-ui): separate local GM TX, measured SV phase and unverified …
masarray Oct 22, 2026
78d0368
feat(ptp): add fail-closed operator source-selection and GM handoff s…
masarray Oct 22, 2026
fecefbd
fix(ptp-policy): rearm recovered external GM under external authority…
masarray Oct 22, 2026
be7e717
docs(integration): inventory all 64 PR heads and 26 issues with fail-…
masarray Oct 22, 2026
a553e04
docs(integration): flag missing side-branch files and strict semantic…
masarray Oct 22, 2026
f31eac0
docs(integration): freeze machine-readable 64 PR and 26 issue source …
masarray Oct 22, 2026
3dff7a1
docs(integration): verify original atomic 4I4V side-branch file blob …
masarray Oct 22, 2026
521979e
docs(integration): retain evidence of competing Qt layouts PTP and li…
masarray Oct 22, 2026
2191fd5
docs(integration): inspect remaining UX PTP and operator baseline sid…
masarray Oct 22, 2026
e6c489c
tools(integration): add read-only offline PR commit ancestry and file…
masarray Oct 22, 2026
0a2600f
docs(integration): retain full Workbench reporting and PTP historical…
masarray Oct 22, 2026
c5c8256
docs(integration): pin Browser, Simulator UX, Studio shutdown, and hi…
masarray Oct 22, 2026
50dc219
docs(integration): retain IED Simulator and START timing release-bloc…
masarray Oct 22, 2026
d0e3b0a
tools(integration): require complete 16-PR independent source coverag…
masarray Oct 22, 2026
6a3bb5c
ci(integration): enforce pinned PR preservation inventory on lightwei…
masarray Oct 22, 2026
b641af7
docs(integration): permanent engineering start-here handoff with base…
masarray Oct 22, 2026
d8e96fc
fix(integration): preserve exact legacy source path using lossless JS…
masarray Oct 22, 2026
0f75394
fix(integration): align historical handoff display with product namin…
masarray Oct 22, 2026
52dccf8
docs(integration): audit exact divergence of all 37 out-of-chain PRs …
masarray Oct 22, 2026
b565be8
docs(integration): cross-link exact 37-PR divergence triage for futur…
masarray Oct 22, 2026
1331754
docs(integration): pinpoint #251 transaction hash and generation-race…
masarray Oct 22, 2026
4987747
fix(sv): reject stale staged 4I4V scenario before live generation ove…
masarray Oct 22, 2026
b6c13a5
fix(sv): restore concurrency-safe 4I4V bank snapshots from #248
masarray Oct 22, 2026
23a99ca
docs(integration): one-page safe-merge handoff, green exact-code CI a…
masarray Oct 22, 2026
fcffcb9
feat(sv): atomic 4I4V CFG commit while RUNNING with no START authority
masarray Oct 22, 2026
6c1ab72
feat(studio): verified atomic live 4I4V CFG with no spurious STOP or …
masarray Oct 22, 2026
8b0eee9
feat(studio): expose explicit verified live 4I4V apply control
masarray Oct 22, 2026
73cbf83
fix(studio): forbid legacy partial live commands while running; requi…
masarray Oct 22, 2026
dde8ed9
fix(studio): prevent partial per-channel ENABLE while 4I4V streaming
masarray Oct 22, 2026
27e7ca8
test(studio): live 4I4V ACK/readback no restart and failure preserves…
masarray Oct 22, 2026
a2ed8c9
fix(studio): report new frequency only after verified live commit or …
masarray Oct 22, 2026
3eac7da
fix(studio): store staged frequency until authoritative ACK and readback
masarray Oct 22, 2026
9d0d7cc
test(studio): enforce live 4I4V transaction, ACK provenance and legac…
masarray Oct 22, 2026
1de2bba
fix(ci): resolve correct project_root for Studio live CFG structural …
masarray Oct 22, 2026
b4a11c6
fix(ci): repair malformed native Inno prerelease YAML, pin direct EXE…
masarray Oct 22, 2026
011ff12
docs(integration): update all handoffs to live-4I4V code-present, acc…
masarray Oct 22, 2026
25c1a65
test(studio): update stale partial-SET assertion for atomic 4I4V live…
masarray Oct 22, 2026
a59b11b
fix(studio): persist START/STOP and heartbeat forensic logs; expose r…
masarray Oct 22, 2026
84f013c
fix(ci): restore proven native preview pipeline; build draft PR test …
masarray Oct 22, 2026
1debf64
fix(ci): permit exact-head Studio preview firmware on draft without e…
masarray Oct 22, 2026
7c7032e
fix(ci): narrowly allow draft integration #286 matched firmware previ…
masarray Oct 22, 2026
fafbab9
fix(studio): START/STOP control tracks board RUNNING, not transient s…
masarray Oct 22, 2026
1fb03d7
fix(studio): open diagnostic folder using QtCore QProcess, preserve Q…
masarray Oct 22, 2026
3737666
fix(ptp-sv): keep internal GM sync through measured 2-3us clock-read …
masarray Oct 22, 2026
67569a3
fix(esp32p4): apply source-only phase margin to on-board AUTO smpSync…
masarray Oct 22, 2026
af4ea86
test(ptp-sv): regress physical 0-2-0 SOURCE flapping at 5-6us uncerta…
masarray Oct 22, 2026
09d9d2f
ci(ptp-sv): run real SOURCE no-flap regression before exact-head firm…
masarray Oct 22, 2026
7994eff
ci(ptp-sv): keep preview native regression compile command unambiguous
masarray Oct 22, 2026
b0e80ad
ci(ptp-sv): run host regression from repository root in embedded work…
masarray Oct 22, 2026
62a6b60
fix(capture): declare active-SV gate and durable empty-capture failur…
masarray Oct 22, 2026
3711d8f
fix(capture): reject capture when SV publisher STOPPED and persist fa…
masarray Oct 22, 2026
28fd561
fix(capture): reject mid-stream STOP and diagnose empty/aborted PCAP …
masarray Oct 22, 2026
0e6c860
fix(studio): disable SV capture and explain STOPPED publisher before …
masarray Oct 22, 2026
3c8b76d
test(capture): regress STOPPED+stale-FPS rejection and exact 24-byte …
masarray Oct 22, 2026
ba248ae
fix(studio): include QJsonObject explicitly for Windows MSVC capture …
masarray Oct 22, 2026
3994267
fix(studio): label stopped-publisher FPS as stale, not live sample rate
masarray Oct 22, 2026
00c27ec
ci(capture): build and execute real production PCAP decoder liveness/…
masarray Oct 22, 2026
7c95f70
fix(studio): reject empty SV capture while board is stopped
masarray Oct 22, 2026
773a320
fix(studio): keep SV heartbeat alive across unverified SHOW health ti…
masarray Oct 23, 2026
ce4531a
fix(sv): fence stale STOPPED telemetry to board stop-sequence after v…
masarray Oct 23, 2026
5dc4b11
fix(studio): debounce transient Windows COM enumeration loss during S…
masarray Oct 23, 2026
73c9727
fix(firmware): snapshot STOP counter before publishing START running …
masarray Oct 23, 2026
9439e86
fix(studio): auto-commit edited 4I4V cells on Enter/focus-out with co…
masarray Oct 23, 2026
cd8aecc
fix(studio): never commit another focused half-typed editor during au…
masarray Oct 23, 2026
8c58e73
test(studio): guard enter/focus live-apply, in-flight coalescing and …
masarray Oct 23, 2026
f8f2cfc
test(studio): remove obsolete manual Apply live assertion from releas…
masarray Oct 23, 2026
55a5a2f
test(studio): preserve START-contract check with optional live-only f…
masarray Oct 23, 2026
b3c59db
fix(studio): resume queued live edit when verified session becomes wr…
masarray Oct 23, 2026
1b219de
fix(studio): only lock 4I4V editors for START, not in-flight live CFG
masarray Oct 23, 2026
042df0d
test(studio): live CFG must not trigger START editor freeze
masarray Oct 23, 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
29 changes: 25 additions & 4 deletions .github/workflows/arstack-studio-native-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ on:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- 'apps/arstack_studio/**'
# Firmware-only timing fixes MUST create a matched ESP32 image and
# Windows Inno installer; do not leave users on stale embedded firmware.
- 'embedded/esp32p4_smv_injector/**'
- 'include/ariec61850/time_sync/**'
- '.github/workflows/arstack-studio-native-preview.yml'

permissions:
Expand All @@ -19,10 +23,14 @@ jobs:
# rather than taking an older public firmware that lacks PROFILE-BINARY-V1.
firmware:
uses: ./.github/workflows/esp32p4-smv-injector.yml
with:
# Only the GUI Preview installer opts into measured local phase sync.
# Stable release workflow keeps ordinary firmware until board validation.
phase_sync_preview: true

windows-preview:
needs: firmware
if: ${{ !github.event.pull_request.draft && github.event.pull_request.head.repo.full_name == github.repository }}
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
runs-on: windows-2022
timeout-minutes: 40
env:
Expand Down Expand Up @@ -50,10 +58,17 @@ jobs:
run: |
cmake -S apps/arstack_studio -B build-studio-preview -G "Visual Studio 17 2022" -A x64 -DARIEC61850_WARNINGS_AS_ERRORS=ON -DARSTACK_STUDIO_ENGINEERING_PREVIEW=ON
if ($LASTEXITCODE -ne 0) { throw 'Preview configuration failed' }
cmake --build build-studio-preview --config Release --target arstack_studio arstack_session_harness --parallel 2
cmake --build build-studio-preview --config Release --target arstack_studio arstack_session_harness arstack_clipboard_harness arstack_capture_harness --parallel 2
if ($LASTEXITCODE -ne 0) { throw 'Native Studio preview build failed' }
& "$PWD\build-studio-preview\Release\arstack_session_harness.exe"
if ($LASTEXITCODE -ne 0) { throw 'Native session regression failed' }
& "$PWD\build-studio-preview\Release\arstack_clipboard_harness.exe"
if ($LASTEXITCODE -ne 0) { throw 'Production native clipboard readback regression failed' }
# The exact production PCAP decoder must pass the real historical
# 24-byte/zero-packet and STOPPED+stale-FPS regression, not just
# the session and clipboard tests on Draft PRs.
& "$PWD\build-studio-preview\Release\arstack_capture_harness.exe"
if ($LASTEXITCODE -ne 0) { throw 'Native SV capture 24-byte PCAP / liveness regression failed' }
# Differentiate product code regressions from missing deployed DLLs.
$nativeGui = Join-Path $PWD 'build-studio-preview\Release\arstack_studio.exe'
$probe = Start-Process -FilePath $nativeGui -ArgumentList '--check-reference-template' -Wait -PassThru
Expand Down Expand Up @@ -95,6 +110,12 @@ jobs:
throw 'Matching firmware job did not provide its manifest'
}
$manifest = Get-Content -Raw -LiteralPath $manifestPath | ConvertFrom-Json
if ($manifest.phaseSyncPreview -ne $true -or
$manifest.phaseServoEnabled -ne $true -or
$manifest.canonicalMacTxEvidenceEnabled -ne $true -or
$manifest.broadcastMirrorEnabled -ne $false) {
throw 'Studio preview refuses old/default SMV firmware without measured PTP-SV phase and MAC TX evidence'
}
$expectedCapabilities = @('SMV-4I4V', 'PROFILE', 'PROFILE-BINARY-V1', 'LIVE-SETPOINTS', 'SESSION-LEASE', 'PTP-P2', 'SMPSYNCH-AUTO')
foreach ($capability in $expectedCapabilities) {
if ($manifest.capabilities -notcontains $capability) { throw "PR firmware lacks capability: $capability" }
Expand Down Expand Up @@ -216,7 +237,7 @@ jobs:
$env:ARSTACK_STUDIO_FIRMWARE_DIR = Join-Path $stage 'firmware'
$env:ARSTACK_STUDIO_ESPFLASH = Join-Path $stage 'tools\espflash.exe'
$env:ESPFLASH_SKIP_UPDATE_CHECK = 'true'
foreach ($check in @('--check-reference-template', '--check-firmware-contract', '--check-p0-policy', '--check-app-lifecycle')) {
foreach ($check in @('--check-reference-template', '--check-firmware-contract', '--check-p0-policy', '--check-clipboard', '--check-app-lifecycle')) {
$probe = Start-Process -FilePath $exe -ArgumentList $check -Wait -PassThru
Write-Host "PACKAGED_PREVIEW_CHECK=$check EXIT=$($probe.ExitCode)"
if ($probe.ExitCode -ne 0) {
Expand Down Expand Up @@ -264,7 +285,7 @@ jobs:
$env:ARSTACK_STUDIO_FIRMWARE_DIR = Join-Path $installDir 'firmware'
$env:ARSTACK_STUDIO_ESPFLASH = Join-Path $installDir 'tools\espflash.exe'
$env:ESPFLASH_SKIP_UPDATE_CHECK = 'true'
foreach ($check in @('--check-firmware-contract', '--check-p0-policy', '--check-app-lifecycle')) {
foreach ($check in @('--check-firmware-contract', '--check-p0-policy', '--check-clipboard', '--check-app-lifecycle')) {
$probe = Start-Process -FilePath $exe -ArgumentList $check -Wait -PassThru
if ($probe.ExitCode -ne 0) { throw "Installed preview failed $check code $($probe.ExitCode)" }
}
Expand Down
33 changes: 31 additions & 2 deletions .github/workflows/arstack-studio-qt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ jobs:
shell: powershell
run: |
cmake --build build-arstack-studio --config Release `
--target arstack_session_harness arstack_windows_ownership_harness --parallel
--target arstack_session_harness arstack_clipboard_harness arstack_windows_ownership_harness --parallel

- name: S8A deterministic session harness on Windows
timeout-minutes: 1
Expand All @@ -98,6 +98,16 @@ jobs:
throw "S8A Windows deterministic harness failed with exit code $exitCode."
}

- name: Native Windows clipboard roundtrip regression
timeout-minutes: 1
shell: powershell
run: |
$exe = Join-Path $PWD 'build-arstack-studio\Release\arstack_clipboard_harness.exe'
& $exe
if ($LASTEXITCODE -ne 0) {
throw "Native Windows OS clipboard readback failed: exit $LASTEXITCODE"
}

- name: S8B cross-process ownership and serial-loss harness
timeout-minutes: 1
shell: powershell
Expand Down Expand Up @@ -174,6 +184,10 @@ jobs:
shell: bash
run: python3 apps/arstack_studio/tests/check_operator_workspace.py

- name: Independent SV PCAP decoder deterministic regressions
shell: bash
run: python3 -m unittest discover -s tests -p test_smv_wire_capture_audit.py -v

- name: Native binary profile authority regression
shell: bash
run: |
Expand Down Expand Up @@ -212,7 +226,7 @@ jobs:
run: |
set -o pipefail
cmake --build build-arstack-studio \
--target arstack_studio arstack_session_harness --parallel 2 \
--target arstack_studio arstack_session_harness arstack_capture_harness arstack_clipboard_harness --parallel 2 \
2>&1 | tee /tmp/arstack-studio-build.log

- name: 4I+4V reference template regression
Expand All @@ -236,6 +250,21 @@ jobs:
timeout 20s ./build-arstack-studio/arstack_session_harness \
2>&1 | tee /tmp/arstack-studio-session-harness.log

- name: Native GUI clipboard content/readback regression
shell: bash
run: |
set -o pipefail
timeout 15s env QT_QPA_PLATFORM=offscreen \
./build-arstack-studio/arstack_clipboard_harness \
2>&1 | tee /tmp/arstack-studio-clipboard-harness.log

- name: Native SV PCAP capture and CSV decoder regression
shell: bash
run: |
set -o pipefail
timeout 20s ./build-arstack-studio/arstack_capture_harness \
2>&1 | tee /tmp/arstack-studio-capture-harness.log

- name: Firmware bundle contract regression
shell: bash
run: |
Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/arstack-studio-windows-lifecycle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,14 @@ jobs:
New-Item -ItemType Directory -Path 'studio-ui-evidence' -Force | Out-Null
Remove-Item Env:ARSTACK_STUDIO_QA_DIR -ErrorAction SilentlyContinue
Remove-Item Env:ARSTACK_STUDIO_QA_NATIVE_ONLY -ErrorAction SilentlyContinue
foreach ($scale in @('1', '1.5', '1.75')) {
foreach ($scale in @('1', '1.25', '1.5', '1.75')) {
$env:QT_SCALE_FACTOR = $scale
$suffix = 'dpi-' + [string][int]([double]::Parse($scale, [System.Globalization.CultureInfo]::InvariantCulture) * 100)
$logdir = Join-Path (Join-Path $PWD 'studio-ui-evidence') $suffix
New-Item -ItemType Directory -Path $logdir -Force | Out-Null
# Software viewport shots, when grabWindow supports the CI backend.
# Native Windows fidelity is verified separately below.
$env:ARSTACK_STUDIO_QA_DIR = $logdir
$stdout = Join-Path $logdir 'geometry-stdout.txt'
$stderr = Join-Path $logdir 'geometry-stderr.txt'
$probe = Start-Process -FilePath $exe -ArgumentList '--check-operator-ui' -Wait -PassThru `
Expand Down Expand Up @@ -136,11 +139,11 @@ jobs:
if ($probe.ExitCode -ne 0) {
throw "Native Windows screenshot acceptance failed, exit=$($probe.ExitCode)"
}
$png = Join-Path $env:ARSTACK_STUDIO_QA_DIR 'studio-960x620.png'
$png = Join-Path $env:ARSTACK_STUDIO_QA_DIR 'studio-960x680.png'
if (-not (Test-Path $png) -or (Get-Item $png).Length -lt 10000) {
throw 'Native Windows 960x620 screenshot was missing or empty'
throw 'Native Windows 960x680 screenshot was missing or empty'
}
Write-Host 'Windows Qt deterministic 3-viewports x 3-DPI geometry + native 960x620 screenshot: PASS'
Write-Host 'Windows Qt deterministic 5-viewports x 4-DPI geometry + native 960x680 screenshot: PASS'
- name: Upload desktop layout evidence
if: always()
uses: actions/upload-artifact@v4
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/ci-routing-policy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,16 @@ on:
- '.github/workflows/**'
- 'scripts/check_ci_trigger_policy.py'
- 'docs/CI_WORKFLOW_ROUTING.md'
- 'docs/integration/**'
- 'tools/integration_preservation_audit.py'
push:
branches: [main]
paths:
- '.github/workflows/**'
- 'scripts/check_ci_trigger_policy.py'
- 'docs/CI_WORKFLOW_ROUTING.md'
- 'docs/integration/**'
- 'tools/integration_preservation_audit.py'
permissions:
contents: read
concurrency:
Expand All @@ -24,3 +28,11 @@ jobs:
- uses: actions/checkout@v4
- name: Verify scoped PR workflow routing
run: python3 scripts/check_ci_trigger_policy.py
- name: Verify preservation manifest and all 37 non-chain source inventories
shell: bash
run: |
if [ -f docs/integration/PR_PRESERVATION_SNAPSHOT_2026-10-22.json ]; then
python3 tools/integration_preservation_audit.py --verify-only
else
echo 'No integration manifest in this branch; no-op.'
fi
2 changes: 1 addition & 1 deletion .github/workflows/esp32p4-ptp-lab.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ jobs:
'g_announce_sent.load',
'g_sync_sent.load',
'g_follow_up_sent.load',
'return g_ptp_ready.load',
'return source_has_fresh_evidence();',
]
combined = eth + '\n' + ptp
missing = [token for token in required if token not in combined]
Expand Down
75 changes: 70 additions & 5 deletions .github/workflows/esp32p4-smv-injector.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ name: ESP32-P4 SMV Injector

on:
workflow_call:
inputs:
phase_sync_preview:
description: "Build PTP-to-SV measured-local AUTO candidate only for Studio preview"
type: boolean
default: false
required: false
workflow_dispatch:
push:
branches: [main]
Expand Down Expand Up @@ -50,7 +56,10 @@ env:

jobs:
build-esp32p4:
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
# On draft consolidation, do not run ordinary expensive standalone builds.
# The Studio Native Preview explicitly requests a paired firmware via
# workflow_call phase_sync_preview=true; allow only that purposeful build.
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft || (inputs.phase_sync_preview == true && github.event.pull_request.head.ref == 'feat/ptp-source-policy-fsm-20261022') }}
runs-on: ubuntu-latest
timeout-minutes: 25
env:
Expand Down Expand Up @@ -106,9 +115,51 @@ jobs:
echo "ARSTACK_FIRMWARE_BUILD_ID=${ARSTACK_SOURCE_COMMIT:0:16}" >> "$GITHUB_ENV"
echo "Exact firmware build identity pinned to ${ARSTACK_SOURCE_COMMIT:0:16}"

# Run the host-only SOURCE phase/MAC regression in the *same exact
# checkout* that produces the board image; Draft #286 otherwise skips
# the PTP Core workflow, making the physical 0<->2 fix untested.
- name: Regress internal GM microsecond sync without 0-2-0 flapping
if: ${{ inputs.phase_sync_preview == true }}
shell: bash
run: |
set -euo pipefail
# Embedded job defaults to embedded/esp32p4_smv_injector;
# this standalone host test lives at the repository root.
cd "$GITHUB_WORKSPACE"
g++ -std=c++20 -O2 -Wall -Wextra -Werror -Iinclude tests/test_sv_tx_egress_evidence.cpp -o /tmp/arstack_sv_egress_regression
/tmp/arstack_sv_egress_regression
echo 'PTP-SV SOURCE phase and MAC continuity regression: PASS'

- name: Enable PTP-SV measured AUTO preview profile
if: ${{ inputs.phase_sync_preview == true }}
run: |
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
cfg = Path('sdkconfig.defaults')
content = cfg.read_text(encoding='utf-8')
original = 'CONFIG_AR_SMV_BROADCAST_MIRROR=y'
assert content.count(original) == 1, 'expected controlled mirror policy'
content = content.replace(original, '# CONFIG_AR_SMV_BROADCAST_MIRROR is not set')
content += ('\n# SOURCE PTP-SV AUTO phase qualification - preview only\n'
'CONFIG_AR_SMV_PTP_PHASE_SERVO_EXPERIMENTAL=y\n'
'CONFIG_AR_SMV_HW_TX_EVIDENCE_EXPERIMENTAL=y\n')
cfg.write_text(content, encoding='utf-8')
PY

- name: Select ESP32-P4 target
run: source /opt/esp/idf/export.sh && idf.py set-target esp32p4

- name: Verify phase-qualified Studio preview is the actual compiled profile
if: ${{ inputs.phase_sync_preview == true }}
run: |
set -euo pipefail
grep -qx 'CONFIG_AR_SMV_PTP_PHASE_SERVO_EXPERIMENTAL=y' sdkconfig
grep -qx 'CONFIG_AR_SMV_HW_TX_EVIDENCE_EXPERIMENTAL=y' sdkconfig
grep -qx '# CONFIG_AR_SMV_BROADCAST_MIRROR is not set' sdkconfig
grep -qx 'CONFIG_AR_PTP_OPERATING_ROLE=0' sdkconfig
echo 'SOURCE local AUTO preview: servo ON; canonical MAC TX evidence ON; mirror OFF'

- name: Verify P0 pre-v3 silicon policy
run: |
set -euo pipefail
Expand All @@ -124,7 +175,10 @@ jobs:
grep -qx 'CONFIG_AR_PTP_DOMAIN=0' sdkconfig
grep -qx 'CONFIG_AR_PTP_TRANSPORT_SPECIFIC=0' sdkconfig
grep -qx 'CONFIG_AR_PTP_RESPOND_PDELAY=y' sdkconfig
grep -qx 'CONFIG_AR_PTP_SYNC_INTERVAL_MS=250' sdkconfig
grep -qx 'CONFIG_AR_PTP_VLAN=y' sdkconfig
grep -qx 'CONFIG_AR_PTP_VLAN_ID=0' sdkconfig
grep -qx 'CONFIG_AR_PTP_VLAN_PRIORITY=4' sdkconfig
grep -qx 'CONFIG_AR_PTP_SYNC_INTERVAL_MS=1000' sdkconfig
grep -qx 'CONFIG_AR_PTP_ANNOUNCE_INTERVAL_MS=1000' sdkconfig
echo 'Production timing profile: PASS · serialized shared EMAC TX · PTP-P2 LAB_SOURCE · HW timestamp adapter compiled'

Expand All @@ -148,9 +202,9 @@ jobs:
start_begin = source.index('if (take_start_request())')
start_end = source.index('if (!live_tx_running())', start_begin)
start_block = source[start_begin:start_end]
clock_start = start_block.rindex(
'sample_clock = start_sample_clock(task_handle, active_profile.publisher_rate_hz);'
)
# M3 passes the ETH/PTP epoch context as additional arguments.
# Assert that the timer is still armed after the final console log.
clock_start = start_block.rindex('sample_clock = start_sample_clock(')
assert start_block.rindex('ESP_LOGI') < clock_start
assert 'ESP_LOG' not in start_block[clock_start:]
assert 'static_assert(std::atomic<std::uint32_t>::is_always_lock_free);' in source
Expand Down Expand Up @@ -194,7 +248,13 @@ jobs:
import os
import re
import sys
from pathlib import Path
image, sha256, source_commit = sys.argv[1:]
cfg = Path('sdkconfig').read_text(encoding='utf-8')
servo = 'CONFIG_AR_SMV_PTP_PHASE_SERVO_EXPERIMENTAL=y' in cfg
mac_evidence = 'CONFIG_AR_SMV_HW_TX_EVIDENCE_EXPERIMENTAL=y' in cfg
no_mirror = '# CONFIG_AR_SMV_BROADCAST_MIRROR is not set' in cfg
candidate = servo and mac_evidence and no_mirror
if not re.fullmatch(r"[0-9a-f]{40}", source_commit):
raise SystemExit("Firmware source SHA unavailable/invalid; refusing a zero-provenance package")
manifest = {
Expand All @@ -211,6 +271,11 @@ jobs:
"espIdf": "5.5.4",
"sourceCommit": source_commit,
"buildId": source_commit[:16],
"phaseSyncPreview": candidate,
"phaseServoEnabled": servo,
"canonicalMacTxEvidenceEnabled": mac_evidence,
"broadcastMirrorEnabled": not no_mirror,
"smpSynchQualifiedAtBuild": False,
}
with open("build/firmware-manifest.json", "w", encoding="utf-8", newline="\n") as handle:
json.dump(manifest, handle, indent=2, sort_keys=True)
Expand Down
9 changes: 9 additions & 0 deletions .github/workflows/ptp-core-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,15 @@ jobs:
Build-Target 'smp_synch_wire_offset_tests'
Build-Target 'ptp_discipline_tests'
Build-Target 'ptp_p2_hardening_tests'
Build-Target 'ptp_power_profile_tests'
Build-Target 'sv_ptp_epoch_tests'
Build-Target 'ptp_control_cancellation_tests'
Build-Target 'ptp_emac_role_ownership_tests'
Build-Target 'ptp_canonical_authority_tests'
Build-Target 'ptp_receiver_clock_authority_tests'
Build-Target 'sv_ptp_clock_lease_tests'
Build-Target 'sv_ptp_phase_authority_tests'
Build-Target 'sv_tx_egress_evidence_tests'
Build-Target 'ptp_profile_analyze'

- name: Run PTP regression and analyzer smoke tests on MSVC
Expand Down
Loading
Loading