Skip to main content

Verification log

What has been checked, how, and what has not. Machine checks run on every bash scripts/gate.sh 6. Live checks were run by a person on a real tailnet with real Claude Code sessions. Host names and ids are left out.

Machine checks (2026-10-28)​

CommandLast line
bash scripts/gate.sh 0 to gate.sh 6GATE 0 PASS to GATE 6 PASS
bash scripts/smoke.shSMOKE PASS
bash scripts/e2e.shE2E PASS

The gate covers: clean install with a frozen lockfile, typecheck, build, the Vitest suite (tests are tagged per design item and counted; skipped, focused or todo tests fail the gate), static checks (no bind-guard bypass, no SQLite in the shim, no permission relay), the smoke and end-to-end scripts, launchd plist lint, unit rendering, README and handoff checks, and the client setup script in dry-run mode.

systemd-analyze --user verify was skipped: not available on macOS.

Live checks (2026-10-28)​

Numbers follow the repo's handoff checklist. Items 10 and 13 are open; see Not verified.

#CheckResult
1Port registry entry for 47910 and 8443Done. A check that nothing else listens on them is still owed.
2Bus host chosenA laptop for now; an always-on host later.
3Tailnet HTTPS certificatesEnabled; tailscale cert issued a certificate. .Self.CertDomains still read null on macOS.
4ACL grantGrant on tcp:8443 between tagged machines, plus two policy tests; read back.
5Bus host checkoutClean clone, install, build; gate.sh 6 printed GATE 6 PASS.
6Install and exposelaunchd unit running; tailscale serve on 8443. Over HTTPS: /healthz 200, unauthenticated POST /mcp 401, authenticated tools/list 200, bad token 401. (The tool list then had 6 tools; unregister was added later.)
7Principal and tokensPrincipal created; a 90-day token stored in 1Password via the stdin pipe; read back by item id.
8Client entry on the bus hostbus Connected; a fresh claude -p listed the bus tools; grep -c sbus_ ~/.claude.json is 0; the token's last_used_at was set. Without the service-account override the helper failed to connect, as expected.
9Second machineUnauthenticated POST over HTTPS returned 401. Its own bus entry and token Connected. Round trip: the bus host sent message 1 to a session on the second machine, which read it, acked it and replied with message 2, read back on the bus host.
11Push entrybus-push Connected; leak check 0; a plain unnamed claude created no shim files; a named launch with the channels flag registered and the model answered with its session name. Stdio servers inherit claude's environment, so the --mcp-config fallback is not needed. Found: the channels flag is ignored while both telemetry variables are set.
12Push to an idle sessionOn the bus host: with the session idle, a message from another session appeared as ← bus-push: ... within one poll interval; the model replied over the bus and acked with session=<meta.to>; doctor showed unacked: 0.

Docs checks (2026-10-29)​

Run while writing this site:

  • session-bus --help output and the exit codes for usage errors (2), a refused bind (2), an unknown session in doctor (1), --ttl-days 91 (1), and backup onto an existing file (1).
  • Default token lifetime: 90 days.
  • setup-client.sh --dry-run and install-unit.sh --dry-run --systemd output.
  • The getting started path: a local serve, a token in SESSION_BUS_TOKEN, a headersHelper entry with no token in it, and claude -p --mcp-config calling register, send and inbox successfully.

Not verified​

  • Client checkout on the second machine for push. Pull works there (check 9); push from or to the second machine has not been run.
  • Push across machines. Push to an idle session was seen on the bus host only.
  • HTTP channels experiment. Whether an HTTP MCP server can register as a channel is untested. ADR 0001 still records deferred-human.
  • systemd. The unit renders and passes static checks, but has not been run on Linux.
  • Direct tailnet bind in a live deployment. The bind guard is unit-tested with a stubbed tailscale; the live deployment used tailscale serve.
  • User-scope ${VAR} expansion in Claude Code entries. The default headersHelper path does not depend on it.
  • --mcp-config with the channels flag. Whether server:<name> resolves a server defined only there.
  • Plugin route. /sb:session-bus via the plugin marketplace has only been tried lightly. The npm package is private and nothing is published. The skills release workflow has not run on GitHub.
  • Long-running behaviour. No soak test, no load test, no benchmark.