Skip to content

P0-U: stable Command Dock row lifetime and architectural latency plan - #640

Closed
masarray wants to merge 6 commits into
fix/control-priority-inspection-20261020from
fix/command-dock-stable-projection-20261020
Closed

masarray wants to merge 6 commits into
fix/control-priority-inspection-20261020from
fix/command-dock-stable-projection-20261020

Conversation

@masarray

@masarray masarray commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

Reproduced root cause (not cosmetic)

Iec61850MonitorDevice.RefreshCommandSignals() called CommandSignals.ReplaceAll() on every projection, even for unchanged rows. The collection emits Reset after clearing/repopulating, forcing WPF DataGrid row recreation. MainWindow.CommandPanelUx invokes projection through a 2.5s preload timer even with zero new inspections. Existing DistinctOperable membership also depends on transient control proof, and the shell toggles Expander on tab navigation. This is a model/lifecycle issue, not animation.

Changed

  • Reconcile the small CommandSignals membership in place by SignalDefinition identity with Insert, RemoveAt, and Move. No-op refresh issues zero CollectionChanged notifications, retains row instance and Interlock/Sync/Test operator choices, does not issue an MMS request. Genuine authority revocation still removes only that row; StatusOnly/unknown/unverified controls remain ineligible.
  • Add P109U regression tests: 25 identical refreshes, no Reset, selective revocation/requalification, no read-only controls in command grid.
  • Repair pre-existing P109S test fixture that violated the production valid CO DataObject guard (the failure currently breaks parent command PR P0-T: prioritize operator commands over Command Dock inspection backlog #638 CI). The application safety guard remains unchanged.
  • Architecture RFC: docs/COMMAND_DOCK_RELIABILITY_ARCHITECTURE_2026-10-20.md documents deeper stages for typed atomic proof, event-driven WPF, command-stage latency, and release gates. Only phase A is implemented here.

Safety, ancestry and coordination

Stacked on command PR #638 -> #635, engine measurement PR #183. Explicitly DO NOT overlap or overwrite sibling leaf SV/OR/BL + IED progress PR #636; Models/MonitorModels.cs is touched in both at disjoint sections, requiring semantic merge. No MMS control semantics, timeout, interlock, sync, test, CommandTermination, single-flight or quarantine changes. No main merge or release until full combined-head CI and physical acceptance.

Performance claims and acceptance

Source-proven elimination of redundant WPF Reset events (no-change: 1 -> 0); no unverified claim of improved 8–13s native command latency. Instrument SBOw/Operate response vs termination as in engine PR #183 and compare equivalent reference MMS client operation milestones, then run real relay FAT. Windows CI pending.

Copy link
Copy Markdown
Owner Author

Dependent implementation PR #641 builds on this identity-preserving projection: removes 2.5-s visual timer, binds command rows on real WPF Loaded, uses event-triggered MMS preflight rather than tab navigation, keeps shared dock expanded state across tabs, makes typed inspection commit only after network reads (fail closed on errors), and ensures diagnostic prose cannot grant ctlModel authorization. Added explicit command-claim denial while a descriptor inspection is busy, preserving first-click typed Open/Close preflight. Full CI/hardware FAT still required; no automatic merge or release.

Copy link
Copy Markdown
Owner Author

D27 superseded historical stacked PR — source already in integrated RC #727.

Exact ancestry verification: historical head d7b16f21e091f73cad57fb942b82be1d63e7b83a → current RC d2d0ca731061824102058756fba8599ddfa2342e: ahead_by=842, behind_by=0. This proves the RC contains every commit on the historical branch; this PR does not need another merge. Closed as already absorbed into the RC ancestry, not as a direct GitHub PR merge. It does not establish live IED, physical FAT, trial-engine or mainline acceptance. #729 is the independent mainline promotion gate.

Copy link
Copy Markdown
Owner Author

D27 backlog reconciliation — historical PR branch fully contained in integrated RC. Exact GitHub ancestry proof: d7b16f21e091f73cad57fb942b82be1d63e7b83a..d4598619b1b8fc21487cf5beb83a8a8284d0e9cf has ahead_by=848, behind_by=0. Thus no commits from this branch would be lost by closing its redundant PR. This is closure as absorbed ancestry, not a direct PR merge. RC #727 holds the code; blocked main promotion #729 and live field/engine gates remain open. Do not treat this historical closure as IEC 61850 physical acceptance.

@masarray masarray closed this Oct 27, 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