Skip to content

fix: hide live discovery protocol noise from Signal Selection - #188

Merged
masarray merged 5 commits into
mainfrom
fix/live-discovery-operational-inventory
Aug 15, 2026
Merged

fix: hide live discovery protocol noise from Signal Selection#188
masarray merged 5 commits into
mainfrom
fix/live-discovery-operational-inventory

Conversation

@masarray

@masarray masarray commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Field evidence

Real Siemens live discovery on ARSAS 2f2af7d29a4103030b76261a827cc0031d82f1d2 / ARIEC 761fa0df9ca84fbe15352d2670f03fddbe8784ba correctly preserved 58/58 static DataSet members, but Signal Selection still exposed discovery/service noise such as Mod, Beh, Health, NamPlt, substitution attributes, origin.orCat, origin.orIdent, ctlVal, ctlNum, and d.stVal / LLN0.q.stVal style points.

The live scan reported 8,481 raw MMS variables, 7,776 FC points, 4,664 SCADA candidates, 2,382 publishable live signals and 213 control objects. The problem is therefore not DataSet parsing; it is the presentation boundary between broad live discovery authority and Signal Selection.

Root cause

SasOperationalSignalPolicy already has operator-facing rules, but Signal Selection uses WPF's default collection view, which can be shared with another DataGrid. The global UI filter may be installed first and then replaced by the wizard constructor when it assigns its own search/filter predicate. Because the global policy remembers the shared view as already filtered, it can fail to re-wrap it when the wizard loads.

Fix

  • Add LiveDiscoverySignalSelectionPolicy as a field-hardened selector boundary.
  • Explicitly reject protocol/engineering path segments such as Mod, Beh, Health, NamPlt, q, t, d, origin, control-service leaves, substitution/configuration/nameplate attributes, including nested forms such as d.stVal and q.stVal.
  • Static DataSet membership remains authoritative and wins over the noise classifier.
  • Install the Signal Selection filter on the wizard Loaded event, after constructor search/column filters exist.
  • Compose with the wizard's existing filter and restore the previous shared collection-view filter on close.
  • Never mutate or prune device.Signals from UI code.
  • Full ARIEC/live discovery authority remains intact for diagnostics, SCL comparison, report planning and engineering inspection.

Regression coverage

Field-derived negative examples:

  • GAPC1.Mod.stVal
  • GAPC1.Beh.stVal
  • GAPC1.Health.stVal
  • GAPC1.NamPlt.d
  • GGIO substitution/service attributes
  • GGIO1.Mod.Oper.origin.orCat
  • GGIO1.Mod.Oper.origin.orIdent
  • ctlVal, ctlNum, Check, ctlModel
  • d.stVal
  • LLN0.q.stVal

Positive coverage keeps breaker position, MMXU measurements, protection trip, GGIO indications, valid CSWI position control, and object-level static DataSet members. A configured static DataSet member is also verified to remain visible even if its name resembles an engineering state.

Field acceptance

After this PR, Diagnostics can still describe the complete raw MMS/live model, but Signal Selection must not show the protocol/engineering noise above. Static DataSet completeness must remain 58/58. No field success is claimed until the real Siemens IED is re-tested.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@masarray
masarray merged commit 9e2cc0c into main Aug 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant