Verification¶
Tests and coverage¶
make testbuilds and runs the suite.make coverageenforces 100 percent statements, branches, functions and lines (vitest.config.tssets the thresholds). CI runs it on ubuntu and macOS with Node 20 and 22.
Benchmark¶
node scripts/bench.mjs dist prints p50 and p95 for a hook run, a CLI send, a 10-way fan-out, status over 50 sessions and a pull over 100k historical deliveries, plus burst throughput.
On 2026-10-20 (Apple M2 Pro): hook 52 ms, send 74 ms, fan-out 0.33 ms, status 22 ms, pull 0.04 ms, 6900 sends/s.
Live checks¶
make verify CLI=<cli> with cli one of claude, codex, gemini, hummin, opencode, zcode (or node scripts/live/<cli>.mjs [model]) runs one live check against the real CLI in tmux: an isolated broker, the exact files murmur install writes (loaded as project config, so your real CLI config is only read for auth), one owner message, and a PASS or FAIL per step judged from the broker's own records. It spends a few cents of model calls.
| Check | What it proves | Last result (2026-10-20) |
|---|---|---|
claude |
Two sessions announce with native transports; one message to both goes sent, delivered (tag in each transcript), replied; each reply reaches the owner who asked and not the other session; /murmur stores $(...), backticks, quotes, ! and $HOME verbatim |
PASS, haiku, replies in about 3.6 s |
codex |
The session announces with its thread id; codex queue reaches the running window; transcript proof; reply through the MCP tool |
PASS, gpt-5.6-luna, 6.2 s |
hummin |
The extension injects, acks delivered, carries the reply; the model-free /murmur |
PASS, zai/glm-5.3-flash, 6.0 s |
opencode |
The plugin announces, injects with promptAsync, acks delivered, carries the reply |
PASS, opencode 1.19.3, opencode/glm-5.3-flash-free, reply in 5.2 s (the readiness check can take up to 60 s on the first start after an upgrade) |
gemini |
SessionStart announces; the message waits queued; BeforeAgent hands it over; reply through the MCP tool | Skipped by the owner on 2026-10-20: needs GEMINI_API_KEY (Gemini CLI 0.58 refuses the legacy personal login) |
zcode |
Hooks fire under workspace trust; the session announces; one message is handed over by a hook and answered | BLOCKED: the provider answers 429 "Insufficient balance or no resource package. Please recharge." and the session never announced in headless mode, so whether hooks fire under -p is unverified |
Evidence behind the Claude native path¶
The binary's own injection recipe, a live single-session spike, and a live two-session run settled the frame format. The write-up is in the repository's DESIGN.md.
zcode check notes¶
scripts/live/zcode.mjs uses headless -p prompts, because the zcode.cjs in the app bundle fails to start its TUI ("Cannot find package '@zcode/tui'"). It sets ZCODE_BUILTIN_PROVIDER_CONFIG_FILE to <app>/Contents/Resources/config/provider/zcode-builtin.json, since without it zcode.cjs cannot locate its provider config. It grants workspace hook trust with zcode hooks trust grant --workspace <dir> --all-current --bundle-digest <d>, revokes it afterwards, and deletes the trust store if the check created it.