Skip to content

Restore all mandatory IED DataSet signals in selection wizard - #172

Merged
masarray merged 7 commits into
mainfrom
fix/dataset-members-signal-wizard
Aug 14, 2026
Merged

Restore all mandatory IED DataSet signals in selection wizard#172
masarray merged 7 commits into
mainfrom
fix/dataset-members-signal-wizard

Conversation

@masarray

@masarray masarray commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Problem

Valid IEC 61850 signals that are members of an IED static DataSet can disappear before the Signal Selection Wizard is shown. The user therefore cannot find them on first connect or later through Edit Signal, before selection state is even involved.

Root cause

ARSAS applies application-level SCADA/readability curation while building the normal discovered signal workspace. That curation is useful for reducing engineering noise, but it must not override ARIEC's authoritative DataSet membership and primary-value classification.

Final fix

  • consume the pinned ARIEC Signal Catalog from device.LiveDiscoveryModel;
  • use engine-owned GetMandatoryPrimarySignals() only — ARSAS does not infer which DataSet members are primary;
  • union every engine-declared mandatory primary static DataSet signal into the selection inventory before the wizard becomes interactive;
  • keep restored rows IsSelected = false unless the normal user-selection workflow selects them;
  • enrich an already-present row with engine DataSet/report evidence instead of duplicating it;
  • keep non-DataSet engineering noise out of this recovery path;
  • register recovered rows with MainWindow lifecycle ownership/property-change handling so later selection/runtime updates behave like normal discovered rows;
  • keep the recovery idempotent for first-connect and Edit Signal/reopen flows.

Architecture hardening from final audit

  • removed ARSAS-side $ -> . reference canonicalization from the recovery service;
  • dedupe now compares only literal reference forms already exposed by ARIEC (DesignReference, ObservedReference, primary/canonical/effective/observed MMS references);
  • ARIEC remains the only IEC 61850 semantic/canonicalization authority;
  • a recovered DataSet row is marked Not probed, not ready/readable, so inventory presence is not confused with MMS read success;
  • no changes were made to the large legacy MainWindow/runtime/native-client files; the final diff is four focused files only.

Regression coverage

  • mandatory primary DataSet signal is present while still unselected;
  • reopening selection is idempotent/no duplicate;
  • existing discovered row is enriched rather than duplicated;
  • existing MMS-style reference is matched only through an engine-provided literal reference form, with no app canonicalization;
  • non-DataSet signal is not promoted;
  • restored row remains Not probed until actual acquisition reads it.

Exact-head validation

Head: 65510f3b328d04db42ccdf25528f23cbb2889c8f

  • Build ARSAS #1097 — SUCCESS
    • immutable engine lock/API verification
    • source/license and UX/GOOSE/SMV/SAS invariants
    • solution build
    • full ARSAS application regression tests
    • portable x64 publish
    • portable smoke test
    • artifact upload
  • Validate SV evidence bundles #273 — SUCCESS
    • focused compile
    • focused regression tests

Merge decision

Final software audit found no remaining merge blocker. Physical IED verification remains valuable as post-merge field validation for the originally affected relay, but it is no longer a software merge gate per the requested integration decision.

@masarray
masarray marked this pull request as ready for review August 14, 2026 13:38
@masarray
masarray merged commit 58521e5 into main Aug 14, 2026
2 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 65510f3b32

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

{
protected override void OnInitialized(EventArgs e)
{
var merge = Iec61850DataSetSignalInventoryService.EnsureMandatorySignals(_device);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Merge mandatory signals before gating the wizard

Running recovery only from OnInitialized is too late for the flows that need it: ConnectAndConfigureDeviceAsync opens the wizard only when device.SignalCount > 0, and OpenSignalSelectionWizardAsync also returns early for an empty inventory, so an IED whose mandatory DataSet signals are all removed by normal curation can never reach this call. The Connect All path additionally performs discovery with openWizard: false, so it never recovers these signals or restores their saved selections. Merge the catalog into the inventory immediately after discovery and before selection restoration and zero-count checks.

Useful? React with 👍 / 👎.

Comment on lines +120 to +124
if (membership is not null &&
!string.Equals(signal.DataSetReference, membership.DataSetReference, StringComparison.OrdinalIgnoreCase))
{
signal.DataSetReference = membership.DataSetReference;
changed = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve a consistent DataSet and RCB membership pair

When a signal belongs to multiple DataSets, this unconditionally replaces an existing DataSetReference with the alphabetically first membership, while ApplyEngineDataSetAuthority preserves any nonempty ReportControlReference. A previously valid DataSet/RCB pair can therefore become an RCB for one DataSet paired with another DataSet, and the report planner will build a static plan from that mismatched pair. Select a membership associated with the chosen RCB, or retain an existing authoritative pair when both references are already populated.

Useful? React with 👍 / 👎.

@masarray masarray mentioned this pull request Aug 14, 2026
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