eda-bridge-runtime 0.1.0a5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. eda_bridge_runtime-0.1.0a5/.agents/plugins/marketplace.json +20 -0
  2. eda_bridge_runtime-0.1.0a5/.github/workflows/publish.yml +81 -0
  3. eda_bridge_runtime-0.1.0a5/.gitignore +15 -0
  4. eda_bridge_runtime-0.1.0a5/AGENTS.md +11 -0
  5. eda_bridge_runtime-0.1.0a5/CONTRIBUTING.md +6 -0
  6. eda_bridge_runtime-0.1.0a5/LICENSE +22 -0
  7. eda_bridge_runtime-0.1.0a5/PKG-INFO +97 -0
  8. eda_bridge_runtime-0.1.0a5/README.md +56 -0
  9. eda_bridge_runtime-0.1.0a5/SECURITY.md +11 -0
  10. eda_bridge_runtime-0.1.0a5/docs/ACCEPTANCE.md +74 -0
  11. eda_bridge_runtime-0.1.0a5/docs/ARCHITECTURE.md +63 -0
  12. eda_bridge_runtime-0.1.0a5/docs/DEPLOYMENT_ROLES.md +63 -0
  13. eda_bridge_runtime-0.1.0a5/docs/MCP_AND_CODEX.md +79 -0
  14. eda_bridge_runtime-0.1.0a5/docs/PI_AGENT_PILOT.md +103 -0
  15. eda_bridge_runtime-0.1.0a5/docs/V0_1_SCOPE.md +34 -0
  16. eda_bridge_runtime-0.1.0a5/docs/schemas/eda-context-v2.schema.json +28 -0
  17. eda_bridge_runtime-0.1.0a5/docs/schemas/request-v1.schema.json +22 -0
  18. eda_bridge_runtime-0.1.0a5/docs/schemas/run-view-v1.schema.json +32 -0
  19. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/.codex-plugin/plugin.json +35 -0
  20. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/.mcp.json +8 -0
  21. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/icon.png +0 -0
  22. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/logo.png +0 -0
  23. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/assets/logo.svg +4 -0
  24. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/hooks/hooks.json +28 -0
  25. eda_bridge_runtime-0.1.0a5/plugins/eda-bridge-runtime/skills/eda-runtime-control/SKILL.md +52 -0
  26. eda_bridge_runtime-0.1.0a5/pyproject.toml +41 -0
  27. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/__init__.py +33 -0
  28. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/_version.py +1 -0
  29. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/adapter.py +36 -0
  30. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/agent_audit.py +152 -0
  31. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/artifacts.py +43 -0
  32. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/cli.py +154 -0
  33. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/connections.py +192 -0
  34. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/context.py +150 -0
  35. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/jobs.py +203 -0
  36. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/lease.py +65 -0
  37. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/ledger.py +264 -0
  38. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/mcp_server.py +389 -0
  39. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/protocol.py +274 -0
  40. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/redaction.py +24 -0
  41. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/runtime.py +143 -0
  42. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/supervisor.py +73 -0
  43. eda_bridge_runtime-0.1.0a5/src/eda_bridge_runtime/transport.py +171 -0
  44. eda_bridge_runtime-0.1.0a5/tests/test_agent_audit.py +91 -0
  45. eda_bridge_runtime-0.1.0a5/tests/test_connections_mcp.py +324 -0
  46. eda_bridge_runtime-0.1.0a5/tests/test_context.py +86 -0
  47. eda_bridge_runtime-0.1.0a5/tests/test_jobs_leases.py +114 -0
  48. eda_bridge_runtime-0.1.0a5/tests/test_ledger.py +78 -0
  49. eda_bridge_runtime-0.1.0a5/tests/test_protocol.py +115 -0
  50. eda_bridge_runtime-0.1.0a5/tests/test_runtime_transport.py +186 -0
  51. eda_bridge_runtime-0.1.0a5/uv.lock +331 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "eda-bridge-runtime",
3
+ "interface": {
4
+ "displayName": "Eda Bridge Runtime"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "eda-bridge-runtime",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./plugins/eda-bridge-runtime"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_USE"
16
+ },
17
+ "category": "Developer Tools"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,81 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
17
+ with:
18
+ python-version: "3.13"
19
+ - name: Verify tag matches package version
20
+ env:
21
+ RELEASE_TAG: ${{ github.ref_name }}
22
+ run: |
23
+ python - <<'PY'
24
+ import pathlib
25
+ import tomllib
26
+ import os
27
+
28
+ version = tomllib.loads(pathlib.Path("pyproject.toml").read_text())["project"]["version"]
29
+ tag_version = os.environ["RELEASE_TAG"].removeprefix("v")
30
+ if version != tag_version:
31
+ raise SystemExit(f"tag {tag_version!r} does not match package {version!r}")
32
+ PY
33
+ - run: python -m pip install --upgrade build twine
34
+ - run: python -m pip install -e ".[dev]"
35
+ - run: pytest
36
+ - run: ruff check .
37
+ - run: python -m build
38
+ - run: python -m twine check dist/*
39
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.0
40
+ with:
41
+ name: python-package-distributions
42
+ path: dist/
43
+ if-no-files-found: error
44
+ retention-days: 7
45
+
46
+ publish:
47
+ needs: build
48
+ runs-on: ubuntu-latest
49
+ environment:
50
+ name: pypi
51
+ url: https://pypi.org/p/eda-bridge-runtime
52
+ permissions:
53
+ id-token: write
54
+ steps:
55
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
56
+ with:
57
+ name: python-package-distributions
58
+ path: dist/
59
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
60
+
61
+ verify:
62
+ needs: publish
63
+ runs-on: ubuntu-latest
64
+ steps:
65
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
66
+ with:
67
+ python-version: "3.13"
68
+ - name: Install the exact published version
69
+ env:
70
+ RELEASE_TAG: ${{ github.ref_name }}
71
+ run: |
72
+ version="${RELEASE_TAG#v}"
73
+ for attempt in 1 2 3 4 5 6; do
74
+ if python -m pip install --no-cache-dir "eda-bridge-runtime==$version"; then
75
+ python -c "import eda_bridge_runtime; assert eda_bridge_runtime.__version__ == '$version'"
76
+ eda-runtime --help
77
+ exit 0
78
+ fi
79
+ sleep 10
80
+ done
81
+ exit 1
@@ -0,0 +1,15 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ *.egg-info/
7
+ dist/
8
+ build/
9
+ .coverage
10
+ htmlcov/
11
+ .codex_tmp/
12
+ *.sqlite3
13
+ *.sqlite3-shm
14
+ *.sqlite3-wal
15
+
@@ -0,0 +1,11 @@
1
+ # Agent working agreement
2
+
3
+ - Treat this as a public repository. Never add customer data, credentials,
4
+ private hostnames, private paths, or proprietary EDA models.
5
+ - Preserve the agent-neutral and vendor-neutral boundary.
6
+ - Every operation initiated by an agent must include a concise `purpose`.
7
+ - Prefer typed capabilities over arbitrary script execution.
8
+ - Keep local and SSH behavior conformant through shared tests.
9
+ - Do not claim success until durable state or a fresh observation proves it.
10
+ - Do not publish or create releases without explicit owner authorization.
11
+
@@ -0,0 +1,6 @@
1
+ # Contributing
2
+
3
+ Keep the core agent-neutral and vendor-neutral. New EDA behavior belongs in an
4
+ adapter package. Protocol changes require schema updates, compatibility tests,
5
+ and a short migration note. Tests must use synthetic or sanitized scratch data.
6
+
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Pengfei Li
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,97 @@
1
+ Metadata-Version: 2.5
2
+ Name: eda-bridge-runtime
3
+ Version: 0.1.0a5
4
+ Summary: Agent-neutral execution runtime for local and remote EDA bridges
5
+ Author: Pengfei Li
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Pengfei Li
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ License-File: LICENSE
29
+ Classifier: Development Status :: 3 - Alpha
30
+ Classifier: License :: OSI Approved :: MIT License
31
+ Classifier: Programming Language :: Python :: 3
32
+ Classifier: Programming Language :: Python :: 3.10
33
+ Classifier: Programming Language :: Python :: 3.11
34
+ Classifier: Programming Language :: Python :: 3.12
35
+ Requires-Python: >=3.10
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
38
+ Requires-Dist: pytest>=8.0; extra == 'dev'
39
+ Requires-Dist: ruff>=0.8; extra == 'dev'
40
+ Description-Content-Type: text/markdown
41
+
42
+ # EDA Bridge Runtime
43
+
44
+ <img src="plugins/eda-bridge-runtime/assets/logo.png" width="180" alt="EDA Bridge Runtime logo">
45
+
46
+ `eda-bridge-runtime` is an agent-neutral execution layer for EDA automation.
47
+ It gives local and SSH-driven bridges the same request envelope, durable job
48
+ semantics, context handoff, timing evidence, and append-only execution ledger.
49
+
50
+ The runtime is intentionally not an EDA bridge and not an AI harness. Vendor
51
+ bridges keep their native API knowledge. Agents state a short purpose; the
52
+ runtime records what was requested, what actually ran, how long each phase
53
+ took, and what result or artifact was produced.
54
+
55
+ ## Design promises
56
+
57
+ - Local and SSH execution use one protocol and one evidence model.
58
+ - Every agent-originated operation carries a concise `purpose`.
59
+ - Actor metadata is collected automatically where possible and records its
60
+ provenance; missing metadata never blocks engineering work.
61
+ - Mutating requests are idempotent and auditable.
62
+ - Disconnection does not imply that a long EDA job failed.
63
+ - Context tokens contain locators and fingerprints, never credentials.
64
+ - EDA-specific behavior lives in adapters, not in the runtime core.
65
+
66
+ ## Current alpha
67
+
68
+ `0.1.0a5` adds agent-host lifecycle auditing without changing tool permissions. Codex hooks record
69
+ session, turn, model, permission mode, tool-call identity, concise purpose, and a content hash before
70
+ an EDA Runtime call, then link the completed call to its actual Run. The audit is append-only,
71
+ hash-chained, and stores neither raw operation payloads nor chat transcripts.
72
+
73
+ `0.1.0a4` adds rich bounded Context snapshots, stable origin routing, direct
74
+ one-submit execution, and automatic origin binding during connection setup.
75
+ Vendor Skills can declare the Runtime MCP directly, so users select one
76
+ task-facing Skill rather than manually composing infrastructure Skills.
77
+
78
+ ```powershell
79
+ python -m pip install "eda-bridge-runtime==0.1.0a5"
80
+ eda-runtime doctor
81
+ ```
82
+
83
+ For repository development, create a virtual environment and install `.[dev]`
84
+ instead. Public releases are built once on a clean GitHub runner, published
85
+ through PyPI Trusted Publishing, and installed back from PyPI before acceptance.
86
+
87
+ See [Architecture](docs/ARCHITECTURE.md) and the
88
+ [protocol schema](docs/schemas/request-v1.schema.json). Host placement is
89
+ defined by the [agent-client, eda-worker, and combined deployment roles](docs/DEPLOYMENT_ROLES.md).
90
+
91
+ The proposed lightweight Pi Agent pilot is described in
92
+ [Pi Agent pilot](docs/PI_AGENT_PILOT.md). It reuses the same Runtime boundary instead of adding a
93
+ second SSH or EDA-control path.
94
+
95
+ The repository also includes a minimal [MCP and Codex plugin](docs/MCP_AND_CODEX.md). It resolves
96
+ named local/SSH connections without asking the agent to assemble transport commands on each call.
97
+ Sanitized real-host evidence is recorded in [acceptance results](docs/ACCEPTANCE.md).
@@ -0,0 +1,56 @@
1
+ # EDA Bridge Runtime
2
+
3
+ <img src="plugins/eda-bridge-runtime/assets/logo.png" width="180" alt="EDA Bridge Runtime logo">
4
+
5
+ `eda-bridge-runtime` is an agent-neutral execution layer for EDA automation.
6
+ It gives local and SSH-driven bridges the same request envelope, durable job
7
+ semantics, context handoff, timing evidence, and append-only execution ledger.
8
+
9
+ The runtime is intentionally not an EDA bridge and not an AI harness. Vendor
10
+ bridges keep their native API knowledge. Agents state a short purpose; the
11
+ runtime records what was requested, what actually ran, how long each phase
12
+ took, and what result or artifact was produced.
13
+
14
+ ## Design promises
15
+
16
+ - Local and SSH execution use one protocol and one evidence model.
17
+ - Every agent-originated operation carries a concise `purpose`.
18
+ - Actor metadata is collected automatically where possible and records its
19
+ provenance; missing metadata never blocks engineering work.
20
+ - Mutating requests are idempotent and auditable.
21
+ - Disconnection does not imply that a long EDA job failed.
22
+ - Context tokens contain locators and fingerprints, never credentials.
23
+ - EDA-specific behavior lives in adapters, not in the runtime core.
24
+
25
+ ## Current alpha
26
+
27
+ `0.1.0a5` adds agent-host lifecycle auditing without changing tool permissions. Codex hooks record
28
+ session, turn, model, permission mode, tool-call identity, concise purpose, and a content hash before
29
+ an EDA Runtime call, then link the completed call to its actual Run. The audit is append-only,
30
+ hash-chained, and stores neither raw operation payloads nor chat transcripts.
31
+
32
+ `0.1.0a4` adds rich bounded Context snapshots, stable origin routing, direct
33
+ one-submit execution, and automatic origin binding during connection setup.
34
+ Vendor Skills can declare the Runtime MCP directly, so users select one
35
+ task-facing Skill rather than manually composing infrastructure Skills.
36
+
37
+ ```powershell
38
+ python -m pip install "eda-bridge-runtime==0.1.0a5"
39
+ eda-runtime doctor
40
+ ```
41
+
42
+ For repository development, create a virtual environment and install `.[dev]`
43
+ instead. Public releases are built once on a clean GitHub runner, published
44
+ through PyPI Trusted Publishing, and installed back from PyPI before acceptance.
45
+
46
+ See [Architecture](docs/ARCHITECTURE.md) and the
47
+ [protocol schema](docs/schemas/request-v1.schema.json). Host placement is
48
+ defined by the [agent-client, eda-worker, and combined deployment roles](docs/DEPLOYMENT_ROLES.md).
49
+
50
+ The proposed lightweight Pi Agent pilot is described in
51
+ [Pi Agent pilot](docs/PI_AGENT_PILOT.md). It reuses the same Runtime boundary instead of adding a
52
+ second SSH or EDA-control path.
53
+
54
+ The repository also includes a minimal [MCP and Codex plugin](docs/MCP_AND_CODEX.md). It resolves
55
+ named local/SSH connections without asking the agent to assemble transport commands on each call.
56
+ Sanitized real-host evidence is recorded in [acceptance results](docs/ACCEPTANCE.md).
@@ -0,0 +1,11 @@
1
+ # Security
2
+
3
+ Do not place EDA license strings, SSH private keys, bridge authentication
4
+ tokens, customer designs, or customer paths in requests or ledger metadata.
5
+ The runtime redacts common secret-shaped keys before persistence, but callers
6
+ remain responsible for using artifact references instead of embedding private
7
+ payloads.
8
+
9
+ Report security issues privately to the repository owner. Do not open a public
10
+ issue containing credentials, proprietary design data, or host inventories.
11
+
@@ -0,0 +1,74 @@
1
+ # Sanitized acceptance evidence
2
+
3
+ Acceptance used a remote Linux EDA host over one persistent SSH transport. No customer project,
4
+ credentials, host address, or task-specific geometry is included here.
5
+
6
+ ## 2026-08-29 Codex lifecycle-audit acceptance
7
+
8
+ - A freshly installed `0.1.0-alpha.5` plugin loaded its bundled
9
+ `hooks/hooks.json` in a new Codex CLI session and called `eda.connections.list` exactly once.
10
+ This non-interactive acceptance used Codex's explicit hook-trust bypass after the installed Hook
11
+ file was inspected; normal interactive use presents the standard one-time trust review.
12
+ - The pre- and post-tool hooks produced two consecutive, hash-linked audit events. They observed
13
+ the Codex model, session, turn, tool-call identity, permission mode, and concise declared purpose.
14
+ - The events stored a SHA-256 fingerprint instead of the raw MCP arguments. No chat transcript,
15
+ customer data, connection details, or credentials were copied into the Agent audit.
16
+ - The diagnostic connection-list call correctly recorded `execution.linked=false` because it does
17
+ not create an EDA Run. Runtime operation tests cover completion linkage to the returned Run view.
18
+ - The two hook records were 609 ms apart, including the MCP call itself. Hook handlers do not
19
+ rewrite the pending call or return an allow decision, so telemetry cannot bypass tool approval.
20
+
21
+ ## 2026-08-28 convergence acceptance
22
+
23
+ - The installed Agent-side MCP exposed six typed tools, including `eda.capabilities`.
24
+ - Capability discovery through the registered SSH connections took 438 ms for ADS and 422 ms for
25
+ AnsysEM on the first measurement. Both adapters reported `execution_host_role=eda-worker`; ADS
26
+ reported a synchronous Run model and AnsysEM a durable Run model.
27
+ - ADS 2026 Update 2.1 created one disposable empty workspace on virtual display 4 in 1.55 seconds.
28
+ A repeated call with the same idempotency key returned the original Run in 265 ms and did not
29
+ recreate the workspace.
30
+ - AEDT 2026.1 / PyAEDT 1.4.0 created, saved, closed, and fresh-reopened one disposable empty HFSS
31
+ 3D Layout project on virtual display 4. Submission returned in 453 ms and the durable Run reached
32
+ `passed` after 42.4 seconds. Status observations normally took 0--16 ms over the reused transport.
33
+ - Repeating the AnsysEM submission returned the same `job_id` and original `run_id`; later status
34
+ and event calls observed that Run without replaying it.
35
+ - The first AnsysEM attempt exposed a missing propagation of the connection-level runtime profile
36
+ into detached workers. The Bridge now inherits this profile automatically; a regression test and
37
+ the successful real-host rerun cover the failure path.
38
+
39
+ ## 2026-08-28 Context v2 and dual-role acceptance
40
+
41
+ - Both vendor Bridges emitted bounded `EDA_CONTEXT:v2` tokens containing a stable origin, session
42
+ state, target summary, capability digest, and freshness state. Runtime selected the correct
43
+ registered connection from the origin without a connection hint; legacy v1 decoding remains
44
+ covered by tests.
45
+ - One ADS documentation query completed with a single `eda.submit` over the SSH route in 529 ms.
46
+ One AnsysEM documentation query completed over the production SSH route in 860 ms. Neither path
47
+ launched the EDA or required separate context-resolution and capability calls.
48
+ - The same Runtime and AnsysEM adapter completed a documentation-status request through a local
49
+ connection in 72 ms when the EDA worker also acted as the Agent host. Only the connection record
50
+ differed between the local and SSH paths.
51
+ - Acceptance caught that an SSH child initially inherited the host's default virtual display even
52
+ though the captured Context named another display. The production connection commands now bind
53
+ the display before launching either Bridge; the ledgers then observed the required display for
54
+ both adapters.
55
+ - Connection setup probed each Bridge once and persisted its origin. Subsequent Context-driven
56
+ requests did not spend an extra round trip rediscovering the target.
57
+
58
+ ## Evidence boundary
59
+
60
+ - Both append-only ledgers verified their hash chains after the real operations.
61
+ - Recorded facts include the concise declared purpose, MCP client and harness identity, observed
62
+ host/display/runtime facts, adapter events, and terminal result. Metadata unavailable from the
63
+ client remains explicitly `unknown` with provenance instead of being guessed.
64
+ - Scratch output completeness was checked, then the disposable artifacts were removed. No customer
65
+ model was opened, no solve was launched, and no GUI automation was used.
66
+
67
+ ## Package and failure-path checks
68
+
69
+ - Unit tests cover hash-chain integrity, source identity, handshake mismatch, malformed-frame
70
+ isolation, idempotency, leases, durable jobs, orphan detection, connection ambiguity, legacy and
71
+ stateless MCP discovery, context routing, and no-replay connection failure.
72
+ - Runtime, ADS adapter, and AnsysEM adapter tests pass; lint passes for Runtime, AnsysEM, and all
73
+ modified ADS files. The wider ADS repository retains unrelated pre-existing lint debt.
74
+ - The Codex plugin manifest and bundled Skill pass their validators.
@@ -0,0 +1,63 @@
1
+ # Architecture
2
+
3
+ ## One execution path
4
+
5
+ An agent, CLI, MCP server, or EDA UI creates a versioned request envelope. The
6
+ runtime reads an explicit `EDA_CONTEXT` snapshot or a deterministic registered
7
+ binding, opens either a local or SSH transport, and submits the request to an
8
+ EDA adapter. A v2 Context adds bounded origin, session, target, selection,
9
+ capability, and freshness facts; v1 remains accepted. When the selected Skill
10
+ already establishes a typed operation, `eda.submit` performs routing, freshness
11
+ validation, and execution in one client call.
12
+
13
+ All paths emit the same event model into one logical execution ledger:
14
+
15
+ `client -> runtime -> transport -> adapter -> vendor bridge -> EDA`
16
+
17
+ The ledger keeps declared intent separate from observed execution. Physical
18
+ client and server ledger segments may live on different hosts; `request_id`,
19
+ `run_id`, `trace_id`, sequence numbers, and event hashes make them mergeable.
20
+
21
+ ## Three logical responsibility domains
22
+
23
+ The system has three logical responsibility domains. Skill, MCP, transport,
24
+ and SSH are interfaces or internal modules, not additional product layers.
25
+
26
+ | Domain | Owns | Does not own |
27
+ |---|---|---|
28
+ | User and Agent | Intent, engineering judgment, concise purpose | Durable execution state |
29
+ | Runtime kernel | Identity enrichment, facts, routing, transport, leases, jobs, Run projection | EDA semantics |
30
+ | Vendor adapter and bridge | Typed EDA capabilities, native API calls, EDA lifecycle, result normalization | Agent policy or cross-EDA governance |
31
+
32
+ The physical modules remain separable for testing. MCP and CLI are stateless
33
+ frontends to the Runtime kernel; local and SSH are interchangeable transports;
34
+ Skills are routing policy; vendor adapters preserve real EDA differences.
35
+ See [Deployment roles](DEPLOYMENT_ROLES.md) for host placement.
36
+
37
+ ## Reliability model
38
+
39
+ Delivery is at-least-once. Mutating operations therefore require an
40
+ `idempotency_key`. Durable jobs persist state before execution, expose an event
41
+ cursor, and allow clients to reconnect without restarting the EDA operation.
42
+ Resource leases carry monotonically increasing fencing tokens so a stale worker
43
+ cannot claim current ownership.
44
+
45
+ Synchronous responses and durable jobs retain their existing wire formats. The
46
+ Runtime adds a compact `eda-runtime.run-view/v1` projection so clients observe
47
+ the same run identity, state, terminal flag, job identity, and path-free
48
+ evidence references without forcing ADS and AnsysEM to share one execution
49
+ implementation.
50
+
51
+ ## Escape lanes
52
+
53
+ The preferred path is a typed adapter capability. If unavailable, callers may
54
+ use a verified native API, then a bounded script, then bounded GUI assistance,
55
+ then a manual external action. Adapters advertise which lanes exist. Every
56
+ non-typed lane must be explicit in the request and ledger.
57
+
58
+ ## Privacy and retention
59
+
60
+ Structured ledger records are retained until user cleanup. Raw vendor/debug
61
+ logs are artifacts with a default seven-day retention policy. Context tokens
62
+ contain no secrets. Structured values are redacted recursively before being
63
+ written.
@@ -0,0 +1,63 @@
1
+ # Deployment roles
2
+
3
+ The Runtime uses two independent host roles. They may be installed on separate
4
+ machines or combined on one machine; the execution contract does not change.
5
+
6
+ ## Agent client
7
+
8
+ The agent host owns the user-facing Skill, MCP server, connection registry,
9
+ context resolution, and transport reuse. It does not need the EDA application
10
+ or a vendor bridge installed locally when the selected connection is SSH.
11
+
12
+ Required components:
13
+
14
+ - `eda-runtime mcp serve` and the Runtime Codex plugin;
15
+ - `~/.eda-bridge-runtime/connections.json` or an explicitly selected registry;
16
+ - the thin Runtime routing Skill;
17
+ - platform SSH configuration when an EDA worker is remote.
18
+
19
+ ## EDA worker
20
+
21
+ The EDA host owns the vendor adapter service, bridge, EDA add-on or add-in, EDA
22
+ process, durable worker state, and vendor evidence. It does not need Agent
23
+ Skills or the Runtime Codex plugin unless an Agent also runs on that host.
24
+
25
+ Required components:
26
+
27
+ - the shared Runtime protocol library;
28
+ - one vendor bridge and its Runtime adapter service;
29
+ - the intended EDA installation, runtime profile, display, and license;
30
+ - host-side job, ledger, and artifact state used by that bridge.
31
+
32
+ ## Combined host
33
+
34
+ A combined host installs both roles and selects a `local` Runtime connection.
35
+ It still traverses MCP, Runtime, and the vendor adapter; only SSH is removed.
36
+ This preserves purpose, actor, idempotency, Run, and evidence behavior between
37
+ local and remote deployments.
38
+
39
+ ```text
40
+ Agent host EDA host
41
+ ----------- --------
42
+ Agent -> Skill -> MCP -> Runtime client Runtime adapter service
43
+ | -> vendor bridge
44
+ +-- local or SSH ------> -> EDA add-on/API -> EDA
45
+ ```
46
+
47
+ Skills are Agent instructions, not remote execution services. Documentation
48
+ query backends and licensed corpora may live on either host, but their
49
+ user-facing Skill belongs wherever the Agent runs.
50
+
51
+ ## Installation-state proof
52
+
53
+ An Agent capability is usable only when four states agree:
54
+
55
+ 1. repository source;
56
+ 2. installed Python package;
57
+ 3. installed plugin and Skill cache;
58
+ 4. tools exposed to a freshly started Agent session.
59
+
60
+ An EDA worker is proven separately by its installed bridge version, adapter
61
+ capabilities, EDA/profile identity, and a bounded real-host acceptance check.
62
+ Static Skills found on an EDA-only host do not participate in a remote Agent's
63
+ route and must not be treated as worker dependencies.
@@ -0,0 +1,79 @@
1
+ # MCP and Codex plugin
2
+
3
+ The bundled plugin is a thin discovery layer. It starts `eda-runtime mcp serve`, while the Runtime
4
+ keeps transport, idempotency, durable jobs, and the execution ledger independent of Codex.
5
+ The plugin and Skill belong on the Agent host. A remote EDA host needs only the
6
+ shared Runtime protocol plus its vendor bridge and adapter service unless an
7
+ Agent also runs there.
8
+
9
+ The plugin also installs `PreToolUse` and `PostToolUse` hooks scoped only to its own MCP tools.
10
+ They write an Agent-host append-only audit that records the Codex session, turn, active model,
11
+ permission mode, tool-call identity, concise purpose, and a hash of the arguments. Completion links
12
+ that identity to the returned Runtime Run. Hooks do not rewrite inputs, approve tools, parse the
13
+ chat transcript, or store raw operation payloads. Inspect the bounded recent view with
14
+ `eda-runtime audit list`.
15
+
16
+ Codex asks for one-time trust when a new or changed plugin Hook is first used. Review and approve
17
+ the two bundled audit commands; routine calls need no extra Agent prompt after that. Automated
18
+ acceptance may use Codex's explicit hook-trust bypass only after validating the installed Hook file.
19
+
20
+ The stdio server supports both the legacy MCP initialization era through `2025-11-25` and the
21
+ stateless `2026-07-28` discovery era. It exposes six tools:
22
+
23
+ - `eda.context.resolve`
24
+ - `eda.connections.list`
25
+ - `eda.capabilities`
26
+ - `eda.submit`
27
+ - `eda.job.status`
28
+ - `eda.job.events`
29
+
30
+ Operation, status, and event calls include an additive compact `run` object.
31
+ It projects synchronous responses and durable jobs into one observation shape
32
+ and lists content-addressed evidence metadata without exposing artifact paths.
33
+
34
+ For a greenfield task, use the create operation established by the selected vendor Skill; discover
35
+ capabilities only when that operation is not known. ADS and AnsysEM intentionally keep different
36
+ creation schemas; both return a bounded, reusable `EDA_CONTEXT` without exposing credentials or
37
+ large private artifacts.
38
+
39
+ When a selected Skill and Context establish the operation, call `eda.submit` directly. Separate
40
+ `eda.context.resolve` and `eda.capabilities` calls are diagnostic and discovery tools, not mandatory
41
+ preflight. The adapter still validates the Context generation and target before execution.
42
+
43
+ The tools never accept a raw local or SSH launch command. They select a previously registered
44
+ connection by `connection_id`, by a stable `origin_id` in `EDA_CONTEXT`, or by an unambiguous EDA
45
+ match. Each Agent host may map the same origin to a different local or SSH route.
46
+
47
+ ## One-time connection registration
48
+
49
+ Installation or administration code registers the connection once. Engineers normally copy
50
+ context from the EDA UI and do not maintain this file themselves.
51
+
52
+ ```console
53
+ eda-runtime connection set --eda ansys-electronics-desktop --kind ssh \
54
+ --host eda-host --ssh-option=-o --ssh-option=BatchMode=yes \
55
+ ansys-lab /opt/eda/bin/ansysem-agent runtime serve
56
+
57
+ eda-runtime connection set --eda keysight-ads --kind local \
58
+ ads-local ads-agent runtime serve
59
+ ```
60
+
61
+ Registration probes the adapter once and stores its stable `origin_id`; engineers do not create or
62
+ maintain that identifier. `--origin-id` is an administrative override and `--no-origin-probe`
63
+ exists only for repair or legacy adapters.
64
+
65
+ The default registry is `~/.eda-bridge-runtime/connections.json`. Set `EDA_RUNTIME_HOME` to move
66
+ the whole Runtime control directory. Do not store credentials in the registry; SSH authentication
67
+ remains in the platform SSH configuration.
68
+
69
+ ## Plugin source
70
+
71
+ The repository plugin lives at `plugins/eda-bridge-runtime`. Install the Python package first so
72
+ that `eda-runtime` is on the host path, then install the repository marketplace and plugin:
73
+
74
+ ```console
75
+ codex plugin marketplace add cottman99/eda-bridge-runtime --ref main
76
+ codex plugin add eda-bridge-runtime@eda-bridge-runtime
77
+ ```
78
+
79
+ Restart the Codex client after first installation so its Skill and MCP server are loaded together.