From f7d1f65163eca3731c33056bcbe6aa8cbff5572b Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sat, 26 Sep 2026 14:07:14 +0700 Subject: [PATCH] test(maintenance): validate combined PR 413-415 candidate Signed-off-by: ARI SULISTIONO --- .github/workflows/rcb-export-guard.yml | 22 +++++++++++++++++-- .../smart-discovery-capture-build.yml | 16 +++++++++++--- .../smart-discovery-golden-budget-lock.yml | 16 +++++++++++--- .../smart-discovery-golden-provenance.yml | 16 +++++++++++--- .../smart-discovery-repeat-run-stability.yml | 16 +++++++++++--- CONTRIBUTING.md | 2 ++ ...iResponsiveIec61850MonitorRuntimeFacade.cs | 10 ++++----- docs/README.md | 6 ++--- 8 files changed, 82 insertions(+), 22 deletions(-) diff --git a/.github/workflows/rcb-export-guard.yml b/.github/workflows/rcb-export-guard.yml index bbbf233b3..6adca0000 100644 --- a/.github/workflows/rcb-export-guard.yml +++ b/.github/workflows/rcb-export-guard.yml @@ -12,6 +12,7 @@ on: - "Services/RcbAvailabilityProbeService.cs" - "SaveSclWindow.xaml.cs" - "scripts/verify-rcb-export.ps1" + - "engines/ARIEC61850.lock.json" - ".github/workflows/rcb-export-guard.yml" pull_request: branches: [ main ] @@ -24,6 +25,7 @@ on: - "Services/RcbAvailabilityProbeService.cs" - "SaveSclWindow.xaml.cs" - "scripts/verify-rcb-export.ps1" + - "engines/ARIEC61850.lock.json" - ".github/workflows/rcb-export-guard.yml" workflow_dispatch: @@ -38,9 +40,25 @@ jobs: - name: Checkout ARSAS uses: actions/checkout@v7 - - name: Checkout ARIEC61850 engine + - name: Checkout pinned ARIEC61850 engine shell: powershell - run: git clone --quiet --depth 1 --branch main https://github.com/masarray/ARIEC61850.git ARIEC61850 + run: | + $lock = Get-Content .\engines\ARIEC61850.lock.json -Raw | ConvertFrom-Json + if ($lock.repository -ne 'masarray/ARIEC61850' -or + ([string]$lock.commit) -notmatch '^[0-9a-f]{40}$') { + throw 'Invalid ARIEC61850 integration lock.' + } + git clone --quiet --filter=blob:none --no-checkout "https://github.com/$($lock.repository).git" ARIEC61850 + if ($LASTEXITCODE -ne 0) { throw 'Engine clone failed.' } + git -C .\ARIEC61850 fetch --quiet --depth 1 origin $lock.commit + if ($LASTEXITCODE -ne 0) { throw 'Pinned engine fetch failed.' } + git -C .\ARIEC61850 checkout --quiet --detach $lock.commit + if ($LASTEXITCODE -ne 0) { throw 'Pinned engine checkout failed.' } + $actual = (git -C .\ARIEC61850 rev-parse HEAD).Trim().ToLowerInvariant() + if ($LASTEXITCODE -ne 0 -or $actual -ne ([string]$lock.commit).ToLowerInvariant()) { + throw "Pinned engine mismatch. Expected $($lock.commit), checked out $actual." + } + Write-Host "RCB export guard uses pinned ARIEC61850 $actual" - name: Verify RCB availability and export invariants id: guard diff --git a/.github/workflows/smart-discovery-capture-build.yml b/.github/workflows/smart-discovery-capture-build.yml index d4294532b..7c1b4a685 100644 --- a/.github/workflows/smart-discovery-capture-build.yml +++ b/.github/workflows/smart-discovery-capture-build.yml @@ -39,11 +39,21 @@ jobs: name: Build smart-discovery portable field capture runs-on: windows-latest steps: - - name: Checkout ARSAS test branch + - name: Checkout exact ARSAS candidate + uses: actions/checkout@v7 + with: + path: ArIED61850Tester + fetch-depth: 1 + persist-credentials: false + + - name: Verify exact candidate revision shell: powershell run: | - $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 + $actual = (git -C .\ArIED61850Tester rev-parse HEAD).Trim().ToLowerInvariant() + $expected = $env:GITHUB_SHA.Trim().ToLowerInvariant() + if ($actual -ne $expected) { + throw "ARSAS source revision mismatch. Expected $expected, checked out $actual." + } - name: Resolve and validate engine pin shell: powershell diff --git a/.github/workflows/smart-discovery-golden-budget-lock.yml b/.github/workflows/smart-discovery-golden-budget-lock.yml index d6d29f123..15a1aa4cb 100644 --- a/.github/workflows/smart-discovery-golden-budget-lock.yml +++ b/.github/workflows/smart-discovery-golden-budget-lock.yml @@ -39,11 +39,21 @@ jobs: name: Verify P0-5e evidence-derived hard budget runs-on: windows-latest steps: - - name: Checkout ARSAS branch + - name: Checkout exact ARSAS candidate + uses: actions/checkout@v7 + with: + path: ArIED61850Tester + fetch-depth: 1 + persist-credentials: false + + - name: Verify exact candidate revision shell: powershell run: | - $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 + $actual = (git -C .\ArIED61850Tester rev-parse HEAD).Trim().ToLowerInvariant() + $expected = $env:GITHUB_SHA.Trim().ToLowerInvariant() + if ($actual -ne $expected) { + throw "ARSAS source revision mismatch. Expected $expected, checked out $actual." + } - name: Validate P0-5e production target remains evidence-gated shell: powershell diff --git a/.github/workflows/smart-discovery-golden-provenance.yml b/.github/workflows/smart-discovery-golden-provenance.yml index 333ad7ac0..01dd2bc0c 100644 --- a/.github/workflows/smart-discovery-golden-provenance.yml +++ b/.github/workflows/smart-discovery-golden-provenance.yml @@ -39,11 +39,21 @@ jobs: name: Verify P0-5e capture build and target provenance runs-on: windows-latest steps: - - name: Checkout ARSAS branch + - name: Checkout exact ARSAS candidate + uses: actions/checkout@v7 + with: + path: ArIED61850Tester + fetch-depth: 1 + persist-credentials: false + + - name: Verify exact candidate revision shell: powershell run: | - $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 + $actual = (git -C .\ArIED61850Tester rev-parse HEAD).Trim().ToLowerInvariant() + $expected = $env:GITHUB_SHA.Trim().ToLowerInvariant() + if ($actual -ne $expected) { + throw "ARSAS source revision mismatch. Expected $expected, checked out $actual." + } - name: Execute P0-5e provenance fixtures shell: powershell diff --git a/.github/workflows/smart-discovery-repeat-run-stability.yml b/.github/workflows/smart-discovery-repeat-run-stability.yml index 7d522c487..48ad5a0ce 100644 --- a/.github/workflows/smart-discovery-repeat-run-stability.yml +++ b/.github/workflows/smart-discovery-repeat-run-stability.yml @@ -39,11 +39,21 @@ jobs: name: Verify P0-5f repeat-run stability contract runs-on: windows-latest steps: - - name: Checkout ARSAS branch + - name: Checkout exact ARSAS candidate + uses: actions/checkout@v7 + with: + path: ArIED61850Tester + fetch-depth: 1 + persist-credentials: false + + - name: Verify exact candidate revision shell: powershell run: | - $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 + $actual = (git -C .\ArIED61850Tester rev-parse HEAD).Trim().ToLowerInvariant() + $expected = $env:GITHUB_SHA.Trim().ToLowerInvariant() + if ($actual -ne $expected) { + throw "ARSAS source revision mismatch. Expected $expected, checked out $actual." + } - name: Validate P0-5f sources shell: powershell diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 840bcc5cb..82cb6d60e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,6 +14,8 @@ Focused engineering contributions are welcome when they improve a reproducible I Open an issue before beginning a large architectural change so the ARSAS/ARIEC61850 boundary, maturity label, safety impact, and validation plan can be agreed first. +For maintenance or refactoring, follow the existing [production engineering contract](AGENTS.md): use one clear subsystem owner per PR, record the base commit and behavior that must remain unchanged, and report the exact validation performed. Avoid mixing unrelated release, protocol, and UI changes. + ## Development setup Use a sibling checkout unless an explicit engine path is supplied: diff --git a/Services/UiResponsiveIec61850MonitorRuntimeFacade.cs b/Services/UiResponsiveIec61850MonitorRuntimeFacade.cs index 8ca44876b..27dedb04b 100644 --- a/Services/UiResponsiveIec61850MonitorRuntimeFacade.cs +++ b/Services/UiResponsiveIec61850MonitorRuntimeFacade.cs @@ -78,7 +78,7 @@ public Task EnrichSelectedStaticDataSetUnitsAsync( Iec61850MonitorDevice device, CancellationToken cancellationToken) => RunDeviceOperationAsync( - device?.DeviceId, + device.DeviceId, cancellationToken, token => _inner.EnrichSelectedStaticDataSetUnitsAsync(device, token)); @@ -86,7 +86,7 @@ public Task EnrichCanonicalForSclSaveAsync( Iec61850MonitorDevice device, CancellationToken cancellationToken) => RunDeviceOperationAsync( - device?.DeviceId, + device.DeviceId, cancellationToken, token => _inner.EnrichCanonicalForSclSaveAsync(device, token)); @@ -95,7 +95,7 @@ public Task> ConnectAndDiscoverAsync( CancellationToken cancellationToken, IProgress? progress = null) => RunDeviceOperationAsync( - device?.DeviceId, + device.DeviceId, cancellationToken, token => _inner.ConnectAndDiscoverAsync(device, token, progress)); @@ -104,7 +104,7 @@ public Task ConnectUsingCachedModelAsync( CancellationToken cancellationToken, IProgress? progress = null) => RunDeviceOperationAsync( - device?.DeviceId, + device.DeviceId, cancellationToken, token => _inner.ConnectUsingCachedModelAsync(device, token, progress)); @@ -114,7 +114,7 @@ public Task> StartMonitoringAsync( int pollingIntervalMs, CancellationToken cancellationToken) => RunDeviceOperationAsync( - device?.DeviceId, + device.DeviceId, cancellationToken, token => _inner.StartMonitoringAsync(device, selectedSignals, pollingIntervalMs, token)); diff --git a/docs/README.md b/docs/README.md index a7f294002..a22782557 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ This directory contains the engineering, validation, licensing, provenance, release, and operating-boundary documents for the ARSAS Windows IEC 61850 engineering workstation. -The current application version on `main` is **ARSAS 1.6.37**. Public binary identity remains tied to the latest actually published stable GitHub Release and its verified package evidence. +The current source version is recorded in [VERSION](../VERSION); the latest published package identity is recorded in [GitHub Releases](https://github.com/masarray/arsas/releases/latest) and its release evidence. Historical milestone documents retain their original version context. ## Start here @@ -25,7 +25,7 @@ The current application version on `main` is **ARSAS 1.6.37**. Public binary ide |---|---| | [IO List FAT Evidence Testing](IO_LIST_FAT_EVIDENCE.md) | Dedicated one-IED FAT workspace, exact `TestPointId` mapping, ordered transition evidence, durable journal, `.xlsx`, native `.pdf`, and `.arsas` output. | | [Phase progress](../NEXT_PHASE_PROGRESS.md) | Historical signal-selection behavior and validation records. | -| [Connection diagnostic audit](../CONNECTION_DIAGNOSTIC_AUDIT.md) | Example route and connection-failure reasoning. | +| [Connection diagnostic audit](audits/CONNECTION_DIAGNOSTIC_AUDIT.md) | Example route and connection-failure reasoning. | | [Changelog](../CHANGELOG.md) | Public application, documentation, website, and release history. | ## Control engineering @@ -33,7 +33,7 @@ The current application version on `main` is **ARSAS 1.6.37**. Public binary ide | 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. | +| [Smart Control feedback audit](audits/SMART_CONTROL_FEEDBACK_AUDIT.md) | Control completion, feedback mapping, and evidence boundaries. | | [Close feedback event verification](close-feedback-event-verification.md) | Event-driven feedback confirmation workflow. | ## Licensing and provenance