Skip to content
Closed
Show file tree
Hide file tree
Changes from 88 commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
373b3d5
feat: add coherent live SV signal state
masarray Aug 10, 2026
1b3d451
test: cover live SV signal generations
masarray Aug 10, 2026
01f16d9
feat: add embedded live SV control interface
masarray Aug 10, 2026
6ae45e3
feat: add bench live SV control task
masarray Aug 10, 2026
9cb345e
build: include live SV control task
masarray Aug 10, 2026
6709dbe
feat: make ESP32-P4 SV values live-updatable while running
masarray Aug 10, 2026
c4c5e29
docs: define live SV injection workflow
masarray Aug 10, 2026
0555d75
docs: record live injection state machine
masarray Aug 10, 2026
f558fd2
docs: add bench live control command reference
masarray Aug 10, 2026
626a097
test: add live SV signal runtime regression target
masarray Aug 10, 2026
c716380
merge: preserve current main build targets with live SV regression
masarray Aug 10, 2026
384db1e
merge: update live SV runtime onto current main
masarray Aug 10, 2026
af32f5d
fix: make live SV snapshots data-race-free with triple buffering
masarray Aug 10, 2026
3606f62
Bind BRCB delivery to owner and defer commit
masarray Aug 11, 2026
7b927ef
Enforce owner-bound two-phase BRCB delivery
masarray Aug 11, 2026
233dc79
Prove owner-bound two-phase BRCB delivery
masarray Aug 11, 2026
8f2a013
Close MMS runtime on every terminal server session path
masarray Aug 11, 2026
22812f7
Prove terminal server session closes established association
masarray Aug 11, 2026
76563ab
Recover BRCB checkpoint from surviving A/B bank
masarray Aug 11, 2026
22eef13
Add one-bank BRCB checkpoint recovery regression
masarray Aug 11, 2026
907f516
Extend BRCB hard profile safety regressions
masarray Aug 11, 2026
b39a688
Isolate static MMS server from legacy core
masarray Aug 11, 2026
48efffd
Ignore POSIX SIGPIPE in static server host process
masarray Aug 11, 2026
f47017c
Wire host SIGPIPE guard into static server
masarray Aug 11, 2026
79d6fb0
Reauthorize owner on BRCB delivery commit
masarray Aug 11, 2026
e5c6303
Harden ESP32-P4 bench serial command input
masarray Aug 11, 2026
fe7e24e
Fix interactive serial line assembly
masarray Aug 11, 2026
dbc5ced
Fix BRCB two-phase commit authorization signature
masarray Aug 11, 2026
c753f66
Update BRCB delivery smoke for owner-bound commit API
masarray Aug 11, 2026
3ea48e4
feat: add browser SMV injector control GUI shell
masarray Aug 11, 2026
2041e0d
feat: style SMV injector control GUI
masarray Aug 11, 2026
424b88e
feat: wire SMV GUI to serial live-control protocol
masarray Aug 11, 2026
44a22ec
feat: add one-click local GUI launcher
masarray Aug 11, 2026
dd72e62
docs: document SMV injector GUI bench workflow
masarray Aug 11, 2026
07cd7fd
ci: add SMV injector GUI smoke checks
masarray Aug 11, 2026
a9e4470
fix: serve SMV GUI from launcher directory
masarray Aug 11, 2026
040829c
fix(gui): make injector workspace responsive
masarray Aug 11, 2026
2835bfd
fix(gui): keep connection controls visible on narrow windows
masarray Aug 11, 2026
263fc4e
feat: converge GUI with SCL-driven SV profile engine
masarray Aug 11, 2026
216af6a
feat: add SCL-driven SV profile inspection tool
masarray Aug 11, 2026
f072855
build(gui): add focused host profile compiler target
masarray Aug 11, 2026
bc09fe2
feat(gui): serve smart SCL profile inspection locally
masarray Aug 11, 2026
5db08d9
feat(gui): launch smart SCL profile backend
masarray Aug 11, 2026
926f9c8
feat(embedded): add immutable runtime SV profile state
masarray Aug 11, 2026
334db43
feat(embedded): implement runtime SV profile commit boundary
masarray Aug 11, 2026
f2baaab
build(embedded): include runtime SV profile state
masarray Aug 11, 2026
5f997b3
feat(embedded): add machine profile control interface
masarray Aug 11, 2026
ab4c1fd
feat(embedded): stage and commit validated SV profiles
masarray Aug 11, 2026
23f3f1a
build(embedded): include profile control transport
masarray Aug 11, 2026
d6681ab
feat(embedded): wake publisher on GUI control transitions
masarray Aug 11, 2026
91689bd
feat(embedded): route GUI profile commands and publisher wakes
masarray Aug 11, 2026
0c766f8
feat(embedded): expose publisher fail-closed stop
masarray Aug 11, 2026
2042614
feat(embedded): arm SCL-driven profiles with rational realtime schedu…
masarray Aug 11, 2026
006e89f
feat(gui): connect SCL compiler to profile deployment workflow
masarray Aug 11, 2026
55030c0
style(gui): add SCL profile compiler and deploy states
masarray Aug 11, 2026
5549459
feat(gui): load smart SCL profile bridge
masarray Aug 11, 2026
18b0908
ci(gui): validate smart SCL profile bridge
masarray Aug 11, 2026
ff66b64
docs(gui): document SCL compile and device deploy workflow
masarray Aug 11, 2026
366aa56
docs: keep embedded roadmap vendor-neutral
masarray Aug 11, 2026
1b37afa
docs: remove legacy vendor-specific embedded roadmap
masarray Aug 11, 2026
94822e7
fix(embedded): fail closed when publisher arm fails
masarray Aug 11, 2026
ff3688a
fix(gui): make C++ SCL engine the only import authority
masarray Aug 11, 2026
61ad066
fix(gui): route SCL import only through smart profile engine
masarray Aug 11, 2026
1377f05
ci(gui): cover smart SCL import bootstrap
masarray Aug 11, 2026
f54ddf8
fix(gui): select native Windows host compiler from ESP-IDF shell
masarray Aug 11, 2026
58a37db
ci(gui): exercise Windows host-tool launcher
masarray Aug 11, 2026
5a58cd8
fix(gui): discover installed Visual Studio generically
masarray Aug 11, 2026
5780daf
fix(gui): self-heal missing host build scaffold
masarray Aug 11, 2026
9bd7451
test(gui): cover missing host scaffold recovery
masarray Aug 11, 2026
bcbd749
fix(gui): self-heal missing tracked runtime assets
masarray Aug 11, 2026
ffc7949
docs: record SMV injector completion boundary and bench evidence
masarray Aug 11, 2026
8ea7ec6
docs: update GUI README with completed SCL-driven injector workflow
masarray Aug 11, 2026
9775184
docs: promote ESP32-P4 injector README to SCL-driven runtime status
masarray Aug 11, 2026
3186756
docs: update SMV architecture after SCL-driven injector acceptance
masarray Aug 11, 2026
ba0d31f
Add native Qt ARStack Studio build scaffold
masarray Aug 11, 2026
f2a10bb
Add Qt SCL profile model interface
masarray Aug 11, 2026
f05116d
Implement direct C++ SCL compilation for Qt
masarray Aug 11, 2026
73795a1
Add Qt application entry point
masarray Aug 11, 2026
25fb843
Add premium Qt Quick SMV injection workspace
masarray Aug 11, 2026
ec547ff
Simplify native Qt premium injection workspace
masarray Aug 11, 2026
36204cf
Align Qt build scaffold with Qt 6 CMake guidance
masarray Aug 11, 2026
bbb4001
Merge SMV live deterministic signal control
masarray Aug 11, 2026
09cf094
Merge SMV injector operator GUI
masarray Aug 11, 2026
056c6a7
Merge SCL-driven SMV injector profile bridge
masarray Aug 11, 2026
98fef69
Share ESP32-P4 SV profile support classification
masarray Aug 11, 2026
32be3e3
Add native Qt serial device controller
masarray Aug 11, 2026
ec3ee6b
Implement native Qt serial SMV control transport
masarray Aug 11, 2026
720d1af
Use shared ESP32 profile gate in Qt SCL model
masarray Aug 11, 2026
dada745
Link native Qt serial transport
masarray Aug 11, 2026
681d8f3
Expose native serial controller to QML
masarray Aug 11, 2026
f581827
Wire latest SMV profile and live controls into Qt UX
masarray Aug 11, 2026
ca6b9e9
Add native Qt Studio build and launch smoke CI
masarray Aug 11, 2026
22ab078
Reuse shared ESP32 profile support gate in inspector
masarray Aug 11, 2026
24d3273
Retain native Qt build logs on CI failures
masarray Aug 11, 2026
ceca8cd
Fix Qt QML syntax and streamline native injector workspace
masarray Aug 11, 2026
fd64c67
Document native Qt SMV Injector scope and workflow
masarray Aug 11, 2026
b2d2337
Allow Qt QML wrapper for SCL profile model
masarray Aug 11, 2026
387308e
Allow Qt QML wrapper for native device controller
masarray Aug 11, 2026
f67bba8
Merge current main into server consolidation
masarray Aug 11, 2026
7635fb7
Restore current-main live signal test in merged CMake
masarray Aug 11, 2026
35fe7ab
Track negotiated peer response limits
masarray Aug 11, 2026
68b0189
Enforce negotiated COTP and MMS response limits
masarray Aug 11, 2026
988eae0
Fail closed on negotiated peer limit overflow
masarray Aug 11, 2026
bd9a581
Expose BRCB peer-limit result
masarray Aug 11, 2026
a228dde
Enforce negotiated limits on BRCB delivery
masarray Aug 11, 2026
5f8ead9
Add negotiated response limit regression
masarray Aug 11, 2026
f4328d4
Run negotiated response limit smoke in embedded profile
masarray Aug 11, 2026
29e4996
Run negotiated limit regression through public server core
masarray Aug 11, 2026
7c17778
Prove negotiated limits under BRCB hard profile
masarray Aug 11, 2026
40bcc3f
Fix static server smoke command and capability scope
masarray Aug 11, 2026
42073d5
Fix negotiated limit smoke span view
masarray Aug 11, 2026
ec47fed
Advertise only implemented MMS services
masarray Aug 11, 2026
b6fe0b4
Remove duplicated ACSE external decode branch
masarray Aug 11, 2026
25831b4
Add confirmed-request Reject PDU encoder
masarray Aug 11, 2026
e060588
Encode bounded MMS confirmed-request Reject PDU
masarray Aug 11, 2026
7726e58
Return MMS RejectPDU for unsupported confirmed requests
masarray Aug 11, 2026
6e7ac5b
Make static server socket waits interruptible
masarray Aug 11, 2026
fe4c8cb
Assert narrow MMS service advertisement
masarray Aug 11, 2026
0c7512a
Update MMS PDU smoke for narrow services and RejectPDU
masarray Aug 11, 2026
eeebca8
Expect RejectPDU for unsupported confirmed request
masarray Aug 11, 2026
a77758a
Polish Qt injector P0 live workflow
masarray Aug 11, 2026
b3940d9
Fix Qt P0 state badge color
masarray Aug 11, 2026
655d9d5
Polish Qt SMV Injector P1 UX
masarray Aug 11, 2026
e7742eb
PTP-P1: hardware-timestamped lab timing companion and analyzer core
masarray Aug 11, 2026
68c933f
PTP-P1.5: complete portable runtime and ESP control bridge
masarray Aug 11, 2026
d041391
Merge remote-tracking branch 'origin/main' into main-qt-premium-phase2
masarray Aug 11, 2026
ab7704a
Add premium Qt workflow and dock shell
masarray Aug 11, 2026
f000772
Port ARIEC61850 server discovery and wire parity (#61)
masarray Aug 11, 2026
97227a8
Add smart live injection and resizable Qt dock shell
masarray Aug 11, 2026
05b64e6
Honor negotiated MMS server limits (#67)
masarray Aug 11, 2026
ec7daef
Fix CT waveform int64 portability
masarray Aug 11, 2026
3adc52c
Return ConfirmedError for missing MMS objects
masarray Aug 11, 2026
acaca94
Regress strict missing-object ConfirmedError
masarray Aug 11, 2026
0ffce10
Keep strict ConfirmedError inside bounded runtime
masarray Aug 11, 2026
472b3fc
Harden Qt live injection safety gates
masarray Aug 11, 2026
46e1165
Merge PR #65: smart live SMV Qt Studio
masarray Aug 11, 2026
8a189fa
Merge current main PTP runtime into server consolidation
masarray Aug 11, 2026
3839587
Merge latest main ARStack Studio updates into server consolidation
masarray Aug 11, 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
114 changes: 114 additions & 0 deletions .github/workflows/smv-injector-gui.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: SMV Injector GUI

on:
push:
paths:
- 'apps/smv_injector_gui/**'
- 'tools/smv_profile_inspect.cpp'
- 'include/ariec61850/sampled_values/publisher_profile.hpp'
- 'include/ariec61850/scl/**'
- 'src/scl/**'
- 'tests/fixtures/scl/**'
- '.github/workflows/smv-injector-gui.yml'
pull_request:
paths:
- 'apps/smv_injector_gui/**'
- 'tools/smv_profile_inspect.cpp'
- 'include/ariec61850/sampled_values/publisher_profile.hpp'
- 'include/ariec61850/scl/**'
- 'src/scl/**'
- 'tests/fixtures/scl/**'
- '.github/workflows/smv-injector-gui.yml'

permissions:
contents: read

jobs:
profile-bridge-smoke:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'

- name: JavaScript syntax
run: |
node --check apps/smv_injector_gui/app.js
node --check apps/smv_injector_gui/scl_bridge_bootstrap.js
node --check apps/smv_injector_gui/profile_bridge.js

- name: Required UI files
shell: bash
run: |
test -s apps/smv_injector_gui/index.html
test -s apps/smv_injector_gui/styles.css
test -s apps/smv_injector_gui/profile_bridge.css
test -s apps/smv_injector_gui/app.js
test -s apps/smv_injector_gui/scl_bridge_bootstrap.js
test -s apps/smv_injector_gui/profile_bridge.js
test -s apps/smv_injector_gui/host_server.py
test -s apps/smv_injector_gui/run.cmd
grep -q 'navigator.serial' apps/smv_injector_gui/app.js
grep -q '/api/scl/inspect' apps/smv_injector_gui/profile_bridge.js

- name: Build smart SCL profile engine
shell: bash
run: |
cmake -S apps/smv_injector_gui/host -B build-smv-gui -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build-smv-gui --target ariec61850_smv_profile_inspect

- name: Profile compiler regression
shell: bash
run: |
fixture=tests/fixtures/scl/sv-4800-structured-4i4v.scd
build-smv-gui/ariec61850_smv_profile_inspect "$fixture" > /tmp/profile-b.json
grep -q '"compatibilityClass":"B"' /tmp/profile-b.json
grep -q '"publisherRateHz":4800' /tmp/profile-b.json
build-smv-gui/ariec61850_smv_profile_inspect "$fixture" --counter-modulus 4800 > /tmp/profile-a.json
grep -q '"compatibilityClass":"A"' /tmp/profile-a.json
grep -q '"deviceSupport":"ready"' /tmp/profile-a.json

- name: Local backend smoke
shell: bash
run: |
python3 apps/smv_injector_gui/host_server.py --profile-tool build-smv-gui/ariec61850_smv_profile_inspect --port 8765 >/tmp/smv-gui-http.log 2>&1 &
server_pid=$!
trap 'kill ${server_pid} 2>/dev/null || true' EXIT
for attempt in $(seq 1 30); do
if curl --fail --silent http://127.0.0.1:8765/ >/tmp/smv-gui-index.html; then break; fi
sleep 0.2
done
grep -q 'ARStack61850' /tmp/smv-gui-index.html
curl --fail --silent -X POST \
-H 'X-File-Name: fixture.scd' \
--data-binary @tests/fixtures/scl/sv-4800-structured-4i4v.scd \
'http://127.0.0.1:8765/api/scl/inspect?counterModulus=4800' >/tmp/api.json
grep -q '"deviceSupport":"ready"' /tmp/api.json

windows-launcher-smoke:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Simulate locally deleted host scaffold
shell: powershell
run: Remove-Item 'apps\smv_injector_gui\host' -Recurse -Force

- name: Verify native-host launcher and self-heal
shell: cmd
run: apps\smv_injector_gui\run.cmd --build-only

- name: Verify Windows profile compiler
shell: powershell
run: |
$tool = Join-Path $PWD 'build-smv-gui\ariec61850_smv_profile_inspect.exe'
if (-not (Test-Path $tool)) { throw "profile compiler missing: $tool" }
& $tool 'tests\fixtures\scl\sv-4800-structured-4i4v.scd' '--counter-modulus' '4800' | Tee-Object -FilePath profile-a.json
if (-not (Select-String -Path profile-a.json -SimpleMatch '"deviceSupport":"ready"')) {
throw 'Windows profile compiler did not produce a deployable Class-A fixture result'
}
18 changes: 15 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -185,10 +185,13 @@ if(ARIEC61850_BUILD_TOOLS)
ariec61850_apply_warnings(ariec61850_file_transfer)
ariec61850_apply_sanitizers(ariec61850_file_transfer)

add_executable(ariec61850_static_ied_server tools/static_ied_server.cpp)
add_executable(
ariec61850_static_ied_server
tools/static_ied_server.cpp
tools/static_ied_server_sigpipe.cpp)
target_link_libraries(
ariec61850_static_ied_server
PRIVATE ARIEC61850::mms_server_core ARIEC61850::core)
PRIVATE ARIEC61850::mms_server_core)
if(WIN32)
target_link_libraries(ariec61850_static_ied_server PRIVATE ws2_32)
endif()
Expand Down Expand Up @@ -217,6 +220,13 @@ if(ARIEC61850_BUILD_TESTS)
add_test(NAME ariec61850_${test_name}_tests COMMAND ariec61850_${test_name}_tests)
endforeach()

add_executable(ariec61850_live_signal_tests tests/test_live_signal.cpp)
target_link_libraries(ariec61850_live_signal_tests PRIVATE ARIEC61850::core)
target_compile_features(ariec61850_live_signal_tests PRIVATE cxx_std_20)
ariec61850_apply_warnings(ariec61850_live_signal_tests)
ariec61850_apply_sanitizers(ariec61850_live_signal_tests)
add_test(NAME ariec61850_live_signal_tests COMMAND ariec61850_live_signal_tests)

add_executable(ariec61850_goose_runtime_tests tests/test_goose_runtime.cpp)
target_link_libraries(ariec61850_goose_runtime_tests PRIVATE ARIEC61850::core)
target_compile_features(ariec61850_goose_runtime_tests PRIVATE cxx_std_20)
Expand Down Expand Up @@ -404,7 +414,9 @@ if(ARIEC61850_BUILD_TESTS)
mms_brcb_objects
mms_brcb_lifecycle
mms_brcb_persistence
mms_brcb_recovery_v2)
mms_brcb_recovery_v2
mms_brcb_checkpoint_fallback
mms_negotiated_limits)
set(brcb_target "ariec61850_${brcb_smoke}_server_core_tests")
add_executable(
${brcb_target}
Expand Down
165 changes: 165 additions & 0 deletions ESP32_EMBEDDED_ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# ARStack61850 Embedded Runtime Roadmap

## Product direction

ARStack61850 is a portable IEC 61850 instrumentation stack with two complementary deployment classes:

1. **Host / engineering** — Windows and Linux tools for SCL engineering, live discovery, evidence, diagnostics, waveform/scenario configuration, capture integration, and interoperability workflows.
2. **Embedded / realtime runtime** — bounded protocol execution on dedicated hardware for deterministic SV/GOOSE publication, capture, timing evidence, and future synchronized operation.

The host is the engineering brain. Dedicated hardware is the realtime packet and timing authority.

## Process-bus hardware principles

The embedded process-bus path requires a real Ethernet Layer-2 interface. Wireless networking is not a substitute for canonical SV/GOOSE transmission.

Reference platforms should provide, as applicable:

- raw Ethernet frame transmission and reception;
- deterministic interrupt/DMA behavior;
- hardware-assisted timestamps where available;
- sufficient RAM for bounded packet/profile/capture buffers;
- a management/control path that does not become the sample-timing source;
- electrical isolation appropriate to the intended laboratory or field role.

Board-specific pin maps, commercial product identities, and marketing specifications do not belong in the public architecture roadmap. Platform adapters keep those details outside the protocol core.

## Non-negotiable architecture rules

### Embedded core

The embedded core may contain wire codecs, immutable compiled profiles, bounded state machines, and realtime signal/runtime primitives, but it must not depend on:

- desktop socket APIs;
- filesystem or interactive CLI workflows;
- full XML/SCL parsing;
- PCAP/evidence report generation;
- desktop UI frameworks;
- host-only discovery and engineering workflows.

Platform ownership is injected through small HAL/adaptor contracts. RTOS, MAC/PHY, DMA, timestamp, USB/management, and board details remain outside the IEC 61850 semantic core.

### SCL/profile boundary

XML and vendor-specific engineering-file dialect handling stay on the host:

```text
SCL / CID / SCD / IID
|
v
smart tolerant host parser
|
v
validated immutable profile
|
v
embedded runtime
```

The host may normalize representation differences, preserve provenance, quarantine irrelevant extensions, and explain conflicts. Deployment remains fail-closed when mandatory wire semantics are unresolved.

### Realtime boundary

The realtime publisher must not parse XML, rebuild BER per sample, allocate on the hot path, or depend on Windows/Linux scheduling.

Preferred execution model:

```text
validated profile + mutable signal state
|
v
prebuilt packet template
|
v
deterministic scheduler
|
v
Ethernet MAC/DMA
|
v
timing evidence
```

Signal values may change coherently while running. Stream identity/layout changes require STOP -> validate -> arm.

### Memory discipline

Steady-state publisher/subscriber paths should use:

- preallocated or caller-owned buffers;
- bounded capacities;
- no per-frame heap allocation;
- no unbounded queues;
- explicit overflow/drop accounting;
- fixed or bounded metadata structures;
- predictable CPU ownership.

Host convenience models may use dynamic containers at configuration time as long as they do not leak allocation requirements into the realtime path.

## Timing truth hierarchy

Timing claims should progress through increasingly authoritative evidence:

1. sample deadline;
2. realtime task wake;
3. MAC transmit/receive hardware timestamp where supported;
4. independent measurement-point timestamp.

Host arrival time is useful diagnostic information but must not be treated as canonical wire timing evidence.

## Synchronization direction

A future synchronized runtime should separate:

- wire protocol parsing;
- passive synchronization monitoring;
- applicable profile validation;
- hardware clock access;
- offset/delay estimation and servo;
- lock / acquiring / holdover states;
- sample-synchronization field policy;
- timestamp evidence.

Presence of synchronization traffic alone is never proof of lock.

## Process-bus capture direction

The receive side should converge on the same realtime/evidence core used by the publisher:

- promiscuous raw receive;
- hardware timestamps where available;
- bounded capture rings;
- sequence/gap/duplicate/out-of-order accounting;
- SCL expected-vs-observed comparison;
- waveform, RMS, frequency, and phasor reconstruction;
- triggers with bounded pre/post capture;
- evidence export handled by the host.

## Hardware evolution

The current single-port MCU-class reference platform is suitable for proving deterministic publication, receive instrumentation, control-plane separation, and timestamp architecture.

A later precision platform should be specified from measured needs rather than assumptions. Potential requirements include:

- multiple independent process-side physical paths;
- separate management path;
- copper and/or optical interfaces as required by deployment;
- timestamping close to the measurement point;
- disciplined oscillator/clock architecture;
- external switching, tapping, or programmable logic only where measured throughput/timing requirements justify it.

## Delivery order

1. deterministic SV publisher foundation;
2. hardware timing evidence;
3. smart SCL-to-profile compiler;
4. immutable device-profile deployment;
5. live engineering-value control through the GUI;
6. broad interoperability matrix and observed-wire resolver;
7. synchronized clock/profile support;
8. hardware-timestamped process-bus analyzer;
9. precision multi-port hardware when evidence requires it.

## Public repository rule

Public project-owned content remains vendor-neutral. Research findings from commercial implementations may inform engineering principles privately, but public architecture should contain standards, generic engineering patterns, reproducible measurements, and project-owned evidence rather than competitor/product references or UI imitation.
Loading
Loading