Skip to content
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
docs(control): record C5 simulator interoperability acceptance
  • Loading branch information
masarray committed Aug 10, 2026
commit f88f3df4b8b874b51205d20de9c3a32dbecc3191
239 changes: 239 additions & 0 deletions docs/CONTROL_INTEROP_ACCEPTANCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
# IEC 61850 Control Interoperability Acceptance Record

## Scope

This record captures the Phase 4D-C5 live simulator interoperability evidence gathered on 2026-08-11 against an isolated IEC 61850 vendor simulator.

It documents observed interoperability of the guarded C++ control path. It is not an IEC 61850 conformance certificate and is not evidence of physical primary-plant or production-relay control.

## Tested profile

- Endpoint: `192.168.1.10:102`
- Simulator model/profile: `BCU7SL`
- Control object: `BCU7SLCTRL/CSWI1.Pos`
- Discovered CDC: `SPC`
- Live `ctlVal` TypeSpecification: `boolean`
- Status object: `BCU7SLCTRL/CSWI1$ST$Pos$stVal`
- `sboTimeout`: 30000 ms
- `operTimeout`: 1000 ms
- Origin used by the harness: `ARSTACK-C5`, station control
- Interlock-check: enabled
- Synchro-check: enabled
- Harness safety gate: exact `--arm IEC61850-LAB-CONTROL`
- Automatic command retry: disabled

The live descriptor discovery also confirmed exact named structures for `Oper`, `SBOw` where applicable, and `Cancel`. The control path followed the live TypeSpecification instead of guessing a positional layout.

## Acceptance matrix

| ctlModel | Model | Tested path | Result | Observed command Writes |
|---|---|---|---|---|
| 1 | Direct with normal security | OFF and ON | PASS | exactly one `Oper` per deliberate action |
| 2 | SBO with normal security | Select/Operate OFF, Select/Operate ON, Select/Cancel | PASS | exactly one `Oper` per operate action; exactly one `Cancel` for cancel |
| 3 | Direct with enhanced security | OFF and ON | PASS | exactly one `Oper` per deliberate action |
| 4 | SBO with enhanced security | SBOw/Operate OFF and ON | PASS | exactly `SBOw`, then `Oper` per successful action |

Overall tested-profile state: **SIMULATOR_INTEROP_PASSED**.

## Direct normal — ctlModel 1

Raw discovery reported `numeric=1`, interpreted as `direct-normal`.

### OFF

- status before: `0x0680`
- status after: `0x0640`
- completion: `accepted`
- accepted: `true`
- termination: `false`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

### ON

- status before: `0x0640`
- status after: `0x0680`
- completion: `accepted`
- accepted: `true`
- termination: `false`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

This matches the normal-security completion boundary: successful MMS Oper service acceptance completes the command; CommandTermination is not required.

Local evidence filenames produced by the harness:

- `bcu7sl-direct-normal-off.json`
- `bcu7sl-direct-normal-on.json`

## SBO normal — ctlModel 2

Raw discovery reported `numeric=2`, interpreted as `sbo-normal`.

The model required Select and did not require CommandTermination.

### Select / Operate OFF

- completion: `accepted`
- accepted: `true`
- termination: `false`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

### Select / Operate ON

- completion: `accepted`
- accepted: `true`
- termination: `false`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

For this simulator, status could converge shortly after the normal-security MMS completion boundary. A subsequent deliberate command observed the expected new state. The harness therefore does not redefine normal-security completion as a status-change wait.

### Select / Cancel

- completion: `accepted`
- accepted: `true`
- termination: `false`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Cancel`
- no `Oper` Write followed

The SBO normal Select service is a Read of `SBO`, so the read is intentionally not counted in `mmsControlWriteCount`.

Local evidence filenames produced by the harness:

- `bcu7sl-sbo-normal-off.json`
- `bcu7sl-sbo-normal-on.json`
- `bcu7sl-sbo-normal-cancel.json`

## Direct enhanced — ctlModel 3

Raw discovery reported `numeric=3`, interpreted as `direct-enhanced`.

The descriptor reported `requiresSelect=false`, `enhanced=true`, and `commandTermination=true`.

### OFF

- status before: `0x0680`
- status after: `0x0640`
- completion: `positive-termination`
- accepted: `true`
- termination: `true`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

### ON

- status before: `0x0640`
- status after: `0x0680`
- completion: `positive-termination`
- accepted: `true`
- termination: `true`
- command Writes: 1
- Write: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

Both directions completed only after a positive correlated CommandTermination. MMS Write acceptance alone was not treated as enhanced-security completion.

Local evidence filenames produced by the harness:

- `bcu7sl-direct-enhanced-off.json`
- `bcu7sl-direct-enhanced-on.json`

## SBO enhanced — ctlModel 4

Raw discovery reported `numeric=4`, interpreted as `sbo-enhanced`.

The descriptor reported `requiresSelect=true`, `enhanced=true`, and `commandTermination=true`.

Live TypeSpecification discovery reported the named structures:

```text
Oper=structure(ctlVal:boolean,origin:structure(orCat:integer,orIdent:octet-string),ctlNum:unsigned,T:utc-time,Test:boolean,Check:bit-string)
SBOw=structure(ctlVal:boolean,origin:structure(orCat:integer,orIdent:octet-string),ctlNum:unsigned,T:utc-time,Test:boolean,Check:bit-string)
Cancel=structure(ctlVal:boolean,origin:structure(orCat:integer,orIdent:octet-string),ctlNum:unsigned,T:utc-time,Test:boolean)
```

### OFF

- status before: `0x0680`
- status after: `0x0640`
- completion: `positive-termination`
- accepted: `true`
- termination: `true`
- command Writes: 2
- Write 1: `BCU7SLCTRL/CSWI1$CO$Pos$SBOw`
- Write 2: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

### ON after OFF

- status before: `0x0640`
- status after: `0x0680`
- completion: `positive-termination`
- accepted: `true`
- termination: `true`
- command Writes: 2
- Write 1: `BCU7SLCTRL/CSWI1$CO$Pos$SBOw`
- Write 2: `BCU7SLCTRL/CSWI1$CO$Pos$Oper`

### Safe rejection / no-retry evidence

An earlier SBOw attempt was rejected by the simulator before Oper. The harness recorded:

- completion: `rejected`
- accepted: `false`
- command Writes: 1
- only Write: `BCU7SLCTRL/CSWI1$CO$Pos$SBOw`
- no `Oper` Write followed
- no automatic retry followed

The exact application-side reason was not established by retained LastApplError/PCAP evidence, so this record does not assign a specific rejection cause.

Local evidence filenames produced by the harness:

- `bcu7sl-sbo-enhanced-off.json`
- `bcu7sl-sbo-enhanced-on-after-off.json`
- `bcu7sl-sbo-enhanced-on.json` (rejected SBOw case before the successful opposite-direction sequence)

## Type-safety evidence

Before the successful SPC tests, an intentionally incorrect `--value-kind dpc` attempt was rejected locally because the live `ctlVal` TypeSpecification was Boolean:

```text
Control value does not match live ctlVal TypeSpecification at ctlVal.
```

No valid control sequence was sent for the mismatched value type. This confirms the live TypeSpecification gate prevents the client from guessing a DPC encoding for an SPC/Boolean command.

## No-retry evidence

Across the accepted cases, the harness reported exact command Write counts matching the expected control model:

- Direct normal: 1 `Oper`
- SBO normal Operate: 1 `Oper` after Select Read
- SBO normal Cancel: 1 `Cancel` after Select Read
- Direct enhanced: 1 `Oper`
- SBO enhanced: 1 `SBOw` + 1 `Oper`

The rejected SBO enhanced selection stopped after the single rejected `SBOw`. No automatic second selection or Oper was generated.

## Claim boundary

This evidence is sufficient to label this specific tested simulator profile:

`SIMULATOR_INTEROP_PASSED`

It does **not** establish:

- IEC 61850 conformance certification;
- interoperability with every vendor implementation;
- physical IED / relay acceptance;
- energized primary-plant control suitability;
- negative LastApplError/AddCause coverage for every rejection mode;
- association-loss coverage for every control phase.

Those remain separate acceptance gates.

## Retention note

The JSON filenames above were generated on the operator workstation. For audit-grade retention, pair each JSON with its matching PCAP/PCAPNG and simulator/event evidence according to `docs/CONTROL_INTEROP_RUNBOOK.md`. The JSON `mmsControlWriteCount` / `mmsControlWrites` values must agree with the packet capture before upgrading any physical-IED claim.