ads-agent-bridge 0.1.0a17__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 (38) hide show
  1. ads_agent_bridge-0.1.0a17/.github/workflows/ci.yml +27 -0
  2. ads_agent_bridge-0.1.0a17/.gitignore +10 -0
  3. ads_agent_bridge-0.1.0a17/AGENTS.md +31 -0
  4. ads_agent_bridge-0.1.0a17/CHANGELOG.md +23 -0
  5. ads_agent_bridge-0.1.0a17/CONTRIBUTING.md +29 -0
  6. ads_agent_bridge-0.1.0a17/LICENSE +21 -0
  7. ads_agent_bridge-0.1.0a17/PKG-INFO +163 -0
  8. ads_agent_bridge-0.1.0a17/README.md +114 -0
  9. ads_agent_bridge-0.1.0a17/SECURITY.md +15 -0
  10. ads_agent_bridge-0.1.0a17/docs/RELEASE_CONTRACT.md +66 -0
  11. ads_agent_bridge-0.1.0a17/docs/VALIDATION_2026-08-05.md +96 -0
  12. ads_agent_bridge-0.1.0a17/examples/dds_readback.py +66 -0
  13. ads_agent_bridge-0.1.0a17/examples/minimal_ac.py +100 -0
  14. ads_agent_bridge-0.1.0a17/pyproject.toml +48 -0
  15. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/__init__.py +3 -0
  16. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/__main__.py +3 -0
  17. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/addon/AdsAgentBridge/__init__.py +59 -0
  18. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/addon/AdsAgentBridge/server.py +356 -0
  19. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/addon/__init__.py +1 -0
  20. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/addon_installer.py +167 -0
  21. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/bridge_client.py +69 -0
  22. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/cli.py +200 -0
  23. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/compatibility.py +42 -0
  24. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/config.py +77 -0
  25. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/discovery.py +227 -0
  26. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/docs_kb.py +201 -0
  27. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/models.py +31 -0
  28. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/onboarding.py +146 -0
  29. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/paths.py +55 -0
  30. ads_agent_bridge-0.1.0a17/src/ads_agent_bridge/quickstart_circuit.py +103 -0
  31. ads_agent_bridge-0.1.0a17/tests/test_addon_installer.py +69 -0
  32. ads_agent_bridge-0.1.0a17/tests/test_bridge_client.py +28 -0
  33. ads_agent_bridge-0.1.0a17/tests/test_cli.py +31 -0
  34. ads_agent_bridge-0.1.0a17/tests/test_compatibility.py +10 -0
  35. ads_agent_bridge-0.1.0a17/tests/test_discovery.py +63 -0
  36. ads_agent_bridge-0.1.0a17/tests/test_docs_kb.py +33 -0
  37. ads_agent_bridge-0.1.0a17/tests/test_onboarding.py +93 -0
  38. ads_agent_bridge-0.1.0a17/tests/test_paths.py +10 -0
@@ -0,0 +1,27 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ os: [ubuntu-latest, windows-latest]
16
+ python-version: ["3.10", "3.13"]
17
+ runs-on: ${{ matrix.os }}
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+ - run: python -m pip install --upgrade pip
24
+ - run: python -m pip install ".[test]" build
25
+ - run: python -m pytest
26
+ - run: python -m build
27
+ - run: python -m pip check
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .pytest_cache/
5
+ .venv/
6
+ dist/
7
+ build/
8
+ .coverage
9
+ .codex_tmp/
10
+ .ads-agent/
@@ -0,0 +1,31 @@
1
+ # ADS Agent Bridge Development Contract
2
+
3
+ This repository is the clean, public product repository. Keep research,
4
+ customer workspaces, vendor documentation, generated indexes, and private
5
+ paths out of Git.
6
+
7
+ The critical user path is:
8
+
9
+ ```text
10
+ pipx install ads-agent-bridge
11
+ ads-agent setup
12
+ ads-agent quickstart
13
+ ```
14
+
15
+ Work that does not improve or protect that path is not a v0.1 release blocker.
16
+ Read `docs/RELEASE_CONTRACT.md` before expanding scope.
17
+
18
+ Rules:
19
+
20
+ - Windows and Linux are equal release gates.
21
+ - ADS 2025 and later are the stable support target. Earlier Python-capable
22
+ generations remain preview or experimental until their real runtime gates
23
+ pass.
24
+ - Bind docs, capabilities, sessions, and examples to an explicit ADS instance.
25
+ - Prefer runtime feature probes over version-only assumptions.
26
+ - Keep the ADS embedded addon standard-library-only when practical.
27
+ - Listen on localhost and require a random session token.
28
+ - Never distribute Keysight documentation or a generated copy of it.
29
+ - Run tests from a non-system-drive temporary directory when available.
30
+ - A partial quickstart must return a non-zero status and name every unpassed
31
+ gate; never report docs lookup as a completed automation roundtrip.
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable public changes are documented here.
4
+
5
+ ## 0.1.0a17 — 2026-08-05
6
+
7
+ Initial limited public alpha.
8
+
9
+ - Discover and explicitly select local ADS installations on Windows and Linux.
10
+ - Classify stable, preview, experimental, and unsupported ADS generations.
11
+ - Build a private per-installation search index from locally installed HTML
12
+ documentation without redistributing Keysight content.
13
+ - Install, inspect, upgrade, and uninstall the DE/DDS user add-on with backups.
14
+ - Connect to authenticated localhost-only DE and DDS bridge sessions.
15
+ - Keep arbitrary Python and AEL execution behind explicit two-sided unsafe
16
+ opt-in.
17
+ - Run a disposable headless minimal-AC workspace and validate its ADS dataset.
18
+ - Locate Windows ADS user configuration through Keysight `eeenv/HOME` registry
19
+ values, with an explicit config-directory override.
20
+ - Redact session bearer tokens from public CLI output.
21
+
22
+ Momentum, RFPro, FEM, SIPro, and PIPro are not part of this alpha's supported
23
+ workflow claim.
@@ -0,0 +1,29 @@
1
+ # Contributing
2
+
3
+ Contributions should keep the three-command path reliable:
4
+
5
+ ```console
6
+ pipx install ads-agent-bridge
7
+ ads-agent setup
8
+ ads-agent quickstart
9
+ ```
10
+
11
+ ## Local checks
12
+
13
+ Use Python 3.10 or later in an isolated environment:
14
+
15
+ ```console
16
+ python -m pip install -e ".[test]"
17
+ python -m pytest
18
+ python -m build
19
+ python -m pip check
20
+ ```
21
+
22
+ Do not commit Keysight documentation, generated indexes, ADS workspaces,
23
+ session files, license data, private paths, or customer material. Live ADS and
24
+ solver claims need observable evidence from a disposable or explicitly
25
+ authorized workspace.
26
+
27
+ Keep pull requests focused and explain the user-facing capability or failure
28
+ mode they change. Security reports belong in private vulnerability reporting,
29
+ not public issues.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ADS Agent Bridge contributors
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.
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: ads-agent-bridge
3
+ Version: 0.1.0a17
4
+ Summary: Unofficial local documentation and automation bridge for Keysight ADS
5
+ Project-URL: Homepage, https://github.com/cottman99/ads-agent-bridge
6
+ Project-URL: Repository, https://github.com/cottman99/ads-agent-bridge
7
+ Project-URL: Issues, https://github.com/cottman99/ads-agent-bridge/issues
8
+ Project-URL: Changelog, https://github.com/cottman99/ads-agent-bridge/blob/main/CHANGELOG.md
9
+ Author: ADS Agent Bridge contributors
10
+ License: MIT License
11
+
12
+ Copyright (c) 2026 ADS Agent Bridge contributors
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+ License-File: LICENSE
32
+ Keywords: ads,automation,eda,keysight,rf
33
+ Classifier: Development Status :: 3 - Alpha
34
+ Classifier: License :: OSI Approved :: MIT License
35
+ Classifier: Operating System :: Microsoft :: Windows
36
+ Classifier: Operating System :: POSIX :: Linux
37
+ Classifier: Programming Language :: Python :: 3
38
+ Classifier: Programming Language :: Python :: 3.10
39
+ Classifier: Programming Language :: Python :: 3.11
40
+ Classifier: Programming Language :: Python :: 3.12
41
+ Classifier: Programming Language :: Python :: 3.13
42
+ Requires-Python: >=3.10
43
+ Requires-Dist: beautifulsoup4<5,>=4.12
44
+ Requires-Dist: html2text<2027,>=2024.2.26
45
+ Requires-Dist: platformdirs<5,>=4
46
+ Provides-Extra: test
47
+ Requires-Dist: pytest<10,>=8; extra == 'test'
48
+ Description-Content-Type: text/markdown
49
+
50
+ # ADS Agent Bridge
51
+
52
+ An unofficial, local-first documentation and automation bridge for Keysight
53
+ Advanced Design System (ADS).
54
+
55
+ > [!IMPORTANT]
56
+ > This is a limited public alpha. Use disposable ADS workspaces and review the
57
+ > reported capability gates before relying on automation results.
58
+ > Keysight and ADS are trademarks of Keysight Technologies. This project is
59
+ > not affiliated with or endorsed by Keysight.
60
+
61
+ The first release is designed around three commands:
62
+
63
+ ```text
64
+ pipx install ads-agent-bridge
65
+ ads-agent setup
66
+ ads-agent quickstart
67
+ ```
68
+
69
+ The current alpha slice implements cross-platform ADS installation discovery,
70
+ capability/support reporting, per-installation local documentation indexing,
71
+ DE/DDS add-on registration, and a headless minimal-AC quickstart with dataset
72
+ readback.
73
+
74
+ It does **not** currently claim a completed Momentum, RFPro, FEM, SIPro, or
75
+ PIPro workflow. Those lanes require separate solver-side acceptance evidence.
76
+
77
+ Official ADS documentation is never distributed with this package. Indexes
78
+ are built privately from documentation already installed on the user's
79
+ machine.
80
+
81
+ Set `ADS_AGENT_HOME` to place configuration, data, and caches under an explicit
82
+ directory. This is useful for isolated tests, remote servers, and systems where
83
+ the normal user cache location is not appropriate.
84
+
85
+ ## Install and verify
86
+
87
+ Prerequisites:
88
+
89
+ - a locally licensed ADS installation;
90
+ - Python 3.10 or later for the `ads-agent` command;
91
+ - `pipx` (recommended) or an isolated virtual environment.
92
+
93
+ ```console
94
+ pipx install ads-agent-bridge
95
+ ads-agent setup
96
+ ads-agent quickstart
97
+ ```
98
+
99
+ When several ADS versions are found, interactive setup asks which one to use.
100
+ For an unattended or version-specific setup:
101
+
102
+ ```console
103
+ ads-agent setup --ads-root /path/to/ADS2026_Update2 --non-interactive
104
+ ```
105
+
106
+ A successful quickstart independently reports documentation, add-on,
107
+ workspace, circuit simulation, and dataset readback gates. It creates a new
108
+ disposable workspace and refuses to overwrite an existing path.
109
+
110
+ ## Current commands
111
+
112
+ ```text
113
+ ads-agent instances scan [--ads-root PATH]
114
+ ads-agent instances list
115
+ ads-agent instances use INSTANCE_ID
116
+ ads-agent compatibility explain [--ads INSTANCE_ID]
117
+ ads-agent docs ensure [--ads INSTANCE_ID]
118
+ ads-agent docs status [--ads INSTANCE_ID]
119
+ ads-agent docs query QUERY [--ads INSTANCE_ID]
120
+ ads-agent setup [--ads-root PATH] [--non-interactive] [--config-dir PATH]
121
+ ads-agent quickstart [--ads INSTANCE_ID] [--workspace PATH] [--config-dir PATH]
122
+ ads-agent addon status
123
+ ads-agent bridge sessions
124
+ ```
125
+
126
+ Documentation queries stay on the local machine:
127
+
128
+ ```console
129
+ ads-agent docs query "keysight.ads.de workspace" --limit 5
130
+ ```
131
+
132
+ The bridge listens only on localhost and uses a random token per session.
133
+ Arbitrary embedded Python and dynamic AEL calls are disabled unless ADS is
134
+ launched with `ADS_AGENT_UNSAFE=1` and the client command also includes
135
+ `--unsafe`.
136
+
137
+ On Windows, `setup` reads Keysight's per-version `eeenv/HOME` registry values
138
+ to locate the real `hpeesof/config` directory. Use `--config-dir` (or
139
+ `ADS_AGENT_ADS_CONFIG_DIR`) when maintaining separate ADS profiles.
140
+
141
+ On Linux, ADS Python may still require an available X display even though the
142
+ quickstart opens no ADS window. Set `DISPLAY` to the intended isolated display
143
+ before running it. `setup` edits only the current user's ADS add-on XML files,
144
+ creates timestamped backups, and preserves unrelated add-ons.
145
+
146
+ Stable support is targeted at ADS 2025 and later. ADS 2024 Update 2 is a
147
+ preview target; ADS 2023 Update 2 through ADS 2024 Update 1 are experimental.
148
+ Runtime capability probes, rather than version numbers alone, decide which
149
+ features are actually available.
150
+
151
+ ## Remove the integration
152
+
153
+ ```console
154
+ ads-agent addon uninstall
155
+ ```
156
+
157
+ The installer preserves unrelated ADS add-ons and creates timestamped XML
158
+ backups before changing an existing configuration.
159
+
160
+ ## Development
161
+
162
+ See [CONTRIBUTING.md](CONTRIBUTING.md) and the evidence-backed
163
+ [validation record](docs/VALIDATION_2026-08-05.md).
@@ -0,0 +1,114 @@
1
+ # ADS Agent Bridge
2
+
3
+ An unofficial, local-first documentation and automation bridge for Keysight
4
+ Advanced Design System (ADS).
5
+
6
+ > [!IMPORTANT]
7
+ > This is a limited public alpha. Use disposable ADS workspaces and review the
8
+ > reported capability gates before relying on automation results.
9
+ > Keysight and ADS are trademarks of Keysight Technologies. This project is
10
+ > not affiliated with or endorsed by Keysight.
11
+
12
+ The first release is designed around three commands:
13
+
14
+ ```text
15
+ pipx install ads-agent-bridge
16
+ ads-agent setup
17
+ ads-agent quickstart
18
+ ```
19
+
20
+ The current alpha slice implements cross-platform ADS installation discovery,
21
+ capability/support reporting, per-installation local documentation indexing,
22
+ DE/DDS add-on registration, and a headless minimal-AC quickstart with dataset
23
+ readback.
24
+
25
+ It does **not** currently claim a completed Momentum, RFPro, FEM, SIPro, or
26
+ PIPro workflow. Those lanes require separate solver-side acceptance evidence.
27
+
28
+ Official ADS documentation is never distributed with this package. Indexes
29
+ are built privately from documentation already installed on the user's
30
+ machine.
31
+
32
+ Set `ADS_AGENT_HOME` to place configuration, data, and caches under an explicit
33
+ directory. This is useful for isolated tests, remote servers, and systems where
34
+ the normal user cache location is not appropriate.
35
+
36
+ ## Install and verify
37
+
38
+ Prerequisites:
39
+
40
+ - a locally licensed ADS installation;
41
+ - Python 3.10 or later for the `ads-agent` command;
42
+ - `pipx` (recommended) or an isolated virtual environment.
43
+
44
+ ```console
45
+ pipx install ads-agent-bridge
46
+ ads-agent setup
47
+ ads-agent quickstart
48
+ ```
49
+
50
+ When several ADS versions are found, interactive setup asks which one to use.
51
+ For an unattended or version-specific setup:
52
+
53
+ ```console
54
+ ads-agent setup --ads-root /path/to/ADS2026_Update2 --non-interactive
55
+ ```
56
+
57
+ A successful quickstart independently reports documentation, add-on,
58
+ workspace, circuit simulation, and dataset readback gates. It creates a new
59
+ disposable workspace and refuses to overwrite an existing path.
60
+
61
+ ## Current commands
62
+
63
+ ```text
64
+ ads-agent instances scan [--ads-root PATH]
65
+ ads-agent instances list
66
+ ads-agent instances use INSTANCE_ID
67
+ ads-agent compatibility explain [--ads INSTANCE_ID]
68
+ ads-agent docs ensure [--ads INSTANCE_ID]
69
+ ads-agent docs status [--ads INSTANCE_ID]
70
+ ads-agent docs query QUERY [--ads INSTANCE_ID]
71
+ ads-agent setup [--ads-root PATH] [--non-interactive] [--config-dir PATH]
72
+ ads-agent quickstart [--ads INSTANCE_ID] [--workspace PATH] [--config-dir PATH]
73
+ ads-agent addon status
74
+ ads-agent bridge sessions
75
+ ```
76
+
77
+ Documentation queries stay on the local machine:
78
+
79
+ ```console
80
+ ads-agent docs query "keysight.ads.de workspace" --limit 5
81
+ ```
82
+
83
+ The bridge listens only on localhost and uses a random token per session.
84
+ Arbitrary embedded Python and dynamic AEL calls are disabled unless ADS is
85
+ launched with `ADS_AGENT_UNSAFE=1` and the client command also includes
86
+ `--unsafe`.
87
+
88
+ On Windows, `setup` reads Keysight's per-version `eeenv/HOME` registry values
89
+ to locate the real `hpeesof/config` directory. Use `--config-dir` (or
90
+ `ADS_AGENT_ADS_CONFIG_DIR`) when maintaining separate ADS profiles.
91
+
92
+ On Linux, ADS Python may still require an available X display even though the
93
+ quickstart opens no ADS window. Set `DISPLAY` to the intended isolated display
94
+ before running it. `setup` edits only the current user's ADS add-on XML files,
95
+ creates timestamped backups, and preserves unrelated add-ons.
96
+
97
+ Stable support is targeted at ADS 2025 and later. ADS 2024 Update 2 is a
98
+ preview target; ADS 2023 Update 2 through ADS 2024 Update 1 are experimental.
99
+ Runtime capability probes, rather than version numbers alone, decide which
100
+ features are actually available.
101
+
102
+ ## Remove the integration
103
+
104
+ ```console
105
+ ads-agent addon uninstall
106
+ ```
107
+
108
+ The installer preserves unrelated ADS add-ons and creates timestamped XML
109
+ backups before changing an existing configuration.
110
+
111
+ ## Development
112
+
113
+ See [CONTRIBUTING.md](CONTRIBUTING.md) and the evidence-backed
114
+ [validation record](docs/VALIDATION_2026-08-05.md).
@@ -0,0 +1,15 @@
1
+ # Security
2
+
3
+ Do not report security vulnerabilities through a public issue. Use GitHub's
4
+ private vulnerability reporting for this repository.
5
+
6
+ The product security boundary is localhost-only transport with a random token
7
+ per ADS session. Arbitrary Python or AEL execution will require explicit unsafe
8
+ mode and is not part of the default quickstart path.
9
+
10
+ Session JSON files contain bearer tokens. They are written to the local runtime
11
+ directory with restrictive permissions where supported. The public
12
+ `bridge sessions` command redacts tokens.
13
+
14
+ This alpha is intended for local ADS installations and disposable workspaces.
15
+ Do not expose bridge ports through a proxy, port forward, or public interface.
@@ -0,0 +1,66 @@
1
+ # v0.1 Release Contract
2
+
3
+ ## Product promise
4
+
5
+ A new user can install one package, select the intended local ADS installation,
6
+ query that installation's private local documentation, and run one verified
7
+ circuit workflow without learning the internal adapter or plugin architecture.
8
+
9
+ ## User path
10
+
11
+ ```text
12
+ pipx install ads-agent-bridge
13
+ ads-agent setup
14
+ ads-agent quickstart
15
+ ```
16
+
17
+ `setup` must discover installed ADS instances, select one without silently
18
+ preferring the newest version, probe capabilities, install recoverable user
19
+ integration, and make documentation lookup immediately useful.
20
+
21
+ `quickstart` must report these gates independently:
22
+
23
+ 1. documentation index;
24
+ 2. documentation query;
25
+ 3. add-on registration when the selected ADS supports Python add-ons;
26
+ 4. disposable workspace creation;
27
+ 5. circuit simulation;
28
+ 6. dataset readback.
29
+
30
+ It passes only when all required gates pass.
31
+
32
+ ## Support tiers
33
+
34
+ - ADS 2025 and later: stable target.
35
+ - ADS 2024 Update 2: preview target.
36
+ - ADS 2023 Update 2 through ADS 2024 Update 1: experimental target.
37
+ - Older versions: documentation-only when local docs can be discovered; no
38
+ live Python bridge promise.
39
+
40
+ Version is a starting hint. Runtime capability probes decide whether DE, DDS,
41
+ addons, AEL interoperability, headless automation, or EM routes are available.
42
+
43
+ ## v0.1 release blockers
44
+
45
+ - clean wheel and offline wheelhouse installation;
46
+ - automatic dependency installation;
47
+ - multi-instance discovery and explicit selection;
48
+ - Windows and Linux setup/docs/bridge gates;
49
+ - resumable private documentation indexing;
50
+ - recoverable addon install, upgrade, and uninstall;
51
+ - localhost token-authenticated live bridge;
52
+ - disposable-workspace headless circuit simulation and dataset readback;
53
+ - one real two-port Momentum golden path;
54
+ - no vendor docs, private paths, or monorepo runtime imports.
55
+
56
+ ## Non-blocking extensions
57
+
58
+ The full plugin platform, RFPro/FEM completeness, SIPro/PIPro, broad PDK
59
+ automation, AEL debugging, built-in SSH orchestration, and large example
60
+ catalogs do not block the first public beta.
61
+
62
+ ## Evidence language
63
+
64
+ Use `discovered`, `indexed`, `installed`, `connected`, `created`, `saved`,
65
+ `reopened`, `simulated`, and `read_back` only when the corresponding observable
66
+ gate passed. Filesystem presence alone is not live ADS or solver evidence.
@@ -0,0 +1,96 @@
1
+ # Validation record — 2026-08-05
2
+
3
+ ## Outcome
4
+
5
+ `ads-agent-bridge 0.1.0a17` passes the minimum public core on Windows and
6
+ Linux. The alpha package is suitable for a limited public release that claims
7
+ installation discovery, private local documentation indexing, recoverable
8
+ DE/DDS add-on registration, authenticated localhost bridge connectivity, and
9
+ the minimal headless AC workflow.
10
+
11
+ The full v0.1 contract is not yet complete because the real two-port Momentum
12
+ golden path has not passed. No EM or RFPro solver-completion claim is made by
13
+ this record.
14
+
15
+ ## Release artifact
16
+
17
+ - Wheel: `ads_agent_bridge-0.1.0a17-py3-none-any.whl`
18
+ - Source distribution: `ads_agent_bridge-0.1.0a17.tar.gz`
19
+ - Clean Python 3.10 installation: passed, including declared dependencies.
20
+ - `pip check`: no broken requirements.
21
+ - Unit tests: 18 passed.
22
+ - Wheel inspection: contains only the public package, metadata, and MIT
23
+ license; no documentation corpus, generated index, private path, host, or
24
+ monorepo runtime dependency was found.
25
+
26
+ ## Linux acceptance
27
+
28
+ Target: ADS 2026 Update 2.1 with its bundled Python 3.13, using an isolated X
29
+ display, state directory, user profile, workspace, slot, and ports.
30
+
31
+ - Automatic installation discovery: passed.
32
+ - Local documentation roots: ADS, Python, AEL, and DDS discovered.
33
+ - Fast private index: 9,422 HTML pages indexed; repeat run reused the index.
34
+ - `setup`: passed, including isolated DE and DDS registration.
35
+ - Final a16 `quickstart`: passed all six reported gates.
36
+ - Circuit evidence: 30-line generated netlist; 31 dataset rows; columns
37
+ `freq`, `R1_v`, and `SRC1.i`; frequency range 1 Hz to 1 MHz.
38
+ - Live DE and DDS sessions: authenticated ping/status passed.
39
+ - Safe/unsafe boundary: arbitrary Python rejected by default and worked only
40
+ after explicit process and client opt-in.
41
+ - Project management: copied workspace open/readback passed.
42
+ - AEL interoperability: bounded function discovery and workspace refresh
43
+ passed.
44
+ - DDS: equation readback was valid with 31 complex samples.
45
+ - Headless route: separate workspace simulation and dataset readback passed.
46
+ - Cleanup: test ADS processes were terminated; pre-existing add-on XML files
47
+ were restored to their exact pre-test SHA-256 values.
48
+
49
+ ## Windows acceptance
50
+
51
+ Stable-version headless matrix:
52
+
53
+ | ADS version | Support | Indexed pages | Quickstart | Dataset rows |
54
+ |---|---:|---:|---:|---:|
55
+ | 2026 Update 2 | stable | 9,422 | passed | 31 |
56
+ | 2026 Update 1 | stable | 8,825 | passed | 31 |
57
+ | 2025 Update 2 | stable | 7,649 | passed | 31 |
58
+
59
+ Additional Windows gates:
60
+
61
+ - Clean wheel installation under Python 3.10: passed.
62
+ - Multi-installation discovery found the three stable installations plus an
63
+ older ADS 2023 Update 1 installation without silently changing the default.
64
+ - ADS user configuration discovery followed Keysight's per-version
65
+ `eeenv/HOME` registry value instead of assuming `%USERPROFILE%`.
66
+ - Real isolated ADS 2026 Update 2 DE and DDS add-on startup: passed.
67
+ - New DE and DDS sessions used localhost, random tokens, separate profiles,
68
+ and the expected disposable workspace; ping/status passed.
69
+ - Public session listing redacted the token and reported only `has_token`;
70
+ authenticated requests continued to use the private session record.
71
+ - Add-on XML recovery: byte-identical SHA-256 values before and after the live
72
+ test.
73
+ - Test processes were terminated by exact new PID; the pre-existing user ADS
74
+ process set remained unchanged.
75
+ - The final quickstart did not write ADS `.cfg` files into the caller's
76
+ current directory.
77
+
78
+ ## Older-version boundary
79
+
80
+ ADS 2023 Update 1 was discovered and `setup` degraded cleanly: missing local
81
+ HTML documentation was reported as `not_available`, and unsupported Python
82
+ add-on registration was skipped. Its bundled Python lacks `keysight.ads.de`,
83
+ so the circuit quickstart correctly failed. This is evidence for the current
84
+ unsupported boundary, not a failure of the stable ADS 2025+ claim.
85
+
86
+ ## Remaining gates
87
+
88
+ 1. Build and accept a distributable two-port Momentum fixture with solver-side
89
+ port, terminal status, result-artifact, and numeric S-parameter evidence.
90
+ 2. Make the maintained RFPro/Momentum acceptance harness cross-platform; the
91
+ current external harness assumes the Windows `tools/python/python.exe`
92
+ layout and cannot validate a Linux solver run.
93
+ 3. Run the ADS 2024 Update 2 preview and ADS 2023 Update 2 experimental lanes
94
+ on real installations before strengthening their support language.
95
+ 4. Publishing to a public package index and creating a signed/tagged release
96
+ were not performed by this validation.
@@ -0,0 +1,66 @@
1
+ """Create a DDS file and validate an ADS dataset through an equation.
2
+
3
+ Set ``WORKSPACE`` and ``DATASET`` in the DDS bridge namespace before running.
4
+ The final stdout line is a JSON acceptance record. This intentionally avoids
5
+ adding a plot, because raw complex data can open an interactive chooser.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import traceback
12
+ from pathlib import Path
13
+
14
+ from keysight.ads import dds
15
+
16
+
17
+ def json_safe(value):
18
+ if isinstance(value, complex):
19
+ return {"real": value.real, "imag": value.imag}
20
+ if isinstance(value, (str, int, float, bool)) or value is None:
21
+ return value
22
+ if isinstance(value, (list, tuple)):
23
+ return [json_safe(item) for item in value]
24
+ if isinstance(value, dict):
25
+ return {str(key): json_safe(item) for key, item in value.items()}
26
+ return repr(value)
27
+
28
+
29
+ def main() -> dict:
30
+ record = {"ok": False}
31
+ try:
32
+ workspace = Path(globals()["WORKSPACE"]).resolve()
33
+ dataset_path = Path(globals()["DATASET"]).resolve()
34
+ if not dataset_path.is_file():
35
+ raise FileNotFoundError(dataset_path)
36
+ dds.init_dds_path(workspace)
37
+ dds_file = dds.new_dds_file(dataset_path, workspace)
38
+ dds_file.add_dataset_alias("minimal_ac", str(dataset_path))
39
+ page = dds_file.pages[0]
40
+ page.name = "Minimal AC dataset"
41
+ equation = page.add_equation("node_voltage", "R1_v")
42
+ values = equation.variable.to_dataframe().values.tolist()
43
+ dds_name = "minimal_ac_readback.dds"
44
+ dds_path = workspace / dds_name
45
+ dds_file.save(dds_name, workspace)
46
+ record.update(
47
+ {
48
+ "ok": equation.status == "Valid" and len(values) > 0 and dds_path.is_file(),
49
+ "workspace": str(workspace),
50
+ "dataset_path": str(dataset_path),
51
+ "dds_path": str(dds_path),
52
+ "dds_exists": dds_path.is_file(),
53
+ "equation": equation.expression,
54
+ "equation_status": equation.status,
55
+ "row_count": len(values),
56
+ "values_preview": json_safe(values[:3]),
57
+ "dataset_aliases": dict(dds_file.dataset_aliases),
58
+ "is_dds_app": bool(dds.is_dds_app()),
59
+ }
60
+ )
61
+ except Exception as exc:
62
+ record.update({"error": repr(exc), "traceback": traceback.format_exc()})
63
+ return record
64
+
65
+
66
+ print(json.dumps(main(), ensure_ascii=False))