Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
23c9be6
Add portable guarded IEC 61850 control model core
masarray Aug 10, 2026
563120c
Implement guarded Direct and SBO control planner
masarray Aug 10, 2026
456ad8b
Harden guarded control pending and expiry semantics
masarray Aug 10, 2026
1d9ad4c
Add guarded control hard-profile oracle
masarray Aug 10, 2026
8ec399d
Add no-exception control hard profile
masarray Aug 10, 2026
0a4b4b5
Gate guarded control semantics in GCC and Clang
masarray Aug 10, 2026
3f57667
Add live-type MMS control structure builder API
masarray Aug 10, 2026
b5bba0e
Implement live-type Oper SBOw and Cancel builder
masarray Aug 10, 2026
8e05c1b
Fix control structure header utility dependency
masarray Aug 10, 2026
ca0fcda
Add MMS control structure golden-wire tests
masarray Aug 10, 2026
67f0764
Add strict control MMS structure validation profile
masarray Aug 10, 2026
e53aa25
Gate control MMS structures on GCC and Clang
masarray Aug 10, 2026
e26c732
Add CommandTermination and LastApplError decoder API
masarray Aug 10, 2026
81d1cf2
Implement correlated CommandTermination decoding
masarray Aug 10, 2026
68f1eb2
Add LastApplError and CommandTermination parity tests
masarray Aug 10, 2026
6458183
Add strict CommandTermination validation profile
masarray Aug 10, 2026
6d8c2bd
Gate CommandTermination parity on GCC and Clang
masarray Aug 10, 2026
c143161
Add non-fatal bounded MMS poll for control completion waits
masarray Aug 10, 2026
8b664a8
Implement non-fatal bounded MMS poll for control waits
masarray Aug 10, 2026
9ce8a93
Add guarded live IEC 61850 control session API
masarray Aug 10, 2026
6cc7bf2
Add production control transport over MMS association runtime
masarray Aug 10, 2026
dd57b97
Implement live ctlModel and TypeSpecification control discovery
masarray Aug 10, 2026
c58635a
Implement guarded Direct SBO and enhanced live control orchestration
masarray Aug 10, 2026
f5923f9
Add deterministic smart-control session parity tests
masarray Aug 10, 2026
cbd1e76
Add strict live control session parity profile
masarray Aug 10, 2026
2f49987
Gate smart-control session parity on GCC and Clang
masarray Aug 10, 2026
1367089
Link MMS PDU dependencies in control session profile
masarray Aug 10, 2026
a65eb96
Fix non-default MMS value fixtures in control session tests
masarray Aug 10, 2026
20dcc18
Link Session codec dependency in control session profile
masarray Aug 10, 2026
ea0a096
Integrate guarded control parity into normal core build
masarray Aug 10, 2026
f2c4e68
Update port status for guarded control parity C1-C4
masarray Aug 10, 2026
9ffc0c3
Add guarded live control interoperability harness
masarray Aug 10, 2026
60c5426
Add standalone C5 control interop build profile
masarray Aug 10, 2026
022659b
Add C5 control interop harness CI
masarray Aug 10, 2026
f5f6302
Document C5 physical control interoperability procedure
masarray Aug 10, 2026
47b5245
Add one-click Windows build for C5 control harness
masarray Aug 10, 2026
2c9abcb
Publish C5 harness binaries with CI evidence
masarray Aug 10, 2026
a9f96ad
Sync migration checklist through Control C5
masarray Aug 10, 2026
2da72e0
Advance port status to Control C5 lab readiness
masarray Aug 10, 2026
d7ea8c5
Advance migration plan through Control C5
masarray Aug 10, 2026
e7aa282
Sync feature matrix through Control C5
masarray Aug 10, 2026
3bd902f
c5: add read-only live control inventory probe
masarray Aug 10, 2026
e59344e
c5: build read-only control inventory companion
masarray Aug 10, 2026
884ee54
c5: surface safe control inventory command after build
masarray Aug 10, 2026
0921d08
c5: validate and publish read-only control inventory probe
masarray Aug 10, 2026
9da0514
C5: add raw read-only ctlModel diagnostic probe
masarray Aug 10, 2026
e6ecf75
C5: build raw ctlModel diagnostic companion
masarray Aug 10, 2026
b9759f2
Harden live Smart Control diagnostics
masarray Aug 10, 2026
f88f3df
docs(control): record C5 simulator interoperability acceptance
masarray Aug 10, 2026
6191e20
docs(control): reconcile parallel simulator acceptance
masarray Aug 10, 2026
9fedd88
Merge current main into Smart Control integration
masarray Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions .github/workflows/control-hard-profile-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Control Hard Profile CI

on:
push:
branches:
- main
pull_request:
paths:
- 'include/ariec61850/control/**'
- 'src/control/**'
- 'embedded/control_guarded_hard_profile_smoke.cpp'
- 'embedded/control_hard_profile/**'
- '.github/workflows/control-hard-profile-ci.yml'

permissions:
contents: read

jobs:
control-hard-profile:
name: Control Hard / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]

steps:
- uses: actions/checkout@v4

- name: Select compiler
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi

- name: Configure control hard profile
run: cmake -S embedded/control_hard_profile -B build-control-hard

- name: Build control hard profile
run: cmake --build build-control-hard --parallel

- name: Run control smoke
run: >-
ctest --test-dir build-control-hard
--output-on-failure
--output-junit control-ctest.xml

- name: Prove exception runtime is absent
shell: bash
run: |
set -euo pipefail
binary=build-control-hard/ariec61850_hard_guarded_control_smoke
if nm -C "$binary" | grep -E '__cxa_throw|__cxa_begin_catch|__cxa_end_catch|__gxx_personality_v0'; then
echo "exception runtime symbol found in $binary" >&2
exit 1
fi
echo 'NO_EXCEPTION_RUNTIME=PASS'

- name: Report footprint
shell: bash
run: |
set -euo pipefail
{
echo "compiler=${{ matrix.compiler }}"
size build-control-hard/ariec61850_hard_guarded_control_smoke
} | tee build-control-hard/control-footprint.txt

- name: Upload control evidence
uses: actions/upload-artifact@v4
with:
name: control-hard-${{ matrix.compiler }}-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: |
build-control-hard/control-ctest.xml
build-control-hard/control-footprint.txt
92 changes: 92 additions & 0 deletions .github/workflows/control-interop-harness-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Control Interop Harness CI

on:
push:
branches:
- "agent/phase-4d-c5-control-interoperability"
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
control-interop:
name: Control Interop Harness / ${{ matrix.compiler }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
compiler: gcc
- os: ubuntu-latest
compiler: clang
- os: windows-latest
compiler: msvc

steps:
- uses: actions/checkout@v4

- name: Select compiler
if: runner.os == 'Linux'
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi

- name: Configure C5 harness
shell: bash
run: cmake -S tools/control_interop_probe -B build-control-interop

- name: Build C5 harness
shell: bash
run: cmake --build build-control-interop --config Release --parallel

- name: Run offline safety self-test
shell: bash
run: ctest --test-dir build-control-interop -C Release --output-on-failure

- name: Stage Linux harness and contract
if: runner.os == 'Linux'
shell: bash
run: |
mkdir -p evidence/control-interop
./build-control-interop/ariec61850_control_interop_probe --self-test \
| tee evidence/control-interop/self-test-${{ matrix.compiler }}.txt
./build-control-interop/ariec61850_control_interop_probe --help \
> evidence/control-interop/help-${{ matrix.compiler }}.txt
./build-control-interop/ariec61850_control_inventory_probe --self-test \
| tee evidence/control-interop/inventory-self-test-${{ matrix.compiler }}.txt
./build-control-interop/ariec61850_control_inventory_probe --help \
> evidence/control-interop/inventory-help-${{ matrix.compiler }}.txt
cp build-control-interop/ariec61850_control_interop_probe \
evidence/control-interop/ariec61850_control_interop_probe-${{ matrix.compiler }}
cp build-control-interop/ariec61850_control_inventory_probe \
evidence/control-interop/ariec61850_control_inventory_probe-${{ matrix.compiler }}

- name: Stage Windows harness and contract
if: runner.os == 'Windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path evidence/control-interop | Out-Null
$exe = 'build-control-interop/Release/ariec61850_control_interop_probe.exe'
$inventory = 'build-control-interop/Release/ariec61850_control_inventory_probe.exe'
& $exe --self-test | Tee-Object -FilePath evidence/control-interop/self-test-msvc.txt
& $exe --help | Out-File -Encoding utf8 evidence/control-interop/help-msvc.txt
& $inventory --self-test | Tee-Object -FilePath evidence/control-interop/inventory-self-test-msvc.txt
& $inventory --help | Out-File -Encoding utf8 evidence/control-interop/inventory-help-msvc.txt
Copy-Item $exe evidence/control-interop/ariec61850_control_interop_probe.exe
Copy-Item $inventory evidence/control-interop/ariec61850_control_inventory_probe.exe

- name: Upload C5 harness evidence and binary
uses: actions/upload-artifact@v4
with:
name: control-interop-harness-${{ matrix.compiler }}
path: evidence/control-interop
if-no-files-found: error
64 changes: 64 additions & 0 deletions .github/workflows/control-mms-profile-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Control MMS Profile CI

on:
push:
branches:
- main
pull_request:
paths:
- 'include/ariec61850/control/**'
- 'src/control/**'
- 'tests/test_control_mms_structure.cpp'
- 'tests/control_mms_profile/**'
- 'include/ariec61850/mms/data_value.hpp'
- 'include/ariec61850/mms/services.hpp'
- 'src/mms/data_value.cpp'
- 'src/mms/data_codec.cpp'
- 'src/mms/utc_time.cpp'
- '.github/workflows/control-mms-profile-ci.yml'

permissions:
contents: read

jobs:
control-mms-profile:
name: Control MMS / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]

steps:
- uses: actions/checkout@v4

- name: Select compiler
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi

- name: Configure control MMS profile
run: cmake -S tests/control_mms_profile -B build-control-mms

- name: Build control MMS profile
run: cmake --build build-control-mms --parallel

- name: Run control MMS golden-wire tests
run: >-
ctest --test-dir build-control-mms
--output-on-failure
--output-junit control-mms-ctest.xml

- name: Upload control MMS evidence
uses: actions/upload-artifact@v4
with:
name: control-mms-${{ matrix.compiler }}-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: build-control-mms/control-mms-ctest.xml
61 changes: 61 additions & 0 deletions .github/workflows/control-session-profile-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Control Session Profile CI

on:
push:
branches:
- main
pull_request:
paths:
- 'include/ariec61850/control/**'
- 'src/control/**'
- 'include/ariec61850/mms/association_runtime.hpp'
- 'src/mms/association_runtime_control_wait.cpp'
- 'tests/test_control_session.cpp'
- 'tests/control_session_profile/**'
- '.github/workflows/control-session-profile-ci.yml'

permissions:
contents: read

jobs:
control-session-profile:
name: Control Session / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]

steps:
- uses: actions/checkout@v4

- name: Select compiler
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi

- name: Configure control session profile
run: cmake -S tests/control_session_profile -B build-control-session

- name: Build control session profile
run: cmake --build build-control-session --parallel

- name: Run smart-control parity tests
run: >-
ctest --test-dir build-control-session
--output-on-failure
--output-junit control-session-ctest.xml

- name: Upload control session evidence
uses: actions/upload-artifact@v4
with:
name: control-session-${{ matrix.compiler }}-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: build-control-session/control-session-ctest.xml
62 changes: 62 additions & 0 deletions .github/workflows/control-termination-profile-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Control Termination Profile CI

on:
push:
branches:
- main
pull_request:
paths:
- 'include/ariec61850/control/**'
- 'src/control/**'
- 'tests/test_command_termination.cpp'
- 'tests/control_termination_profile/**'
- 'include/ariec61850/mms/data_value.hpp'
- 'include/ariec61850/mms/reporting.hpp'
- 'src/mms/data_value.cpp'
- '.github/workflows/control-termination-profile-ci.yml'

permissions:
contents: read

jobs:
control-termination-profile:
name: Control Termination / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]

steps:
- uses: actions/checkout@v4

- name: Select compiler
shell: bash
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
else
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
fi

- name: Configure control termination profile
run: cmake -S tests/control_termination_profile -B build-control-termination

- name: Build control termination profile
run: cmake --build build-control-termination --parallel

- name: Run CommandTermination parity tests
run: >-
ctest --test-dir build-control-termination
--output-on-failure
--output-junit control-termination-ctest.xml

- name: Upload termination evidence
uses: actions/upload-artifact@v4
with:
name: control-termination-${{ matrix.compiler }}-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: build-control-termination/control-termination-ctest.xml
Loading
Loading