From bae8394380d6947d7837d9555ed6c3b5b7be8c24 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sat, 17 Oct 2026 05:45:55 +0700 Subject: [PATCH 1/2] docs: repair duplicated handoff header and record rigorous Reporting/RCB gate --- docs/WORKBENCH_CURRENT_HANDOFF.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/WORKBENCH_CURRENT_HANDOFF.md b/docs/WORKBENCH_CURRENT_HANDOFF.md index e99ab3ecb..aeac95ed8 100644 --- a/docs/WORKBENCH_CURRENT_HANDOFF.md +++ b/docs/WORKBENCH_CURRENT_HANDOFF.md @@ -1,21 +1,25 @@ # Native Qt IEC 61850 Workbench — current cross-thread handoff -> **Updated:** 2026-10-16 (WIB), snapshot only; always refresh GitHub refs and PR state before editing. +> **Updated:** 2026-10-17 (WIB), snapshot only; always refresh GitHub refs and PR state before editing. > **Primary strategy and ownership contract:** [WORKBENCH_ARSAS_GUI_SSOT_STRATEGY.md](WORKBENCH_ARSAS_GUI_SSOT_STRATEGY.md). > **Scope:** installed native ARStack Workbench in apps/ied_simulator. Not a web app, WPF clone, or the separate ESP32-P4/SMV Studio track. +## M2P Reporting/RCB exact InformationReport authority — 2026-10-17 (WIB) + +- **Integration status:** [PR #203](https://github.com/masarray/arstack61850/pull/203), code head must be verified and merged only after exact-head CI SUCCESS. As of this handoff preparation, acceptance on actual IED hardware remains **OPEN**; check GitHub for source merge before saying production-integrated. +- **Reference parity without extra engine:** native `MmsReportSubscriptionRuntime` owns confirmed MMS Read/Write and unconfirmed InformationReport route; `MmsReportFrameMapper`, `MmsReportFrameBindingValidator` and bounded `MmsOfflineReportMonitor` guard and project exact observations. Reuses `MmsStaticReportSessionRuntime` ownership; GUI `MmsReportController`/`BrowserReportPane.qml` use same snapshots, not new receiver, decoder, thread or poller. +- **Identity authority:** check wire `RptID` before mapping values to any member names. Then verify DataSet reference and ConfRev when included, strict ascending inclusion indexes, each directory member, and each optional wire DataRef against canonical/user and typed MMS identities. Reject foreign, stale, contradictory or reordered reports without poisoning accepted-stream counters or labeling values. +- **RCB lifecycle:** static DataSet pinned through live probe, reservation and enable with no silent takeover; authored Dynamic DataSet retains explicit write and readback semantics. Probe excludes write-only GI, which is sent explicitly only when configured/supported after guarded RptEna verification; record not-supported/failed/sent distinctly from receiving an actual report. +- **Browser GUI:** use exact selected RCB reference in each projected InformationReport, not RptID-only matching (indexed RCBs can share an RptID). Show accepted, rejected and decode-failed counts, selected lifecycle events, and bounded detailed member evidence including q/t fields. +- **Scripted regression:** foreign `RptID`, live static DataSet rebind refusal with zero unsafe writes, valid report after foreign rejection, wrong/conflicting DataSet and ConfRev, member order/duplicate, swapped/foreign/empty DataRef, optional-field omissions, and exact typed MMS DataRef acceptance. Native Qt Report/RCB GUI QA and Browser convergence guard must pass on the same commit. +- **Physical acceptance remains open:** installed Windows package; real vendor relay `RptID/DatSet/ConfRev/OptFlds/TrgOps/Owner` readback; GI write and actual report reception; multiple RCBs with shared RptID; BRCB EntryID/BufOvfl/replay/segmentation; safe disable/cleanup and reconnect; actual PCAP + vendor/model/firmware. See [PR #203](https://github.com/masarray/arstack61850/pull/203) physical acceptance comment. + ## M2N native Browser GOOSE Subscribe + ARSAS/ARIEC parity — 2026-10-16 (WIB) - **Integrated `main` at this checkpoint:** `71580659f28c49207db94efd7f7d302d5fd12901`, [PR #200](https://github.com/masarray/arstack61850/pull/200) MERGED after exact-head `4df620874bdab9c0bf280d31a342c12dfa6ab38a` **3/3 relevant workflows SUCCESS**: 55/55 native IED Simulator Qt job steps, SCL-Assisted Workbench CI and Product Naming Guard. Three P1 review findings fixed/answered/resolved. Exact post-merge main jobs (IED Simulator Qt, SCL-assisted, Release Hardening) were still running; verify separately. - **Reference-backed root cause:** `BrowserGoosePane.qml` previously presented only canonical configured SCL/control-block data, while `GooseWorkspace` already received real Ethernet GOOSE via `GooseMonitorController`, bounded AF_PACKET/Npcap, native `GooseFrameCodec`, sequence/TAL supervision and PCAP export. Cross-checked ARSAS `docs/GOOSE_SUBSCRIBER.md`, `GooseSubscriberRuntime.cs`, `GooseSubscriberLiteView.xaml` and ARIEC `GooseFrameParser.cs`. This ports missing capability into the existing native owner; **not** a duplicate parser, second NIC socket, .NET app, timer, poller or cache. - **User-visible capability:** Browser → GOOSE has explicit interface picker, Refresh NICs and GOOSE Subscribe/Stop for the *shared passive* monitor; never silently auto-select first NIC. The selected configured stream displays actual matching wire stNum/sqNum, packet/timeout state and decoded ordered `allData`. After capture stops, retained values are clearly historical, not live. The full Sniffer remains available. -- **Identity and safe engineering naming:** exact case-preserved `goCBRef` and available DataSet, APPID (SCL hexadecimal), destination MAC, goID and VLAN/PCP; typed live MMS `LD/LN.GO.gcb`/ `LD/LN.DataSet` → canonical `$GO# Native Qt IEC 61850 Workbench — current cross-thread handoff - -> **Updated:** 2026-10-16 (WIB), snapshot only; always refresh GitHub refs and PR state before editing. -> **Primary strategy and ownership contract:** [WORKBENCH_ARSAS_GUI_SSOT_STRATEGY.md](WORKBENCH_ARSAS_GUI_SSOT_STRATEGY.md). -> **Scope:** installed native ARStack Workbench in apps/ied_simulator. Not a web app, WPF clone, or the separate ESP32-P4/SMV Studio track. - -/`$DataSet` wire conversion only (no global dot replacement). No APPID-only guesses; malformed/ambiguous/wrong-publisher evidence rejected. A model member is labeled with an observed value **only when the configured ConfRev AND DataSet member count agree**. Otherwise raw allData remains visible, explicitly unbound, with mismatch warning, no invented FCDA mapping. +- **Identity and safe engineering naming:** exact case-preserved `goCBRef` and available DataSet, APPID (SCL hexadecimal), destination MAC, goID and VLAN/PCP; typed live MMS `LD/LN.GO.gcb`/ `LD/LN.DataSet` → canonical `$GO$`/`$DataSet` wire conversion only (no global dot replacement). No APPID-only guesses; malformed/ambiguous/wrong-publisher evidence rejected. A model member is labeled with an observed value **only when the configured ConfRev AND DataSet member count agree**. Otherwise raw allData remains visible, explicitly unbound, with mismatch warning, no invented FCDA mapping. - **Bounded performance:** one `GooseMonitorController` for the application, 256 streams/256 members/256 events/4096 retained packets/64 packets per poll; NIC enumeration cached behind its own `interfacesChanged`, refreshed only on command and never per incoming frame. Multiple IED tabs reuse the one monitor with strict stream binding, not multiple receivers. - **Regression:** `ied_goose_workspace_qa` replays generated native GOOSE publisher PCAP; checks exact matching, allData order, canonical MMS references, wrong APPID/DataSet/MAC/goID/VLAN, malformed identity, case sensitivity, competing publishers with same ref/APPID, plus existing TTL/sequence/PCAP capacity. Qt QML smoke and rendered Browser routing passed on exact PR SHA. This is test evidence, **not** field IED capture or manufacturer interoperability certification. - **Outstanding product gates:** test on physical publisher/relay and selected Windows Npcap NIC (including VLAN/offload/network path and physical frame receipt), validate ConfRev/FCDA values with real SCD, time-to-first-observation, Windows installed Workbench package, and independent reporting/RCB controls. No guessed GOOSE subscription acknowledgements or device state changes. Separate ESP32-P4/PTP/SMV Studio track remains independent. From 931f1022c542633e8234b2fc67af999524084cc7 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sat, 17 Oct 2026 05:47:33 +0700 Subject: [PATCH 2/2] docs(workbench): record accepted 13/13 RCB authority gate and exact merged commit --- docs/WORKBENCH_CURRENT_HANDOFF.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/WORKBENCH_CURRENT_HANDOFF.md b/docs/WORKBENCH_CURRENT_HANDOFF.md index aeac95ed8..21043b199 100644 --- a/docs/WORKBENCH_CURRENT_HANDOFF.md +++ b/docs/WORKBENCH_CURRENT_HANDOFF.md @@ -6,7 +6,7 @@ ## M2P Reporting/RCB exact InformationReport authority — 2026-10-17 (WIB) -- **Integration status:** [PR #203](https://github.com/masarray/arstack61850/pull/203), code head must be verified and merged only after exact-head CI SUCCESS. As of this handoff preparation, acceptance on actual IED hardware remains **OPEN**; check GitHub for source merge before saying production-integrated. +- **Integrated code:** [PR #203](https://github.com/masarray/arstack61850/pull/203) MERGED into `main` at `a33271e90fea369abad551e7601b446752e10d54`, exact PR head `723ad3f46728b864c91e553820e410ab4171ad9a`. **13/13 exact-head workflows SUCCESS**, including C++ GCC/Clang/Windows MSVC, native IED Simulator Qt **55/55 steps**, Security and Evidence ASan/UBSan/libFuzzer, BRCB/RCB, MMS R1–R2, SCL-assisted Workbench and Connect, interoperability server, and naming guard; 0 unresolved review threads. This is CI/scripted production-path evidence, **not** a physical IED certification. Post-merge `main` workflow runs must be checked separately. - **Reference parity without extra engine:** native `MmsReportSubscriptionRuntime` owns confirmed MMS Read/Write and unconfirmed InformationReport route; `MmsReportFrameMapper`, `MmsReportFrameBindingValidator` and bounded `MmsOfflineReportMonitor` guard and project exact observations. Reuses `MmsStaticReportSessionRuntime` ownership; GUI `MmsReportController`/`BrowserReportPane.qml` use same snapshots, not new receiver, decoder, thread or poller. - **Identity authority:** check wire `RptID` before mapping values to any member names. Then verify DataSet reference and ConfRev when included, strict ascending inclusion indexes, each directory member, and each optional wire DataRef against canonical/user and typed MMS identities. Reject foreign, stale, contradictory or reordered reports without poisoning accepted-stream counters or labeling values. - **RCB lifecycle:** static DataSet pinned through live probe, reservation and enable with no silent takeover; authored Dynamic DataSet retains explicit write and readback semantics. Probe excludes write-only GI, which is sent explicitly only when configured/supported after guarded RptEna verification; record not-supported/failed/sent distinctly from receiving an actual report.