Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
87c619f
test(goose): introduce stable keyed publisher reconciliation and dete…
masarray Oct 20, 2026
db1c609
test(goose): introduce stable keyed publisher reconciliation and dete…
masarray Oct 20, 2026
6d5244f
fix(goose): preserve keyed publisher selection and independent cohere…
masarray Oct 20, 2026
508fbdd
fix(goose): bind stable publisher rows and inspector to one live or h…
masarray Oct 20, 2026
27d6932
fix(goose): distinguish same GoCB on different physical LAN sources i…
masarray Oct 20, 2026
50087af
test(goose): assert raw publisher separation for identical GoCBRef on…
masarray Oct 20, 2026
caeb8d6
chore(release): reserve v1.4.2 hotfix candidate without modifying pub…
masarray Oct 20, 2026
b75957e
chore(release): reserve v1.4.2 hotfix candidate without modifying pub…
masarray Oct 20, 2026
22cfc03
chore(release): reserve v1.4.2 hotfix candidate without modifying pub…
masarray Oct 20, 2026
d8e7732
chore(release): reserve v1.4.2 hotfix candidate without modifying pub…
masarray Oct 20, 2026
a85b5ab
docs: describe v1.4.2 GOOSE selection hotfix candidate and field acce…
masarray Oct 20, 2026
3218b2d
refactor(goose): derive selected live frame solely from keyed catalog…
masarray Oct 20, 2026
f03b635
fix(goose): preserve case-sensitive GoCB identity and align unknown-r…
masarray Oct 20, 2026
8845b78
fix(goose): align catalog fallback identity with receive-engine proto…
masarray Oct 20, 2026
a9ac452
fix(goose): validate stale/live coexistence and honor repeat-click se…
masarray Oct 20, 2026
91042a2
fix(goose): validate stale/live coexistence and honor repeat-click se…
masarray Oct 20, 2026
4642a0d
fix(goose): validate stale/live coexistence and honor repeat-click se…
masarray Oct 20, 2026
abbfd8d
feat(goose): make explorer filtering deterministic without changing s…
masarray Oct 20, 2026
8daf806
fix(goose): filtered explorer view preserves keyed user selection
masarray Oct 20, 2026
5c161bb
fix(goose): bind filtered publisher view without resetting stable row…
masarray Oct 20, 2026
44ec3fc
test(goose): cover search and GoID filter misses while stable selecti…
masarray Oct 20, 2026
b8c82d0
feat(goose): bounded SCL-gated quality interpretation with negative r…
masarray Oct 20, 2026
f1f5d62
feat(goose): bounded SCL-gated quality interpretation with negative r…
masarray Oct 20, 2026
b8f979a
test(goose): validate quality bit order using scalar decoded payload
masarray Oct 20, 2026
159f93b
test(goose): validate quality bit order using scalar decoded payload
masarray Oct 20, 2026
e9024d3
feat(goose): readable typed values, SCL-gated quality, and explicit r…
masarray Oct 20, 2026
d08343a
feat(goose): responsive two-column typed-value inspector and delibera…
masarray Oct 20, 2026
d4650c1
fix(goose): initial captured values are baseline, not fabricated changes
masarray Oct 20, 2026
927456d
test(goose): initial arrival must not invent value changes
masarray Oct 20, 2026
3aca915
feat(goose): quality summary always surfaces substituted, test and bl…
masarray Oct 20, 2026
ec5dba4
fix(goose): reconcile typed DataSet rows without collapsing expanded …
masarray Oct 20, 2026
7fb156b
fix(goose): bind stable typed DataSet rows and preserve full signal r…
masarray Oct 20, 2026
d645d24
test(ui): update GOOSE inspector width contract while preserving 8-DI…
masarray Oct 20, 2026
bbd123f
feat(goose): coherent live/history highlighting, RX-event counters an…
masarray Oct 21, 2026
bfd90eb
feat(goose): explicitly label unmapped MMS entries without inventing …
masarray Oct 21, 2026
75eb143
test(goose): prove unmapped entries cannot masquerade as SCL signal r…
masarray Oct 21, 2026
0280b06
fix(goose): reject malformed IEC 61850 quality bitstring padding
masarray Oct 21, 2026
6885491
test(goose): quality validity variants and malformed padding fail closed
masarray Oct 21, 2026
c66338e
test(goose): match validity bit-order mapping for invalid quality
masarray Oct 21, 2026
111c61f
feat(goose-ui): scoped compact chevron disclosure control with keyboa…
masarray Oct 21, 2026
ce79969
feat(goose): notify TEST flag changes on stable publisher row without…
masarray Oct 21, 2026
848d41e
feat(goose-ui): precise chevrons, engineering TEST chips and explicit…
masarray Oct 21, 2026
60dfa9d
test(goose-ui): gate scoped compact disclosure, live selection, RX/ev…
masarray Oct 21, 2026
d07e78f
test(goose): retransmitted publisher TEST flag updates without row re…
masarray Oct 21, 2026
3170ca2
docs(goose): P0-P3 acceptance criteria, semantic safety and Windows e…
masarray Oct 21, 2026
a85ee54
docs(release): describe scoped GOOSE P0-P3 refinement without changin…
masarray Oct 21, 2026
16416d7
fix(goose-ui): sticky Inspector header, aligned DataSet count and com…
masarray Oct 21, 2026
1a45cf0
fix(goose-ui): expose compact MMS type/source without recomputing bou…
masarray Oct 21, 2026
931cc8d
test(goose-ui): lock sticky header, DataSet count alignment and compa…
masarray Oct 21, 2026
bb78507
docs(goose): operator screenshot findings and fixed-header/expanded-e…
masarray Oct 21, 2026
366b341
feat(goose): precise plain-language descriptions without guessing swi…
masarray Oct 21, 2026
6cc60c9
test(goose): positive/negative readable-type and quality descriptions
masarray Oct 21, 2026
2bdad5f
feat(goose): convert operator readouts into descriptive engineering l…
masarray Oct 21, 2026
5014de3
feat(goose-ui): use friendly sending-device and message filtering terms
masarray Oct 21, 2026
4610955
feat(goose-ui): readable message, network and data-value labels with …
masarray Oct 21, 2026
fb66a05
fix(goose): label unnamed data as understandable numbered items
masarray Oct 21, 2026
66fd46a
test(goose): verify simple data-item names without a matching configu…
masarray Oct 21, 2026
4ffe8db
feat(goose): friendly event summaries, descriptive counts and signal …
masarray Oct 21, 2026
5b8ab30
feat(goose-ui): inline signal-configuration guidance and accessible p…
masarray Oct 21, 2026
be5b202
fix(goose): align event timestamps to local time and gate breaker-sta…
masarray Oct 21, 2026
8d92869
fix(goose): interpret double-point state only from verified configura…
masarray Oct 21, 2026
987a986
fix(goose): use audited pure state formatter for SCL-matched circuit …
masarray Oct 21, 2026
27bb65c
test(goose): positive and negative circuit breaker state interpretati…
masarray Oct 21, 2026
23aab01
feat(goose): show decoded quality details in plain engineering language
masarray Oct 21, 2026
5471fd1
feat(goose): show original matched configuration types only in advanc…
masarray Oct 21, 2026
92a12d4
feat(goose-ui): reveal verified technical configuration fields only w…
masarray Oct 21, 2026
e2e94c3
test(goose-ui): enforce readable operator labels and preserved origin…
masarray Oct 21, 2026
32f9f4e
docs(goose): electrical-engineer language guide, clock semantics and …
masarray Oct 21, 2026
56e8f3b
polish(goose): remove last sequence abbreviation from the sending-dev…
masarray Oct 21, 2026
16b9565
test(goose): avoid test-framework overload ambiguity on safety assert…
masarray Oct 21, 2026
9b4753a
test(goose): lock local timestamp agreement and safe plain-language s…
masarray Oct 21, 2026
dcb6724
feat(goose): display commissioning and test flags as clear Yes/No sta…
masarray Oct 21, 2026
9e71774
polish(goose-ui): explicit yes/no flags and readable configuration label
masarray Oct 21, 2026
e21ecda
test(goose-ui): track renamed plain-language heading without weakenin…
masarray Oct 21, 2026
b99efad
feat(goose-ui): add Material vector search, close and circled chevron…
masarray Oct 21, 2026
3d6f5ea
feat(goose-ui): single search SSOT, fast clear command and concise op…
masarray Oct 21, 2026
4eba26a
feat(goose-ui): single Material search with clear, remove duplicate d…
masarray Oct 21, 2026
2fb9cda
feat(goose-ui): restore search keyboard focus after Material clear co…
masarray Oct 21, 2026
648e47e
feat(goose-ui): three independent calm inspector accordions with valu…
masarray Oct 21, 2026
19b94ad
polish(goose): unify section and data row expand affordance with vect…
masarray Oct 21, 2026
6d4cd6a
polish(goose-ui): single placeholder search, denser readable source r…
masarray Oct 21, 2026
3a33923
polish(goose): concise capture status and initial event text without …
masarray Oct 21, 2026
b674673
test(goose-ui): enforce compact Material search, source virtualizatio…
masarray Oct 21, 2026
8fb5079
docs(goose): compact Material UX and field acceptance matrix without …
masarray Oct 21, 2026
dc213b3
test(goose-ui): align plain-language contract with compact Values acc…
masarray Oct 21, 2026
923dfce
test(goose): positive/negative single-search matching and clear witho…
masarray Oct 21, 2026
353f0b9
polish(goose): remove redundant toggle explanation and compact the so…
masarray Oct 21, 2026
8183e15
polish(goose): keep Live/History status brief, retaining timestamp on…
masarray Oct 21, 2026
1865953
fix(goose-ui): store three accordion open states in ViewModel across …
masarray Oct 21, 2026
3c34b07
fix(goose-ui): bind all collapsible section states to stable per-sess…
masarray Oct 21, 2026
58cc4bb
test(goose-ui): assert section states survive tab reconstruction via …
masarray Oct 21, 2026
d97620d
fix(goose-ui): use ListView-compatible VirtualizingPanel properties (…
masarray Oct 21, 2026
0d76ab2
feat(goose): label unknown DataSet members with their observed MMS ty…
masarray Oct 21, 2026
052e589
feat(goose): true capture-relative time, matching entry timestamps, a…
masarray Oct 21, 2026
a0901b3
feat(goose-ui): Messages list with Time, Relative time, Source, Desti…
masarray Oct 21, 2026
4795880
feat(goose-ui): standard GOOSE Details, Network and Data terminology …
masarray Oct 21, 2026
49a5821
test(goose): named typed entries without invented SCL references
masarray Oct 21, 2026
f23dc5d
test(goose-ui): verify standard message/detail terminology and truthf…
masarray Oct 21, 2026
c37b6ed
docs(goose): field terminology, relative time semantics and Windows a…
masarray Oct 21, 2026
e6a98fa
feat(goose): pure capture-relative timestamp calculation
masarray Oct 21, 2026
991d62a
test(goose): relative time baseline, elapsed time and out-of-order sa…
masarray Oct 21, 2026
927346b
refactor(goose): use tested pure capture-relative time conversion
masarray Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/release-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ on:
workflow_dispatch:
inputs:
version:
description: Version label, for example 1.4.1
description: Version label, for example 1.4.2
required: true
default: 1.4.1
default: 1.4.2
publish_release:
description: Publish GitHub Release after successful validation (manual only)
required: true
Expand All @@ -25,7 +25,7 @@ on:
release_notes_file:
description: Markdown file used as release body
required: true
default: docs/RELEASE_NOTES_v1.4.1.md
default: docs/RELEASE_NOTES_v1.4.2.md
push:
tags:
- "v*"
Expand Down Expand Up @@ -183,7 +183,7 @@ jobs:
$sha = "artifacts/release/SHA256SUMS.txt"
$manifest = "artifacts/release/release-manifest.json"
$notesFile = '${{ github.event.inputs.release_notes_file }}'
if ([string]::IsNullOrWhiteSpace($notesFile)) { $notesFile = 'docs/RELEASE_NOTES_v1.4.1.md' }
if ([string]::IsNullOrWhiteSpace($notesFile)) { $notesFile = 'docs/RELEASE_NOTES_v1.4.2.md' }
if (-not (Test-Path $notesFile)) { throw "Release notes file not found: $notesFile" }

$releaseArgs = @('release', 'create', $tag, $installer, $zip, $sha, $manifest, '--title', "Process Bus Insight $tag", '--notes-file', $notesFile, '--target', '${{ github.sha }}')
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<NeutralLanguage>en</NeutralLanguage>

<!-- Public release version. Pre-release versions may set VersionSuffix explicitly. -->
<VersionPrefix Condition="'$(VersionPrefix)' == ''">1.4.1</VersionPrefix>
<VersionPrefix Condition="'$(VersionPrefix)' == ''">1.4.2</VersionPrefix>
<VersionSuffix Condition="'$(VersionSuffix)' == ''"></VersionSuffix>
<Version Condition="'$(Version)' == '' and '$(VersionSuffix)' == ''">$(VersionPrefix)</Version>
<Version Condition="'$(Version)' == '' and '$(VersionSuffix)' != ''">$(VersionPrefix)-$(VersionSuffix)</Version>
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ The application can record what was configured in SCL, what the selected capture

## Download and run

1. Download the latest **Windows Inno Setup installer** from [GitHub Releases](https://github.com/masarray/DigSubAnalyzer/releases): `ProcessBusInsight-v1.4.1-win-x64-setup.exe`.
1. Download the latest published **Windows Inno Setup installer** (v1.4.2 after its public release) from [GitHub Releases](https://github.com/masarray/DigSubAnalyzer/releases): `ProcessBusInsight-v1.4.2-win-x64-setup.exe`.
2. Run the installer. Its stable app identity supports in-place updates, same-version repair, Windows uninstall, and optional desktop shortcut.
3. **Offline manuals are installed directly inside the app folder** (`User Manual.pdf`, `Quick Start.pdf`, and `Install and Update.md`), with Start Menu shortcuts.
4. Install **Npcap separately** when live raw Ethernet capture is required; it is not bundled. Offline PCAP analysis remains available without it.
Expand All @@ -58,8 +58,8 @@ An optional **portable ZIP** is also available for manual extraction. The commun
Current Windows distribution naming:

```text
ProcessBusInsight-v1.4.1-win-x64-setup.exe
ProcessBusInsight-v1.4.1-win-x64-portable.zip (optional)
ProcessBusInsight-v1.4.2-win-x64-setup.exe
ProcessBusInsight-v1.4.2-win-x64-portable.zip (optional)
SHA256SUMS.txt
release-manifest.json
```
Expand Down Expand Up @@ -100,8 +100,8 @@ dotnet run --project .\src\ProcessBus.App.Wpf\ProcessBus.App.Wpf.csproj -c Relea
Create and verify a portable package:

```powershell
.\scripts\publish-windows-portable.ps1 -Version "1.4.1"
.\scripts\verify-release-package.ps1 -PackageZip ".\artifacts\release\ProcessBusInsight-v1.4.1-win-x64-portable.zip"
.\scripts\publish-windows-portable.ps1 -Version "1.4.2"
.\scripts\verify-release-package.ps1 -PackageZip ".\artifacts\release\ProcessBusInsight-v1.4.2-win-x64-portable.zip"
```

Run the repository-quality gate:
Expand Down
26 changes: 26 additions & 0 deletions docs/RELEASE_NOTES_v1.4.2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Process Bus Insight v1.4.2 — GOOSE Selection Hotfix Candidate

This hotfix follows published v1.4.1 and is **not** an IEC 61850 certification or a claim of completed physical Windows field acceptance.

## Operator-visible changes
- Publisher explorer holds a stable selected publisher when GOOSE snapshots update rapidly.
- Inspector live values use the latest coherent selected-publisher frame; clicking a timeline row deliberately pins historical evidence without overwriting the chosen live publisher.
- Explicit selection persists across retransmissions, filtering, and temporary publisher absence. STALE retains last valid values and last-received time.
- Publisher identity includes source MAC, APPID, VLAN, and GoCBRef, preventing collisions between similarly named control blocks.
- Typed DataSet values still use generic MMS decode when SCL is unavailable, and resolve matching SCL mapping when supplied.
- No layout spacing, phasor, waveform, PTP, or SV decoder changes.

## Verification before public release
A Windows hotfix candidate must pass repository health, Windows CI/test, Runtime Stability, Runtime Architecture, CodeQL, verified Inno installation/repair and exact-SHA BuildInfo provenance. A physical click/selection stream test remains a separate required check (100%, 125%, 150% DPI; sustained retransmissions, multiple publishers and filters).

**Distribution:** candidate artifacts produced by the PR workflow are not a published stable v1.4.2 release. Preserve v1.4.1 tag and published assets. Explicit approval required to release the hotfix.

## Engineer-focused GOOSE readout refinement

- Compact chevrons instead of prominent circular disclosure controls, with stable expanded raw MMS details during high-rate retransmissions.
- Each unmapped entry is explicitly named `Entry n`; signal references appear only from matching SCL data.
- `TEST` badges on publisher and Inspector, distinct `RX frames` and `visible events` counters, and GOOSE-specific capture status.
- Explicit `LIVE / STALE / PINNED EVENT` context. Returning to Live clears the timeline's historical selection.
- Strict 13-bit IEC 61850 q bit-string padding validation and additional positive/negative regression coverage.

Manual Windows GUI/display-scaling field acceptance remains a separate approval gate.
2 changes: 1 addition & 1 deletion docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"applicationCategory": "EngineeringApplication",
"applicationSubCategory": "Digital substation and process bus analysis",
"operatingSystem": "Windows 10, Windows 11",
"softwareVersion": "1.4.1",
"softwareVersion": "1.4.2",
"license": "https://spdx.org/licenses/GPL-3.0-or-later.html",
"isAccessibleForFree": true,
"url": "https://masarray.github.io/DigSubAnalyzer/",
Expand Down
32 changes: 32 additions & 0 deletions docs/validation/GOOSE_COMPACT_OPERATOR_UX_2026-10-21.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# GOOSE Compact Operator UX — Windows Acceptance

Scope: GOOSE workspace only. Retain key-stable publisher selection, the bounded live and historical traffic views, the 8-DIP workspace gutters, raw MMS evidence, and the previously validated signal interpretation.

## Design behavior

- The source rail has one search field with local WPF vector Material-style search/close icons. An empty search hides the clear control; typing reveals it. Clicking clear resets the existing filter and restores focus to the search input, without rebuilding publisher identity or changing the selected publisher.
- The duplicate message-name dropdown and duplicate explanatory source footer are removed. The repeated-messages toggle still controls timeline visibility only.
- Only the source ListView scrolls. Its Grid star row constrains height and the ListView uses the WPF recyclable virtualizing stack; the title, search and retransmission toggle remain visible.
- The sticky Inspector status remains visible above the scrollable evidence. Within that evidence are three independent sections: Message (open), Network (closed) and Values (open). Users can expand/collapse each in any combination, using mouse, touch or keyboard. The static controls preserve their state through receive updates.
- Values have no forced maximum height. Closing Message/Network reveals more DataSet rows, and the single evidence scrollbar reveals overflowing content.
- The compact circle-chevron icon is drawn as vector geometry with no downloaded font, icon dependency or network access.
- Raw MMS types and true signal identity remain traceable from expanded entry detail; unconfigured bit patterns are not translated into physical switch states.

## Acceptance matrix

| Test | Expected |
| --- | --- |
| 20+ publishers at 768 px window height | Source ListView scrolls to last item; search and toggle remain fixed |
| Search by message/source/MAC, then clear | Matching rows update without reset of keyed publisher; clear icon disappears on empty |
| Search miss, then clear | No false publisher removal; all sources return |
| Expand Message + Network + Values | Headers are independently clickable; one evidence scrollbar handles overflow |
| Collapse Message + Network | Values gain available viewport area; entry row expanders still work |
| Receive repeated messages with one or more sections collapsed | No unexpected accordion state flip, Inspector target loss or UI-thread blocking |
| Select a historical event and return to live | Sticky context updates but accordion states persist |
| 100/125/150% Windows scaling | Circle-chevron, search, X and signal/value text remain aligned and not clipped |
| Keyboard focus and accessibility | Search and section headers can be focused; toggle activation works by keyboard |
| Import matching SCL / omit SCL | Verified names and quality when matched; raw data items with no fabricated meaning otherwise |

## CI discipline

Use one exact-SHA Windows CI and runtime/security/Inno candidate workflow set after committing the complete UX checkpoint. Review any failure and fix only the affected surface. Do not rerun successful jobs without a substantive reason. Keep v1.4.1 stable assets untouched and treat this as v1.4.2 pre-release candidate until physical acceptance.
73 changes: 73 additions & 0 deletions docs/validation/GOOSE_ENGINEERING_READOUT_P0_P3_2026-10-21.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# GOOSE Engineering Readout — P0–P3 Validation Handoff

Date: 2026-10-21. Scope: receive-only GOOSE engineering workspace. Baseline: selection/inspector single-source-of-truth hotfix plus v1.4.2 GUI candidate. This is **not** an IEC 61850 conformance claim.

## Engineering invariants

1. Selection is keyed to source MAC, APPID, VLAN, and GoCB reference; transient WPF null/retransmission does not delete operator intent.
2. **Live** Inspector always shows the latest coherent frame of the explicitly selected publisher. Choosing an event pins an immutable historical snapshot. Returning to Live explicitly clears timeline selection; switching publisher cannot leave a misleading historic highlight.
3. RX frame count is distinct from event count **visible after filters**. Retransmission toggle governs only event history visibility; it does not stop receiving retransmitted packets.
4. Raw MMS data without matching SCL is labeled `Entry 1…n` with its decoded wire type/value. Signal names, DPC meanings, and IEC 61850 q quality are never inferred from arbitrary bit patterns.
5. Only a matched SCL quality field with a valid 13-bit MMS BIT STRING can be interpreted as IEC 61850 q. Invalid unused-bit padding, unexpected width, bad hex, and non-BitString types fail closed.
6. The initial observed DataSet is a baseline, not a fabricated field change. Subsequent changes use prior observed values.
7. Test-mode publishers show explicit **TEST** identifiers; no red/green Boolean good/bad assumptions.
8. Keyed publisher rows and per-index DataSet rows survive passive refreshes without collapsing an opened MMS detail. Deliberately changing publisher or pinning a different event resets only that DataSet context.

## Visual contract

- Workspace shell and panel gutters: 8 DIP. GOOSE detail width: 460 DIP; other workspaces unchanged.
- Compact Signal / Value rows with a subdued chevron, expanded MMS raw value and payload hex, semantically resolved quality details only with a matching SCL.
- Publisher label and full reference available without high-contrast action ornamentation.
- Timeline remains a forensic event list, not a decorative panel filled with unrelated cards.
- Time-sensitive status strip reflects GOOSE traffic when the GOOSE workspace is active, without changing other workspaces' status.

## Required automatic gates

Windows repository health, workspace layout/source contract, full .NET solution compilation, unit tests, Runtime Stability, Runtime Architecture, CodeQL, dependency checks and Inno installer package/install/repair. These must all reference the *same commit SHA* and be verified on the PR head.

### Regression coverage

- Empty/malformed quality, invalid unused padding, exact 13-bit validity values, substituted/test/operator-blocked detail flags.
- Generic entry names versus explicit matching SCL signal reference names.
- Publisher TEST flag changes on an existing selected keyed row.
- Multi-publisher identity, retransmission, same-GoID split MAC/VLAN, filter-miss, stale/recovery, 1,000 retransmissions, 500-source bounded churn.
- First-frame baseline versus later observed state-change semantics.

## Manual Windows field acceptance (still required after automated PASS)

At 1366×768, 1586×893 and 1920×1080 (where available) under 100%, 125%, and 150% display scaling: inspect normal/expanded DataSet rows without clipping, confirm chevron click and keyboard toggle, tab through TEST/LIVE/PINNED/STALE indicators, select multiple GOOSE publishers during continuous retransmissions, pin events, click Return to Live, use filter search/GOOSE ID with no selection loss, and observe updates with real or recorded GOOSE traffic. Import a matching SCL and verify genuine signal/quality mappings, then repeat without SCL to confirm raw-only fallback.

**Acceptance boundary:** a successful automated CI build does not prove physical UI readability or IEC 61850 interoperability at a specific field installation. Keep candidate publication and branch promotion separate from this manual sign-off.

## Follow-up: operator screenshot inspection, expanded raw MMS entries

Three operator screenshots of the P0–P3 candidate demonstrate selection stability during reception and successful simultaneous expansion of two typed DataSet entries. They also reveal three visual defects: DataSet title/count running together, the Inspector context disappearing when the entire pane scrolls, and unnecessarily tall expanded MMS details.

The targeted follow-up uses a fixed Inspector header row (including PINNED/TEST and Return to Live), a single scrolling evidence region, an explicitly aligned DataSet title/count grid, and compact key/value MMS details. These corrections do not alter packet reception, GOOSE state matching, generic typed decoding, or the 8-DIP workspace gutter.

Required physical acceptance: expand two entries, scroll to the bottom and back, confirm the Inspector mode and Return to Live remain visible throughout; confirm the DataSet count does not touch the title at 100%, 125%, 150% DPI; verify selecting a different publisher or returning to Live changes Inspector context correctly without replacing unrelated publisher rows.

## Operator language acceptance — message/field terminology

The application must explain what an electrical engineer is seeing without requiring familiarity with every IEC 61850 field name. Keep accurate original wire references in tooltips or expandable forensic rows.

| Main display | Original technical evidence |
| --- | --- |
| Message name | goID |
| Control block | goCbRef |
| Application code | APPID |
| State number / Sequence number | stNum / sqNum |
| Sender address / Group address | Ethernet source / destination MAC |
| Network group | VLAN ID and priority |
| Configuration version | confRev |
| Allowed wait | timeAllowedToLive, milliseconds |
| Binary bit pattern | MMS BitString |
| Data item 1, Data item 2… | Raw decoded values without matching SCL |
| Open/Closed (verified switch-position signal only) | Matched SCL XCBR or XSWI / Pos.stVal |
| First seen / State changed / Repeated | New / State Change / Retrans reception events |

**Failure safety:** no breaker position can be inferred from a bare `00/01/10/11` bit pattern, unrelated DPC attributes, quality fields, timestamps or incomplete SCL identity. Source data is not renamed when evidence is missing. A configuration-tab shortcut explains how to identify signals.

**Clock semantics:** the reception time in message history must use the same local clock as the recorded-message Inspector timestamp, avoiding false multi-hour offsets on site.

**Additional physical acceptance:** use a multi-publisher real capture and a matching imported device configuration. Compare message history time against the Inspector time; validate names, interpreted switch position and decoded quality against a separately verified record. With no configuration, all entries remain generic with readable data type and raw bit/hex evidence. Test 100/125/150% scaling and expand two data rows without losing the sticky Inspector heading.
38 changes: 38 additions & 0 deletions docs/validation/GOOSE_FAMILIAR_FIELD_TERMINOLOGY_2026-10-21.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# GOOSE Message Terminology — Field Acceptance

## Purpose

Use widely recognized GOOSE capture and protocol field terminology in the GOOSE workspace while retaining the existing application layout, stable publisher selection, compact search and three independent Inspector sections. All terms describe actual received evidence, not assumed switching states.

## Capture table

| Column | Evidence |
| --- | --- |
| Time | Local receive time from the actual frame timestamp (seven fractional digits where available) |
| Relative time | Seconds since the first observed GOOSE history event after capture start/reset; **not** the time gap to the preceding event |
| Source | Source Ethernet MAC address |
| Destination | Destination Ethernet MAC address |
| Description | Original GOOSE control-block reference (GoCBRef), with full text in a tooltip |

The small `G` marker denotes a GOOSE frame; its tooltip retains the event distinction (first seen, state change, repeated). The repeated-message filter still controls which events are visible, not which frames are received. The receive count and event count remain separate.

## Details

- Control Block reference, Application ID, GOOSE ID, Status number (stNum), Sequence number (sqNum), Entry time.
- Destination MAC address, Source MAC address, DataSet reference, VLAN ID, VLAN priority, Needs commissioning, Configuration revision, Simulation/Test, Time allowed to live (ms).
- Data: Name and Value columns. When no valid SCL identity is available, a received MMS BitString is named **Bitstring N** only as an ordinal/type label, not as an IEC 61850 object identifier. Other recognized wire types likewise may use type/ordinal labels.

## Operator contract

- Dark theme, 8-DIP gutters, scrollable publisher list, one Material-style search/clear field and independent Message/Network/Data disclosure controls remain in place.
- DataSet interpretation does **not** infer a breaker position from an unmapped bit pattern. Verifiable SCL matching remains a prerequisite to semantic values and quality.
- Historical event selection remains distinct from live publisher selection. **Show Latest** returns to live evidence. The Inspector displays the selected message snapshot coherently.
- No external product/provider names are introduced in source, commit history, public PR or validation notes.

## Automated and physical checks

Automated: exact-SHA Windows compile, full tests, 8-DIP geometry and terminology contract, runtime architecture/stability, CodeQL, dependency analysis and candidate Inno install/repair smoke.

Physical: inspect 20+ active GOOSE sources, select two different messages, compare Source/Destination with a verified Ethernet capture, ensure Relative time is monotonic and reset with capture clearing, inspect all detail labels without clipping at 100%/125%/150% scaling, import matching SCL for genuine values and test raw Bitstring fallback without SCL.

Green CI is not a substitute for the final physical reading/interaction test.
Loading
Loading