Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
180 commits
Select commit Hold shift + click to select a range
5089a94
Add built-in TCP transport and live discovery
masarray Aug 6, 2026
fbbeea6
Fix strict-warning loopback comparison
masarray Aug 6, 2026
f9457a8
Add Phase 4C.1 live-model parity
masarray Aug 7, 2026
83a34f0
Add Phase 4C.1 model reference implementation
masarray Aug 7, 2026
11db6b1
Add Phase 4C.1 live model schema
masarray Aug 7, 2026
31ca0cf
Add Phase 4C.1 live model implementation wrapper
masarray Aug 7, 2026
0fd7e5c
Add Phase 4C.1 live model helpers 1
masarray Aug 7, 2026
55a7179
Add Phase 4C.1 live model helpers 2
masarray Aug 7, 2026
c3d5456
Add Phase 4C.1 live model helpers 3
masarray Aug 7, 2026
a454351
Add Phase 4C.1 live model helpers 4
masarray Aug 7, 2026
f58cd2d
Add Phase 4C.1 live model helpers 5
masarray Aug 7, 2026
a9b62b4
Add Phase 4C.1 live model helpers 6
masarray Aug 7, 2026
bf79cc7
Add live model JSON and fingerprint output
masarray Aug 7, 2026
d11820c
Add live-model parity and read-only allowlist regression
masarray Aug 7, 2026
3772d45
Add C# to C++ live-model parity checker
masarray Aug 7, 2026
841784f
Add physical read-only interoperability evidence runner
masarray Aug 7, 2026
e5efebc
Add Windows physical interoperability runner
masarray Aug 7, 2026
74c79b9
Add Linux physical interoperability runner
masarray Aug 7, 2026
add78b8
Document Phase 4C.1 parity and physical acceptance
masarray Aug 7, 2026
3362217
Update discovery profile for Phase 4C.1
masarray Aug 7, 2026
34f61b4
Update port status for Phase 4C.1
masarray Aug 7, 2026
421ddac
Record Phase 4C.1 migration status
masarray Aug 7, 2026
08071f2
Document Phase 4C.1 usage
masarray Aug 7, 2026
cea2b6d
Update Phase 4C.1 validation ledger
masarray Aug 7, 2026
f5206ef
Clarify Phase 4C.1 provenance
masarray Aug 7, 2026
713cdc0
Extend lab report for Phase 4C.1
masarray Aug 7, 2026
6b4e05f
Update physical read-only interoperability checklist
masarray Aug 7, 2026
587fee9
Update Phase 4C.1 notice
masarray Aug 7, 2026
caedc97
Update third-party notice for Phase 4C.1
masarray Aug 7, 2026
2c5c5cd
Ignore generated Phase 4C.1 evidence
masarray Aug 7, 2026
f17d081
Update migration plan after Phase 4C.1
masarray Aug 7, 2026
a92ac4d
Update association profile for Phase 4C.1
masarray Aug 7, 2026
008fd2e
Clarify reporting boundary in Phase 4C.1
masarray Aug 7, 2026
776e9e7
Finalize discovery profile for Phase 4C.1
masarray Aug 7, 2026
772e385
Fix Windows min/max macro collision in TCP transport
masarray Aug 7, 2026
6377723
Add IEDScout CPA responding-selector compatibility patch
masarray Aug 7, 2026
e190a3e
Extend IEDScout CPA compatibility patch with regression test
masarray Aug 7, 2026
5b3a6ab
Accept bounded responding selector in Presentation CPA
masarray Aug 7, 2026
7b9389c
Add vendor CPA responding-selector regression
masarray Aug 7, 2026
9b32eee
Port C#-style IP-only IED identity resolution into live CLI
masarray Aug 7, 2026
e56eb18
Verify IP-only live model identity inference
masarray Aug 7, 2026
aacbe7a
Fix vendor CPA regression session user-data length
masarray Aug 7, 2026
5a2bc58
Correct IEDScout CPA patch regression lengths
masarray Aug 7, 2026
d74127f
Accept standard optional X.226 CPA fields
masarray Aug 7, 2026
4739385
Port tolerant C# association acceptance fallback
masarray Aug 7, 2026
32cc8ab
Port C# live IED identity resolver into core model
masarray Aug 7, 2026
55fe438
Port ARIEC61850 identity resolver regression cases
masarray Aug 7, 2026
4868f04
Preserve DataSet and RCB inventory without deep reads
masarray Aug 7, 2026
20c6c95
Align model coverage and identity JSON with C# builder
masarray Aug 7, 2026
88eb5df
Port logical-node root type probe planning
masarray Aug 7, 2026
9a10025
Expect logical-node root type probes
masarray Aug 7, 2026
c146032
Port C# heuristic SCL basic type mapping
masarray Aug 7, 2026
c84eb86
Use C# SCL type hints when exact MMS type is absent
masarray Aug 7, 2026
f100e9d
Port C# CDC inference registry and patterns
masarray Aug 7, 2026
fd9e341
Complete standalone C# CDC inference port
masarray Aug 7, 2026
1aaa58f
Port live control-block model schema from C#
masarray Aug 7, 2026
608fcdd
Port C# GO SV SG LG control-block inventory
masarray Aug 7, 2026
2203884
Add C# control-block coverage warnings and summary
masarray Aug 7, 2026
895bc3a
Expose live control-block inventory in model JSON
masarray Aug 7, 2026
b71e787
Port C# live control-block inventory regression tests
masarray Aug 7, 2026
b448cf0
Model dynamic RCB DataSet binding state explicitly
masarray Aug 7, 2026
5671d9e
Classify RCB DataSet binding without penalizing dynamic slots
masarray Aug 7, 2026
30f32b8
Track RCB binding coverage separately from structure
masarray Aug 7, 2026
a9f3f37
Expose dynamic RCB binding evidence in model JSON
masarray Aug 7, 2026
ad9b377
Show RCB binding counts in human model summary
masarray Aug 7, 2026
abeb103
Regress dynamic RCB bound and unbound live states
masarray Aug 7, 2026
4675dbf
Port C# Smart RCB selection planner API
masarray Aug 7, 2026
43d09b0
Port C# Smart RCB selector implementation
masarray Aug 7, 2026
ce19f6c
Add Smart RCB selector parity regressions
masarray Aug 7, 2026
44ac7f3
Build Smart RCB selector and parity tests
masarray Aug 7, 2026
492b18b
Fix GCC dangling-reference diagnostic in RCB tests
masarray Aug 7, 2026
6f49266
Wire read-only Smart RCB planner into live discovery CLI
masarray Aug 7, 2026
302a919
Port conservative C# RCB availability evaluator
masarray Aug 7, 2026
7aa1330
Test conservative C# RCB availability parity
masarray Aug 7, 2026
df787df
Expose conservative read-only RCB availability evidence
masarray Aug 7, 2026
d8dd951
Add ESP32-oriented embedded core build profile
masarray Aug 7, 2026
17311d5
Add embedded core full-link smoke target
masarray Aug 7, 2026
878d703
Document ESP32 embedded architecture baseline
masarray Aug 7, 2026
5d25d15
Gate MCU embedded profile in CI
masarray Aug 7, 2026
6e6149d
Add allocation-free embedded transport HAL
masarray Aug 7, 2026
625c50f
Add configurable MCU capacity profile
masarray Aug 7, 2026
1d46bba
Compile embedded HAL and ESP32 capacity profile in smoke gate
masarray Aug 7, 2026
ba5a2ad
Fix embedded CI source manifest audit
masarray Aug 7, 2026
ecf3759
Define ESP32-first embedded delivery roadmap
masarray Aug 7, 2026
4895e0c
Add allocation-free wire encode result contract
masarray Aug 7, 2026
3a78695
Expose bounded Sampled Values PDU encoding API
masarray Aug 7, 2026
7bb1775
Add allocation-free IEC 61850 UTC time writer
masarray Aug 7, 2026
d440b63
Use bounded UTC time serialization for embedded path
masarray Aug 7, 2026
88e6648
Implement allocation-free Sampled Values PDU encoder
masarray Aug 7, 2026
ed7a98c
Expose bounded Sampled Values Ethernet encoding API
masarray Aug 7, 2026
6b8e707
Implement allocation-free Sampled Values Ethernet encoder
masarray Aug 7, 2026
1645232
Add Waveshare ESP32-S3 industrial board profile
masarray Aug 7, 2026
5dfddd8
Exercise bounded SV encoding in embedded smoke test
masarray Aug 7, 2026
8be6c8c
Define public alpha and Waveshare ESP32-S3 delivery roadmap
masarray Aug 7, 2026
5ef6f41
Align Waveshare W5500 profile with ESP-IDF MACRAW ownership
masarray Aug 7, 2026
6569b2e
Use ESP-IDF MACRAW architecture for Waveshare W5500
masarray Aug 7, 2026
3cfdf97
Fix embedded source audit parser and missing-file check
masarray Aug 7, 2026
61c023d
Avoid duplicate feature-branch C++ CI runs
masarray Aug 7, 2026
d73858e
Avoid duplicate feature-branch security CI runs
masarray Aug 7, 2026
f2d752c
Avoid duplicate feature-branch embedded CI runs
masarray Aug 7, 2026
8f0a8e4
Add C# type template and variable type projection schema
masarray Aug 8, 2026
8e14365
Port C# live type template projections
masarray Aug 8, 2026
f2300b4
Wire C# type projections into live model build
masarray Aug 8, 2026
5075d29
Expose C# type projections in live model JSON
masarray Aug 8, 2026
2e82742
Regress C# live type template projections
masarray Aug 8, 2026
d55087d
Separate structural and runtime live model fingerprints
masarray Aug 8, 2026
80812e6
Add structural and runtime live model fingerprints
masarray Aug 8, 2026
e28bf90
Wire structural and runtime fingerprint helpers
masarray Aug 8, 2026
5418f5c
Regress structural versus runtime live fingerprints
masarray Aug 8, 2026
dd82bff
Expose structural and runtime live fingerprints in JSON
masarray Aug 8, 2026
7f6694c
Reject reserved VLAN ID during Ethernet decode
masarray Aug 8, 2026
4730134
Regress reserved VLAN GOOSE fuzz crash
masarray Aug 8, 2026
1a15fdb
Add cross-language same-IED model parity tool
masarray Aug 8, 2026
00c5bc9
Gate cross-language live model parity tool
masarray Aug 8, 2026
1b059ac
Document same-IED C# versus C++ parity workflow
masarray Aug 8, 2026
b2018cb
Define ESP32-P4 and ESP32-S3 embedded target roles
masarray Aug 8, 2026
6909902
Make legacy parity script a structural comparator wrapper
masarray Aug 8, 2026
659f783
Use structural fingerprint for live interop acceptance
masarray Aug 8, 2026
f5cde7e
Refresh Public Alpha live discovery documentation
masarray Aug 8, 2026
2f0c9b6
Add conservative Public Alpha feature matrix
masarray Aug 8, 2026
e27fc6a
Fix C# parity type-read workflow
masarray Aug 8, 2026
d27261f
Align live model projection with C# oracle
masarray Aug 8, 2026
9974eab
Compare RCB runtime evidence semantically across C# and C++
masarray Aug 8, 2026
76f18e9
Record live same-IED model and full RCB evidence
masarray Aug 8, 2026
cea9a6a
Document live model parity and runtime evidence semantics
masarray Aug 8, 2026
0675ac8
Extend read-only multi-cycle acceptance evidence
masarray Aug 8, 2026
4f2af7d
Gate live evidence tooling on Linux and Windows
masarray Aug 8, 2026
19439b6
Expose MMS association profile attempt evidence
masarray Aug 8, 2026
57dd43e
Port C# association profile retry with full reconnect
masarray Aug 8, 2026
dcfef81
Regress full-reconnect association profile fallback
masarray Aug 8, 2026
2d8c6f0
Carry association profile evidence in live discovery results
masarray Aug 8, 2026
eaa97e1
Expose association profile in live discovery summary
masarray Aug 8, 2026
f7d4105
Add read-only RCB contention probe parity model
masarray Aug 8, 2026
f19cf0b
Test C# parity RCB contention decisions
masarray Aug 8, 2026
eeef512
Add read-only live RCB contention probe tool
masarray Aug 8, 2026
c03f566
Build read-only RCB contention probe tool
masarray Aug 8, 2026
b2caf3e
Match C# ResvTms contention normalization exactly
masarray Aug 8, 2026
a6c2cb0
Cover C# dash ResvTms contention edge case
masarray Aug 8, 2026
6974487
Fix contention regression test typo
masarray Aug 8, 2026
3f7031a
Add Phase 4C physical acceptance orchestrator
masarray Aug 8, 2026
b9fd9e9
Add Windows Phase 4C physical acceptance wrapper
masarray Aug 8, 2026
a66be10
Validate Phase 4C acceptance orchestrator in CI
masarray Aug 8, 2026
c265263
Record OCR7SR12 physical read-only evidence
masarray Aug 8, 2026
bc1cf90
Add generic read-only control-block reader
masarray Aug 8, 2026
7aabb3b
Add live read-only control-block probe
masarray Aug 8, 2026
466ad7b
Add control-block inventory regression tests
masarray Aug 8, 2026
5306335
Build control-block read probe and regression tests
masarray Aug 8, 2026
de4b57e
Deduplicate control-block attributes by semantic path
masarray Aug 8, 2026
56fbf0b
Fix control-block dedup test identifier typo
masarray Aug 8, 2026
1794c8e
Fix MSVC control-block probe shadow warning
masarray Aug 8, 2026
3de262e
Carry bounded control-block runtime evidence
masarray Aug 8, 2026
d832345
Project deep control-block reads into live model
masarray Aug 8, 2026
5591ab0
Wire bounded control-block values into live discovery
masarray Aug 8, 2026
c02f2fc
Test SGCB runtime evidence projection
masarray Aug 8, 2026
5cb7cd6
Record physical OCR7SR12 SGCB deep-read evidence
masarray Aug 8, 2026
b1770c6
Update feature matrix for SGCB deep reads
masarray Aug 8, 2026
20145fb
Expose machine-readable control-block runtime values
masarray Aug 8, 2026
25fbe76
Project control-block runtime attributes into live model
masarray Aug 8, 2026
36af94d
Serialize control-block runtime evidence
masarray Aug 8, 2026
fc14efc
Test machine-readable control-block runtime evidence
masarray Aug 8, 2026
a330f78
Fingerprint control-block runtime evidence
masarray Aug 8, 2026
d789b2e
Record OCR7SR12 physical read-only acceptance evidence
masarray Aug 8, 2026
ef0e6d7
Advance Phase 4C physical acceptance gates
masarray Aug 8, 2026
48ea0f6
Gate deep control-block reads in interop runner
masarray Aug 8, 2026
758db0b
Gate deep control-block reads in Phase 4C acceptance
masarray Aug 8, 2026
c8c4ce2
Record integrated Phase 4C physical evidence
masarray Aug 8, 2026
4709e81
Add controlled Phase 4C timeout recovery evidence runner
masarray Aug 8, 2026
ed5569f
Smoke controlled timeout recovery evidence runner
masarray Aug 8, 2026
0c9cd5f
Close faulted MMS associations immediately
masarray Aug 8, 2026
c6b4068
Restore byte-exact C# association oracle vector
masarray Aug 8, 2026
ced3ef4
Prove timeout cleanup and reconnect in MMS runtime tests
masarray Aug 8, 2026
0f4daa0
Record OCR7SR12 ten-cycle physical acceptance
masarray Aug 8, 2026
8561b12
Record OCR7SR12 ten-cycle physical evidence
masarray Aug 8, 2026
6fa440a
Accept OCR7SR12 controlled timeout recovery evidence
masarray Aug 8, 2026
a837337
Record OCR7SR12 timeout recovery physical evidence
masarray Aug 8, 2026
fe07a7b
Add live GetNameList pagination evidence probe
masarray Aug 8, 2026
4c755b2
Keep pagination probe minimal and single-pass
masarray Aug 8, 2026
0508f83
Build pagination evidence probe
masarray Aug 8, 2026
3bffcb5
Ignore generated runtime evidence
masarray Aug 10, 2026
eee6c16
Merge main into Phase 4C
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
21 changes: 20 additions & 1 deletion .github/workflows/cpp-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: C++ CI

on:
push:
branches: [main, "agent/**"]
branches: [main]
pull_request:
workflow_dispatch:

Expand Down Expand Up @@ -35,6 +35,16 @@ jobs:
run: cmake --build build --parallel
- name: Test
run: ctest --test-dir build --output-on-failure
- name: Cross-language model parity tool self-test
run: python3 tools/compare_live_model_json.py --self-test
- name: Read-only evidence runner syntax and CLI smoke
run: |
python3 -m py_compile scripts/run-live-readonly-interop.py
python3 scripts/run-live-readonly-interop.py --help > /dev/null
python3 -m py_compile scripts/run-phase4c-physical-acceptance.py
python3 scripts/run-phase4c-physical-acceptance.py --help > /dev/null
python3 -m py_compile scripts/run-phase4c-timeout-recovery.py
python3 scripts/run-phase4c-timeout-recovery.py --help > /dev/null

windows:
name: Windows / MSVC
Expand All @@ -47,3 +57,12 @@ jobs:
run: cmake --build build --config Release --parallel
- name: Test
run: ctest --test-dir build -C Release --output-on-failure
- name: Evidence tooling self-tests
run: |
python tools/compare_live_model_json.py --self-test
python -m py_compile scripts/run-live-readonly-interop.py
python scripts/run-live-readonly-interop.py --help | Out-Null
python -m py_compile scripts/run-phase4c-physical-acceptance.py
python scripts/run-phase4c-physical-acceptance.py --help | Out-Null
python -m py_compile scripts/run-phase4c-timeout-recovery.py
python scripts/run-phase4c-timeout-recovery.py --help | Out-Null
108 changes: 108 additions & 0 deletions .github/workflows/embedded-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: Embedded Profile CI

on:
push:
branches:
- main
pull_request:

permissions:
contents: read

jobs:
embedded-host-sim:
name: Embedded host-sim / ${{ 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: Audit embedded source boundary
shell: bash
run: |
python3 - <<'PY'
from pathlib import Path
import re
import sys

cmake = Path('embedded/CMakeLists.txt').read_text(encoding='utf-8')
match = re.search(r'set\(ARIEC61850_EMBEDDED_SOURCES\s*(.*?)\)', cmake, re.S)
if not match:
raise SystemExit('embedded source list not found')

paths = []
for raw in match.group(1).splitlines():
raw = raw.strip()
if not raw or raw.startswith('#'):
continue
raw = raw.replace('${ARIEC61850_ROOT}/', '')
paths.append(Path(raw))

forbidden = {
'#include <filesystem>': 'filesystem',
'#include <iostream>': 'iostream',
'winsock2.h': 'WinSock',
'windows.h': 'Windows API',
'sys/socket.h': 'POSIX socket API',
'netinet/': 'POSIX network API',
'ariec61850/capture/': 'PCAP/capture layer',
'ariec61850/comtrade/': 'COMTRADE layer',
'ariec61850/evidence/': 'host evidence layer',
'ariec61850/scl/parser': 'SCL parser',
'ariec61850/mms/tcp_transport': 'host TCP transport',
'ariec61850/mms/live_discovery': 'host live discovery',
}

failures = []
throw_count = 0
for path in paths:
if not path.is_file():
failures.append(f'{path}: embedded source does not exist')
continue
text = path.read_text(encoding='utf-8')
throw_count += len(re.findall(r'\bthrow\b', text))
for needle, label in forbidden.items():
if needle in text:
failures.append(f'{path}: forbidden {label} dependency ({needle})')

print(f'embedded sources={len(paths)}')
print(f'legacy throw tokens={throw_count} (migration debt; no-exceptions gate not enabled yet)')
if failures:
print('\n'.join(failures), file=sys.stderr)
raise SystemExit(1)
PY

- name: Configure embedded profile
run: >-
cmake -S embedded -B build-embedded
-DARIEC61850_EMBEDDED_NO_RTTI=ON
-DARIEC61850_EMBEDDED_NO_EXCEPTIONS=OFF
-DARIEC61850_EMBEDDED_WARNINGS_AS_ERRORS=ON

- name: Build embedded profile
run: cmake --build build-embedded --parallel

- name: Test embedded full-link smoke
run: ctest --test-dir build-embedded --output-on-failure

- name: Report host-sim footprint
shell: bash
run: |
if command -v size >/dev/null 2>&1; then
size build-embedded/ariec61850_embedded_link_smoke || true
fi
2 changes: 1 addition & 1 deletion .github/workflows/security-evidence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Security and Evidence

on:
push:
branches: [main, "agent/**"]
branches: [main]
pull_request:
workflow_dispatch:

Expand Down
40 changes: 27 additions & 13 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,18 +1,32 @@
build/
build-*/
cmake-build-*/
CMakeFiles/
CMakeCache.txt
Testing/
.vs/
.vscode/
.idea/
*.user
*.suo
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
*.profraw
crash-*
leak-*
timeout-*
oom-*
slow-unit-*
*.interop.json
*.VC.db
*.VC.opendb
*.obj
*.o
*.a
*.lib
*.dll
*.so
*.dylib
*.exe
*.pdb
*.ilk
*.log
*.tmp
*.swp
__pycache__/
*.pyc
interop-evidence/
evidence/
.artifacts/
*-live-model.json
*-live-runtime.json
*-parity.json
interop-summary.json
84 changes: 26 additions & 58 deletions ASSOCIATION_RUNTIME_PROFILE.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,37 @@
# MMS Association and Report Subscription Runtime Profile
# MMS Association, TCP, and Read-Only Discovery Runtime Profile

## Scope
## Association runtime

Phase 4B adds the stateful runtime that joins the deterministic Phase 3 association codecs
and Phase 4A reporting codecs. The runtime is transport-injected: an application supplies an
`MmsByteTransport` implementation, while the core owns TPKT/COTP framing, Session,
Presentation, ACSE/MMS association, confirmed-service routing, and RCB subscription state.
`MmsAssociationRuntime` owns TPKT/COTP, Session, Presentation, ACSE/MMS Initiate, invoke
routing, InformationReport queuing, deadline/cancellation events, disconnect, and explicit
reconnect. It receives an `MmsByteTransport` and does not create hidden background work.

## Association lifecycle
## Built-in TCP transport

`MmsAssociationRuntime` implements:
Phase 4C adds `TcpMmsByteTransport` for Winsock and POSIX sockets. It is non-blocking, resolves
IPv4/IPv6 endpoints, handles partial sends and receive chunks, and observes absolute deadlines
and `std::stop_token` cancellation. It performs no protocol operation by itself.

1. byte-transport connect with deadline and `std::stop_token` cancellation;
2. COTP Connection Request/Confirm negotiation and TPDU-size capture;
3. ISO Session Connect, Presentation CP, ACSE AARQ, and MMS Initiate exchange;
4. accepted/rejected association validation and negotiated MMS limits;
5. segmented COTP send and bounded reassembly on receive;
6. monotonically allocated bounded invoke IDs;
7. confirmed-response/error routing while interleaved InformationReports are queued;
8. explicit timeout, cancellation, fault, and disconnect events; and
9. best-effort COTP Disconnect Request before closing the injected transport.
## Read-only discovery runtime

A failed or timed-out confirmed exchange faults the association because the transport stream
may no longer have a trustworthy request/response boundary. Reconnect is explicit: close or
fault the old runtime state, refill/recreate the transport as required, and call `connect` again.
`MmsTcpLiveDiscoverySession` combines the TCP transport, association runtime, and
`MmsLiveDiscoveryClient`. The discovery client is restricted to GetNameList,
GetVariableAccessAttributes, GetNamedVariableListAttributes, and Read.

## Report subscription lifecycle
Phase 4C.1 maps the resulting evidence to `live-ied-model-v1`, computes a canonical fingerprint,
and provides repeated reconnect/discovery evidence runners. This read-only workflow never
constructs Write, control, GI, RCB reservation/enable, dynamic DataSet mutation, or file-service
requests.

`MmsReportSubscriptionRuntime` implements a persistent static-DataSet RCB workflow:
## Report subscription runtime

1. re-probe the selected RCB immediately before any write;
2. refuse takeover when `RptEna`, reservation, or availability evidence indicates another
session owns the RCB;
3. optionally reserve an URCB using `Resv=true`;
4. optionally write `DatSet`, `TrgOps`, and `OptFlds`;
5. enable with `RptEna=true`;
6. optionally request GI after enable;
7. receive, decode, map, and monitor InformationReports until stop/cancellation/fault;
8. disable only when this runtime enabled the RCB;
9. release only reservations touched by this runtime; and
10. record `cleanup_required` when the association is lost before cleanup completes.
`MmsReportSubscriptionRuntime` remains a separate explicit stateful surface. It can probe,
reserve/enable supported URCBs, receive reports, stop, and perform ownership-aware cleanup. It
is not invoked by live discovery or the Phase 4C.1 evidence runner.

`retry_cleanup` can be called after a successful reconnect. BRCB `EntryID` resume, purge
policy, buffer-overflow recovery, and dynamic DataSet create/delete remain separate work.
## Acceptance

## Safety and ownership rules

- The core does not silently take over an already enabled or reserved RCB.
- Cleanup writes are limited to state touched by the current runtime instance.
- The runtime does not include a default TCP socket implementation; live network access is
possible only when an application explicitly supplies an `MmsByteTransport`.
- No control service, SBO state machine, file service, dynamic DataSet create/delete, or
automatic BRCB replay is enabled by this phase.

## Validation

The scripted transport regression covers:

- successful COTP/ACSE/MMS association and negotiated limits;
- cancellation followed by a clean reconnect;
- confirmed request/response routing with an interleaved InformationReport;
- confirmed-exchange timeout and fault transition;
- URCB probe, reserve, enable, GI, report receive, disable, and reservation release;
- cleanup-required state after association loss; and
- refusal to take over an enabled RCB.

The repository has 16 CTest entries through Phase 4B. Local GCC, Clang, and Clang
ASan/UBSan runs pass all 16 tests with warnings treated as errors.
Automated tests cover scripted association, routing, report interleaving, cancellation/timeout,
TCP loopback, read-only service allowlisting, and live-model parity behavior. Physical IED
acceptance requires the Phase 4C.1 lab runner, same-target C# parity, reconnect/soak evidence,
and reviewed packet-capture references.
Loading
Loading