diff --git a/docs/WORKBENCH_CURRENT_HANDOFF.md b/docs/WORKBENCH_CURRENT_HANDOFF.md index e99ab3ecb..21043b199 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) + +- **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. +- **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.