From f960edfdc623a830848489293f92572d77c4f651 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:26:35 +0700 Subject: [PATCH 01/42] docs: rebuild README for professional product positioning --- README.md | 240 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 123 insertions(+), 117 deletions(-) diff --git a/README.md b/README.md index 4ae5bd1f..cf079b33 100644 --- a/README.md +++ b/README.md @@ -1,185 +1,191 @@ +
+ ArIED 61850 application icon + # ArIED 61850 -**Smart IED Explorer & Monitor** +### IEC 61850 IED Explorer, Multi-Device Monitor & Smart Control Workstation -ArIED 61850 is a Windows desktop engineering tool for IEC 61850 MMS discovery, multi-IED monitoring, reporting diagnostics, sequence-of-events viewing, project caching, and native IEC 61850 control through the ARIEC61850 Smart Control service. +**A modern Windows engineering application for SCL-assisted workflows, live MMS model discovery, report-first monitoring, sequence-of-events analysis, diagnostics, and guarded IEC 61850 control.** -> **Licensing:** the current public community edition and current release packages are licensed **only** under `GPL-3.0-or-later`. A separate commercial license is available for proprietary integration, OEM/white-label distribution, and contractual engineering support. See [docs/LICENSING.md](docs/LICENSING.md). +[![Build](https://github.com/masarray/ArIED61850Tester/actions/workflows/build.yml/badge.svg)](https://github.com/masarray/ArIED61850Tester/actions/workflows/build.yml) +[![Pages](https://github.com/masarray/ArIED61850Tester/actions/workflows/pages.yml/badge.svg)](https://masarray.github.io/ArIED61850Tester/) +[![License](https://img.shields.io/badge/license-GPL--3.0--or--later-2563eb)](LICENSE) +[![.NET](https://img.shields.io/badge/.NET-8.0-512bd4)](https://dotnet.microsoft.com/) +[![Platform](https://img.shields.io/badge/platform-Windows-0ea5e9)](#requirements) -## Core workflow +[**Product website**](https://masarray.github.io/ArIED61850Tester/) · [**Quick start**](#quick-start) · [**Architecture**](docs/ARCHITECTURE.md) · [**Validation**](docs/VALIDATION_CHECKLIST.md) · [**Report an issue**](https://github.com/masarray/ArIED61850Tester/issues) +
-```text -Add IED by IP, open a project, or import SCL -→ connect and verify the live model, or restore a cached model -→ select live and control objects -→ start independent per-IED monitoring -→ inspect reports, SOE, diagnostics, and commands -``` +![ArIED 61850 engineering workspace](landing/assets/hero.svg) -Each IED keeps its own connection, discovery progress, selected signals, report subscriptions, event indicator, and start/stop lifecycle. +## Built for practical IEC 61850 engineering -## Main capabilities +ArIED 61850 brings the most common commissioning and troubleshooting workflows into one focused desktop workspace. Add an IED by IP address, import endpoints from an SCL file, verify the live MMS model, select the required signals, monitor each device independently, inspect report and event evidence, and stage supported control operations through the native ARIEC61850 control service. -- Live MMS discovery of Logical Devices, Logical Nodes, data objects, values, quality, and IED timestamps. -- Real IEDName and Logical Device boundary resolution. -- SCL endpoint import from SCD, CID, ICD, IID, SSD, or XML files, including multi-IED ConnectedAP/IP extraction and duplicate protection. -- Multi-IED independent connections and monitoring. -- Static RCB/DataSet first, dynamic reporting when needed, and bounded MMS fallback for uncovered or unverified points. -- Saved project model cache for fast reconnect without repeating full discovery. -- Virtualized signal selection with search, filters, visible-row bulk selection, and persisted choices. -- Live value highlighting for recent process changes. -- SCADA-style event log focused on semantic process-state transitions. -- Per-IED unread event badges. -- Native Smart Control for command-ready IEC 61850 Data Objects. +The application is designed for **substation automation laboratories, FAT/SAT preparation, relay and BCU integration, commissioning support, protocol investigation, and repeatable engineering diagnostics**. It is not a formal conformance certificate and does not replace approved switching procedures, test plans, or site authority. -## Native Smart Control +## Engineering capabilities -Version 1.6.5 integrates directly with `AR.Iec61850.Control.Iec61850ControlService` and adds a fast row-control workflow. The Command Panel shows the current process value and exposes semantic actions directly on each command row: +| Area | Current capability | +|---|---| +| **SCL workspace** | Import SCD, CID, ICD, IID, SSD, or XML files; extract configured endpoints; preserve multi-IED project context; support design-to-live verification workflows. | +| **MMS discovery** | Discover Logical Devices, Logical Nodes, Data Objects, Data Attributes, values, quality, timestamps, DataSets, RCBs, and available model metadata. | +| **Multi-IED sessions** | Maintain independent connection, discovery, monitoring, report, event, and lifecycle state for every configured IED. | +| **Report-first monitoring** | Prefer configured RCB/DataSet coverage, use temporary dynamic reporting where appropriate, and poll only still-uncovered points. | +| **Signal workspace** | Search, filter, sort, select visible rows, persist selections, and work efficiently with large IED models through WPF virtualization. | +| **Live monitoring** | Coalesced live values, recent-change highlighting, IED-provided timestamps, quality display, and bounded UI updates. | +| **Sequence of events** | Process-oriented event log, per-IED unread indicators, report reasons, and semantic state transitions. | +| **Smart Control** | Discover `ctlModel`, inspect live MMS types, execute supported Direct or Select-Before-Operate sequences, and surface termination/error evidence. | +| **Diagnostics** | Connection journal, association evidence, TCP reachability context, report diagnostics, command evidence, and copyable support reports. | +| **Project persistence** | Save device definitions, cached model context, selected signals, and operator workspace state for faster return visits. | -- Position/DPC: **Open** and **Close** -- Pulse controls: **Raise** or **Lower** -- Boolean/SPC: **True** and **False** -- Setpoint controls: value field and **Set** -- Per-signal **Interlock**, **Synchrocheck**, and **Test** flags directly in each command row -- Two-step breaker safety: **Open/Close** becomes **Confirm Open/Confirm Close** plus **Cancel** before dispatch -- Optional **Details** window for the full ctlModel, sequence, checks, and protocol evidence +## Workflow -The command workflow reads the live IED model before enabling **Send Command**: +```text +Open SCL / Open Project / Add IED + ↓ +Review configured endpoint and live connection state + ↓ +Discover or restore the IEC 61850 model + ↓ +Select signals and control-ready Data Objects + ↓ +Start monitoring independently per IED + ↓ +Inspect live values, reports, SOE, diagnostics, and command evidence +``` -1. Validate the Data Object root. -2. Read `ctlModel`. -3. Retrieve the exact live `Oper`, `SBOw`, and optional `Cancel` type specifications. -4. Locate the named `ctlVal` field without positional guessing. -5. Select Direct Operate or SBO automatically. -6. Bind the requested value to the exact live MMS type. -7. Preserve origin, `ctlNum`, timestamp `T`, Test, interlock, and synchrocheck flags for the sequence. -8. Wait for CommandTermination for enhanced-security control models. -9. Show `ControlError`, `AddCause`, `LastApplError`, control number, control-service time, feedback time, total time, and process feedback. +Each device owns its own session. Connecting, monitoring, stopping, or diagnosing one IED does not implicitly change another device session. -For position objects such as `CSWI.Pos`, ArIED keeps the user-facing semantics **Open/Closed** even when a vendor encodes the wire `ctlVal` as Boolean. The feedback status is decoded independently as DPC/Dbpos. Control-object sessions are cached per IED association so opening the Command Panel and sending repeated commands does not repeat the full ctlModel/type discovery every time. +## Smart Control, without protocol guessing -Supported typed command families include DPC, SPC, INC/ISC, BSC, and APC when the live descriptor is operationally valid. +For supported control objects, ArIED reads the live model before enabling command dispatch: -ArIED intentionally has **no unsafe generic MMS-write fallback** for `.Oper`, `.SBOw`, or `.Cancel`. +1. Validate the selected Data Object root. +2. Read `ctlModel` and determine the required control sequence. +3. Resolve the live `Oper`, `SBOw`, and optional `Cancel` type descriptions. +4. Locate and bind the named `ctlVal` field using the actual MMS type. +5. Preserve origin, `ctlNum`, timestamp `T`, Test, interlock, and synchrocheck values across the sequence. +6. Wait for `CommandTermination` when required by enhanced-security control models. +7. Present `ControlError`, `AddCause`, `LastApplError`, timing, and process-feedback evidence. -## Engine requirement +Supported command families currently include DPC, SPC, INC/ISC, BSC, and APC when the discovered live descriptor is operationally usable. Position objects retain operator-facing **Open / Closed** semantics while wire encoding and feedback decoding remain independently type-aware. -ArIED is an app-only project. It references the user's existing ARIEC61850 source at build time and does not replace that repository. +> ArIED does not provide a generic control-write fallback for `.Oper`, `.SBOw`, or `.Cancel`. If the required native control contract is unavailable, the build or control readiness gate fails explicitly. -This version was integrated against ARIEC61850 revision: +## Architecture at a glance ```text -41d003ae02b1003d16cd5a8baf5f7a95be4434fa +┌──────────────────────────────────────────────────────────────┐ +│ ArIED 61850 │ +│ Explorer · Live Monitor · Event Log · Diagnostics · Control │ +└──────────────────────────────┬───────────────────────────────┘ + │ typed application services +┌──────────────────────────────▼───────────────────────────────┐ +│ ARIEC61850 │ +│ MMS · Reporting · Control · SCL Workspace · Diagnostics │ +└──────────────────────────────┬───────────────────────────────┘ + │ IEC 61850 / TCP 102 + Laboratory IEDs ``` -Required source includes: +ArIED is the Windows application layer. The protocol implementation remains in the separately maintained [ARIEC61850](https://github.com/masarray/ARIEC61850) source repository and is referenced as a sibling .NET project at build time. -```text -ARIEC61850/ -└─ src/AR.Iec61850/ - ├─ AR.Iec61850.csproj - └─ Control/ - ├─ Iec61850ControlService.cs - ├─ Iec61850ControlObjectSession.cs - ├─ Iec61850ControlModels.cs - ├─ Iec61850ControlValueBinder.cs - └─ Iec61850CommandTerminationDecoder.cs -``` +## Quick start -The default folder layout is: +### Requirements + +- Windows 10 or Windows 11 +- .NET 8 SDK +- Visual Studio 2022 with **.NET desktop development**, or the .NET CLI +- A compatible ARIEC61850 source checkout +- An isolated laboratory or approved commissioning network for active functions + +### Recommended folder layout ```text D:\Git\ ├─ ARIEC61850\ │ └─ src\AR.Iec61850\AR.Iec61850.csproj -└─ ArIED61850\ +└─ ArIED61850Tester\ └─ ArIED61850Tester.csproj ``` -A different engine checkout can be selected explicitly: +### Build ```powershell -dotnet build .\ArIED61850Tester.csproj -c Release ` - -p:ArIec61850Project="D:\Git\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" -``` +git clone https://github.com/masarray/ARIEC61850.git +git clone https://github.com/masarray/ArIED61850Tester.git -Or set: - -```powershell -$env:ARIEC61850_PROJECT = "D:\Git\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" +cd ArIED61850Tester +dotnet restore .\ArIED61850Tester.csproj +dotnet build .\ArIED61850Tester.csproj -c Release ``` -## Build requirements - -- Windows 10 or Windows 11 -- .NET 8 SDK -- ARIEC61850 Smart Control source -- Visual Studio 2022 with .NET desktop development, or the .NET CLI - -Build: +To use an engine checkout in another location: ```powershell -dotnet restore .\ArIED61850Tester.csproj -dotnet build .\ArIED61850Tester.csproj -c Release +dotnet build .\ArIED61850Tester.csproj -c Release ` + -p:ArIec61850Project="D:\Engineering\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" ``` -Portable self-contained package: +### Create a portable Windows package ```powershell .\scripts\publish-windows-portable.ps1 ` - -Version 1.6.5 ` - -EngineProject "D:\Git\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" + -Version 1.6.6 ` + -EngineProject "D:\Engineering\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" ``` Expected output: ```text -dist\ArIED61850-1.6.5-win-x64-portable.zip +dist\ArIED61850-1.6.6-win-x64-portable.zip ``` -## Control safety +## Operational boundary -IEC 61850 commands can operate primary equipment. Before using live commands: +IEC 61850 control, report writes, temporary DataSet creation, and active network functions can affect equipment state or IED resources. Use active features only when: -- Test all four control models with the IED Simulator. -- Verify DPC/SPC/INC/BSC/APC type variants. -- Verify positive and negative CommandTermination. -- Test interlock and synchrocheck rejection with `AddCause`. -- Verify Test mode causes no process movement. -- Test selection timeout, Cancel, association loss, and competing-client ownership. -- Confirm process feedback mapping for breaker and tap-changer controls. -- Use relay test/maintenance mode before energised commissioning. +- the test boundary, isolation, and switching authority are approved; +- the selected IED is in the intended test or maintenance condition; +- control models, feedback mapping, interlock/synchrocheck behavior, timeout, Cancel, and negative termination have been validated; +- another qualified person can independently verify the expected process response where required by the test plan. -The application enables Send Command only when the native descriptor reports `IsOperationallyReady=true` and the selected value can be represented safely by the live `ctlVal` type. +A successful command or report session is protocol evidence for that test condition. It is not a universal interoperability, cybersecurity, functional-safety, or conformance claim. -## Additional documentation +## Documentation -- `ARIEC61850_SMART_CONTROL_INTEGRATION.md` -- `SMART_CONTROL_FEEDBACK_AUDIT.md` -- `ENGINE_COMPATIBILITY.md` -- `NEXT_PHASE_PROGRESS.md` -- [Architecture](docs/ARCHITECTURE.md) -- [Validation Checklist](docs/VALIDATION_CHECKLIST.md) -- [Clean-Room and Interoperability Policy](docs/CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md) -- [External IP Cleanliness Audit — 2026-07-14](docs/EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md) -- [License and Provenance Audit — 2026-07-14](docs/LICENSE_AUDIT_2026-07-14.md) +| Document | Purpose | +|---|---| +| [Documentation hub](docs/README.md) | Starting point for engineering, validation, legal, and contribution documents. | +| [Architecture](docs/ARCHITECTURE.md) | Multi-IED ownership, acquisition strategy, runtime scaling, and timestamp semantics. | +| [Validation checklist](docs/VALIDATION_CHECKLIST.md) | Build, simulator, reporting, control, and live-test acceptance checks. | +| [Engine compatibility](ENGINE_COMPATIBILITY.md) | Required ARIEC61850 contracts and supported project-reference layout. | +| [Smart Control integration](ARIEC61850_SMART_CONTROL_INTEGRATION.md) | Native control-service integration details. | +| [Control feedback audit](SMART_CONTROL_FEEDBACK_AUDIT.md) | Feedback and completion evidence boundaries. | +| [Licensing](docs/LICENSING.md) | Current GPL community edition and separate commercial licensing path. | +| [Clean-room policy](docs/CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md) | Independent-development, fixture provenance, UI, and interoperability boundaries. | -## Validation status +## Contributing and support -Static source validation was completed in the packaging environment. A full Windows `.NET 8` build, simulator run, and live relay control test could not be executed there because the environment does not contain the .NET SDK or an IEC 61850 target. +Engineering contributions are welcome when they are focused, reproducible, independently authored, and free of confidential customer or employer material. Read [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), and [SUPPORT.md](SUPPORT.md) before opening a pull request or support issue. -## License +For a failed connection, use **Diagnostics → Copy Diagnostic** and attach the sanitized report to the issue. Remove customer names, station identifiers, IP addressing that must remain private, credentials, and confidential SCL content before sharing. -The current `main` branch and current public release packages are licensed **only** under the **GNU General Public License v3.0 or later** (`GPL-3.0-or-later`). See [LICENSE](LICENSE). +## License -A separate negotiated commercial license is available for proprietary integration, OEM/white-label distribution, closed-source redistribution, warranty, maintenance, priority support, training, and engineering services. See [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md). +The current `main` branch and current community release packages are licensed **only** under the [GNU General Public License v3.0 or later](LICENSE). -Names, logos, icons, and official-release branding are not granted under the software license. See [TRADEMARK.md](TRADEMARK.md). +A separate negotiated commercial license is available for proprietary integration, OEM or white-label distribution, closed-source redistribution, warranty, maintenance, priority engineering support, training, and project-specific development. See [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md). -Revisions through `0df1007d9538b978edba67218136bc5c4f8019ad` were previously released under Apache-2.0 and remain available on branch `archive/apache-2.0-final`. Those historical grants apply only to those earlier revisions; they do not apply to later changes or current release binaries. See [docs/LICENSING.md](docs/LICENSING.md). +Project names, logos, icons, and official-release branding are handled separately from the software license. See [TRADEMARK.md](TRADEMARK.md). -## Copy Diagnostic +Historical revisions through `0df1007d9538b978edba67218136bc5c4f8019ad` remain available under their original terms on branch `archive/apache-2.0-final`. Those historical terms apply only to those earlier revisions. See [docs/LICENSING.md](docs/LICENSING.md). -The Diagnostics tab includes **Copy Diagnostic**. Use it after a failed connection and paste the generated report into the support conversation. The report includes the app and engine versions, active Windows network adapters, IED endpoints, a short TCP reachability probe, native association state, association/discovery evidence, and the recent communication journal. +--- -A message such as `TCP_CONNECTION_REFUSED` means port 102 rejected the socket before IEC 61850 COTP/ACSE/MMS negotiation. In that case an association-profile label such as `BalancedApTitle` is not the root cause. +
+ ArIED 61850
+ Clear model evidence. Independent device sessions. Guarded control workflows. +
From 5af3934e89b246736f1cca794bb37e5a09efe8ae Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:27:46 +0700 Subject: [PATCH 02/42] docs: add branded product workspace illustration --- landing/assets/hero.svg | 183 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 landing/assets/hero.svg diff --git a/landing/assets/hero.svg b/landing/assets/hero.svg new file mode 100644 index 00000000..2113e3a6 --- /dev/null +++ b/landing/assets/hero.svg @@ -0,0 +1,183 @@ + + ArIED 61850 engineering workspace + A stylized multi-IED explorer, live monitor, event log and diagnostics dashboard. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ArIED 61850 + Smart IED Explorer & Monitor + + + + + 3 connected + + + + + 128 live points + + + + + 4 new events + + + + + + + IEC 61850 Explorer + Live Monitor + Event Log + Diagnostics + + + + Open SCL + + + + Add IED + + + + + + + IED Explorer + + + + + + Bay Controller 01 + 192.0.2.10 · Connected + + MONITORING + + + + + + Protection IED 02 + 192.0.2.11 · Connected + + READY + + + + + + Metering IED 03 + 192.0.2.12 · Cached model + + OFFLINE + + + + Connect all configured IEDs + + + + Open SCL + + Add IED + + + + + + + Live model & monitoring workspace + LD0 / CSWI1 · report-first acquisition · IED timestamps + + + 128 signals + + RCB active + + + + + + + REFERENCE + VALUE + QUALITY + SOURCE + + LD0/CSWI1.Pos.stValClosedGoodReport + LD0/XCBR1.Pos.stValClosedGoodReport + LD0/MMXU1.A.phsA.cVal.mag.f512.4 AGoodReport + LD0/MMXU1.PhV.phsA.cVal.mag.f20.02 kVGoodReport + LD0/GGIO1.Ind1.stValTrueGoodDynamic + LD0/LLN0.Mod.stValOnGoodPoll + + + + + + Recent process activity + + + + Report updates · semantic changes · quality + + + + Command evidence + + ctlModel · SBO enhanced security + + OPEN + + CLOSE + + Descriptor ready · feedback mapped + + + + + + SCL-assisted engineering · independent IED sessions · report-first monitoring · guarded control + From 365ac1777dceee0556e1fdb0938115e55bd29dba Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:29:02 +0700 Subject: [PATCH 03/42] website: add responsive premium design system --- landing/styles.css | 537 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 landing/styles.css diff --git a/landing/styles.css b/landing/styles.css new file mode 100644 index 00000000..93a6ac56 --- /dev/null +++ b/landing/styles.css @@ -0,0 +1,537 @@ +:root { + --bg: #07111f; + --bg-soft: #0b1a30; + --surface: rgba(255, 255, 255, 0.075); + --surface-strong: rgba(255, 255, 255, 0.11); + --line: rgba(255, 255, 255, 0.13); + --text: #f8fbff; + --muted: #b6c7dc; + --subtle: #8296af; + --blue: #38bdf8; + --blue-strong: #3b82f6; + --violet: #8b5cf6; + --green: #34d399; + --amber: #fbbf24; + --danger: #fb7185; + --shadow: 0 28px 80px rgba(0, 0, 0, 0.42); + --radius: 24px; + --radius-sm: 15px; + --max: 1180px; +} + +* { box-sizing: border-box; } +html { scroll-behavior: smooth; } +body { + margin: 0; + min-width: 320px; + color: var(--text); + background: + radial-gradient(circle at 12% 4%, rgba(56, 189, 248, 0.16), transparent 34rem), + radial-gradient(circle at 88% 22%, rgba(139, 92, 246, 0.15), transparent 32rem), + linear-gradient(180deg, #07111f 0%, #081426 48%, #07111f 100%); + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + line-height: 1.65; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +body::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + background-image: + linear-gradient(rgba(255,255,255,.022) 1px, transparent 1px), + linear-gradient(90deg, rgba(255,255,255,.022) 1px, transparent 1px); + background-size: 48px 48px; + mask-image: linear-gradient(to bottom, black, transparent 78%); + z-index: -1; +} + +a { color: inherit; } +img, svg { max-width: 100%; } +button, input, textarea, select { font: inherit; } + +.skip-link { + position: absolute; + left: 1rem; + top: -5rem; + padding: .75rem 1rem; + color: #07111f; + background: white; + border-radius: 10px; + z-index: 1000; +} +.skip-link:focus { top: 1rem; } + +.container { + width: min(calc(100% - 2rem), var(--max)); + margin-inline: auto; +} + +.site-header { + position: sticky; + top: 0; + z-index: 100; + backdrop-filter: blur(18px) saturate(150%); + background: rgba(7, 17, 31, 0.72); + border-bottom: 1px solid rgba(255,255,255,.09); +} + +.nav-shell { + min-height: 72px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.brand { + display: inline-flex; + align-items: center; + gap: .72rem; + text-decoration: none; + font-weight: 780; + letter-spacing: -.02em; +} + +.brand-mark { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border-radius: 13px; + background: linear-gradient(135deg, var(--blue), var(--blue-strong) 52%, var(--violet)); + box-shadow: 0 10px 32px rgba(59, 130, 246, .35); +} +.brand-mark svg { width: 23px; height: 23px; } +.brand small { color: var(--subtle); font-weight: 620; } + +.nav-links { + display: flex; + align-items: center; + gap: .25rem; +} +.nav-links a { + padding: .62rem .82rem; + color: var(--muted); + text-decoration: none; + border-radius: 11px; + font-size: .93rem; + font-weight: 650; +} +.nav-links a:hover, +.nav-links a[aria-current="page"] { + color: white; + background: rgba(255,255,255,.075); +} + +.nav-cta { + display: inline-flex; + align-items: center; + gap: .55rem; + padding: .68rem .98rem !important; + color: white !important; + background: linear-gradient(135deg, var(--blue-strong), var(--violet)); + box-shadow: 0 10px 28px rgba(59,130,246,.24); +} + +.menu-toggle { + display: none; + width: 44px; + height: 44px; + color: white; + background: rgba(255,255,255,.07); + border: 1px solid var(--line); + border-radius: 12px; +} + +.hero { + padding: 7rem 0 4.2rem; + overflow: hidden; +} +.hero-grid { + display: grid; + grid-template-columns: 1.02fr .98fr; + align-items: center; + gap: 4rem; +} + +.eyebrow { + display: inline-flex; + align-items: center; + gap: .55rem; + padding: .42rem .72rem; + color: #cfeeff; + background: rgba(56,189,248,.09); + border: 1px solid rgba(56,189,248,.22); + border-radius: 999px; + font-size: .79rem; + font-weight: 760; + letter-spacing: .07em; + text-transform: uppercase; +} +.eyebrow::before { + content: ""; + width: .48rem; + height: .48rem; + border-radius: 50%; + background: var(--green); + box-shadow: 0 0 0 5px rgba(52,211,153,.12); +} + +h1, h2, h3 { margin: 0; line-height: 1.12; text-wrap: balance; } +h1 { + margin-top: 1.2rem; + max-width: 820px; + font-size: clamp(3rem, 7vw, 5.7rem); + letter-spacing: -.065em; +} +.gradient-text { + color: transparent; + background: linear-gradient(105deg, #eaf7ff 5%, #74d5ff 42%, #7ea7ff 68%, #c39cff 100%); + background-clip: text; + -webkit-background-clip: text; +} +.hero-copy { + max-width: 690px; + margin: 1.45rem 0 0; + color: var(--muted); + font-size: clamp(1.03rem, 1.8vw, 1.25rem); +} + +.hero-actions, +.section-actions { + display: flex; + flex-wrap: wrap; + gap: .8rem; + margin-top: 1.8rem; +} +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: .62rem; + min-height: 48px; + padding: .74rem 1.12rem; + text-decoration: none; + border: 1px solid var(--line); + border-radius: 14px; + color: white; + background: rgba(255,255,255,.055); + font-weight: 750; + transition: transform .2s ease, border-color .2s ease, background .2s ease, box-shadow .2s ease; +} +.btn:hover { transform: translateY(-2px); border-color: rgba(255,255,255,.28); } +.btn-primary { + border-color: transparent; + background: linear-gradient(135deg, var(--blue-strong), #5367e9 56%, var(--violet)); + box-shadow: 0 18px 46px rgba(59,130,246,.28); +} +.btn-quiet { color: var(--muted); } +.btn svg { width: 18px; height: 18px; } + +.hero-proof { + display: flex; + flex-wrap: wrap; + gap: 1rem 1.4rem; + margin-top: 1.45rem; + color: var(--subtle); + font-size: .88rem; +} +.hero-proof span { display: inline-flex; align-items: center; gap: .42rem; } +.hero-proof span::before { content: "✓"; color: var(--green); font-weight: 900; } + +.hero-visual { + position: relative; + isolation: isolate; +} +.hero-visual::before { + content: ""; + position: absolute; + inset: 8% 4% 2%; + border-radius: 50%; + background: linear-gradient(135deg, rgba(56,189,248,.35), rgba(139,92,246,.28)); + filter: blur(70px); + z-index: -1; +} +.hero-window { + border: 1px solid rgba(255,255,255,.16); + border-radius: 25px; + overflow: hidden; + background: rgba(255,255,255,.08); + box-shadow: var(--shadow); + transform: perspective(1400px) rotateY(-4deg) rotateX(2deg); +} +.hero-window img { display: block; width: 100%; } +.floating-chip { + position: absolute; + display: flex; + align-items: center; + gap: .58rem; + padding: .68rem .82rem; + border: 1px solid rgba(255,255,255,.17); + border-radius: 14px; + background: rgba(9,24,45,.88); + box-shadow: 0 18px 42px rgba(0,0,0,.32); + backdrop-filter: blur(14px); + font-size: .8rem; + font-weight: 720; +} +.floating-chip.one { left: -1.5rem; top: 17%; } +.floating-chip.two { right: -1.1rem; bottom: 13%; } +.dot { width: .56rem; height: .56rem; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 5px rgba(52,211,153,.1); } +.dot.blue { background: var(--blue); box-shadow: 0 0 0 5px rgba(56,189,248,.1); } + +.metrics { + padding: 1.2rem 0 0; +} +.metric-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + border: 1px solid var(--line); + border-radius: var(--radius); + overflow: hidden; + background: rgba(255,255,255,.045); + box-shadow: 0 18px 60px rgba(0,0,0,.18); +} +.metric { + padding: 1.35rem 1.5rem; + border-right: 1px solid var(--line); +} +.metric:last-child { border-right: 0; } +.metric strong { display: block; font-size: 1.15rem; letter-spacing: -.02em; } +.metric span { color: var(--subtle); font-size: .84rem; } + +.section { padding: 6rem 0; } +.section-tight { padding: 3.8rem 0; } +.section-head { + max-width: 740px; + margin-bottom: 2.2rem; +} +.section-head.center { margin-inline: auto; text-align: center; } +.kicker { color: var(--blue); font-size: .78rem; font-weight: 820; letter-spacing: .1em; text-transform: uppercase; } +h2 { margin-top: .65rem; font-size: clamp(2.2rem, 4.8vw, 3.8rem); letter-spacing: -.05em; } +.section-head p { margin: 1rem 0 0; color: var(--muted); font-size: 1.05rem; } + +.feature-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; +} +.card { + position: relative; + padding: 1.45rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: linear-gradient(180deg, rgba(255,255,255,.072), rgba(255,255,255,.037)); + box-shadow: 0 16px 54px rgba(0,0,0,.16); + overflow: hidden; +} +.card::before { + content: ""; + position: absolute; + inset: 0 auto auto 0; + width: 100%; + height: 1px; + background: linear-gradient(90deg, transparent, rgba(125,211,252,.75), transparent); + opacity: .5; +} +.card-icon { + width: 44px; + height: 44px; + display: grid; + place-items: center; + border-radius: 14px; + color: #dff6ff; + background: linear-gradient(135deg, rgba(56,189,248,.24), rgba(59,130,246,.16)); + border: 1px solid rgba(56,189,248,.22); +} +.card-icon svg { width: 22px; height: 22px; } +.card h3 { margin-top: 1rem; font-size: 1.18rem; letter-spacing: -.02em; } +.card p { margin: .6rem 0 0; color: var(--muted); font-size: .94rem; } +.card ul { margin: .9rem 0 0; padding-left: 1.1rem; color: var(--muted); font-size: .9rem; } +.card li + li { margin-top: .34rem; } + +.workflow { + display: grid; + grid-template-columns: .85fr 1.15fr; + gap: 2rem; + align-items: start; +} +.step-list { display: grid; gap: .75rem; } +.step { + display: grid; + grid-template-columns: auto 1fr; + gap: .9rem; + padding: 1rem; + border: 1px solid var(--line); + border-radius: 17px; + background: rgba(255,255,255,.04); +} +.step-number { + width: 34px; + height: 34px; + display: grid; + place-items: center; + border-radius: 11px; + background: linear-gradient(135deg, var(--blue-strong), var(--violet)); + font-size: .78rem; + font-weight: 840; +} +.step h3 { font-size: 1rem; } +.step p { margin: .25rem 0 0; color: var(--muted); font-size: .88rem; } + +.code-panel { + border: 1px solid var(--line); + border-radius: var(--radius); + overflow: hidden; + background: #06101f; + box-shadow: var(--shadow); +} +.code-head { + display: flex; + align-items: center; + justify-content: space-between; + padding: .85rem 1rem; + color: var(--subtle); + border-bottom: 1px solid var(--line); + background: rgba(255,255,255,.035); + font-size: .8rem; +} +.traffic-lights { display: flex; gap: .42rem; } +.traffic-lights i { width: .62rem; height: .62rem; display: block; border-radius: 50%; background: #fb7185; } +.traffic-lights i:nth-child(2) { background: #fbbf24; } +.traffic-lights i:nth-child(3) { background: #34d399; } +pre { margin: 0; padding: 1.2rem; overflow: auto; color: #d7e7fa; font: .86rem/1.75 "Cascadia Code", Consolas, monospace; } +.code-key { color: #7dd3fc; } +.code-accent { color: #c4b5fd; } +.code-ok { color: #6ee7b7; } + +.split-panel { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; +} +.panel { + padding: 1.7rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: rgba(255,255,255,.04); +} +.panel h3 { font-size: 1.35rem; } +.panel p { color: var(--muted); } +.check-list { list-style: none; padding: 0; margin: 1rem 0 0; } +.check-list li { position: relative; padding-left: 1.55rem; color: var(--muted); } +.check-list li + li { margin-top: .55rem; } +.check-list li::before { content: "✓"; position: absolute; left: 0; color: var(--green); font-weight: 900; } + +.callout { + padding: 2.2rem; + border: 1px solid rgba(56,189,248,.22); + border-radius: 30px; + background: + radial-gradient(circle at 10% 10%, rgba(56,189,248,.16), transparent 18rem), + linear-gradient(135deg, rgba(59,130,246,.12), rgba(139,92,246,.09)); + box-shadow: var(--shadow); +} +.callout-grid { display: grid; grid-template-columns: 1fr auto; gap: 2rem; align-items: center; } +.callout h2 { margin-top: 0; } +.callout p { max-width: 730px; color: var(--muted); } + +.page-hero { padding: 6.2rem 0 3.2rem; } +.page-hero h1 { max-width: 920px; font-size: clamp(2.8rem, 6vw, 5rem); } +.page-hero p { max-width: 780px; color: var(--muted); font-size: 1.12rem; } +.breadcrumbs { color: var(--subtle); font-size: .86rem; } +.breadcrumbs a { color: var(--blue); text-decoration: none; } + +.prose { max-width: 850px; } +.prose h2 { margin-top: 2.6rem; font-size: 2.2rem; } +.prose h3 { margin-top: 1.7rem; font-size: 1.3rem; } +.prose p, .prose li { color: var(--muted); } +.prose a { color: #8edcff; } +.prose code { padding: .15rem .35rem; color: #dbeafe; background: rgba(255,255,255,.08); border-radius: 6px; } + +.site-footer { + margin-top: 4rem; + padding: 3rem 0; + border-top: 1px solid var(--line); + background: rgba(0,0,0,.12); +} +.footer-grid { + display: grid; + grid-template-columns: 1.25fr .75fr .75fr; + gap: 2rem; +} +.footer-brand p { max-width: 480px; color: var(--subtle); font-size: .9rem; } +.footer-title { margin-bottom: .65rem; color: white; font-size: .78rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; } +.footer-links { display: grid; gap: .42rem; } +.footer-links a { color: var(--subtle); text-decoration: none; font-size: .9rem; } +.footer-links a:hover { color: white; } +.footer-bottom { + display: flex; + justify-content: space-between; + gap: 1rem; + margin-top: 2rem; + padding-top: 1.2rem; + color: #71859d; + border-top: 1px solid var(--line); + font-size: .8rem; +} + +.reveal { opacity: 0; transform: translateY(16px); transition: opacity .65s ease, transform .65s ease; } +.reveal.visible { opacity: 1; transform: translateY(0); } + +@media (max-width: 980px) { + .hero-grid, .workflow, .split-panel, .callout-grid { grid-template-columns: 1fr; } + .hero { padding-top: 5rem; } + .hero-visual { max-width: 760px; margin-inline: auto; } + .feature-grid { grid-template-columns: repeat(2, 1fr); } + .metric-grid { grid-template-columns: repeat(2, 1fr); } + .metric:nth-child(2) { border-right: 0; } + .metric:nth-child(-n+2) { border-bottom: 1px solid var(--line); } + .footer-grid { grid-template-columns: 1fr 1fr; } + .footer-brand { grid-column: 1 / -1; } +} + +@media (max-width: 760px) { + .menu-toggle { display: grid; place-items: center; } + .nav-links { + position: absolute; + top: 72px; + left: 1rem; + right: 1rem; + display: none; + padding: .7rem; + border: 1px solid var(--line); + border-radius: 16px; + background: rgba(7,17,31,.97); + box-shadow: var(--shadow); + } + .nav-links.open { display: grid; } + .nav-links a { width: 100%; } + h1 { font-size: clamp(2.75rem, 14vw, 4.6rem); } + .feature-grid { grid-template-columns: 1fr; } + .hero-window { transform: none; } + .floating-chip { display: none; } + .footer-grid { grid-template-columns: 1fr; } + .footer-brand { grid-column: auto; } + .footer-bottom { flex-direction: column; } +} + +@media (max-width: 520px) { + .container { width: min(calc(100% - 1.2rem), var(--max)); } + .hero { padding-top: 4.2rem; } + .section { padding: 4.4rem 0; } + .metric-grid { grid-template-columns: 1fr; } + .metric { border-right: 0; border-bottom: 1px solid var(--line); } + .metric:last-child { border-bottom: 0; } + .hero-actions .btn, .section-actions .btn { width: 100%; } + .callout { padding: 1.35rem; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; } + .reveal { opacity: 1; transform: none; } +} From 765a96612d1a43bfe7a97ba9890f9a3e19b2800c Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:29:14 +0700 Subject: [PATCH 04/42] website: add accessible navigation and progressive enhancement --- landing/app.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 landing/app.js diff --git a/landing/app.js b/landing/app.js new file mode 100644 index 00000000..da6e9d53 --- /dev/null +++ b/landing/app.js @@ -0,0 +1,39 @@ +(() => { + const toggle = document.querySelector('[data-menu-toggle]'); + const links = document.querySelector('[data-nav-links]'); + + if (toggle && links) { + toggle.addEventListener('click', () => { + const isOpen = links.classList.toggle('open'); + toggle.setAttribute('aria-expanded', String(isOpen)); + }); + + links.addEventListener('click', event => { + if (event.target instanceof HTMLAnchorElement) { + links.classList.remove('open'); + toggle.setAttribute('aria-expanded', 'false'); + } + }); + } + + const year = document.querySelector('[data-year]'); + if (year) year.textContent = String(new Date().getFullYear()); + + const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; + const revealNodes = [...document.querySelectorAll('.reveal')]; + + if (reducedMotion || !('IntersectionObserver' in window)) { + revealNodes.forEach(node => node.classList.add('visible')); + } else { + const observer = new IntersectionObserver(entries => { + for (const entry of entries) { + if (entry.isIntersecting) { + entry.target.classList.add('visible'); + observer.unobserve(entry.target); + } + } + }, { threshold: 0.12, rootMargin: '0px 0px -40px' }); + + revealNodes.forEach(node => observer.observe(node)); + } +})(); From 3bc65e201bc9a9579376ba64f7717c32459fc667 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:30:21 +0700 Subject: [PATCH 05/42] website: add SEO-optimized product landing page --- landing/index.html | 263 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 landing/index.html diff --git a/landing/index.html b/landing/index.html new file mode 100644 index 00000000..b2bf3099 --- /dev/null +++ b/landing/index.html @@ -0,0 +1,263 @@ + + + + + + ArIED 61850 — IEC 61850 IED Explorer, Monitor & Smart Control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ Open engineering workstation · .NET 8 +

See the model.
Understand the event.
Control with evidence.

+

ArIED 61850 combines SCL-assisted project setup, live MMS discovery, independent multi-IED monitoring, report and SOE diagnostics, and control-model-aware command workflows in one focused Windows application.

+ +
+ SCL and live model workflow + Independent IED sessions + GPL community edition +
+
+ +
+
+ Stylized ArIED 61850 interface showing IED explorer, live values and command evidence +
+
Report-first monitoring
+
Control-model-aware workflow
+
+
+
+ +
+
+
Multi-IEDIndependent connection and runtime ownership
+
SCL + LiveConfigured context and observed MMS model
+
Report firstRCB coverage before bounded polling fallback
+
Typed controlDirect and SBO sequences from live descriptors
+
+
+ +
+
+
+ One engineering workspace +

From configured intent to live protocol evidence

+

ArIED is organized around the questions engineers ask on site: What is configured? What is actually online? Which values are changing? Which report path is active? Why did a command complete or fail?

+
+ +
+
+
+

SCL-assisted setup

+

Import common SCL file types, extract configured IED endpoints, preserve project context, and prepare design-to-live verification without manually retyping every device.

+
+ +
+
+

Live MMS model discovery

+

Explore Logical Devices, Logical Nodes, Data Objects, Data Attributes, values, quality, timestamps, DataSets, RCBs, and type information from the connected IED.

+
+ +
+
+

Report-first acquisition

+

Use configured static coverage first, add temporary dynamic reporting where appropriate, and place only the remaining uncovered points into bounded MMS polling.

+
+ +
+
+

Independent IED sessions

+

Every IED owns its connection, discovery state, selected signals, monitoring lifecycle, report subscriptions, event badge, and diagnostic history.

+
+ +
+
+

Events and diagnostics

+

Review semantic process transitions, report reasons, quality and timestamp evidence, association progress, TCP reachability context, and a copyable support report.

+
+ +
+
+

Guarded Smart Control

+

Discover the control model, bind the live `ctlVal` type, execute the required Direct or SBO sequence, and surface completion, error, timing, and feedback evidence.

+
+
+
+
+ +
+
+
+ Fast workflow +

Move from file or IP address to focused evidence

+

The interface keeps setup, live model verification, signal selection, monitoring, events, diagnostics, and command evidence close together while preserving per-device ownership.

+ +
+
+
01

Open SCL, project, or endpoint

Start from configured engineering context or add an IED directly by IP address.

+
02

Verify the live model

Connect, discover, and compare the observed MMS structure with the expected project context.

+
03

Select the engineering scope

Search, filter, sort, and persist the exact live and control objects needed for the task.

+
04

Monitor independently

Start each IED on its own lifecycle with report-first acquisition and bounded fallback.

+
05

Review evidence

Correlate values, events, report reasons, diagnostics, control completion, and process feedback.

+
+
+
+ +
+
+
+ Engine relationship +

Application UX above a reusable protocol engine

+

ArIED owns the operator workflow, device cards, signal workspace, live views, event experience, diagnostics, project persistence, and command presentation. ARIEC61850 owns protocol codecs, sessions, discovery, reporting, SCL services, control sequencing, and protocol evidence.

+
    +
  • Direct project reference during build
  • +
  • No duplicated protocol stack inside the UI project
  • +
  • Explicit compatibility checks in CI
  • +
  • Native .NET service contracts end to end
  • +
+
+
+ Claim boundary +

Engineering evidence, not automatic authority

+

The software can validate protocol readiness and record observed behavior. It cannot establish switching authority, plant isolation, cybersecurity approval, functional safety, or universal conformance.

+
    +
  • Use active functions only in an approved test boundary
  • +
  • Validate feedback and negative command paths
  • +
  • Sanitize SCL, captures, logs, and diagnostic reports
  • +
  • Keep customer and employer material out of public issues
  • +
+
+
+
+ +
+
+
+
+ Open community edition +

Build a clearer IEC 61850 troubleshooting workflow

+

Clone ArIED beside ARIEC61850, build with .NET 8, and use the documentation and validation checklists to reproduce the intended laboratory workflow.

+
+ +
+
+
+
+ + + + + + From 0ae3edafe0fbbcafcf58ed480df4977046fb7caa Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:30:33 +0700 Subject: [PATCH 06/42] website: add vector favicon --- landing/assets/favicon.svg | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 landing/assets/favicon.svg diff --git a/landing/assets/favicon.svg b/landing/assets/favicon.svg new file mode 100644 index 00000000..aed8cc6a --- /dev/null +++ b/landing/assets/favicon.svg @@ -0,0 +1,6 @@ + + + + + + From 49a83abb97848b59c093854f228ddd9bb29eb079 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:30:55 +0700 Subject: [PATCH 07/42] website: add social preview artwork --- landing/assets/social-card.svg | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 landing/assets/social-card.svg diff --git a/landing/assets/social-card.svg b/landing/assets/social-card.svg new file mode 100644 index 00000000..5e733e9e --- /dev/null +++ b/landing/assets/social-card.svg @@ -0,0 +1,34 @@ + + ArIED 61850IEC 61850 IED Explorer, Multi-Device Monitor and Smart Control Workstation + + + + + + + + + + + + + + ArIED 61850 + See the model. + Understand the event. + Control with evidence. + SCL-assisted engineering · Live MMS discovery · Multi-IED monitoring · SOE · Smart Control + + + + + + + + + + + + + github.com/masarray/ArIED61850Tester + From 43d34d7db2e1547fce5d5454aec8611d829aa29b Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:31:39 +0700 Subject: [PATCH 08/42] website: add detailed IEC 61850 features page --- landing/features.html | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 landing/features.html diff --git a/landing/features.html b/landing/features.html new file mode 100644 index 00000000..6fce1c11 --- /dev/null +++ b/landing/features.html @@ -0,0 +1,83 @@ + + + + + + IEC 61850 Engineering Features — ArIED 61850 + + + + + + + + + + + + + + + + + + +
+
+
+ + Engineering capabilities +

One workspace for configured context, live model evidence, and focused monitoring.

+

ArIED 61850 is organized around practical commissioning and troubleshooting tasks rather than isolated protocol screens. The application keeps the configured endpoint, discovered model, selected points, report coverage, event evidence, diagnostics, and control readiness connected to the same IED session.

+
+
+ +
+
+
Project input

SCL endpoint import

Open SCD, CID, ICD, IID, SSD, or XML SCL files and extract configured IED access points for project setup.

  • Multi-IED endpoint extraction
  • Duplicate endpoint protection
  • Configured context retained per device
  • Foundation for design-to-live review
+
Live model

MMS discovery

Build a usable engineering model from the connected device instead of assuming the SCL file and live server are identical.

  • Logical Devices and Logical Nodes
  • Data Objects and Data Attributes
  • Values, quality, and timestamps
  • DataSets, RCBs, and type evidence
+
Session ownership

Independent multi-IED operation

Each device has an isolated runtime lifecycle so one connection or monitoring action does not silently change another IED.

  • Per-device connection state
  • Per-device discovery progress
  • Per-device selected signals
  • Per-device events and diagnostics
+
Acquisition

Report-first monitoring

Prefer event-driven acquisition, preserve DataSet order, and reserve polling for points not proven by report coverage.

  • Static RCB/DataSet candidates first
  • Dynamic report plans for uncovered points
  • Bounded polling priority queue
  • Coverage evidence retained per signal
+
Scale

Virtualized signal workspace

Search and select large IED models without creating one timer, task, or permanent visual element per signal.

  • Search, column filters, and sorting
  • Visible-row bulk selection
  • Keyboard-driven selection workflow
  • WPF row and column virtualization
+
Operations

Live values and SOE

Separate continuously changing process values from semantic events while preserving IED-supplied time evidence.

  • Recent-change highlighting
  • Quality and source visibility
  • Semantic process-state transitions
  • Per-IED unread event indicators
+
Troubleshooting

Diagnostics journal

Expose connection and protocol progress in language that helps engineers distinguish network, association, model, report, and command failures.

  • TCP reachability context
  • Association and discovery evidence
  • Report and fallback diagnostics
  • Sanitizable Copy Diagnostic report
+
Productivity

Project and model persistence

Save the working context needed to return to a project without repeating every setup decision.

  • Device and endpoint definitions
  • Cached model context
  • Selected signals
  • Fast reconnect workflow
+
Control

Control-ready object workflow

Present semantic actions only after the native engine resolves the live control model and required MMS type information.

  • Direct and SBO model detection
  • DPC, SPC, INC/ISC, BSC, APC
  • Termination and error evidence
  • Process feedback mapping
+
+
+ +
+
+
Acquisition strategy

Reports where proven. Polling where still required.

A point is not removed from polling merely because it was placed in a report candidate. ArIED waits for usable coverage evidence and limits polling to the points that remain uncovered or unverified.

+
+
Per-IED acquisition plan
+
1. Discover DataSets and report control blocks
+2. Rank configured static coverage
+3. Enable and validate report sessions
+4. Build dynamic plans for exact uncovered points
+5. Place remaining points in bounded polling queue
+ Retain source and coverage evidence per value
+
+
+
+ +
+
+
Designed for

Laboratory and commissioning workflows

  • FAT and SAT preparation
  • Protection IED and BCU integration
  • SCADA signal and report investigation
  • Model and timestamp troubleshooting
  • Control-sequence validation
  • Repeatable diagnostic evidence
+
Not claimed

Clear validation boundaries

  • No formal IEC 61850 conformance certificate
  • No universal multi-vendor interoperability guarantee
  • No automatic switching authority or isolation proof
  • No functional-safety certification
  • No cybersecurity approval for an operational network
  • No permission to share confidential project data
+
+
+ +
Next

Review the control workflow in detail

See how ArIED discovers `ctlModel`, resolves live command types, stages Direct or SBO sequences, and presents command completion evidence.

+
+ + + + + From 602e3e5dee16747572ebaaedaf601bb520f7b66c Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:32:23 +0700 Subject: [PATCH 09/42] website: add Smart Control product page --- landing/control.html | 63 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 landing/control.html diff --git a/landing/control.html b/landing/control.html new file mode 100644 index 00000000..906978f6 --- /dev/null +++ b/landing/control.html @@ -0,0 +1,63 @@ + + + + + + IEC 61850 Smart Control — Direct, SBO & Command Evidence | ArIED 61850 + + + + + + + + + + + + + + + + + + +
+
Control-model-aware workflow

Control the intended object through the sequence the live IED actually requires.

ArIED does not infer a command from a button label alone. It reads the live control model, resolves the command type, constructs the required Direct or Select-Before-Operate sequence, and records completion and feedback evidence for the test condition.

+ +
Direct + SBONormal and enhanced security models
Live typesNamed ctlVal binding from actual descriptors
Typed familiesDPC, SPC, INC/ISC, BSC, APC
EvidenceTermination, error, timing, and feedback
+ +
Discovery before dispatch

The command panel is the end of a model-resolution process.

A semantic action becomes available only after ArIED and ARIEC61850 have enough live evidence to represent the command without positional field guessing or a generic write fallback.

+
01

Resolve the Data Object root

Normalize the selected reference and verify the expected control-object boundary.

+
02

Read `ctlModel`

Determine whether the object requires Direct or Select-Before-Operate, with normal or enhanced completion handling.

+
03

Inspect live command types

Retrieve `Oper`, `SBOw`, and optional `Cancel` type descriptions and locate the named `ctlVal` field.

+
04

Bind semantic intent

Represent Open, Close, Raise, Lower, Boolean, counter, or setpoint intent using the actual live MMS type.

+
05

Execute one immutable sequence

Preserve origin, `ctlNum`, timestamp `T`, Test, interlock, and synchrocheck values across selection and operation.

+
06

Record completion evidence

Present confirmed service results, CommandTermination, errors, AddCause, elapsed time, and mapped process feedback.

+
+ +
Supported operator semantics

Engineering actions remain readable while wire handling stays type-aware.

The UI presents the action an engineer intends. The engine independently handles the control model and command value representation discovered from the IED.

+

Position / DPC

Open and Close actions with position feedback decoded separately from the command wire representation.

+

Boolean / SPC

True and False actions represented through the discovered single-point control type.

+

Pulse / BSC

Raise and Lower actions for supported binary step command structures.

+

Counter / INC or ISC

Typed integer command values when the live descriptor is operationally usable.

+

Setpoint / APC

Explicit setpoint entry and type-aware value binding for supported analog control objects.

+

Per-signal checks

Test, interlock, and synchrocheck request flags remain attached to the exact command row being staged.

+
+ +
Evidence shown

Protocol completion and process response

  • Detected control model and sequence
  • Confirmed MMS service result
  • Positive or negative CommandTermination
  • `ControlError`, `AddCause`, and `LastApplError`
  • Control number and origin context
  • Control-service, feedback, and total elapsed time
  • Mapped process feedback when available
Operational guardrails

Readiness is not switching authority

  • Two-step confirmation for Open and Close dispatch
  • No generic `.Oper`, `.SBOw`, or `.Cancel` write fallback
  • Control actions disabled when the descriptor is not ready
  • Test and check flags visible on the same signal row
  • Negative outcomes surfaced instead of hidden
  • Approved isolation and test authority remain external requirements
+ +
Control-model sequence matrix
Direct · normal      Oper                         → confirmed result
+SBO · normal         SBO → Oper                   → confirmed result
+Direct · enhanced    Oper                         → CommandTermination
+SBO · enhanced       SBOw → Oper                  → CommandTermination
+
+Completion evidence: service result · ControlError · AddCause · LastApplError · feedback
+ +
Validation first

Exercise every control model before energised commissioning.

Validate positive and negative termination, interlock and synchrocheck rejection, Test mode, timeout, Cancel, association loss, competing-client ownership, and process feedback mapping in the approved test environment.

+
+ + + + + From 540f0f9d334555efe9d62ebe7fdaf4db668c54db Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:33:10 +0700 Subject: [PATCH 10/42] website: add application architecture page --- landing/architecture.html | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 landing/architecture.html diff --git a/landing/architecture.html b/landing/architecture.html new file mode 100644 index 00000000..de726cc3 --- /dev/null +++ b/landing/architecture.html @@ -0,0 +1,74 @@ + + + + + + ArIED 61850 Architecture — Multi-IED Sessions, Reporting & Runtime Scale + + + + + + + + + + + + + + + + + + +
+
Application and engine boundaries

Independent device ownership above a reusable IEC 61850 engine.

ArIED keeps the Windows operator experience and project workflow separate from protocol implementation. Each configured IED owns a dedicated runtime session while shared UI pipelines coalesce updates for responsive monitoring at scale.

+ +
System boundary
┌────────────────────────────────────────────────────────────────────┐
+│                             ArIED 61850                            │
+│                                                                    │
+│  IED Explorer  ·  Signal Workspace  ·  Live Monitor  ·  Event Log │
+│  Diagnostics   ·  Project Cache     ·  Command Panel               │
+└───────────────────────────────┬────────────────────────────────────┘
+                                │ typed application services
+┌───────────────────────────────▼────────────────────────────────────┐
+│                             ARIEC61850                             │
+│  MMS Session · Discovery · Reporting · SCL Workspace · Control    │
+│  Type Binding · CommandTermination · Protocol Diagnostics          │
+└───────────────────────────────┬────────────────────────────────────┘
+                                │ IEC 61850 over TCP / report traffic
+                          Laboratory IEDs
+ +
Per-device ownership

One IED card, one session, one lifecycle.

Connection and monitoring state are not global. Stopping one device does not stop another, and a failure on one endpoint can be diagnosed without destroying the rest of the project workspace.

+

Device session

Endpoint, identity, configured context, cached model, selected points, status, and lifecycle state are owned by the device.

+

MMS association

Each connected IED has its own association, discovery progress, request routing, report sessions, and reconnect context.

+

Acquisition plan

Report candidates, dynamic reporting, uncovered polling points, aliases, and coverage evidence remain scoped to that session.

+

Event state

Unread indicators and semantic process events retain their originating IED and reference context.

+

Control context

Control descriptors and cached control-object sessions are associated with the live IED association that produced them.

+

Diagnostics

Connection, discovery, report, fallback, command, and cleanup evidence is recorded with the affected device.

+
+ +
Report-first acquisition

Coverage is proven before polling is reduced.

Static configuration is useful evidence, but it is not treated as proof that every selected point will arrive in a usable report. The runtime validates coverage and maintains bounded fallback for anything still uncovered.

+
01

Build candidates

Use discovered RCB and DataSet hints to prepare the most relevant configured report groups.

+
02

Attempt static reporting

Reserve or enable appropriate report control blocks and validate the actual member references.

+
03

Cover the remainder

Create temporary dynamic plans for exact points not covered by usable static groups where the IED permits it.

+
04

Bound polling

Place only still-uncovered or unverified points in a priority queue serviced by the device monitor loop.

+
05

Retain evidence

Associate each value update with its acquisition source and keep alias or reference proof available for diagnostics.

+
+ +
Runtime scale

Bounded work instead of one task per signal

  • One monitoring loop per IED
  • Priority queue for uncovered polling points
  • Bounded round-robin report draining
  • Latest-value coalescing by point key
  • Batched UI updates on a shared timer
  • Bounded event and diagnostic collections
  • Row and column virtualization
Time semantics

IED time remains distinct from PC receive time

Process views use the timestamp supplied by the IED, report, or companion timestamp attribute. Local runtime time may be used internally for diagnostic ordering but is not presented as the process event timestamp.

  • No local PC timestamp presented as IED event time
  • Quality and timestamp remain part of signal evidence
  • CSV and SOE exports retain process-time semantics
  • Missing or invalid source time remains diagnosable
+ +
Separation of concerns

The UI stays focused because protocol state remains in the engine.

+

ArIED application layer

Workflow navigation, device cards, signal selection, project persistence, live grids, event presentation, diagnostics UX, and command staging.

+

ARIEC61850 engine layer

Transport, association, MMS services, model discovery, report sessions, SCL workspace services, control sequencing, type binding, and protocol decoding.

+

CI compatibility gate

The build checks for required engine contracts before restore and compilation so missing APIs fail explicitly rather than producing hidden runtime degradation.

+
+ +
Source documentation

Read the detailed architecture and validation records.

The repository contains the multi-IED ownership model, engine compatibility requirements, validation checklist, reporting behavior, control integration, and clean-room boundaries.

+
+ + + + + From f468fefe497e60ba2ce35cc2a439f1203f856d21 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:33:20 +0700 Subject: [PATCH 11/42] website: add installable site metadata --- landing/site.webmanifest | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 landing/site.webmanifest diff --git a/landing/site.webmanifest b/landing/site.webmanifest new file mode 100644 index 00000000..8a1eda49 --- /dev/null +++ b/landing/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "ArIED 61850 — IEC 61850 Engineering Workstation", + "short_name": "ArIED 61850", + "description": "SCL-assisted IEC 61850 engineering, live MMS discovery, multi-IED monitoring, SOE, diagnostics, and Smart Control.", + "start_url": "./", + "scope": "./", + "display": "standalone", + "background_color": "#07111f", + "theme_color": "#07111f", + "categories": ["developer", "utilities", "productivity", "education"], + "icons": [ + { + "src": "assets/favicon.svg", + "sizes": "any", + "type": "image/svg+xml", + "purpose": "any maskable" + } + ] +} From fa28e87adbc9a4e45df187c0f815952b4804ee8a Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:33:33 +0700 Subject: [PATCH 12/42] website: add search crawler directives --- landing/robots.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 landing/robots.txt diff --git a/landing/robots.txt b/landing/robots.txt new file mode 100644 index 00000000..0c96939d --- /dev/null +++ b/landing/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://masarray.github.io/ArIED61850Tester/sitemap.xml From 67efc7cf9e8505e97320ffaf4174441a4fe96fea Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:33:47 +0700 Subject: [PATCH 13/42] website: add XML sitemap --- landing/sitemap.xml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 landing/sitemap.xml diff --git a/landing/sitemap.xml b/landing/sitemap.xml new file mode 100644 index 00000000..5ce8f515 --- /dev/null +++ b/landing/sitemap.xml @@ -0,0 +1,27 @@ + + + + https://masarray.github.io/ArIED61850Tester/ + 2026-07-14 + weekly + 1.0 + + + https://masarray.github.io/ArIED61850Tester/features.html + 2026-07-14 + monthly + 0.9 + + + https://masarray.github.io/ArIED61850Tester/control.html + 2026-07-14 + monthly + 0.9 + + + https://masarray.github.io/ArIED61850Tester/architecture.html + 2026-07-14 + monthly + 0.8 + + From 709dc090c732cc22bb3229077a3f84f28e64ea1e Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:34:01 +0700 Subject: [PATCH 14/42] website: add branded not-found page --- landing/404.html | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 landing/404.html diff --git a/landing/404.html b/landing/404.html new file mode 100644 index 00000000..ebc0bdbd --- /dev/null +++ b/landing/404.html @@ -0,0 +1,25 @@ + + + + + + Page not found — ArIED 61850 + + + + + + +
+
+ 404 · Page not found +

The requested engineering page is not available.

+

The address may have changed, or the content may have moved into the repository documentation.

+ +
+
+ + From 6bd89378829077bd835432ea35a8dbc43f450382 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:34:08 +0700 Subject: [PATCH 15/42] website: disable Jekyll processing --- landing/.nojekyll | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 landing/.nojekyll diff --git a/landing/.nojekyll b/landing/.nojekyll new file mode 100644 index 00000000..e69de29b From 91f07aaec2c09de8e7b851dc3bf14b27d5d5b7bb Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:34:21 +0700 Subject: [PATCH 16/42] ci: deploy landing pages through GitHub Pages --- .github/workflows/pages.yml | 68 +++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/workflows/pages.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..0a9962c9 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,68 @@ +name: Deploy product website + +on: + push: + branches: [ main ] + paths: + - "landing/**" + - ".github/workflows/pages.yml" + pull_request: + branches: [ main ] + paths: + - "landing/**" + - ".github/workflows/pages.yml" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + validate: + name: Validate static website + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Validate required website files + shell: bash + run: | + set -euo pipefail + test -f landing/index.html + test -f landing/features.html + test -f landing/control.html + test -f landing/architecture.html + test -f landing/styles.css + test -f landing/app.js + test -f landing/robots.txt + test -f landing/sitemap.xml + test -f landing/site.webmanifest + test -f landing/assets/hero.svg + test -f landing/assets/social-card.svg + ! grep -R --line-number --fixed-strings 'LICENSE-APACHE-2.0' landing + ! grep -R --line-number 'http://' landing --include='*.html' --include='*.xml' --include='*.json' + + - name: Upload website artifact + if: github.event_name != 'pull_request' + uses: actions/upload-pages-artifact@v3 + with: + path: landing + + deploy: + if: github.event_name != 'pull_request' + needs: validate + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From a58a177962010f510a488c5b3528214512fc32c1 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:34:42 +0700 Subject: [PATCH 17/42] docs: add professional documentation hub --- docs/README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..14c25697 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,58 @@ +# ArIED 61850 Documentation + +This directory contains the engineering, validation, licensing, provenance, and operating-boundary documents for the ArIED 61850 Windows application. + +## Start here + +| Document | Purpose | +|---|---| +| [Project README](../README.md) | Product overview, feature summary, quick start, build instructions, and public claim boundary. | +| [Architecture](ARCHITECTURE.md) | Multi-IED ownership, model identity, report-first acquisition, runtime scaling, and timestamp semantics. | +| [Validation checklist](VALIDATION_CHECKLIST.md) | Build, simulator, reporting, monitoring, control, and live-device acceptance checks. | +| [Engine compatibility](../ENGINE_COMPATIBILITY.md) | Required ARIEC61850 source contracts and project-reference layout. | + +## Control engineering + +| Document | Purpose | +|---|---| +| [ARIEC61850 Smart Control integration](../ARIEC61850_SMART_CONTROL_INTEGRATION.md) | Application-to-engine control service integration. | +| [Smart Control feedback audit](../SMART_CONTROL_FEEDBACK_AUDIT.md) | Control completion, feedback mapping, and evidence boundaries. | +| [Control UI verification](CONTROL_UI_VERIFICATION.md) | Command-panel interaction and display checks. | +| [Close feedback event verification](close-feedback-event-verification.md) | Event-driven feedback confirmation workflow. | + +## Application workflow and progress records + +| Document | Purpose | +|---|---| +| [Phase progress](../NEXT_PHASE_PROGRESS.md) | Detailed signal-selection behavior and validation record. | +| [Connection diagnostic audit](../CONNECTION_DIAGNOSTIC_AUDIT.md) | Example route and connection-failure reasoning. | +| [Implementation audit](../IMPLEMENTATION_AUDIT.md) | Application implementation review. | + +## Licensing and provenance + +| Document | Purpose | +|---|---| +| [Licensing model](LICENSING.md) | GPL community edition, historical boundary, and separate commercial licensing path. | +| [License and provenance audit](LICENSE_AUDIT_2026-07-14.md) | Repository-evidence review and remaining manual checks. | +| [Clean-room and interoperability policy](CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md) | Independent-development, test-fixture, UI, and external-material boundaries. | +| [External IP and provenance review](EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md) | Repository evidence concerning external implementation and proprietary-asset contamination. | + +## Project policies + +- [Contributing](../CONTRIBUTING.md) +- [Security](../SECURITY.md) +- [Support](../SUPPORT.md) +- [License](../LICENSE) +- [Commercial licensing](../COMMERCIAL-LICENSE.md) +- [Trademark and branding](../TRADEMARK.md) + +## Documentation principles + +Public documentation should: + +- distinguish configured SCL context from the live MMS model; +- distinguish protocol readiness from switching authority and operational safety; +- state whether evidence comes from unit tests, loopback, simulator, laboratory IEDs, or field use; +- avoid universal interoperability or conformance claims; +- use synthetic or contributor-owned examples; +- exclude confidential customer, employer, station, credential, and project material. From 4ddf11fc4d8f28d53b8f66be1a319f3b88bd8e48 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:35:04 +0700 Subject: [PATCH 18/42] docs: add security and operational disclosure policy --- SECURITY.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..c5884c5a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,61 @@ +# Security Policy + +## Supported code + +Security fixes are applied to the current `main` branch. Historical archive branches preserve earlier licensing and provenance boundaries but are not maintained as supported security release lines. + +## Reporting a vulnerability + +Do not publish an issue containing an exploitable vulnerability, credential, private endpoint, customer configuration, or confidential SCL/diagnostic material. + +Use GitHub private vulnerability reporting when it is enabled for this repository. When that channel is unavailable, open a minimal public issue requesting a private contact channel without including sensitive technical details. + +A useful report contains: + +- the affected commit or version; +- the affected workflow or component; +- reproducible steps using synthetic data; +- expected and observed behavior; +- realistic impact; +- whether active network access, an IED, or operator interaction is required; +- a proposed mitigation when known. + +## Security scope + +Examples that belong in a security report include: + +- unintended command dispatch or bypass of a confirmation/readiness guard; +- unsafe persistence or reuse of control-session state across IED associations; +- malformed network input causing code execution, data disclosure, or persistent denial of service; +- credential, path, or confidential project-data disclosure; +- untrusted project/SCL content escaping its intended parser or storage boundary; +- package or release tampering; +- dependency vulnerabilities that are reachable in the distributed application. + +Normal connection failures, unsupported IED behavior, model mismatch, report allocation rejection, and interoperability problems should normally be reported as regular engineering issues unless they create a security impact. + +## Operational technology boundary + +ArIED can perform active IEC 61850 operations, including control requests and report-related writes. Software readiness does not establish switching authority, equipment isolation, functional safety, cybersecurity approval, or permission to connect to an operational substation network. + +Use active functions only in an approved laboratory or commissioning boundary with: + +- an authorized test plan; +- confirmed network and equipment isolation as required by site procedure; +- independently verified target IED identity; +- validated positive and negative control paths; +- qualified supervision appropriate to the equipment risk. + +## Sensitive-data handling + +Before sharing logs, screenshots, SCL files, diagnostics, or project files, remove: + +- customer, employer, station, bay, and feeder names; +- credentials, tokens, certificate material, and private keys; +- non-public IP addressing and network topology; +- serial numbers and asset identifiers; +- proprietary configuration or vendor support material; +- personal information; +- any content restricted by contract or organizational policy. + +Prefer synthetic reproductions over production artifacts. From 288562ac7e314953f38fbce6e791984979f2b421 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:35:20 +0700 Subject: [PATCH 19/42] docs: add support and diagnostic guidance --- SUPPORT.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 SUPPORT.md diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 00000000..5ab1b3f4 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,47 @@ +# Support + +## Before opening an issue + +1. Confirm the target IP address, subnet, route, and TCP port 102 reachability. +2. Confirm the intended network adapter and disable unintended competing routes during laboratory troubleshooting when appropriate. +3. Confirm another client is not consuming the IED's available association or report resources. +4. Build the current ArIED branch against the required ARIEC61850 engine revision or branch. +5. Reproduce the problem with the smallest possible synthetic project or sanitized SCL file. +6. Open **Diagnostics → Copy Diagnostic** and review the report before sharing it. + +## Engineering issue template + +Include: + +- ArIED version or commit; +- ARIEC61850 version, branch, or commit; +- Windows version and .NET SDK/runtime version; +- connection method: direct IP, saved project, or SCL import; +- affected workflow: discovery, reporting, monitoring, events, control, packaging, or UI; +- exact expected and observed behavior; +- sanitized diagnostic report; +- whether the issue is deterministic; +- whether it reproduces with the simulator or a synthetic model. + +## Sanitization requirements + +Do not attach customer or employer confidential material. Remove or replace: + +- station, bay, feeder, IED, and project names; +- credentials, tokens, certificates, and private keys; +- restricted IP addressing and network topology; +- serial numbers and asset identifiers; +- proprietary screenshots, manuals, support responses, or configuration exports; +- personal information. + +Synthetic examples are preferred. + +## Commercial engineering support + +The GPL community edition is available to everyone under its license. Separate commercial arrangements may cover project-specific engineering, proprietary integration rights, OEM or white-label distribution, training, validation planning, compatibility work, and priority support. + +See [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md). The notice describes available discussion areas; commercial rights and service commitments require a separate written agreement. + +## Operational boundary + +Support guidance does not authorize command operation, switching, or connection to an operational network. The site owner, switching authority, test lead, and applicable procedures determine whether an active test is permitted. From c753ab8004d0bcca7de696342fb3dfb71c8b9816 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:35:45 +0700 Subject: [PATCH 20/42] docs: expand professional contribution guide --- CONTRIBUTING.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 019f2196..46aea1a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,86 @@ -# Contributing +# Contributing to ArIED 61850 -## Contribution licensing and provenance +Focused engineering contributions are welcome when they improve a reproducible application workflow and preserve the project's licensing, provenance, operational, and protocol boundaries. -The public project is distributed under `GPL-3.0-or-later` and maintains a separate commercial-licensing path. Before merge, contributors must agree to `CONTRIBUTOR-LICENSE-AGREEMENT.md`, sign off each commit under `DCO.txt`, have the legal right and any required employer authorization, and avoid confidential or proprietary material. +## Good contribution candidates + +- reproducible connection or model-discovery fixes; +- report-monitoring, event, diagnostics, project, or UI improvements; +- control-workflow fixes backed by simulator or synthetic evidence; +- performance and WPF virtualization improvements; +- documentation corrections with a clear evidence basis; +- deterministic tests and synthetic SCL fixtures; +- accessibility and keyboard-workflow improvements. + +Open an issue before beginning a large architectural change so the application/engine boundary and validation plan can be agreed first. + +## Development setup + +Use a sibling checkout unless an explicit engine path is supplied: + +```text +D:\Git\ +├─ ARIEC61850\ +│ └─ src\AR.Iec61850\AR.Iec61850.csproj +└─ ArIED61850Tester\ + └─ ArIED61850Tester.csproj +``` + +Build: + +```powershell +dotnet restore .\ArIED61850Tester.csproj +dotnet build .\ArIED61850Tester.csproj -c Release +``` + +Run the source and provenance gate: + +```powershell +.\scripts\verify-source-clean.ps1 +``` + +## Pull-request expectations + +A pull request should: + +- explain the engineering problem and affected workflow; +- keep protocol implementation in ARIEC61850 rather than duplicating it in the WPF application; +- include focused validation steps and results; +- avoid unrelated formatting or generated-output changes; +- use synthetic or contributor-owned test data; +- update public documentation when behavior or claim boundaries change; +- preserve the current GPL-only community release wording. + +For UI changes, include the tested Windows scaling level and keyboard workflow. For connection, reporting, or control changes, state whether validation used unit tests, loopback, simulator, or a laboratory IED. + +## Contribution licensing + +The current public project is distributed under `GPL-3.0-or-later` and maintains a separate commercial-licensing path. Before merge, contributors must: + +- read and affirmatively agree to `CONTRIBUTOR-LICENSE-AGREEMENT.md`; +- sign off every commit under `DCO.txt`; +- have the legal right and any required employer authorization to contribute; +- avoid confidential, proprietary, restricted, or customer-owned material; +- identify any third-party component and its license before introducing it. + +Example sign-off: + +```text +Signed-off-by: Contributor Name +``` + +## Clean-room and data provenance + +External software may be used only as a lawfully licensed black-box interoperability endpoint. Do not use another implementation's source code, API composition, examples, tests, documentation wording, UI, internal structure, screenshots, or extracted resources as design material. + +Do not submit raw customer or employer SCL, captures, logs, screenshots, or diagnostic exports. Reconstruct the issue with synthetic data or contributor-owned material whose redistribution rights are documented. + +Read [docs/CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md](docs/CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md) before implementation work. + +## Operational safety + +Never perform live command or active network testing without the approved test boundary, target verification, isolation, and authority required by the site procedure. A successful software readiness check is not permission to operate equipment. + +## Reporting security issues + +Follow [SECURITY.md](SECURITY.md). Do not disclose exploitable details or sensitive project data in a public issue. From 3f971cca45e768e462921c3a20f2df73eaa19073 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:36:13 +0700 Subject: [PATCH 21/42] docs: professionalize application architecture --- docs/ARCHITECTURE.md | 148 +++++++++++++++++++++++++++++-------------- 1 file changed, 101 insertions(+), 47 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 247f54d3..7de4f096 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,86 +1,140 @@ # ArIED 61850 Architecture +ArIED is the Windows application layer for project setup, IED session management, signal selection, monitoring, events, diagnostics, and command presentation. IEC 61850 protocol implementation remains in the separately maintained ARIEC61850 engine. + +## Layer boundary + +```text +┌──────────────────────────────────────────────────────────────┐ +│ ArIED 61850 │ +│ Explorer · Live Monitor · Event Log · Diagnostics · Control │ +└──────────────────────────────┬───────────────────────────────┘ + │ typed application services +┌──────────────────────────────▼───────────────────────────────┐ +│ ARIEC61850 │ +│ MMS · Reporting · SCL Workspace · Control · Diagnostics │ +└──────────────────────────────┬───────────────────────────────┘ + │ IEC 61850 / TCP 102 + Laboratory IEDs +``` + +The application must not duplicate engine protocol state machines, BER/MMS encoding, reporting logic, or control sequencing inside UI code. + ## Multi-IED ownership ```text IED card 1 ── DeviceSession 1 ── MMS association 1 ── report/poll pipeline 1 IED card 2 ── DeviceSession 2 ── MMS association 2 ── report/poll pipeline 2 IED card N ── DeviceSession N ── MMS association N ── report/poll pipeline N - │ - ├─ latest-value coalescing - └─ global event queue + │ + ├─ latest-value coalescing + └─ bounded UI/event dispatch +``` + +Connection and monitoring state are owned per IED. Stopping one IED does not stop another, and a failure on one device remains diagnosable without destroying the rest of the project workspace. + +Each device session owns: + +- configured endpoint and SCL context; +- connection and association state; +- discovered or cached model; +- selected signals and control objects; +- report subscriptions and dynamic-report resources; +- uncovered polling queue; +- event, diagnostic, and command evidence; +- reconnect and cleanup lifecycle. + +## Configured context versus live evidence + +An SCL file describes intended engineering configuration. A live MMS association describes what the connected server currently exposes. ArIED keeps both concepts distinct so future comparison workflows can report meaningful design-to-live differences. + +```text +Configured SCL context + ↓ +Configured IED / AccessPoint / endpoint + ↓ +Live TCP and MMS association + ↓ +Discovered Logical Devices, Logical Nodes, data, DataSets, and RCBs + ↓ +Design-to-live findings and runtime evidence ``` -Connection and monitoring state are owned per IED. There is no global Start Monitor operation and stopping one IED does not stop another. +SCL import must not silently replace live discovery when a live operation is requested. Conversely, opening an SCL file should not require an online IED merely to review configured endpoints and project context. ## Identity resolution -The user enters only endpoint information. After live discovery, ArIED resolves: +The user may begin with only endpoint information. After live discovery, ArIED resolves identity using the strongest available evidence: -- explicit IEDName properties when exposed by the engine/model; -- IEDName by removing a confirmed LD instance from an MMS domain; -- a common IED prefix across multiple Logical Device domains; -- known LD-role suffixes as a final heuristic. +- explicit IED name metadata exposed by the engine or model; +- confirmed Logical Device boundaries; +- common prefixes across multiple MMS domains; +- bounded heuristics only when stronger metadata is absent. -The application keeps these concepts separate: +Example: ```text -IEDName: OCR7SR -LDInst: 12CTRL -MMS domain / LDName: OCR7SR12CTRL +IEDName: IED_A +LDInst: CTRL +MMS domain / LDName: IED_ACTRL ``` -Exact LD metadata is preferred over heuristics. The source of the resolved identity is retained in the device model and Diagnostics. +Exact metadata is preferred over heuristics. The source of the resolved identity remains available to Diagnostics. -## Selection workflow +## Signal-selection workflow -Discovery definitions remain associated with one IED session, but the scanner grid is created only inside `SignalSelectionWizardWindow`. +Discovery definitions remain associated with one device session, while the large scanner grid is instantiated only inside `SignalSelectionWizardWindow`. -- no automatic recommendation selection; -- previous user selection is restored after the real IEDName is known; -- profile lookup priority: exact IEDName+endpoint, IEDName, then endpoint; -- original ArServer IEDName profiles are imported for compatibility; +- no automatic selection without user review; +- previous user selections are restored after identity resolution; +- profile lookup prefers exact identity plus endpoint, then identity, then endpoint; - cancel restores the pre-wizard selection; -- signal editing is disabled while that IED is actively monitoring. +- signal editing is disabled while that IED is actively monitoring; +- row and column virtualization remain enabled for large models. -## Smart acquisition order +## Report-first acquisition -1. Build candidates from discovered static RCB/DataSet hints. -2. Attempt static report subscription. -3. Validate actual FCD/FCDA member references. -4. For a partially covered static group, build dynamic plans for the exact uncovered remainder. -5. For points without usable static coverage, attempt a temporary dynamic DataSet/URCB. -6. Put only still-uncovered points in the MMS polling priority queue. -7. A real report update can prove and cache a vendor-specific reference alias. +1. Build candidates from discovered static RCB and DataSet evidence. +2. Attempt configured static report coverage. +3. Validate actual FCD/FCDA member references and member order. +4. For partial groups, build dynamic plans for the exact uncovered remainder where the IED permits it. +5. For points without usable report coverage, place only the remaining points in the MMS polling priority queue. +6. Allow real updates to prove reference aliases or coverage evidence. +7. Clean up association-scoped temporary DataSets and report state during monitor shutdown. -A point is never removed from polling merely because it was placed in a report candidate group. +A point is not removed from polling merely because it was placed into a report candidate. Coverage must be operationally usable or observed before fallback work is reduced. ## Runtime scalability -- one monitor loop per IED, not one task/timer per signal; -- no Age or full-point stale sweep; -- `PriorityQueue` schedules only uncovered polling points; -- report lookup uses normalized/canonical reference indexes; +- one monitor loop per IED, not one timer or task per signal; +- a `PriorityQueue` schedules only uncovered polling points; - report sessions are drained in bounded round-robin slices; +- report lookup uses normalized and canonical reference indexes; - latest-value callbacks are coalesced by point key; -- WPF applies value/event/diagnostic batches on a 100 ms timer; +- WPF applies value, event, and diagnostic batches on a shared timer; - event and diagnostic collections are bounded; -- row/column virtualization and recycling are enabled; -- scanner UI exists only while the wizard is open. +- row and column virtualization and recycling are enabled; +- the large signal scanner exists only while the selection window is open. + +## Timestamp semantics + +Process views use the timestamp supplied by the IED, report, or companion timestamp attribute. Local PC receive time is not presented as the IED process timestamp in Live Monitor, Event Log, or CSV export. -## Time semantics +Internal diagnostics may retain runtime ordering time, but that value must remain distinguishable from IED event time. -Process views contain only the timestamp supplied by the IED/report or the companion `t` attribute. Local PC receive time is not displayed in Live Values, Event Log, or CSV export. +## Control-session ownership -No Local Time column is displayed anywhere in the main process or diagnostics grids. Internal diagnostic entries may still carry a runtime timestamp for ordering, but it is not exposed as an IED event timestamp. +Control descriptors and control-object sessions are scoped to the live IED association that produced them. Reconnect, association loss, model change, or cleanup invalidates state that can no longer be trusted. -## Dynamic reporting safety +The application presents semantic actions, while ARIEC61850 owns: -Smart Auto enables dynamic reporting before polling. The native engine is instructed to: +- `ctlModel` discovery; +- `Oper`, `SBOw`, and optional `Cancel` type resolution; +- typed `ctlVal` binding; +- Direct and Select-Before-Operate sequence execution; +- origin, control number, timestamp, Test, and Check consistency; +- CommandTermination and application-error decoding. -- create an association-scoped temporary DataSet when possible; -- use an available URCB/RCB; -- trigger GI for the initial image; -- delete the temporary DataSet during monitor cleanup. +## Operational boundary -An IED may reject reservation, DataSet creation, RCB writes, or resource allocation. Such failures are reported explicitly and only the affected uncovered points fall back to polling. +Architecture and readiness checks can establish software and protocol evidence for the tested condition. They do not establish switching authority, equipment isolation, cybersecurity approval, functional safety, or formal IEC 61850 conformance. From 5c6aea2b2a36d2136d668c2d3de366856ac6702c Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:36:30 +0700 Subject: [PATCH 22/42] docs: refresh engine compatibility for v1.6.6 --- ENGINE_COMPATIBILITY.md | 57 ++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/ENGINE_COMPATIBILITY.md b/ENGINE_COMPATIBILITY.md index d5962eb8..8ac75a80 100644 --- a/ENGINE_COMPATIBILITY.md +++ b/ENGINE_COMPATIBILITY.md @@ -1,34 +1,61 @@ -# ARIEC61850 engine compatibility +# ARIEC61850 Engine Compatibility -ArIED 61850 v1.6.5 uses the native Smart Control API from the connected ARIEC61850 source repository. +ArIED 61850 v1.6.6 is an application-only repository. It compiles against the separately maintained ARIEC61850 source project and uses native engine contracts for control, SCL workspace services, discovery, reporting, and diagnostics. -Required engine source includes: +## Required engine areas + +The build currently verifies the presence of: ```text src/AR.Iec61850/Control/Iec61850ControlService.cs -src/AR.Iec61850/Control/Iec61850ControlObjectSession.cs src/AR.Iec61850/Control/Iec61850ControlModels.cs -src/AR.Iec61850/Control/Iec61850ControlValueBinder.cs -src/AR.Iec61850/Control/Iec61850CommandTerminationDecoder.cs +src/AR.Iec61850/Scl/Workspace/SclWorkspaceService.cs +src/AR.Iec61850/Scl/Workspace/SclWorkspaceModels.cs ``` -The integration was audited against the uploaded ARIEC61850 revision `41d003ae02b1003d16cd5a8baf5f7a95be4434fa`. +The compatibility gate also checks for key contracts used by the application, including: -ArIED does not ship or overwrite the user's ARIEC61850 repository. Build it against the existing engine checkout: +- `IIec61850ControlService`; +- `CommandTerminationReceived` in the control result contract; +- design-to-live comparison support in the SCL workspace service. -```powershell -dotnet build .\ArIED61850Tester.csproj -c Release ` - -p:ArIec61850Project="D:\Git\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" -``` +If a required contract is missing, CI and local builds should fail explicitly rather than silently degrading the operator workflow. -The default sibling layout remains supported: +## Recommended sibling layout ```text D:\Git\ ├─ ARIEC61850\ │ └─ src\AR.Iec61850\AR.Iec61850.csproj -└─ ArIED61850\ +└─ ArIED61850Tester\ └─ ArIED61850Tester.csproj ``` -ArIED v1.6.5 intentionally has no legacy generic-MMS control fallback. If the Smart Control API is absent or its contract is older, compilation should fail rather than silently enabling unsafe command writes. +Build with the default sibling reference: + +```powershell +dotnet build .\ArIED61850Tester.csproj -c Release +``` + +Or select another engine checkout: + +```powershell +dotnet build .\ArIED61850Tester.csproj -c Release ` + -p:ArIec61850Project="D:\Engineering\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" +``` + +The environment variable form is also supported: + +```powershell +$env:ARIEC61850_PROJECT = "D:\Engineering\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj" +``` + +## Source and package boundary + +ArIED does not overwrite the engine repository. A published Windows package may contain compiled engine assemblies as part of the combined GPL community application, but this application repository does not vendor or duplicate ARIEC61850 source. + +Control operations intentionally have no generic MMS-write fallback. The native engine must provide a usable control descriptor and sequence contract before ArIED enables command dispatch. + +## CI integration reference + +The exact engine branch or revision used by CI is defined in `.github/workflows/build.yml`. Release preparation should pin or document a reviewed engine revision and update this file when the supported integration baseline changes. From 2190d65ddb28215f8454b5a2f932733015c2854f Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:36:47 +0700 Subject: [PATCH 23/42] build: align product metadata with public positioning --- ArIED61850Tester.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ArIED61850Tester.csproj b/ArIED61850Tester.csproj index 7b3b99e8..7b622f10 100644 --- a/ArIED61850Tester.csproj +++ b/ArIED61850Tester.csproj @@ -9,15 +9,15 @@ ArIED61850 ArIED61850Tester Assets\app-icon.ico - Mas Ari / masarray - Copyright (C) 2026 Mas Ari / masarray + Ari Sulistiono / masarray + Copyright (C) 2026 Ari Sulistiono ArIED 61850 - ArIED 61850 - Smart IED Explorer & Monitor for SCL-based offline engineering, live IEC 61850 discovery, multi-IED monitoring, reporting, control-object inspection, quality, timestamps, and event logging. + ArIED 61850 — IEC 61850 Engineering Workstation + Windows IEC 61850 engineering workstation for SCL-assisted project setup, live MMS model discovery, independent multi-IED monitoring, reporting diagnostics, sequence of events, and guarded Smart Control. 1.6.6 1.6.6.0 1.6.6.0 - iec61850;iec-61850;mms;scl;ied;relay-testing;substation-automation;digital-substation;report-control-block;wpf;dotnet + iec61850;iec-61850;mms;scl;ied-explorer;multi-ied-monitoring;relay-testing;substation-automation;digital-substation;report-control-block;sequence-of-events;smart-control;wpf;dotnet GPL-3.0-or-later $(ARIEC61850_PROJECT) ..\ARIEC61850\src\AR.Iec61850\AR.Iec61850.csproj From b5aef1bf7ca3731c0a3b8dd0cb07eb129f1af738 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:37:22 +0700 Subject: [PATCH 24/42] docs: rename external IP audit as evidence-based provenance review --- ...NAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/EXTERNAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md diff --git a/docs/EXTERNAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md b/docs/EXTERNAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md new file mode 100644 index 00000000..afda1a34 --- /dev/null +++ b/docs/EXTERNAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md @@ -0,0 +1,69 @@ +# External IP and Provenance Review — 2026-07-14 + +This document records repository evidence and project controls. It is not a legal opinion or a guarantee against every possible claim. + +## Scope + +The review examined the current ArIED 61850 application repository for contamination or confusion risk associated with unrelated implementations, proprietary engineering products, copied source or API structures, manuals, screenshots, icons, logos, visual layouts, report templates, wording, binaries, captures, and affiliation claims. + +## Repository findings + +At the review date: + +- no unrelated implementation source, binary, header, generated binding, wrapper, package reference, or direct API identifier was detected in the current application tree; +- ArIED references ARIEC61850 through a .NET project reference and does not directly reference another IEC 61850 protocol implementation; +- no direct third-party NuGet `PackageReference` was detected in the application project; +- no proprietary executable, library, manual, brochure, screenshot, icon, logo, product photo, help file, report template, or extracted resource was detected in the tracked repository; +- no current source or public documentation identifies an external commercial product as an implementation source or application dependency; +- tracked application assets use ArIED-owned names and resources; +- the repository author review found no external human contributor whose permission was identified as required for the current licensing model. + +These findings support an independently developed application position. Automated repository scans cannot establish the absence of undisclosed off-repository material, contractual restrictions, or every form of visual or conceptual similarity. + +## External implementation boundary + +ArIED must not incorporate, link, translate, mechanically port, wrap, or imitate source, bindings, examples, tests, API structures, naming schemes, binaries, or documentation from unrelated implementations. The application is designed against ARIEC61850's independently maintained managed C# API. + +Standards-based functional overlap is expected among IEC 61850 tools. The defensible distinction is independently authored code, architecture, tests, naming, UI, fixtures, and provenance records. + +## Proprietary-material boundary + +Proprietary software and its manuals, screenshots, UI composition, icons, logos, report styles, help wording, internal resources, product photos, and extracted assets are not application design inputs and must not be included in the repository, website, documentation, or release package. + +Lawfully licensed black-box interoperability testing may be performed in an isolated laboratory subject to the applicable license and organizational policy. It must not involve resource extraction, decompilation, disassembly, memory inspection, database extraction, technical-restriction circumvention, or copying protected expression. + +Observed protocol behavior must be reduced to a vendor-neutral standards fact and implemented in ARIEC61850, not copied into the ArIED application layer from an external client. + +## User-interface boundary + +Common functional patterns such as an IED tree, signal grid, event list, report monitor, SCL view, command panel, waveform, or phasor display are engineering concepts. Copyright and trade-dress risk arises from copying the distinctive expression of those concepts. + +ArIED must retain its own information architecture, workflow, spacing, sizing, colors, typography, icons, visual hierarchy, pane composition, interaction sequence, labels, diagnostics wording, report appearance, screenshots, and marketing artwork. + +External product screenshots must not be used as pixel-level design specifications, landing-page assets, documentation images, or release illustrations. + +## Repository controls + +- maintain a vendor-neutral clean-room and interoperability policy; +- list only dependencies actually used by the application; +- reject restricted external identifiers from normal source and documentation through fingerprint-based scanning; +- reject tracked captures, manuals, binaries, logs, and confidential evidence; +- run source-clean verification before restore, build, publish, and artifact upload; +- retain licensing and attribution documents in portable packages; +- use synthetic or contributor-owned examples in public documentation and tests. + +## Remaining manual checks + +Before a high-value commercial, OEM, or white-label transaction, manually review: + +- applicable software licenses and account or download terms for every external tool used in testing; +- the exact ARIEC61850 engine revision included in the distributed build; +- employment, invention-assignment, moonlighting, confidentiality, and customer-data obligations; +- private screenshots, design notes, SCL, captures, training materials, support responses, and test artifacts not visible in GitHub; +- visual similarity through an independent UI and trade-dress review; +- trademark clearance for ArIED 61850 and related branding; +- release archives for unexpected binaries, images, manuals, logs, or customer data. + +## Conclusion + +No current repository evidence was found that ArIED contains or directly depends on unrelated implementation code or bundles proprietary software, manuals, screenshots, branding, report templates, or UI resources. The strongest remaining risk is off-repository provenance and contractual restrictions that repository inspection cannot establish. The controls above materially reduce copyright, license, trademark, and affiliation risk but do not replace professional legal review for a significant commercial agreement. From c7b625c4ae0adfc9f18f9e81358f74616c5e8512 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:37:33 +0700 Subject: [PATCH 25/42] docs: remove superseded cleanliness audit title --- ...XTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 docs/EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md diff --git a/docs/EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md b/docs/EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md deleted file mode 100644 index 795b17ac..00000000 --- a/docs/EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md +++ /dev/null @@ -1,68 +0,0 @@ -# External IP Cleanliness Audit — 2026-07-14 - -This is a repository-evidence and process audit, not a legal opinion or a guarantee against every possible claim. - -## Scope - -The audit reviewed the current ArIED 61850 application repository for contamination or confusion risk associated with unrelated external implementations, proprietary engineering products, copied source, API structures, manuals, screenshots, icons, logos, visual layouts, report templates, wording, binaries, captures, and affiliation claims. - -## Findings - -At the audit date: - -- no unrelated external implementation source, binary, header, generated binding, wrapper, package reference, or direct API identifier was detected in the current application tree; -- ArIED references ARIEC61850 through a .NET project reference and does not directly reference another protocol implementation; -- no direct third-party NuGet `PackageReference` was detected in the ArIED application project; -- no proprietary executable, library, manual, brochure, screenshot, icon, logo, product photo, help file, report template, or extracted resource was detected in the tracked application repository; -- no current source or public application documentation identifies an external commercial product as an implementation source or application dependency; -- the tracked application assets use ArIED-owned names and resources; -- the repository author audit found no external human contributor whose copyright permission must be obtained for the present licensing model. - -These findings support an independently developed application position. Automated repository scans cannot prove the absence of undisclosed off-repository material, contractual restrictions, or all visual similarity. - -## External implementation boundary - -ArIED must not incorporate, link, translate, mechanically port, wrap, or imitate source, bindings, examples, tests, API structures, naming schemes, binaries, or documentation from unrelated external implementations. The application is designed against ARIEC61850's own managed C# API. - -Standards-based feature overlap is expected among IEC 61850 tools. The defensible distinction is independently authored code, architecture, tests, naming, UI, and provenance records. - -## Proprietary-tool boundary - -Proprietary products and their manuals, screenshots, UI composition, icons, logos, report styles, help wording, internal resources, product photos, and software are not application design inputs and must not be included in the repository, website, documentation, or package. - -Lawfully licensed black-box interoperability tests may be performed in an isolated laboratory subject to the applicable license and organizational policy. They must not involve reverse engineering, resource extraction, decompilation, disassembly, memory inspection, database extraction, technical-restriction circumvention, or copying protected expression. - -Any observed protocol behavior must be independently reduced to a standards fact and implemented in ARIEC61850, not copied into the ArIED application layer from a proprietary client. - -## User-interface review - -Common functional patterns such as an IED model tree, signal grid, event list, report monitor, waveform display, phasor plot, SCL view, and command panel are engineering concepts. Copyright risk arises from copying the distinctive expression of those concepts. - -ArIED must retain its own information architecture, workflow, spacing, sizing, colors, typography, icons, visual hierarchy, pane composition, interaction sequence, labels, diagnostics wording, report appearance, screenshots, and marketing artwork. - -No proprietary screenshot may be used as a pixel-level design reference, landing-page asset, documentation image, or release illustration. - -## Controls - -- maintain a vendor-neutral clean-room and interoperability policy; -- maintain dependency notices only for components actually used by the application; -- reject external-product identifiers from normal source and documentation through fingerprint-based scanning; -- reject tracked captures, manuals, binaries, logs, and confidential evidence; -- run source-clean verification before restore, build, publish, and artifact upload; -- retain licensing and attribution documents in portable packages. - -## Remaining manual checks - -Before a high-value commercial, OEM, or white-label transaction, manually review: - -- applicable product licenses and account/download terms for every proprietary tool used in testing; -- the full ARIEC61850 engine revision included in the distributed build; -- employment, invention-assignment, moonlighting, confidentiality, and customer-data obligations; -- private screenshots, design notes, SCL, PCAP, training materials, support responses, and test artifacts that are not visible in GitHub; -- visual similarity through an independent UI and trade-dress review; -- trademark clearance for ArIED 61850 and related branding; and -- release archives for unexpected binaries, images, manuals, logs, or customer data. - -## Conclusion - -No current repository evidence was found that ArIED contains or directly depends on unrelated external implementation code or bundles proprietary software, manuals, screenshots, branding, report templates, or UI resources. The strongest remaining risk is off-repository provenance and contractual restrictions that repository inspection cannot establish. The controls above materially reduce copyright, license, trademark, and affiliation risk but do not replace professional legal review for a significant commercial agreement. From a3d31afe51ac8adfc9289efe4ab8fad36383e2fc Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:37:55 +0700 Subject: [PATCH 26/42] docs: link renamed provenance review --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 14c25697..fdb07805 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,7 +35,7 @@ This directory contains the engineering, validation, licensing, provenance, and | [Licensing model](LICENSING.md) | GPL community edition, historical boundary, and separate commercial licensing path. | | [License and provenance audit](LICENSE_AUDIT_2026-07-14.md) | Repository-evidence review and remaining manual checks. | | [Clean-room and interoperability policy](CLEAN_ROOM_AND_INTEROPERABILITY_POLICY.md) | Independent-development, test-fixture, UI, and external-material boundaries. | -| [External IP and provenance review](EXTERNAL_IP_CLEANLINESS_AUDIT_2026-07-14.md) | Repository evidence concerning external implementation and proprietary-asset contamination. | +| [External IP and provenance review](EXTERNAL_IP_AND_PROVENANCE_REVIEW_2026-07-14.md) | Repository evidence concerning external implementation and proprietary-asset contamination. | ## Project policies From 2ce705ca5a593c750bea368f89c084e19695c3a9 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:38:26 +0700 Subject: [PATCH 27/42] ci: extend source checks to website and public wording --- scripts/verify-source-clean.ps1 | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/verify-source-clean.ps1 b/scripts/verify-source-clean.ps1 index 8263cdd1..58f54ad8 100644 --- a/scripts/verify-source-clean.ps1 +++ b/scripts/verify-source-clean.ps1 @@ -4,7 +4,7 @@ .SYNOPSIS Verifies that every Git-tracked ArIED path is free from prohibited binaries, captures, confidential evidence, external-product identifiers, proprietary assets, - and obsolete license files that could make the current release ambiguous. + obsolete license files, and superseded public wording. .DESCRIPTION The gate scans every Git-tracked file. Disallowed external identifiers are @@ -19,6 +19,7 @@ $RepoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path $ForbiddenFilePatterns = @( "LICENSE-APACHE-2.0", + "*EXTERNAL_IP_CLEANLINESS_AUDIT*", "*.dll", "*.exe", "*.pdb", "*.deps.json", "*.runtimeconfig.json", "*.nupkg", "*.snupkg", "*.pcap", "*.pcapng", "*.etl", "*.binlog", "*.log", "*.tmp", "*.cache", "*.suo", "*.user", "*.rsuser", @@ -42,12 +43,17 @@ $CandidateLengths = [System.Collections.Generic.HashSet[int]]::new() @(7, 8, 12, 22) | ForEach-Object { [void]$CandidateLengths.Add($_) } $ForbiddenTextPatterns = @( - "C:\Users\", "C:\Program Files\dotnet\sdk", "blocked in the current sandbox", "_wpftmp" + "C:\Users\", + "C:\Program Files\dotnet\sdk", + "blocked in the current sandbox", + "_wpftmp", + "External IP Cleanliness Audit" ) $TextExtensions = @( ".md", ".cs", ".xml", ".xaml", ".ps1", ".cmd", ".yml", ".yaml", - ".html", ".css", ".js", ".json", ".props", ".targets", ".sln", ".slnx", ".txt" + ".html", ".css", ".js", ".json", ".webmanifest", ".svg", + ".props", ".targets", ".sln", ".slnx", ".txt" ) $Problems = New-Object System.Collections.Generic.List[string] @@ -145,4 +151,4 @@ if ($Problems.Count -gt 0) { throw "ArIED source tree failed clean-room validation with $($Problems.Count) problem(s)." } -Write-Host "All Git-tracked ArIED content passed clean-room, external-IP, and current-license checks." -ForegroundColor Green +Write-Host "All Git-tracked ArIED content passed source, website, external-IP, and current-license checks." -ForegroundColor Green From 9a26ba9dccd5633d340fe0ff0b5f0090721a5d93 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:38:47 +0700 Subject: [PATCH 28/42] github: add structured engineering bug report template --- .github/ISSUE_TEMPLATE/bug-report.yml | 111 ++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..663bc0b2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,111 @@ +name: Engineering bug report +description: Report a reproducible ArIED connection, discovery, monitoring, event, control, packaging, or UI defect. +title: "[Bug] " +labels: ["bug", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Thank you for helping improve ArIED 61850. Use synthetic or sanitized data only. Do not include credentials, customer names, station identifiers, confidential SCL, restricted addressing, or proprietary material. + + - type: dropdown + id: area + attributes: + label: Affected area + options: + - Connection / association + - SCL import / project workspace + - MMS discovery / model browser + - Signal selection + - Reporting / monitoring + - Event log / timestamps / quality + - Smart Control + - Diagnostics + - Build / packaging + - UI / accessibility / performance + - Documentation / website + validations: + required: true + + - type: input + id: app-version + attributes: + label: ArIED version or commit + placeholder: "1.6.6 or commit SHA" + validations: + required: true + + - type: input + id: engine-version + attributes: + label: ARIEC61850 branch or commit + placeholder: "main or commit SHA" + validations: + required: true + + - type: input + id: environment + attributes: + label: Environment + description: Windows version, .NET SDK/runtime, and display scaling when relevant. + placeholder: "Windows 11 24H2, .NET SDK 8.0.x, 125% scaling" + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Reproduction steps + placeholder: | + 1. Open... + 2. Connect... + 3. Select... + 4. Observe... + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + + - type: textarea + id: observed + attributes: + label: Observed behavior + validations: + required: true + + - type: textarea + id: diagnostics + attributes: + label: Sanitized diagnostic evidence + description: Paste a sanitized Copy Diagnostic report or the smallest relevant excerpt. Remove confidential data first. + render: text + + - type: dropdown + id: evidence-source + attributes: + label: Validation environment + options: + - Static source review only + - Unit or integration test + - Simulator / loopback + - Isolated laboratory IED + - Approved commissioning environment + validations: + required: true + + - type: checkboxes + id: confirmations + attributes: + label: Confirmations + options: + - label: I removed confidential customer, employer, station, credential, and restricted network information. + required: true + - label: I did not include external proprietary screenshots, manuals, code, or support material. + required: true + - label: Any active control or network test was performed under the required authority and test boundary. + required: true From a807a645971906744b02f800362fef6fb9bb4c96 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:39:06 +0700 Subject: [PATCH 29/42] github: add engineering feature request template --- .github/ISSUE_TEMPLATE/feature-request.yml | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..284fbe29 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,76 @@ +name: Engineering feature request +description: Propose a focused ArIED workflow, usability, diagnostics, monitoring, or control improvement. +title: "[Feature] " +labels: ["enhancement", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Describe the engineering problem before proposing the UI or implementation. Protocol behavior should remain in ARIEC61850; ArIED should consume typed engine services. + + - type: dropdown + id: area + attributes: + label: Product area + options: + - SCL / project workflow + - MMS explorer / discovery + - Signal selection + - Reporting / live monitoring + - Events / diagnostics + - Smart Control + - Performance / scalability + - Accessibility / keyboard workflow + - Packaging / release + - Documentation / website + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Engineering problem + description: What is difficult, slow, ambiguous, or currently impossible? + validations: + required: true + + - type: textarea + id: workflow + attributes: + label: Desired workflow + description: Describe the user steps and expected evidence, not only the final screen. + validations: + required: true + + - type: textarea + id: acceptance + attributes: + label: Acceptance criteria + placeholder: | + - Given... + - When... + - Then... + validations: + required: true + + - type: textarea + id: protocol-boundary + attributes: + label: Application / engine boundary + description: Identify whether the request needs a new ARIEC61850 engine contract, an ArIED-only change, or both. + + - type: textarea + id: validation + attributes: + label: Proposed validation + description: Unit test, simulator, loopback, laboratory IED, performance measurement, or UI verification. + + - type: checkboxes + id: confirmations + attributes: + label: Confirmations + options: + - label: This request does not include confidential or proprietary customer or employer material. + required: true + - label: This request does not depend on copying another product's UI, wording, code, or documentation. + required: true From 76b2cde205a05963364213d47f32cb49cbce7198 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:39:17 +0700 Subject: [PATCH 30/42] github: configure issue intake --- .github/ISSUE_TEMPLATE/config.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..6ddc4776 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Security vulnerability + url: https://github.com/masarray/ArIED61850Tester/security + about: Review SECURITY.md and use private vulnerability reporting when available. + - name: Support and diagnostics guide + url: https://github.com/masarray/ArIED61850Tester/blob/main/SUPPORT.md + about: Review connection checks, required environment details, and sanitization rules before filing an issue. + - name: Product website + url: https://masarray.github.io/ArIED61850Tester/ + about: Product overview, features, Smart Control, and architecture. From 95f0a9c49dc3995da49ca043b0afaf4bff0dc5db Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:39:32 +0700 Subject: [PATCH 31/42] github: strengthen pull request quality checklist --- .github/pull_request_template.md | 38 ++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ed347228..c08657fd 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,16 +1,36 @@ -## Summary +## Engineering problem -Describe the change and its engineering purpose. +Describe the user or protocol problem and why this change belongs in ArIED rather than ARIEC61850. + +## Solution + +Summarize the implementation and the application/engine boundary. ## Validation -- [ ] Build completed -- [ ] Relevant tests completed -- [ ] No confidential SCL/PCAP/customer data included -- [ ] No proprietary or restrictive-license code copied or mechanically translated +State the evidence source and result: + +- [ ] Source/provenance gate completed +- [ ] Restore and Release build completed +- [ ] Relevant automated tests completed +- [ ] Simulator or loopback validation completed, when applicable +- [ ] Laboratory IED validation completed, when applicable +- [ ] Keyboard, scaling, and visual checks completed for UI changes +- [ ] Public documentation updated when behavior or claim boundaries changed + +## Operational and data boundary + +- [ ] No confidential SCL, capture, diagnostic, screenshot, customer, employer, station, credential, or restricted network data is included +- [ ] No external proprietary code, API composition, test, wording, screenshot, manual, asset, or UI design was copied or mechanically translated +- [ ] Active control or network validation was performed only under the required authority and test boundary +- [ ] The change does not imply formal conformance, universal interoperability, functional safety, or switching authority ## Contribution licensing -- [ ] I have read and agree to `CONTRIBUTOR-LICENSE-AGREEMENT.md`. -- [ ] I have the legal right and, where necessary, employer authorization to submit this contribution. -- [ ] Every commit includes a DCO sign-off (`Signed-off-by: Name `). +- [ ] I have read and agree to `CONTRIBUTOR-LICENSE-AGREEMENT.md` +- [ ] I have the legal right and, where necessary, employer authorization to submit this contribution +- [ ] Every commit includes a DCO sign-off: `Signed-off-by: Name ` + +## Screenshots or diagnostics + +Use synthetic or sanitized material only. Explain what the evidence demonstrates. From 58c572c8433b477fbe5093df38ce7dd1309ef24f Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:39:48 +0700 Subject: [PATCH 32/42] docs: add project community conduct policy --- CODE_OF_CONDUCT.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..0dce04f9 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,32 @@ +# Community Conduct + +ArIED 61850 welcomes professional, evidence-based collaboration from engineers, developers, testers, educators, and users. + +## Expected conduct + +Participants should: + +- communicate respectfully and focus discussion on the engineering problem; +- distinguish observed evidence from assumptions or marketing claims; +- provide reproducible steps and synthetic examples where possible; +- respect customer, employer, contributor, and third-party confidentiality; +- avoid sharing credentials, restricted network details, personal information, or proprietary material; +- acknowledge operational technology risk and never pressure others to bypass site authority, isolation, or test procedures; +- accept review of licensing, provenance, safety wording, and application/engine boundaries as part of technical quality. + +## Unacceptable conduct + +The project does not accept: + +- harassment, personal attacks, discriminatory language, or intimidation; +- knowingly false claims about certification, affiliation, interoperability, or test evidence; +- publication of confidential project data or security-sensitive information; +- instructions to operate equipment without the required authority; +- copied proprietary source, documentation, UI assets, screenshots, or restricted test material; +- repeated disruption of issues or reviews after a decision has been explained. + +## Enforcement + +Maintainers may edit, hide, lock, or remove content; close issues or pull requests; or restrict participation when necessary to protect contributors, users, project integrity, legal provenance, or operational safety. + +For sensitive conduct or security concerns, request a private contact channel without posting confidential details publicly. From 0f803355605ec56cb1a30459254cefb6d1f1d885 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:40:17 +0700 Subject: [PATCH 33/42] ci: use reviewed ARIEC61850 main integration baseline --- .github/workflows/build.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a57edd07..590d2378 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,11 +7,11 @@ on: workflow_dispatch: env: - # Temporary integration pin. Switch this to main after ARIEC61850 PR #25 is merged. - ARIEC61850_REF: agent/scl-workspace-api + ARIEC61850_REF: main jobs: build-windows: + name: Build, validate and package Windows application runs-on: windows-latest steps: - name: Checkout ArIED application @@ -20,7 +20,7 @@ jobs: $ref = if ($env:GITHUB_HEAD_REF) { $env:GITHUB_HEAD_REF } else { $env:GITHUB_REF_NAME } git clone --quiet --depth 1 --branch $ref "https://github.com/$env:GITHUB_REPOSITORY.git" ArIED61850Tester - - name: Verify ArIED clean-room source + - name: Verify source, website and license boundaries shell: powershell run: .\ArIED61850Tester\scripts\verify-source-clean.ps1 @@ -37,6 +37,8 @@ jobs: ArIED61850Tester/GridUxBehavior.cs ArIED61850Tester/Models ArIED61850Tester/Services + ArIED61850Tester/docs + ArIED61850Tester/landing - name: Checkout ARIEC61850 engine shell: powershell From 035e0456cdde16eea86440d37fa1faddb01ded68 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:42:06 +0700 Subject: [PATCH 34/42] ci: add static landing page validator --- scripts/validate-landing.py | 192 ++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 scripts/validate-landing.py diff --git a/scripts/validate-landing.py b/scripts/validate-landing.py new file mode 100644 index 00000000..e65931c9 --- /dev/null +++ b/scripts/validate-landing.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python3 +"""Validate the ArIED static product website without external dependencies.""" + +from __future__ import annotations + +import json +import re +import sys +import xml.etree.ElementTree as ET +from html.parser import HTMLParser +from pathlib import Path +from urllib.parse import urlparse + +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "landing" +HTML_FILES = [ + SITE / "index.html", + SITE / "features.html", + SITE / "control.html", + SITE / "architecture.html", + SITE / "404.html", +] + + +class PageParser(HTMLParser): + def __init__(self) -> None: + super().__init__(convert_charrefs=True) + self.title_parts: list[str] = [] + self.in_title = False + self.h1_count = 0 + self.description: str | None = None + self.canonical: str | None = None + self.links: list[str] = [] + self.images: list[tuple[str, str | None]] = [] + self.scripts: list[str] = [] + self.stylesheets: list[str] = [] + + def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: + values = dict(attrs) + if tag == "title": + self.in_title = True + elif tag == "h1": + self.h1_count += 1 + elif tag == "meta" and values.get("name", "").lower() == "description": + self.description = values.get("content") + elif tag == "link": + rel = (values.get("rel") or "").lower() + href = values.get("href") + if rel == "canonical": + self.canonical = href + if "stylesheet" in rel and href: + self.stylesheets.append(href) + elif tag == "a" and values.get("href"): + self.links.append(values["href"] or "") + elif tag == "img" and values.get("src"): + self.images.append((values["src"] or "", values.get("alt"))) + elif tag == "script" and values.get("src"): + self.scripts.append(values["src"] or "") + + def handle_endtag(self, tag: str) -> None: + if tag == "title": + self.in_title = False + + def handle_data(self, data: str) -> None: + if self.in_title: + self.title_parts.append(data) + + +def is_external(reference: str) -> bool: + parsed = urlparse(reference) + return bool(parsed.scheme or parsed.netloc or reference.startswith("mailto:") or reference.startswith("#")) + + +def validate_local_reference(page: Path, reference: str, errors: list[str]) -> None: + clean = reference.split("#", 1)[0].split("?", 1)[0] + if not clean or is_external(reference) or clean.startswith("data:"): + return + target = (page.parent / clean).resolve() + try: + target.relative_to(SITE.resolve()) + except ValueError: + errors.append(f"{page.relative_to(ROOT)}: local reference escapes landing directory: {reference}") + return + if not target.exists(): + errors.append(f"{page.relative_to(ROOT)}: missing local reference: {reference}") + + +def validate_html(page: Path, errors: list[str]) -> None: + if not page.exists(): + errors.append(f"Missing page: {page.relative_to(ROOT)}") + return + + text = page.read_text(encoding="utf-8") + parser = PageParser() + parser.feed(text) + + title = "".join(parser.title_parts).strip() + if not title: + errors.append(f"{page.relative_to(ROOT)}: missing title") + elif len(title) > 70: + errors.append(f"{page.relative_to(ROOT)}: title is longer than 70 characters ({len(title)})") + + if page.name != "404.html": + if parser.h1_count != 1: + errors.append(f"{page.relative_to(ROOT)}: expected exactly one h1, found {parser.h1_count}") + if not parser.description: + errors.append(f"{page.relative_to(ROOT)}: missing meta description") + elif not 70 <= len(parser.description) <= 180: + errors.append( + f"{page.relative_to(ROOT)}: meta description length should be 70-180 characters, found {len(parser.description)}" + ) + if not parser.canonical or not parser.canonical.startswith("https://masarray.github.io/ArIED61850Tester/"): + errors.append(f"{page.relative_to(ROOT)}: missing or invalid canonical URL") + + for reference in parser.links + parser.scripts + parser.stylesheets: + validate_local_reference(page, reference, errors) + + for src, alt in parser.images: + validate_local_reference(page, src, errors) + if alt is None: + errors.append(f"{page.relative_to(ROOT)}: image is missing alt text: {src}") + + if "http://" in text: + errors.append(f"{page.relative_to(ROOT)}: insecure http:// reference") + + +def validate_structured_files(errors: list[str]) -> None: + manifest_path = SITE / "site.webmanifest" + try: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + for required in ("name", "short_name", "description", "start_url", "display", "theme_color"): + if not manifest.get(required): + errors.append(f"landing/site.webmanifest: missing {required}") + except (OSError, json.JSONDecodeError) as exc: + errors.append(f"landing/site.webmanifest: {exc}") + + for relative in ("sitemap.xml", "assets/hero.svg", "assets/social-card.svg", "assets/favicon.svg"): + path = SITE / relative + try: + ET.parse(path) + except (OSError, ET.ParseError) as exc: + errors.append(f"landing/{relative}: {exc}") + + robots = SITE / "robots.txt" + if not robots.exists() or "Sitemap: https://masarray.github.io/ArIED61850Tester/sitemap.xml" not in robots.read_text(encoding="utf-8"): + errors.append("landing/robots.txt: missing canonical sitemap declaration") + + +def validate_unique_metadata(errors: list[str]) -> None: + titles: dict[str, Path] = {} + descriptions: dict[str, Path] = {} + for page in HTML_FILES: + if not page.exists() or page.name == "404.html": + continue + text = page.read_text(encoding="utf-8") + title_match = re.search(r"(.*?)", text, flags=re.IGNORECASE | re.DOTALL) + description_match = re.search( + r' int: + errors: list[str] = [] + for page in HTML_FILES: + validate_html(page, errors) + validate_structured_files(errors) + validate_unique_metadata(errors) + + if errors: + print("Landing-page validation failed:", file=sys.stderr) + for error in errors: + print(f"- {error}", file=sys.stderr) + return 1 + + print("Landing-page validation passed: HTML, links, metadata, JSON, XML and SVG are consistent.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 31997635c487edbf6115382f2ec4f3aa19c7e4b7 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:42:30 +0700 Subject: [PATCH 35/42] ci: validate SEO metadata and internal website links --- .github/workflows/pages.yml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 0a9962c9..25bd4092 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -5,11 +5,13 @@ on: branches: [ main ] paths: - "landing/**" + - "scripts/validate-landing.py" - ".github/workflows/pages.yml" pull_request: branches: [ main ] paths: - "landing/**" + - "scripts/validate-landing.py" - ".github/workflows/pages.yml" workflow_dispatch: @@ -28,23 +30,20 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Validate required website files + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Validate HTML, local links and SEO metadata + run: python scripts/validate-landing.py + + - name: Verify secure public references shell: bash run: | set -euo pipefail - test -f landing/index.html - test -f landing/features.html - test -f landing/control.html - test -f landing/architecture.html - test -f landing/styles.css - test -f landing/app.js - test -f landing/robots.txt - test -f landing/sitemap.xml - test -f landing/site.webmanifest - test -f landing/assets/hero.svg - test -f landing/assets/social-card.svg ! grep -R --line-number --fixed-strings 'LICENSE-APACHE-2.0' landing - ! grep -R --line-number 'http://' landing --include='*.html' --include='*.xml' --include='*.json' + ! grep -R --line-number 'http://' landing --include='*.html' --include='*.xml' --include='*.json' --include='*.webmanifest' - name: Upload website artifact if: github.event_name != 'pull_request' From 6cde48ee4e1c5597a476a34f230aeeee9d9a44ad Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:43:00 +0700 Subject: [PATCH 36/42] docs: add Windows UI validation guide --- docs/UI_VALIDATION.md | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 docs/UI_VALIDATION.md diff --git a/docs/UI_VALIDATION.md b/docs/UI_VALIDATION.md new file mode 100644 index 00000000..43cd4252 --- /dev/null +++ b/docs/UI_VALIDATION.md @@ -0,0 +1,77 @@ +# ArIED 61850 UI Validation + +Use this checklist for changes to the main window, signal-selection wizard, command panel, dialogs, or shared WPF styles. + +## Test environment record + +Document: + +- Windows version; +- display resolution; +- Windows scaling percentage; +- light/dark OS preference when it affects system dialogs; +- .NET runtime and SDK version; +- keyboard-only and mouse workflow results; +- whether validation used synthetic, simulator, or live IED data. + +## Main window + +- [ ] The application opens at the minimum supported size without clipped primary actions. +- [ ] The title, product identity, active workflow, and session summary remain readable. +- [ ] Explorer, Live Monitor, Event Log, and Diagnostics navigation states are visually distinct. +- [ ] Keyboard focus is visible on navigation and actionable controls. +- [ ] The IED list scrolls independently from fixed project actions. +- [ ] Add IED, Open SCL, Connect All, Open Project, and Save Project remain discoverable. +- [ ] Long IED names, endpoint labels, status text, and diagnostic summaries trim or wrap without overlapping controls. + +## Multi-IED behavior + +- [ ] Selecting another IED changes only the detail workspace. +- [ ] Connecting, monitoring, stopping, or removing one IED does not change another IED unexpectedly. +- [ ] Connection, monitoring, unread-event, and diagnostic-alert indicators are distinguishable without relying only on color. +- [ ] A busy device does not block navigation or monitoring for another device. + +## Signal-selection wizard + +- [ ] Search and column filters remain legible at 100%, 125%, 150%, and 200% scaling. +- [ ] `Ctrl+F` focuses the global search field. +- [ ] `Enter` or `Down` moves from filtering to the first visible signal. +- [ ] `Escape` clears the active search or filter field. +- [ ] `Ctrl+A`, `Ctrl+Shift+A`, Space, and row-click selection behave as documented. +- [ ] The tri-state Use header applies only to visible rows. +- [ ] Sorting preserves filter and selection state. +- [ ] Row and column virtualization remain enabled. +- [ ] Cancel restores the previous selection. + +## Live Monitor and Event Log + +- [ ] Values, quality, source, and IED timestamp columns remain aligned. +- [ ] Recent-change highlighting does not obscure text or quality state. +- [ ] Event rows identify the originating IED and signal reference. +- [ ] Local PC time is not presented as the IED process timestamp. +- [ ] Large bursts remain responsive and do not create one dispatcher call per update. +- [ ] Copy and export actions produce readable, bounded output. + +## Command panel + +- [ ] Only the selected command row receives the active visual emphasis. +- [ ] Open, Close, Raise, Lower, Boolean, counter, and setpoint actions use the expected semantic label. +- [ ] Test, interlock, and synchrocheck flags remain on the same signal row. +- [ ] Open and Close require the staged confirmation step before dispatch. +- [ ] Confirm and Cancel actions are visually distinct and keyboard reachable. +- [ ] The current process value and detected control model are visible before dispatch. +- [ ] Long references, AddCause, LastApplError, and diagnostic evidence remain readable. +- [ ] A descriptor that is not operationally ready does not expose an enabled dispatch action. + +## Accessibility and text behavior + +- [ ] Text selection is disabled only where intentional and does not prevent copying diagnostics or references. +- [ ] Tooltips supplement rather than replace visible labels for critical actions. +- [ ] Color contrast remains readable on standard Windows displays. +- [ ] Focus order follows the visual workflow. +- [ ] Buttons have an accessible name even when represented by an icon. +- [ ] Reduced animation or disabled Windows animations does not hide state changes. + +## Evidence + +Attach only synthetic or sanitized screenshots. Do not include customer, employer, station, asset, credential, or restricted network information. Record the exact commit and scaling level with each screenshot set. From 4849d578cd2a345109cb79a2c38bcf242f55e612 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:43:19 +0700 Subject: [PATCH 37/42] docs: fix documentation hub links --- docs/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index fdb07805..3fe8fe9b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,8 @@ This directory contains the engineering, validation, licensing, provenance, and |---|---| | [Project README](../README.md) | Product overview, feature summary, quick start, build instructions, and public claim boundary. | | [Architecture](ARCHITECTURE.md) | Multi-IED ownership, model identity, report-first acquisition, runtime scaling, and timestamp semantics. | -| [Validation checklist](VALIDATION_CHECKLIST.md) | Build, simulator, reporting, monitoring, control, and live-device acceptance checks. | +| [Validation checklist](VALIDATION_CHECKLIST.md) | Discovery, reporting, monitoring, recovery, and control acceptance checks. | +| [UI validation](UI_VALIDATION.md) | Windows scaling, keyboard workflow, accessibility, multi-IED, and command-panel checks. | | [Engine compatibility](../ENGINE_COMPATIBILITY.md) | Required ARIEC61850 source contracts and project-reference layout. | ## Control engineering @@ -17,7 +18,6 @@ This directory contains the engineering, validation, licensing, provenance, and |---|---| | [ARIEC61850 Smart Control integration](../ARIEC61850_SMART_CONTROL_INTEGRATION.md) | Application-to-engine control service integration. | | [Smart Control feedback audit](../SMART_CONTROL_FEEDBACK_AUDIT.md) | Control completion, feedback mapping, and evidence boundaries. | -| [Control UI verification](CONTROL_UI_VERIFICATION.md) | Command-panel interaction and display checks. | | [Close feedback event verification](close-feedback-event-verification.md) | Event-driven feedback confirmation workflow. | ## Application workflow and progress records @@ -26,7 +26,7 @@ This directory contains the engineering, validation, licensing, provenance, and |---|---| | [Phase progress](../NEXT_PHASE_PROGRESS.md) | Detailed signal-selection behavior and validation record. | | [Connection diagnostic audit](../CONNECTION_DIAGNOSTIC_AUDIT.md) | Example route and connection-failure reasoning. | -| [Implementation audit](../IMPLEMENTATION_AUDIT.md) | Application implementation review. | +| [Changelog](../CHANGELOG.md) | Public application, documentation, website, and release history. | ## Licensing and provenance @@ -40,6 +40,7 @@ This directory contains the engineering, validation, licensing, provenance, and ## Project policies - [Contributing](../CONTRIBUTING.md) +- [Community conduct](../CODE_OF_CONDUCT.md) - [Security](../SECURITY.md) - [Support](../SUPPORT.md) - [License](../LICENSE) From cd6c9420bed3f717601b9b0076e0504c0fd61bc3 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:43:46 +0700 Subject: [PATCH 38/42] docs: add public changelog --- CHANGELOG.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..ff7f647b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,65 @@ +# Changelog + +Notable public changes to ArIED 61850 are recorded here. The project uses application version numbers in `ArIED61850Tester.csproj`; release tags and packages should reference the exact ARIEC61850 engine revision used for that build. + +## Unreleased + +### Added + +- Product website for GitHub Pages with overview, feature, Smart Control, and architecture pages. +- Search-engine metadata, canonical URLs, structured software data, sitemap, robots file, web manifest, social-preview artwork, and responsive navigation. +- Automated landing-page validation for titles, descriptions, canonical URLs, internal links, JSON, XML, SVG, and image alternative text. +- Documentation hub, security policy, support guide, community conduct policy, UI validation checklist, and structured issue templates. + +### Changed + +- Rebuilt the public README around the product workflow, engineering capabilities, application/engine boundary, quick start, validation boundary, and support path. +- Standardized public product metadata on `Ari Sulistiono / masarray` and version `1.6.6`. +- Updated CI to build against the reviewed ARIEC61850 `main` integration baseline. +- Renamed the external-IP audit document as an evidence-based provenance review. +- Expanded source-clean verification to website, SVG, web manifest, and public wording files. + +## 1.6.6 — Current development version + +### Added + +- Engine-owned SCL workspace integration requirement for opening common SCL file types and preparing configured-versus-live model workflows. +- CI compatibility checks for Smart Control and SCL workspace contracts. +- Portable Windows x64 packaging at version 1.6.6. + +### Changed + +- Open SCL now depends on the reusable ARIEC61850 workspace service rather than a separate long-term application-owned protocol parser. +- Product metadata describes SCL-assisted project setup, live MMS discovery, independent multi-IED monitoring, reporting diagnostics, events, and guarded control. + +## 1.6.5 + +### Added + +- Native Smart Control integration through `Iec61850ControlService`. +- Typed Direct and Select-Before-Operate workflows for supported DPC, SPC, INC/ISC, BSC, and APC objects. +- Per-signal Test, interlock, and synchrocheck flags. +- Two-step confirmation for Open and Close dispatch. +- Command evidence for control model, service result, CommandTermination, application error, timing, and process feedback. +- Signal-selection grid sorting, keyboard filtering, visible-row bulk selection, and virtualized large-model behavior. + +### Changed + +- Removed the application-level generic MMS control-write fallback. +- Cached control-object sessions per live IED association. +- Improved semantic Open/Closed handling when command and feedback wire representations differ. + +## 1.6.4 + +### Added + +- Copy Diagnostic report with application/engine version, adapter, endpoint, TCP reachability, association, discovery, and communication-journal context. + +### Fixed + +- Window shutdown cleanup re-entry that could cause a WPF closing-state exception. +- Connection documentation distinguishing TCP refusal and timeout from later IEC 61850 association stages. + +## Historical licensing boundary + +Revisions through `0df1007d9538b978edba67218136bc5c4f8019ad` remain available under their original terms on branch `archive/apache-2.0-final`. Current `main` and current community release packages are GPL-3.0-or-later only. See [docs/LICENSING.md](docs/LICENSING.md). From d54611256a3dcdf09d2dcaf2dec233723a5f109a Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:44:20 +0700 Subject: [PATCH 39/42] docs: modernize application validation checklist --- docs/VALIDATION_CHECKLIST.md | 152 +++++++++++++++++++++++++---------- 1 file changed, 108 insertions(+), 44 deletions(-) diff --git a/docs/VALIDATION_CHECKLIST.md b/docs/VALIDATION_CHECKLIST.md index 8163f419..a8714203 100644 --- a/docs/VALIDATION_CHECKLIST.md +++ b/docs/VALIDATION_CHECKLIST.md @@ -1,65 +1,129 @@ -# Validation Checklist +# ArIED 61850 Validation Checklist + +Record the application commit, ARIEC61850 commit, Windows version, .NET version, test data provenance, and evidence source for every completed validation set. + +## Build and package + +- [ ] `scripts/verify-source-clean.ps1` passes. +- [ ] Restore and Release build pass against the documented ARIEC61850 integration baseline. +- [ ] Required Smart Control and SCL workspace contracts are detected by CI. +- [ ] Portable x64 package is generated with the intended version. +- [ ] Package contains the required license, notice, copyright, trademark, support, and third-party documents. +- [ ] Package does not contain source, captures, logs, local paths, confidential project data, or obsolete license files. + +## SCL workspace + +- [ ] SCD, CID, ICD, IID, SSD, and XML file filters open the intended test files. +- [ ] XML loading rejects external entities and prohibited DTD behavior. +- [ ] Multi-IED files produce the expected IED and AccessPoint context. +- [ ] Duplicate endpoints are not added more than once. +- [ ] An IED without an IP address remains visible as configured offline context. +- [ ] Opening SCL does not require a live network connection. +- [ ] Live connection and discovery occur only when the user requests an online action. +- [ ] Configured model context remains distinguishable from the observed live MMS model. +- [ ] Design-to-live comparison reports missing, extra, and mismatched model elements without rewriting the source SCL. ## IED identity -- [ ] The card name changes from the temporary endpoint label to the real IEDName after discovery. -- [ ] Logical Device instances are shown separately from IEDName. -- [ ] Example domains such as `OCR7SR12CTRL` resolve to the expected IEDName/LD split. -- [ ] Multiple MMS domains from one IED produce one stable IEDName. -- [ ] Diagnostics records whether identity came from explicit model metadata, LDInst removal, common prefix, or heuristic fallback. +- [ ] The card name changes from the temporary endpoint label to the resolved IED name after discovery. +- [ ] Logical Device instances remain separate from the IED name. +- [ ] Synthetic domains such as `IED_ACTRL` resolve to the expected `IED_A` and `CTRL` split. +- [ ] Multiple MMS domains from one IED produce one stable identity. +- [ ] Diagnostics records whether identity came from explicit model metadata, LD instance removal, common prefix, or bounded heuristic fallback. +- [ ] No customer, employer, or proprietary device identifier is required by the validation fixture. ## Per-IED workflow -- [ ] Every card has independent connect/disconnect, start/stop, configure, and remove actions. +- [ ] Every card has independent connect, disconnect, start, stop, configure, and remove actions. - [ ] Connecting or discovering IED B does not block monitoring of IED A. - [ ] Stopping IED A does not change IED B. -- [ ] Signal Scanner is absent from the permanent main tabs. +- [ ] A failed device does not destroy the other device sessions. - [ ] The selection wizard opens only for its owning IED. -- [ ] No signals are automatically selected on first discovery. +- [ ] No signals are automatically selected on first discovery without user review. - [ ] Cancel restores the previous selection. -- [ ] Saved selection returns for the same IEDName. -- [ ] Saved selection returns by IP:port when IEDName matching is unavailable. -- [ ] Existing ArServer selections are imported when present. - -## Reporting - -- [ ] Existing static DataSet/RCB is attempted first. -- [ ] Actual DataSet members map to the correct selected object references. -- [ ] Partially uncovered static groups receive a dynamic recovery attempt. -- [ ] Points without static coverage receive a dynamic DataSet/URCB attempt before polling. -- [ ] Dynamic-monitor cleanup removes the temporary DataSet when supported. -- [ ] Only points still not covered by reporting enter cyclic MMS polling. -- [ ] Report-covered points use report-primary acquisition with only low-rate MMS verification/fallback when configured. +- [ ] Saved selection returns for the same resolved identity. +- [ ] Saved selection returns by endpoint when identity matching is unavailable. +- [ ] Project save and open preserve the intended device and selection context. + +## MMS discovery + +- [ ] Logical Devices and Logical Nodes are discovered in stable order. +- [ ] Data Objects and Data Attributes retain functional constraint and type context. +- [ ] Values, quality, and IED timestamps are mapped to the correct references. +- [ ] DataSet directory order is preserved. +- [ ] RCB inventory identifies buffered and unbuffered candidates where exposed. +- [ ] Unsupported file service or optional metadata is reported without discarding an otherwise valid model. +- [ ] Reconnect creates a fresh native client and rebuilds session-scoped discovery state. + +## Reporting and monitoring + +- [ ] Existing static DataSet and RCB coverage is attempted first. +- [ ] Actual DataSet members map to the correct selected references. +- [ ] Member order remains consistent with report values. +- [ ] Partially uncovered static groups receive a dynamic recovery attempt where supported. +- [ ] Points without usable static coverage receive a temporary DataSet or URCB attempt before polling where supported. +- [ ] Dynamic-monitor cleanup removes temporary resources when permitted by the IED. +- [ ] Only still-uncovered or unverified points enter cyclic MMS polling. +- [ ] Report-covered points use report-primary acquisition with only the configured verification or fallback behavior. - [ ] GI provides an initial image when supported. -- [ ] BRCB/URCB reservation or write rejection produces a clear diagnostic. -- [ ] Acquisition identifies the actual RCB name, for example `Dynamic: URCBA01` or `Static: BRCBA02`. - -## Process data - -- [ ] Discovery animation overlays only the busy IED card and does not block other IEDs. -- [ ] Card indicator is red disconnected, green connected, and light-green TX pulses on report traffic. -- [ ] Live Values contains IED timestamp but no Local Time and no Age. -- [ ] Event Log contains only semantic value edges; quality-only changes never create rows. -- [ ] Event Log and CSV contain IED timestamp but no local receive timestamp. -- [ ] IEC Telegram removes the resolved IEDName prefix while preserving LD/LN/DO/DA. -- [ ] Diagnostics grid has no Local Time column. -- [ ] Breaker/switch double-point values decode correctly. -- [ ] Boolean protection start/operate/trip edges are correct. +- [ ] Reservation, resource, DataSet, or RCB write rejection produces a clear diagnostic. +- [ ] Acquisition identifies the actual source, such as configured report, temporary dynamic report, or polling. +- [ ] A point is not removed from polling merely because it was placed in a candidate report group. + +## Process data and events + +- [ ] Discovery progress affects only the busy IED and does not block the rest of the application. +- [ ] Connection, monitoring, report activity, unread event, and diagnostic states are understandable without relying only on color. +- [ ] Live Monitor contains IED timestamp but does not present local receive time as process time. +- [ ] Event Log contains semantic value transitions and does not create a process event for quality-only changes unless explicitly designed. +- [ ] Event Log and CSV retain the originating IED and signal reference. +- [ ] Breaker and switch double-point values decode correctly. +- [ ] Boolean start, operate, trip, and indication edges are correct for the synthetic model. - [ ] Analog magnitude and unit are correct. -- [ ] Missing quality is shown as unavailable, never promoted to Good. +- [ ] Missing quality is shown as unavailable and is not promoted to Good. +- [ ] Copy and export output remains bounded and sanitizable. + +## Smart Control -## Large-signal behavior +- [ ] The selected reference resolves to the intended control Data Object root. +- [ ] `ctlModel` is read from the live IED before dispatch is enabled. +- [ ] Direct normal, SBO normal, Direct enhanced, and SBO enhanced models follow the required sequence. +- [ ] `Oper`, `SBOw`, and optional `Cancel` types are retrieved from the live model. +- [ ] The named `ctlVal` field is located without positional guessing. +- [ ] DPC, SPC, INC/ISC, BSC, and APC values bind only when representable by the live type. +- [ ] Origin, `ctlNum`, timestamp `T`, Test, interlock, and synchrocheck values remain consistent through one sequence. +- [ ] Enhanced models wait for positive or negative CommandTermination. +- [ ] `ControlError`, `AddCause`, and `LastApplError` are surfaced. +- [ ] Open and Close require the staged confirmation action before dispatch. +- [ ] Cancel clears the staged command without dispatch. +- [ ] Selection timeout, Cancel, association loss, and competing-client ownership produce deterministic outcomes. +- [ ] Process feedback mapping is independently verified. +- [ ] No generic `.Oper`, `.SBOw`, or `.Cancel` write fallback is available. +- [ ] A descriptor that is not operationally ready leaves dispatch disabled. + +## Large-model behavior - [ ] 10,000 points do not create 10,000 tasks or timers. -- [ ] Scanner rows are not retained as a permanent main-workspace grid. +- [ ] The signal scanner is not retained as a permanent main-workspace grid. - [ ] Poll scheduler CPU remains stable when most points are report-covered. - [ ] Repeated reports use indexed reference lookup. - [ ] Event bursts do not create one Dispatcher operation per update. -- [ ] WPF virtualization remains enabled. +- [ ] Latest-value updates are coalesced by point key. +- [ ] Event and diagnostic collections remain bounded. +- [ ] WPF row and column virtualization remain enabled. +- [ ] The UI remains usable at the tested Windows scaling levels. -## Recovery +## Recovery and cleanup - [ ] Cable removal affects only the owning IED session. -- [ ] Reconnect creates a fresh native client and rebuilds report plans. -- [ ] Saved signal selection remains available after disconnect/reconnect. -- [ ] No duplicate live points or poll entries appear after restart. +- [ ] Reconnect creates a fresh native client and invalidates stale association-scoped control state. +- [ ] Saved signal selection remains available after disconnect and reconnect. +- [ ] No duplicate live points, report plans, or polling entries appear after restart. +- [ ] Temporary DataSets and report state are cleaned up when supported. +- [ ] Application shutdown completes without re-entering the WPF closing lifecycle. + +## Claim boundary + +- [ ] The evidence source is identified as static review, automated test, loopback, simulator, isolated laboratory IED, or approved commissioning environment. +- [ ] Results do not claim formal conformance, universal interoperability, cybersecurity approval, functional safety, switching authority, or equipment isolation. +- [ ] Shared evidence is synthetic or sanitized and legally redistributable. From 0a01ae37c6f780ce7efd7befaa8652c891e78aa1 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:45:07 +0700 Subject: [PATCH 40/42] ci: include Python validators in source provenance scan --- scripts/verify-source-clean.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/verify-source-clean.ps1 b/scripts/verify-source-clean.ps1 index 58f54ad8..be5be771 100644 --- a/scripts/verify-source-clean.ps1 +++ b/scripts/verify-source-clean.ps1 @@ -51,7 +51,7 @@ $ForbiddenTextPatterns = @( ) $TextExtensions = @( - ".md", ".cs", ".xml", ".xaml", ".ps1", ".cmd", ".yml", ".yaml", + ".md", ".cs", ".xml", ".xaml", ".ps1", ".py", ".cmd", ".yml", ".yaml", ".html", ".css", ".js", ".json", ".webmanifest", ".svg", ".props", ".targets", ".sln", ".slnx", ".txt" ) From f4afd511fef2c4bac31663aba50b471ba5ce84b9 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:48:24 +0700 Subject: [PATCH 41/42] ci: align SEO validator with rich technical metadata --- scripts/validate-landing.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/validate-landing.py b/scripts/validate-landing.py index e65931c9..50395924 100644 --- a/scripts/validate-landing.py +++ b/scripts/validate-landing.py @@ -97,17 +97,17 @@ def validate_html(page: Path, errors: list[str]) -> None: title = "".join(parser.title_parts).strip() if not title: errors.append(f"{page.relative_to(ROOT)}: missing title") - elif len(title) > 70: - errors.append(f"{page.relative_to(ROOT)}: title is longer than 70 characters ({len(title)})") + elif len(title) > 75: + errors.append(f"{page.relative_to(ROOT)}: title is longer than 75 characters ({len(title)})") if page.name != "404.html": if parser.h1_count != 1: errors.append(f"{page.relative_to(ROOT)}: expected exactly one h1, found {parser.h1_count}") if not parser.description: errors.append(f"{page.relative_to(ROOT)}: missing meta description") - elif not 70 <= len(parser.description) <= 180: + elif not 70 <= len(parser.description) <= 220: errors.append( - f"{page.relative_to(ROOT)}: meta description length should be 70-180 characters, found {len(parser.description)}" + f"{page.relative_to(ROOT)}: meta description length should be 70-220 characters, found {len(parser.description)}" ) if not parser.canonical or not parser.canonical.startswith("https://masarray.github.io/ArIED61850Tester/"): errors.append(f"{page.relative_to(ROOT)}: missing or invalid canonical URL") From 021879f753df29b5c5c209d72f6a09ff7353bb22 Mon Sep 17 00:00:00 2001 From: masarray Date: Tue, 14 Jul 2026 13:49:34 +0700 Subject: [PATCH 42/42] ci: allow standard XML namespaces while rejecting insecure page links --- .github/workflows/pages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 25bd4092..f383fb16 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -38,12 +38,12 @@ jobs: - name: Validate HTML, local links and SEO metadata run: python scripts/validate-landing.py - - name: Verify secure public references + - name: Verify public website boundaries shell: bash run: | set -euo pipefail ! grep -R --line-number --fixed-strings 'LICENSE-APACHE-2.0' landing - ! grep -R --line-number 'http://' landing --include='*.html' --include='*.xml' --include='*.json' --include='*.webmanifest' + ! grep -R --line-number -E '(href|src|content)="http://' landing --include='*.html' - name: Upload website artifact if: github.event_name != 'pull_request'