Skip to content

Final calm engineering polish — periodic SV report grouping, readable SCL and verified candidate FAT gates - #47

Draft
masarray wants to merge 143 commits into
mainfrom
fix/phasor-ssot-responsive-lightweight-20261019
Draft

masarray wants to merge 143 commits into
mainfrom
fix/phasor-ssot-responsive-lightweight-20261019

Conversation

@masarray

@masarray masarray commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

Latest addition: real per-channel SV freshness

  • Full stream STALE: the waveform control binds SelectedStream.IsActive and mutes all voltage/current traces and legends, retaining the last valid oscilloscope evidence (same visual semantics as phasors). Prominent STALE · last valid samples lane header.
  • Partial 4I+4V quality fault: only the channel whose verified instMag/q word indicates invalid/old/untrusted data is withheld. Its previous coherent waveform/phasor/RMS is shown as HELD at 38% opacity; if no prior valid samples exist it becomes MISSING. Five healthy phases remain normal. The stream becomes amber LIVE · WARN, not green.
  • A channel is not switched to LIVE on the first good ASDU: it needs a full new coherent window. Zero-amplitude valid data remains LIVE; never infer stale from a flat waveform.
  • All consumers share ChannelFreshness in the selected-stream analyzer SSOT: waveform, phasor, measurement rows, immutable runtime snapshot and power readout. Three-phase power returns N/A if any required channel is HELD/MISSING; held data is not claimed as a current measurement.
  • Same raw decoding and aligned smpCnt window, no additional background timer, packet worker, or channel packet cache. Presentation uses per-trace opacity and existing frozen pens.
  • Respect SCL channel-to-element mapping for quality bits when channel ordering differs, and fail conservatively for unverified layouts. Unsupported arbitrary layouts do not get guessed channel freshness.
  • Fix an initial quality-window off-by-one regression discovered by CI: exact 2/4/8-cycle PCAP replay remains valid. Test covers one bad Ic, five healthy peers, recovery, missing-quality semantics and valid zero.

Previously implemented in this PR

  • Phasor exact-tip callouts for co-linear U/I, stable label collision avoidance, snapshot-driven U/I scaling, and source-relative electrical angles.
  • Npcap trusted native DLL selection; no fabricated fallback Ethernet NIC.
  • Safe Windows Inno Setup installer with in-place repair and local PDF manuals regenerated from Markdown with SHA256 provenance.
  • Public release remains manually gated on main and documented physical target-NIC/long-running injector field acceptance. No auto-merge or automatic stable release.

Validation

Current head automated Windows CI, Runtime Architecture, Runtime Stability, candidate package and CodeQL are the gate. Physical single-channel quality inject test on the target PC and the full 60-minute bench are still pending.

WPF visible-spacing correction — follow-up to physical screenshots (2026-10-20)

The first styling pass was insufficient: it standardized padding, but retained a visibly oversized 16-DIP gap between the 280-DIP explorer, central canvas and 320-DIP inspector, versus only 8 DIP below the capture header and 12 DIP between Phasors / Measurements.

Actual Grid geometry fixed in this follow-up:

  • Outer shell horizontal gutters: 280,8,*,8,320, rather than 280,16,*,16,320.
  • Analyzer interior canvas/inspector and phasor/measurement split: 8 DIP.
  • Diagnostics hero/metric vertical and nine adjacent metric-card horizontal gaps: 8 DIP.
  • GOOSE timeline/inspector: 8 DIP.
  • Timing/PTP hero / evidence / events and three header cards: 8 DIP.
  • SCL hero/body and catalog/inspector: 8 DIP.
  • All primary panel sibling gaps now use compact 8 DIP, with independent 12-DIP inside-panel padding.
  • Fixed explorer Grid.RowSpan=2 bug that caused the sidebar bottom to overlap the footer gap and fail to align with the main canvas bottom. It now occupies exactly Grid.Row=0, like the central canvas, above the shared 8-DIP footer gutter.
  • The updated parsed-XAML CI contract checks root shell geometry, major tab grids, actual left panel row alignment, and legacy metric gaps. No data acquisition/decoder/phasor math changed.

Validation: Windows CI, runtime architecture/stability, CodeQL, dependency review, and Inno installer for current commit are the automated gates. Live Windows screenshots at 100%/125%/150% DPI remain a separate visual acceptance gate.

Physical screenshot verification and build provenance (2026-10-20)

Four same-resolution (1586x893) operator screenshots show a 16 px explorer/main gap (left edge x9 to right edge x288; next panel begins x305), and the SCL hero/body and analyzer right-stack still resemble the old 12 px split. The left explorer also extends ~8 px below the center panel. These are incompatible with the PR's parsed XAML 8-DIP shell and removed RowSpan, so do not claim that those screenshots prove Candidate 251 was installed or launch-path-correct. TabControl template uses zero padding and only a SelectedContent presenter, so a hidden 8-DIP template inset is not supported by source review.

Installer/runtime diagnostic added:

  • Remove misleading static About labels Version 1.0.0 / Build 2026.04.
  • Include BuildInfo.json with exact Git SHA, version, GitHub run ID, and SHA256 of packaged EXE in both the Inno and portable payloads.
  • About shows the assembly version, short commit/CI number, and the actual executable path (Environment.ProcessPath); hover for the full SHA/path.
  • Both ZIP validator and Inno install/repair smoke verify provenance manifest and actual EXE hash, making accidental stale/mismatched installation detectable.

Field acceptance still pending: Install the verified new candidate, open top-right Info → About, record the Build commit and actual executable path. Compare against candidate artifact and capture fresh screenshots of workspace gaps. If correct commit shows old 16px gutters at 100% Windows scale, investigate WPF visual-tree geometry/DPI live rather than making speculative spacing edits.

Calm engineering polish — baseline checkpoint and scope

Progress locked first at exact commit 03fc3657f2ba21df2bc570d2198c59bb2f2be2dc, on checkpoint/pre-calm-engineering-polish-20261020, with all six baseline workflows green. All subsequent work remains on this PR.

  • Bounded exact-message DiagnosticEventSummarizer, groups repetitions as ×N, earliest/latest time tooltip; original forensic AnalyzerShellState.Events unchanged.
  • Incremental display reconciliation prevents clearing/rebuilding up to 200 ListView items on each arrival; no new timer, packet worker, or waveform cache.
  • Correct engineering semantics: signed host/Npcap ARRIVAL Δ · HOST vs clock jitter claims; missing smpCnt evidence labeled inferred gaps, not confirmed NIC packet loss.
  • Static RX waveform badge separates reception from amber LIVE · WARN integrity. The former pulsing animation was removed.
  • Compact U/I scale toolbar, full option tooltips; PT P transport-column widths corrected; calm truthful GOOSE empty states; SCL full technical identifier tooltips.
  • Read the acceptance and locked baseline.
  • Latest automated CI: WPF 8-DIP geometry PASS, Windows build PASS, 183/183 xUnit PASS, Runtime Architecture PASS, Runtime Stability PASS and Dependency Security PASS. CodeQL and candidate Inno verification remain explicit gates until their latest current-SHA workflows finish.
  • Still DRAFT: public release requires final physical field acceptance, NIC/quality injection regression and operator DPI screenshots; no claim of live field certification.

Final five-tab screenshot follow-up — 2026-10-20

The 13:10 operator screenshots show restored premium/compact 8-DIP spacing, readable analyzer waveforms, clear passive PTP claims, and a meaningful SCL mismatch notice. Visual blocker: Diagnostics still shows dozens of periodic SV arrival timing excursions >= 300 us summaries. Root cause: the raw analyzer emits report messages with changing counters/latest-smpCnt values, while the UI initially grouped by full message. This is not proof that prior aggregation worked in the field.

Targeted correction at current candidate head:

  • Exact known periodic family grouped by stable severity + svID + title, only if svID is explicit, retaining latest raw evidence, earliest/latest report timestamps and reporting ×N reports (not misleading ×N missing packets).
  • Ordinary diagnostics, different svIDs and changing severity remain separate. Raw forensic events unmodified, bounded 200-row projection and incremental ListView reconciliation unchanged.
  • New positive/negative regression tests for volatile reports, two publishers, severity differences and missing-source fail-closed behavior.
  • Readability: SCL full signal references 12-DIP monospace / appropriate row height; compact P/Q/S/PF measurements raised to 12 DIP. No panel-grid or SSOT signal/phasor changes.
  • Preserved checkpoint checkpoint/calm-polish-candidate-273-20261020 at 754ec5d850b1d2b1f7572db8b17f484f103b6681.

Stable public release deliberately BLOCKED until docs/validation/V1.4.1_PUBLIC_RELEASE_ACCEPTANCE.md physical target-PC gates are signed on this exact candidate: actual NIC and 60-minute capture, multi-setting U/I validation, 4000/4800 rates, quality-gap/held/missing tests, 100/125/150% DPI and Npcap/installer lifecycle. CI, screenshots and candidate packaging are not calibrated relay/clock-lock or packet-loss proof. Remain Draft PR; do not merge/publish stable without this field evidence.

@masarray masarray changed the title Fix phasor SSOT, compact-label collisions and redundant WPF redraws Fix phasor SSOT and ship repairable Inno Setup Windows installer Oct 19, 2026
@masarray masarray changed the title Fix actual WPF panel geometry (8-DIP gutters and footer alignment), SV freshness and Inno installer Diagnose stale WPF layout via exact build provenance, 8-DIP geometry, and verified Inno installer Oct 20, 2026
@masarray masarray changed the title Diagnose stale WPF layout via exact build provenance, 8-DIP geometry, and verified Inno installer Calm engineering polish: locked baseline, truthful Diagnostics/PTP, quiet Analyzer and verified Inno Oct 20, 2026
@masarray masarray changed the title Calm engineering polish: locked baseline, truthful Diagnostics/PTP, quiet Analyzer and verified Inno Final calm engineering polish — periodic SV report grouping, readable SCL and verified candidate FAT gates Oct 20, 2026

This branch has not been deployed

No deployments
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