Skip to content

Release ARSAS 1.6.34 - #268

Merged
masarray merged 279 commits into
mainfrom
release/v1.6.34
Sep 8, 2026
Merged

Release ARSAS 1.6.34#268
masarray merged 279 commits into
mainfrom
release/v1.6.34

Conversation

@masarray

@masarray masarray commented Sep 8, 2026

Copy link
Copy Markdown
Owner

ARSAS 1.6.34 stable release

Direct integration of the proven FAT/relay-bench recovery and P1 operator workflow branch into main, including the final Legacy SAS SCL export serialization fix.

Release contents

  • FAT/relay-bench recovery authorities and lifecycle fixes
  • COMTRADE re-download selection/staged overwrite hardening
  • semantic signal naming and IEC reference presentation continuity
  • independent multi-RCB export workflow
  • final SCL export object-cycle fix: XML XDocument is written only as SCL/CID and is no longer serialized into companion JSON
  • regression coverage for the serialization boundary

Proven candidate before release metadata bump

  • ARSAS head: a3e650130ea250e6c674bea30663d2d0f3866d04
  • Build ARSAS #2161: GREEN
  • Validate IO #1030: GREEN
  • Validate SV #1251: GREEN
  • portable publish + smoke test: GREEN
  • ARIEC61850 remains pinned at 11ab2304482600c19ba979f4fc9021ddb46b9af9

Release metadata

  • version: 1.6.34
  • channel: stable
  • Windows publication request incremented to trigger the official release workflow after merge to main

Do not change functional code in this PR beyond the already-proven candidate; the only post-candidate changes are release version metadata.

@masarray
masarray merged commit c9e6c3c into main Sep 8, 2026
4 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: 816e77495b

ℹ️ 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".

Comment on lines +44 to +48
$selection = Replace-Exact $selection @'
// A descriptor may carry more than one membership. Do not arbitrarily take the
// first DataSet: choose only literal memberships that are backed by authoritative
// report-control configuration.
'@ @'

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 Remove the nonexistent patch anchor

The Apply Progressive Static bench policy workflow always fails here: Replace-Exact throws when its old text is absent, but Services/Iec61850StaticDataSetAuthoritySelection.cs contains no “A descriptor may carry more than one membership” comment (the code proceeds directly from the descriptor loop to var memberships). Consequently the newly added bench workflow stops before building or publishing any artifact.

Useful? React with 👍 / 👎.

Comment on lines +221 to +223
await engineeringWindow.RefreshIoFatCommandValuesAsync(device);
AttachFatCommandDevice(device);
SynchronizeFatCommandRows();

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 Discard stale command-panel refresh completions

When the operator changes SelectedIed while this network-backed refresh is awaiting, a second refresh attaches the newly selected device, but the older invocation can finish afterward and unconditionally reattach its captured device. The panel then displays operable controls for the previously selected IED, and those buttons retain that old signal as their command target. Add a selected-IED/generation check after the await before attaching or synchronizing the result.

Useful? React with 👍 / 👎.

Comment on lines +172 to +176
// Advance the current projection before the controller promotes the newest V2.
// The shifted item is the already-journaled previous V2, so no process evidence
// is invented; this keeps current-pair assessment atomic for the live UI.
if (shiftedValue1 != null)
point.Runtime.SetFatValueEvidence(shiftedValue1);

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 Journal the rolling shift before mutating evidence

For a completed rolling pair, Observe mutates Value1Evidence before the controller calls AppendOrFault for the new Value 2. If the asynchronous journal has failed or refuses the append, the controller returns without promoting the new evidence, but Value 1 has already changed to a newly generated, unjournaled evidence object, leaving a duplicated/partially advanced report pair despite the capture being rejected. Return the shift without applying it, append the required journal entries, and mutate both slots only after append succeeds.

Useful? React with 👍 / 👎.

_associationResumeMonitoring.Contains(device.DeviceId) &&
!device.IsMonitoring)
{
await StartDeviceMonitorAsync(device).ConfigureAwait(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.

P1 Badge Retain reconnect state when monitor restart fails

For an IED that was monitoring before the outage, StartDeviceMonitorAsync can return false after a transient report/planning failure, but its result is ignored. Because connected remains true, the following success check calls CompleteAssociationReconnect and clears _associationResumeMonitoring and the retry marker, leaving the IED connected but permanently not monitoring. Treat a failed monitor restart as a failed reconnect so the watchdog retries it.

Useful? React with 👍 / 👎.

Comment on lines +185 to +189
private static bool P1IsConfirmedCommandFeedback(Iec61850PointSnapshot snapshot)
=> snapshot.IsValueEdge &&
!snapshot.IsReportTraffic &&
(snapshot.Reason ?? string.Empty).Contains(
"confirmed command feedback",

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 Require an active command before opening the UI fence

This downstream filter treats the reason string alone as confirmed command feedback. The polling path can deliberately inherit state.Reason after report traffic, so after the facade's two-second expectation-backed fence expires, a stale non-report edge carrying the old “confirmed command feedback” reason reaches this method and opens a fresh fence around the stale value; subsequent real report state can then be suppressed. Gate this classification on the active command expectation/provenance rather than the reused reason text.

Useful? React with 👍 / 👎.

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