@embassys/ambassador 0.2.6 → 0.2.8

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.
@@ -1,87 +1,32 @@
1
1
  # Get started with Gemini CLI
2
2
 
3
- Release target: `@embassys/ambassador@0.2.6`. The profile is source-reviewed
4
- against Gemini CLI 0.58.0, and its exact ACP initialization contract passed.
5
- Real-agent direct and webhook qualification remain open under the one-release
6
- qualification exception in ADR 0015.
3
+ ## Before you start
7
4
 
8
- Ambassador enables Gemini CLI only for this exact contract:
5
+ - Install Node.js `>=24.19.0 <25`.
6
+ - Install and sign in to Gemini CLI `0.58.0`.
7
+ - Gemini supplies native ACP through `gemini --acp`; no adapter is needed.
8
+ - Ambassador never receives your Gemini or Google credential.
9
9
 
10
- | Field | Value |
11
- | --- | --- |
12
- | MCP `clientInfo` | `gemini-cli-mcp-client` / `0.58.0` |
13
- | Delivery modes | direct and webhook |
14
- | Direct command | `gemini --acp` |
15
- | Accepted ACP `agentInfo` | `gemini-cli` / `0.58.0` |
16
- | Ambassador MCP in the direct session | ACP HTTP MCP injection |
10
+ ## Set up direct delivery
17
11
 
18
- Gemini CLI supplies native ACP, so Ambassador does not select or contain an
19
- adapter. The reviewed release is
20
- [`v0.58.0`](https://github.com/google-gemini/gemini-cli/tree/v0.58.0). Its
21
- [`ACP mode documentation`](https://github.com/google-gemini/gemini-cli/blob/v0.58.0/docs/cli/acp-mode.md)
22
- defines `gemini --acp`. Its
23
- [`acpRpcDispatcher.ts`](https://github.com/google-gemini/gemini-cli/blob/v0.58.0/packages/cli/src/acp/acpRpcDispatcher.ts)
24
- returns the `gemini-cli` ACP identity, and
25
- [`acpSessionManager.ts`](https://github.com/google-gemini/gemini-cli/blob/v0.58.0/packages/cli/src/acp/acpSessionManager.ts)
26
- maps session MCP configuration into Gemini CLI. The MCP client identity comes
27
- from
28
- [`mcp-client.ts`](https://github.com/google-gemini/gemini-cli/blob/v0.58.0/packages/core/src/tools/mcp-client.ts).
29
- Other versions fail closed until the registry is reviewed and updated.
30
-
31
- ## Setup
32
-
33
- 1. Install Node.js `>=24.19.0 <25`, then install and authenticate Gemini CLI
34
- 0.58.0 using its normal setup. Ambassador never installs or updates Gemini.
35
- 2. For noninteractive provider authentication, set the appropriate approved
36
- Gemini or Vertex variables outside chat. The profile accepts
37
- `GEMINI_API_KEY`, `GOOGLE_API_KEY`, `GOOGLE_CLOUD_PROJECT`,
38
- `GOOGLE_CLOUD_LOCATION`, and `GOOGLE_GENAI_USE_VERTEXAI`.
39
- 3. Generate the local MCP token without putting its value in chat or a command
40
- argument:
41
-
42
- ```sh
43
- export AMBASSADOR_LOCAL_TOKEN="$(
44
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
45
- )"
46
- ```
47
-
48
- 4. If you may choose webhook delivery, create its secret in the same shell
49
- before starting Ambassador:
12
+ 1. From the directory Gemini CLI may access, keep Ambassador running:
50
13
 
51
14
  ```sh
52
- export AMBASSADOR_WEBHOOK_SECRET="$(
53
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
54
- )"
15
+ npx --yes @embassys/ambassador@latest start
55
16
  ```
56
17
 
57
- 5. From the directory the direct agent may access, start the exact release and
58
- keep it running in the foreground:
59
-
60
- ```sh
61
- npx --yes @embassys/ambassador@0.2.6 start \
62
- --local-token-env=AMBASSADOR_LOCAL_TOKEN
63
- ```
64
-
65
- 6. Configure Gemini CLI's MCP client to use the loopback endpoint printed by
66
- Ambassador, with a bearer token read from `AMBASSADOR_LOCAL_TOKEN`. Use the
67
- provider's normal MCP configuration mechanism; do not copy the token value
68
- into chat.
69
- 7. Ask Gemini CLI to register with your email and optional display name. The
70
- first `register_agent` call contains `email` and, if wanted, `display_name`.
71
- Ambassador recognizes the Gemini CLI profile and asks direct versus webhook,
72
- with direct as the default.
73
- 8. For direct mode, choose direct. The follow-up repeats the same `email` and
74
- optional `display_name` and adds `delivery: {"mode":"direct"}`. Ambassador
75
- starts `gemini --acp` and injects its authenticated HTTP MCP server into the
76
- new ACP session.
77
- 9. For webhook mode, choose webhook and provide the HTTPS receiver URL plus
78
- the environment-variable name `AMBASSADOR_WEBHOOK_SECRET`. The follow-up
79
- repeats the registration fields and adds `delivery.mode`, `delivery.url`,
80
- and `delivery.secret_env`; it never sends the secret value.
81
- 10. Enter the email verification code when Gemini CLI asks for it. Gemini CLI
82
- calls `verify_email` with that `email` and six-digit `code`; the central
83
- token and DPoP key stay inside Ambassador.
84
-
85
- Gemini owns provider authentication and history. Ambassador never receives the
86
- provider credentials, central token, or DPoP private key. Never put the local
87
- token or a provider credential in chat or registration arguments.
18
+ 2. Add `http://127.0.0.1:8787/mcp` as a Streamable HTTP MCP server in Gemini
19
+ CLI's normal MCP configuration. Do not configure authentication.
20
+ 3. Start or restart Gemini CLI so it sees the MCP server.
21
+ 4. Ask Gemini CLI to register your email; it calls Ambassador's
22
+ `register_agent` tool.
23
+ 5. Enter the six-digit code sent to your email. Gemini CLI is direct-only, so
24
+ Ambassador does not ask a delivery question.
25
+
26
+ Ambassador will launch `gemini --acp` when a central message arrives. That is
27
+ a new gateway-managed session, not the chat used for registration.
28
+
29
+ The qualification probe records the installed version without rejecting it.
30
+ Production still checks the exact MCP client and ACP identities in the compiled
31
+ profile, so a new incompatible release fails closed. See
32
+ [Qualification](qualification.md) for compatibility evidence.
@@ -1,84 +1,52 @@
1
1
  # Get started with Hermes Agent
2
2
 
3
- Release target: `@embassys/ambassador@0.2.6`. The profile is source-reviewed
4
- against Hermes Agent 0.21.0. Real-agent direct and webhook qualification remain
5
- open under the one-release qualification exception in ADR 0015.
3
+ ## Before you start
6
4
 
7
- Ambassador enables Hermes only for this exact contract:
5
+ - Install Node.js `>=24.19.0 <25`.
6
+ - Install and authenticate Hermes Agent `0.20.5` or `0.21.0`.
7
+ - Make sure `hermes-acp` is on `PATH` for direct delivery.
8
+ - Ambassador never receives your provider credential.
8
9
 
9
- | Field | Value |
10
- | --- | --- |
11
- | MCP `clientInfo` | `mcp` / `0.1.0` |
12
- | Delivery modes | direct and webhook |
13
- | Direct command | `hermes-acp` |
14
- | Accepted ACP `agentInfo` | `hermes-agent` / `0.21.0` |
15
- | Ambassador MCP in the direct session | ACP HTTP MCP injection |
10
+ Hermes Agent `0.20.5` passed both live delivery modes and is included in
11
+ Ambassador 0.2.8's direct profile. The qualification probe records the installed
12
+ version without treating the observation itself as a failure.
16
13
 
17
- The contract was reviewed at Hermes revision
18
- `1cb3ab617363ffab9e55239a7d2ab0d6f9c10473`. Hermes pins Python MCP 2.0.0 and
19
- constructs `ClientSession` without overriding its client identity in
20
- [`mcp_tool.py`](https://github.com/NousResearch/hermes-agent/blob/1cb3ab617363ffab9e55239a7d2ab0d6f9c10473/tools/mcp_tool.py).
21
- That SDK's exact `mcp` / `0.1.0` identity is defined by Python MCP 2.0.0's
22
- [`DEFAULT_CLIENT_INFO`](https://github.com/modelcontextprotocol/python-sdk/blob/6f69a3758ebf2ee55ce050f58b470ce11af71133/src/mcp/client/session.py).
23
- Hermes declares the `hermes-acp` entry point in
24
- [`pyproject.toml`](https://github.com/NousResearch/hermes-agent/blob/1cb3ab617363ffab9e55239a7d2ab0d6f9c10473/pyproject.toml)
25
- and returns its ACP identity in
26
- [`acp_adapter/server.py`](https://github.com/NousResearch/hermes-agent/blob/1cb3ab617363ffab9e55239a7d2ab0d6f9c10473/acp_adapter/server.py).
27
- Later versions fail closed until the registry is reviewed and updated.
14
+ ## Set up direct delivery
28
15
 
29
- ## Setup
30
-
31
- 1. Install Node.js `>=24.19.0 <25`, then install and authenticate Hermes Agent
32
- 0.21.0 using its normal provider setup. Ambassador never installs or updates
33
- Hermes.
34
- 2. Generate the local MCP token without putting its value in chat or a command
35
- argument:
36
-
37
- ```sh
38
- export AMBASSADOR_LOCAL_TOKEN="$(
39
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
40
- )"
41
- ```
42
-
43
- 3. If you may choose webhook delivery, create its secret in the same shell
44
- before starting Ambassador:
16
+ 1. From the directory Hermes may access, keep Ambassador running:
45
17
 
46
18
  ```sh
47
- export AMBASSADOR_WEBHOOK_SECRET="$(
48
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
49
- )"
19
+ npx --yes @embassys/ambassador@latest start
50
20
  ```
51
21
 
52
- 4. From the directory the direct agent may access, start the exact release and
53
- keep it running in the foreground:
54
-
55
- ```sh
56
- npx --yes @embassys/ambassador@0.2.6 start \
57
- --local-token-env=AMBASSADOR_LOCAL_TOKEN
58
- ```
59
-
60
- 5. Configure Hermes to use the loopback MCP endpoint printed by Ambassador,
61
- with a bearer token read from `AMBASSADOR_LOCAL_TOKEN`. Use Hermes's normal
62
- MCP configuration mechanism; do not copy the token value into chat.
63
- 6. Ask Hermes to register with your email and optional display name. The first
64
- `register_agent` call contains `email` and, if wanted, `display_name`.
65
- Ambassador recognizes the Hermes profile and asks direct versus webhook,
66
- with direct as the default.
67
- 7. For direct mode, choose direct. The follow-up repeats the same `email` and
68
- optional `display_name` and adds `delivery: {"mode":"direct"}`. Ambassador
69
- starts `hermes-acp` and injects its authenticated HTTP MCP server into the
70
- gateway-owned ACP session.
71
- 8. For webhook mode, choose webhook and provide the HTTPS receiver URL plus
72
- the environment-variable name `AMBASSADOR_WEBHOOK_SECRET`. The follow-up
73
- repeats the registration fields and adds `delivery.mode`, `delivery.url`,
74
- and `delivery.secret_env`; it never sends the secret value.
75
- 9. Enter the email verification code when Hermes asks for it. Hermes calls
76
- `verify_email` with that `email` and six-digit `code`; the central token and
77
- DPoP key stay inside Ambassador.
78
-
79
- Hermes receives neither the central token nor the DPoP private key. Never put
80
- the local token or webhook secret in chat or registration arguments.
81
-
82
- The opt-in real-agent runner injects its qualification MCP endpoint into the
83
- Hermes ACP session and verifies the exact reviewed `clientInfo` when Hermes
84
- calls the bounded qualification tool.
22
+ 2. Add `http://127.0.0.1:8787/mcp` as a Streamable HTTP MCP server in Hermes's
23
+ normal MCP configuration. Do not configure authentication.
24
+ 3. Start or restart Hermes so it sees the MCP server.
25
+ 4. Ask Hermes to register your email; it calls Ambassador's `register_agent`
26
+ tool.
27
+ 5. Choose **Send directly to this Hermes agent**.
28
+ 6. Enter the six-digit code sent to your email.
29
+
30
+ Ambassador will launch `hermes-acp` when a central message arrives. That is a
31
+ new gateway-managed session, not the chat used for registration.
32
+
33
+ ## Use a webhook instead
34
+
35
+ - Before step 1, set the receiver secret in the same shell:
36
+
37
+ ```sh
38
+ export AMBASSADOR_WEBHOOK_SECRET="$(
39
+ node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
40
+ )"
41
+ ```
42
+
43
+ - During registration, choose **Send to a webhook**.
44
+ - Give Hermes the HTTPS webhook URL and the variable name
45
+ `AMBASSADOR_WEBHOOK_SECRET`.
46
+ - Hermes supplies `delivery.url` and `delivery.secret_env`; it never receives
47
+ the secret value.
48
+
49
+ Production still checks the exact MCP client and ACP identities in the compiled
50
+ profile, so a new incompatible release fails closed. See
51
+ [Qualification](qualification.md) for the artifact-specific compatibility
52
+ evidence.
@@ -1,83 +1,49 @@
1
1
  # Get started with OpenClaw
2
2
 
3
- Release target: `@embassys/ambassador@0.2.6`. The profile is source-reviewed
4
- against OpenClaw 2026.8.1. Real-agent direct and webhook qualification remain
5
- open under the one-release qualification exception in ADR 0015.
3
+ ## Before you start
6
4
 
7
- Ambassador enables OpenClaw only for this exact contract:
5
+ - Install Node.js `>=24.19.0 <25`.
6
+ - Install and authenticate OpenClaw `2026.8.1`.
7
+ - Make sure `openclaw` is on `PATH` for direct delivery.
8
+ - Ambassador never receives your provider credential.
8
9
 
9
- | Field | Value |
10
- | --- | --- |
11
- | MCP `clientInfo` | `openclaw-bundle-mcp` / `0.0.0` |
12
- | Delivery modes | direct and webhook |
13
- | Direct command | `openclaw acp` |
14
- | Accepted ACP `agentInfo` | `openclaw-acp` / `2026.8.1` |
15
- | Ambassador MCP in the direct session | provider configuration required |
10
+ ## Set up direct delivery
16
11
 
17
- The contract was reviewed at OpenClaw revision
18
- `a68a4e39684168cf83201cf48261be23174bad3d`. The source defines the MCP alias in
19
- [`agent-bundle-mcp-runtime.ts`](https://github.com/openclaw/openclaw/blob/a68a4e39684168cf83201cf48261be23174bad3d/src/agents/agent-bundle-mcp-runtime.ts),
20
- the ACP identity in
21
- [`acp/types.ts`](https://github.com/openclaw/openclaw/blob/a68a4e39684168cf83201cf48261be23174bad3d/src/acp/types.ts),
22
- and the command in
23
- [`acp-cli.ts`](https://github.com/openclaw/openclaw/blob/a68a4e39684168cf83201cf48261be23174bad3d/src/cli/acp-cli.ts).
24
- Later versions fail closed until the registry is reviewed and updated.
25
-
26
- ## Setup
27
-
28
- 1. Install Node.js `>=24.19.0 <25`, then install and authenticate OpenClaw
29
- 2026.8.1 using its normal provider setup. Ambassador never installs or
30
- updates OpenClaw.
31
- 2. Generate the local MCP token without putting its value in chat or a command
32
- argument:
33
-
34
- ```sh
35
- export AMBASSADOR_LOCAL_TOKEN="$(
36
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
37
- )"
38
- ```
39
-
40
- 3. If you may choose webhook delivery, create its secret in the same shell
41
- before starting Ambassador:
12
+ 1. From the directory OpenClaw may access, keep Ambassador running:
42
13
 
43
14
  ```sh
44
- export AMBASSADOR_WEBHOOK_SECRET="$(
45
- node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
46
- )"
15
+ npx --yes @embassys/ambassador@latest start
47
16
  ```
48
17
 
49
- 4. From the directory the direct agent may access, start the exact release and
50
- keep it running in the foreground:
51
-
52
- ```sh
53
- npx --yes @embassys/ambassador@0.2.6 start \
54
- --local-token-env=AMBASSADOR_LOCAL_TOKEN
55
- ```
56
-
57
- 5. Configure OpenClaw's MCP client to use the loopback endpoint printed by
58
- Ambassador, with a bearer token read from `AMBASSADOR_LOCAL_TOKEN`.
59
- OpenClaw's ACP interface does not accept session MCP injection, so this
60
- normal provider configuration is also required for direct delivery.
61
- 6. Ask OpenClaw to register with your email and optional display name. The
62
- first `register_agent` call contains `email` and, if wanted, `display_name`.
63
- Ambassador recognizes the OpenClaw profile and asks direct versus webhook,
64
- with direct as the default.
65
- 7. For direct mode, choose direct. The follow-up repeats the same `email` and
66
- optional `display_name` and adds `delivery: {"mode":"direct"}`. Ambassador
67
- records the canonical startup directory and rejects a later start from a
68
- different directory.
69
- 8. For webhook mode, choose webhook and provide the HTTPS receiver URL plus
70
- the environment-variable name `AMBASSADOR_WEBHOOK_SECRET`. The follow-up
71
- repeats the registration fields and adds `delivery.mode`, `delivery.url`,
72
- and `delivery.secret_env`; it never sends the secret value. Receiver-side
73
- conversion to an OpenClaw-native hook belongs outside Ambassador.
74
- 9. Enter the email verification code when OpenClaw asks for it. OpenClaw calls
75
- `verify_email` with that `email` and six-digit `code`; the central token and
76
- DPoP key stay inside Ambassador.
77
-
78
- OpenClaw receives neither the central token nor the DPoP private key. Never put
79
- the local token or webhook secret in chat or registration arguments.
80
-
81
- For the opt-in real-agent suite, configure this same provider-side MCP entry at
82
- `http://127.0.0.1:8787/mcp` using `AMBASSADOR_QUALIFICATION_LOCAL_TOKEN`; the
83
- runner verifies that OpenClaw calls it with the exact reviewed `clientInfo`.
18
+ 2. Add `http://127.0.0.1:8787/mcp` as a Streamable HTTP MCP server in
19
+ OpenClaw's normal MCP configuration. Do not configure authentication.
20
+ 3. Start or restart OpenClaw so it sees the MCP server.
21
+ 4. Ask OpenClaw to register your email; it calls Ambassador's `register_agent`
22
+ tool.
23
+ 5. Choose **Send directly to this OpenClaw agent**.
24
+ 6. Enter the six-digit code sent to your email.
25
+
26
+ Ambassador will launch `openclaw acp` when a central message arrives. OpenClaw
27
+ does not accept session MCP injection, so keep the provider-side MCP entry from
28
+ step 2 configured.
29
+
30
+ ## Use a webhook instead
31
+
32
+ - Before step 1, set the receiver secret in the same shell:
33
+
34
+ ```sh
35
+ export AMBASSADOR_WEBHOOK_SECRET="$(
36
+ node -e "process.stdout.write(require('node:crypto').randomBytes(24).toString('hex'))"
37
+ )"
38
+ ```
39
+
40
+ - During registration, choose **Send to a webhook**.
41
+ - Give OpenClaw the HTTPS webhook URL and the variable name
42
+ `AMBASSADOR_WEBHOOK_SECRET`.
43
+ - OpenClaw supplies `delivery.url` and `delivery.secret_env`; it never receives
44
+ the secret value.
45
+
46
+ The qualification probe records the installed version without rejecting it.
47
+ Production still checks the exact MCP client and ACP identities in the compiled
48
+ profile, so a new incompatible release fails closed. See
49
+ [Qualification](qualification.md) for compatibility evidence.
@@ -10,8 +10,11 @@ general reply operations. It does test the deployed, action-specific
10
10
 
11
11
  The runner covers the current package name, guided registration, one
12
12
  full-message webhook target, and one direct target. The default direct target
13
- is the deterministic mock ACP agent. A separately confirmed mode uses the
14
- fixed Codex profile and `codex-acp` 1.8.0 with an isolated Codex login.
13
+ is the deterministic mock ACP agent. Separately confirmed modes use the fixed
14
+ Codex or Hermes profiles and their supported exact agent and adapter versions.
15
+ Real-provider modes use isolated provider configuration copies. Their
16
+ installed-version probes are observational; the compiled-in production profile
17
+ still decides ACP compatibility by exact identity matching.
15
18
 
16
19
  ## Safety
17
20
 
@@ -25,10 +28,10 @@ fixed Codex profile and `codex-acp` 1.8.0 with an isolated Codex login.
25
28
  ## Required live checks after the cutover
26
29
 
27
30
  1. Pack and scan the exact candidate package.
28
- 2. Create two disposable identities through authenticated local MCP.
31
+ 2. Create two disposable identities through loopback local MCP.
29
32
  3. Use the exact enabled `clientInfo` aliases for one webhook profile and one
30
- direct profile. Prove the dual-mode registration result advertises direct
31
- as its default before choosing the required mode.
33
+ direct profile. Prove a dual-mode profile advertises direct as its default;
34
+ prove a direct-only profile proceeds without a delivery question.
32
35
  4. Receive and use both verification emails without persisting their codes.
33
36
  5. Restart and prove encrypted credential and nonsecret profile loading.
34
37
  6. Prove valid Bearer plus DPoP requests and the negative DPoP matrix.
@@ -70,11 +73,43 @@ export AMBASSADOR_CONFIRM_LIVE_QUALIFICATION=run-live-qualification-with-real-co
70
73
  pnpm run qualify:live
71
74
  ```
72
75
 
73
- The runner rejects an ordinary user home, checks the adapter version before it
74
- contacts central, uses the compiled-in Codex command and profile, and never
75
- accepts a command override. It also lets abandoned server-side polls expire
76
- after the restart check before it enqueues a message. Delete the isolated home
77
- after the run.
76
+ The runner rejects an ordinary user home, records the installed version when
77
+ one can be observed, uses the compiled-in Codex command and profile, and never
78
+ accepts a command override. The observation does not establish compatibility;
79
+ the exact ACP identity check remains authoritative. The runner also lets
80
+ abandoned server-side polls expire after the restart check before it enqueues a
81
+ message. Delete the isolated home after the run.
82
+
83
+ For Hermes, prepare an owner-only temporary home containing only `.hermes/.env`,
84
+ `.hermes/auth.json`, `.hermes/config.yaml`, and
85
+ `.hermes/shared/nous_auth.json` copied from the authenticated installation.
86
+ Remove unrelated MCP entries only from that copy. Put Hermes Agent 0.20.5 or
87
+ 0.21.0 and `hermes-acp` on `PATH`, then choose one fixed mode:
88
+
89
+ ```sh
90
+ export AMBASSADOR_HERMES_QUALIFICATION_HOME=/absolute/path/to/isolated/home
91
+ export AMBASSADOR_LIVE_DIRECT_AGENT=hermes-direct
92
+ export AMBASSADOR_CONFIRM_LIVE_QUALIFICATION=run-live-qualification-with-real-hermes-direct-and-two-disposable-mailosaur-identities
93
+ pnpm run qualify:live
94
+ ```
95
+
96
+ or:
97
+
98
+ ```sh
99
+ export AMBASSADOR_HERMES_QUALIFICATION_HOME=/absolute/path/to/isolated/home
100
+ export AMBASSADOR_LIVE_DIRECT_AGENT=hermes-webhook
101
+ export AMBASSADOR_CONFIRM_LIVE_QUALIFICATION=run-live-qualification-with-real-hermes-webhook-and-two-disposable-mailosaur-identities
102
+ pnpm run qualify:live
103
+ ```
104
+
105
+ The runner rejects the ordinary Hermes home and non-owner-only copies. It uses
106
+ exact MCP `clientInfo` `mcp` / `0.1.0`, launches only compiled-in
107
+ `hermes-acp` for direct mode, and configures Ambassador MCP only in the isolated
108
+ copy. The runner records the installed Hermes version when it can, but does not
109
+ use that observation as a compatibility gate; direct ACP identity matching
110
+ remains exact. Webhook mode starts Hermes's authenticated generic route,
111
+ requires its bearer filter and native HMAC V2 validation, and suppresses
112
+ provider output. Delete the isolated home after every attempt.
78
113
 
79
114
  ## Required report
80
115
 
@@ -148,6 +183,85 @@ behavior passed. The supported-Node repeat remains part of the qualification
148
183
  record even though the user approved 0.2.6 as a one-release exception before
149
184
  that repeat.
150
185
 
186
+ ## Hermes 0.20.5 observations
187
+
188
+ On 2026-09-03, Hermes Agent 0.20.5 ran on macOS 26.5.2 arm64 with Node
189
+ 24.19.0. Both live cases reviewed central source revision
190
+ `ac3f7a6e33829eb80301c7944f611d29cc2499b5`; the live deployment did not
191
+ expose its revision. The actual npm artifact was downloaded from the registry,
192
+ clean-installed, and used through its installed `ambassador` CLI. Its npm
193
+ integrity was
194
+ `sha512-qaL4IHTrMwpyrY1OisPXMexytmnNfO7Bjc5tXgLCF3LolXQW2R8GrzErqJkMIlM+Zh8Cce9ijN+zfYb3xiNHSQ==`,
195
+ its registry SHA-1 was `c0179df957bc05de921da578344fab6c1ba4a713`,
196
+ and its tarball SHA-256 was
197
+ `312b514ce2dd43de81502debd63004ea9a84da79099d4730c301b52e593c97c8`.
198
+ The installed CLI started without options, rejected a forbidden option, and
199
+ passed the packed-runtime scan.
200
+
201
+ The artifact-specific outcomes were:
202
+
203
+ | Delivery case | Ambassador artifact | Outcome |
204
+ | --- | --- | --- |
205
+ | Webhook | Published `@embassys/ambassador@0.2.7` | Passed the complete live round trip |
206
+ | Direct eligibility probe | Published `@embassys/ambassador@0.2.7` | Ambassador capability-registry rejection at `startup_failed`, as required by its exact 0.21.0 profile |
207
+ | Direct | Source candidate adding exact Hermes ACP 0.20.5 | Passed the complete live round trip |
208
+
209
+ The source-built direct candidate was not substituted for the published
210
+ artifact checks. Its tarball SHA-256 was
211
+ `1d434e8a5dbf027a42326a7e6b42a58094fe17cfdbf8cf96a4e7d314a24835be`,
212
+ and the direct qualification runner SHA-256 was
213
+ `7b6a680bba64abe8d86c9f2328a7562360b15def1eea1d7cf11f21d8f7dea24f`.
214
+ The final strict webhook pass used runner SHA-256
215
+ `e2506c09012f5e7bb3630acb70b5844be3a1769b5baaef3fc76dda07ed27c8c0`.
216
+ No later source change altered the direct profile or delivery implementation
217
+ used by that candidate.
218
+
219
+ Each pass registered and email-verified a controlled requester and the real
220
+ Hermes target through separate local Ambassador MCP endpoints, then restarted
221
+ both gateways and reloaded the encrypted credentials and delivery profiles.
222
+ The requester obtained `get_phone_number` permission, Hermes called
223
+ `respond_to_permission` with a grant, the requester called `call_action` with
224
+ approved synthetic data, and Hermes received the complete correlated
225
+ `action_call`. The real model called `submit_action_result` exactly once with
226
+ the supplied call ID, success status, and approved synthetic phone object.
227
+ The requester received the matching `action_response`. Local webhook custody
228
+ or ACP completion was observed before each corresponding central
229
+ acknowledgement.
230
+
231
+ Both modes passed Bearer plus DPoP behavior, the negative DPoP matrix, the
232
+ deployed six-action catalog, zero central MCP requests, artifact scanning, and
233
+ Mailosaur and temporary-state cleanup. Direct mode proved ACP v1 initialization
234
+ and injected Ambassador MCP. Webhook mode proved the Hermes receiver's bearer
235
+ filter, HMAC V2 authentication, and custody before acknowledgement. The normal
236
+ Hermes home was not changed; owner-only credential copies were removed after
237
+ the runs.
238
+
239
+ The live DPoP positive case needed no nonce. The deployed catalog names and
240
+ input-schema SHA-256 digests were:
241
+
242
+ | Action | Input schema SHA-256 |
243
+ | --- | --- |
244
+ | `create_calendar_event` | `4b9c97f146bfbb4c2cc1ec0812ada60406ce563d59c5abc807fcb6ba2dc0270c` |
245
+ | `get_email` | `032af9a4835a30e280f7c122f8971565b4e2527b25d9fcb0ad2f778f654aecbd` |
246
+ | `get_free_busy_permission` | `7775afae503f343ae09ed3510c66410cb361ea4125b28047d15321e7430f4f96` |
247
+ | `get_phone_number` | `6c7954b7f42f818db7f93433bd07dc2aac273bd4599a637d2233529c6149bc48` |
248
+ | `read_calendar_event_by_title` | `92ddb62ec62f187cdd1cfe0995d01afd06f283f2c174f6f24173083b1aab0d2f` |
249
+ | `read_calendar_permission` | `27deb9a2fbadef8582fa9036fa9bc4a173eeaa92034d0fab8f4e12b1dfdf0662` |
250
+
251
+ One earlier strict webhook attempt failed at
252
+ `action_response_webhook_timeout_failed` after the real target had granted the
253
+ permission, submitted one successful correlated result, accepted both target
254
+ messages, and received both target acknowledgements. Ambassador reported no
255
+ stderr. The safe evidence cannot distinguish central response queueing from a
256
+ consuming-poll delivery loss, so this is classified in the central REST
257
+ action-response delivery phase, not as Ambassador target delivery, Hermes
258
+ webhook custody, model execution, or MCP invocation. A fresh isolated rerun of
259
+ the same strict case passed. No compatibility fallback or replay was added.
260
+
261
+ These observations approve the source registry's exact Hermes ACP 0.20.5
262
+ entry. They do not show that published Ambassador 0.2.7 supports Hermes 0.20.5
263
+ direct mode. Ambassador 0.2.8 contains the candidate change.
264
+
151
265
  ## Earlier direct observation
152
266
 
153
267
  On 2026-09-02, real Codex had already passed delivery, injected Ambassador MCP
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embassys/ambassador",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "Local Ambassador for the Embassys agent network",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -46,6 +46,7 @@
46
46
  "clean": "node scripts/clean.mjs",
47
47
  "format": "biome check --write .",
48
48
  "lint": "biome check .",
49
+ "probe:agents": "node scripts/probe-agent-versions.mjs",
49
50
  "qualify:agents": "node scripts/qualify-agents.mjs",
50
51
  "qualify:live": "node scripts/live-qualification.mjs",
51
52
  "test": "pnpm run test:build && node scripts/run-tests.mjs",