Skip to content

Commit bbd6f00

Browse files
author
Developer
committed
V2.10.63: Hermes Agent attach smoke (credential-free)
Mirrors the V2.10.62 IronClaw attach-smoke pattern for the Hermes lane (the default Agent Desktop runtime). 3 new files + 1 BRANDING entry, no source code changed. - tests/hermes-agent-attach.smoke.test.ts: 11 cases pin the V2.10.61 diagnoseRemoteConnection contract (6 diagnostic codes, 3 runtime resolutions, security-floor invariant: probe never reads HERMES_TEST_TOKEN from the env, never forwards it as a header or query string). Mocks are a local node:http listener, the credential layer is owned by the apply boundary. - docs/hermes-agent-attach.smoke.md: operator runbook, 5 steps, read-the-key-from-shell-var pattern, no key ever echoed in the doc, side-by-side with the V2.10.62 IronClaw runbook. - scripts/hermes-agent-attach.smoke.cjs: operator CLI for live verification; reads HERMES_TEST_TOKEN from env, prints PASS/FAIL with hints, masks the key to a 4-char prefix + ellipsis + 4-char suffix in any output. - BRANDING_AND_LICENSE.md: V2.10.63 entry with the 6-code contract, the security-floor invariant, the 4-audit baseline, and the out-of-scope list (no Docker Desktop attach panel, no diagnoseRemoteConnection refactor, no live Hermes attach on this dev box). Verified: typecheck 0/0, hermes 11/11, ironclaw 5/5, presets 9/9, orchestration 2/2, mojibake 813/813, i18n 8/8 (no new keys), skill-counts clean, doc-pair same 5 baseline, no real credentials on disk in any tracked file.
1 parent 4ee26b8 commit bbd6f00

4 files changed

Lines changed: 1038 additions & 0 deletions

File tree

BRANDING_AND_LICENSE.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2270,3 +2270,130 @@ CLI invocation. The in-repo smoke pins the security-floor
22702270
invariant that the probe never picks up auth from env; the
22712271
operator runbook documents the live verification path
22722272
without ever holding the token in the committed tree.
2273+
2274+
2275+
---
2276+
2277+
## V2.10.63 - Hermes Agent attach smoke (credential-free)
2278+
2279+
**Scope:** 3 new files (1 test + 1 doc + 1 operator script).
2280+
**No source code changed.**
2281+
2282+
**What changed (V2.10.63):**
2283+
2284+
1. **`agent-desktop/tests/hermes-agent-attach.smoke.test.ts`** (new,
2285+
11 cases). Credential-free unit smoke that proves:
2286+
- The V2.10.61 `diagnoseRemoteConnection` function is
2287+
importable from `src/main/hermes.ts`.
2288+
- It resolves `runtime: "hermes"` on a 200 `/health`
2289+
response, with `ok: true`, `code: "ok"`,
2290+
`transport: "remote"`, `statusCode: 200`.
2291+
- It returns `code: "auth"` on a 401 `/health` response,
2292+
with `runtime: "hermes"` still set (auth failure is
2293+
recoverable, not "wrong server").
2294+
- It falls back to `runtime: "openclaw"` on a 404
2295+
`/health` + 200 `/v1/models` with the openclaw model
2296+
shape.
2297+
- It returns `code: "wrong-port"` on a 404 `/health` + 200
2298+
`/v1/models` with a non-openclaw body.
2299+
- It returns `code: "openclaw-compat-disabled"` when
2300+
`expectedRuntime === "openclaw"` and the host exposes a
2301+
wrong-port shape on `/v1/models` (the operator picked the
2302+
OpenClaw lane, but the host did not serve it).
2303+
- It returns `code: "unreachable"` on a refused
2304+
connection.
2305+
- The probe module **does not** read `HERMES_TEST_TOKEN`
2306+
from the env and does not forward it as a header or
2307+
query string. The credential is owned by the apply
2308+
layer (`Settings.tsx`) at the form-input boundary.
2309+
- When the caller passes an apiKey (the apply layer does,
2310+
on every Test-Connection click), the probe forwards it
2311+
as `Authorization: Bearer <key>`.
2312+
2313+
2. **`docs/hermes-agent-attach.smoke.md`** (new). Operator
2314+
runbook that walks the operator through:
2315+
- The security floor (read first).
2316+
- Step 0: verify Hermes is running on the local loopback
2317+
port (8642) with a plain curl.
2318+
- Step 1: read the local `API_SERVER_KEY` from
2319+
`~/.hermes/profiles/<profile>/.env` into a shell
2320+
variable (without ever echoing the value in this doc).
2321+
- Step 2: point the probe at the live Hermes.
2322+
- Step 3: run the operator-side script and read
2323+
PASS/FAIL with hints.
2324+
- Step 4: attach from the Agent Desktop remote panel.
2325+
- Step 5: clean up the shell env.
2326+
- A side-by-side comparison table with the V2.10.62
2327+
IronClaw runbook so an operator can read one and
2328+
immediately know how to run the other.
2329+
2330+
3. **`scripts/hermes-agent-attach.smoke.cjs`** (new).
2331+
Operator-side Node CLI that probes the live Hermes, reads
2332+
the API server key from
2333+
`process.env.HERMES_TEST_TOKEN` (or `HERMES_TEST_URL` for
2334+
the host/port/path override), and prints PASS/FAIL with
2335+
operator-actionable hints. The key is never logged.
2336+
The only key-shaped output is a 4-char prefix + ellipsis
2337+
+ 4-char suffix (e.g. `desk…8c`).
2338+
2339+
**Verification:**
2340+
2341+
- `npm run typecheck` (node + web): 0 errors.
2342+
- `tests/hermes-agent-attach.smoke.test.ts`: 11/11 pass with
2343+
no env var, 11/11 pass with `HERMES_TEST_TOKEN` set to a
2344+
sentinel. The "hides the bearer token" case asserts the
2345+
probe never picks up the sentinel.
2346+
- `tests/ironclaw-attach.smoke.test.ts`: 5/5 pass (V2.10.62
2347+
contract still holds).
2348+
- `tests/gateway-runtime-presets.test.ts`: 9/9 pass.
2349+
- `tests/runtime-orchestration.test.ts`: 2/2 pass.
2350+
- `node scripts/check-mojibake.cjs`: 813 files, 0 issues
2351+
(was 810; +3 for the 3 new files).
2352+
- `node scripts/check-i18n-coverage.cjs`: 8 locales, 0 new
2353+
missing keys (no locale files touched).
2354+
- `node scripts/skill-counts.cjs`: clean.
2355+
- `node scripts/check-doc-pair.cjs`: same 5 known baseline
2356+
drift items, no new drift.
2357+
- Final credential scan: no real credentials on disk in
2358+
any tracked file. No test sentinel on disk in any
2359+
tracked file. The two real IronClaw credentials posted
2360+
in earlier chat remain only in the chat transcript
2361+
(which the agent cannot un-ring; the runbook's Step 0
2362+
flags rotation).
2363+
2364+
**Out of scope (deliberate):**
2365+
2366+
- **The Docker Desktop attach panel** is still not rendered
2367+
in Welcome.tsx (clean V2.10.64+ candidate; see V2.10.61
2368+
BRANDING entry).
2369+
- **Replacing the existing `diagnoseRemoteConnection`**
2370+
surface. The smoke pins the V2.10.61 contract; any future
2371+
refactor that changes the diagnostic code set must update
2372+
the runbook + test + script in lockstep.
2373+
- **Saving the API server key in any file, including
2374+
`.env`.** The runbook is explicit that the key lives only
2375+
in the shell's `process.env.HERMES_TEST_TOKEN` for the
2376+
duration of one CLI invocation.
2377+
- **Verifying the live attach against a real Hermes
2378+
install on this dev box.** The dev box has `~/.hermes`
2379+
runtime-home data (sessions, profiles, memories,
2380+
SOUL.md) but no Hermes binary on PATH; same constraint
2381+
as the V2.10.62 IronClaw smoke. The operator-side
2382+
runbook is the verification path; an operator with a
2383+
Hermes install can run it on their host.
2384+
2385+
**Why this is the right V2.10.63 step:**
2386+
2387+
The V2.10.61 connect-to-remote-gateway form has three
2388+
lanes (Hermes / OpenClaw / IronClaw). V2.10.62 covered
2389+
the IronClaw lane with a credential-free unit smoke +
2390+
operator runbook. V2.10.63 applies the same pattern to
2391+
the Hermes lane — the most important lane, because Hermes
2392+
is the default Agent Desktop runtime. The Hermes probe
2393+
(`diagnoseRemoteConnection`) is also a more complex
2394+
surface than the IronClaw probe (`probeLocalModelHealth`):
2395+
it has 6 diagnostic codes, 3 runtime resolutions, and a
2396+
security-floor invariant around the local connection-
2397+
config fallback path. The 11-case smoke pins each of
2398+
those without ever touching a real Hermes install or a
2399+
real API server key.

0 commit comments

Comments
 (0)