0.16.1 — no more silent delivery loss; per-node signing
0.16.1
- Fixed the two delivery-loss mechanisms behind #86, validated live on all
three platforms:- Every delivery path now writes the per-node activity file (shared
_activity_lineformat), so a lifecycle hook deferring behind a plain
mesh watchpresence holder wakes on delivery instead of starving and
dying silently when the watch exits. - Transport checkpoints (cursor + replay fingerprint) run only after the
delivery handoff — inline after a successful emit for standalone
watches, deferred until after the hook's own output in hook relay mode.
A death before handoff leaves the frame re-deliverable: at-least-once
instead of silent loss. Undeliverable frames are consumed exactly once
and leave a visible activity trace. - Activity previews decode message envelopes (not just tasks), keeping
the watch and MCP writers in agreement.
- Every delivery path now writes the per-node activity file (shared
- The agent-session watch warning now names the one-shot
mesh watch --timeoutre-arm fallback for harnesses where the hook
cannot wake yet; the defer-mode wake summary mentions the CLI drain
commands for sessions without MCP tools. - Known limb, tracked in #90: on Windows the harness-spawned async
claude-hook process exits instantly and never receives — with this
release that degrades to delayed redelivery, never loss; the one-shot
re-arm loop remains the Windows posture.
This release also ships everything from 0.16.0, which was never published (PyPI latest was 0.15.1):
0.16.0
- Per-node message signing (#62 phase 2): every node holds its own ed25519
key, signs its outbound frames over the wire AAD + payload, and classifies
inbound frames against a locally-pinned identity (verified / unverified /
unsigned / mismatch). Trust is trust-on-first-use; the receive path is
NON-ENFORCING — it surfaces a verdict and pins peers but drops no frame.
Enforcement + the downgrade ratchet are still pending (#74). A node
generates its key on first send, so upgrading an existing node is enough. - Owner keys are passphrase-protected by default (#64): minting an approval then needs the passphrase on the terminal, which a harnessed agent cannot answer — so an owner signature proves a human acted, not just that a process read the key.
owner-init --no-passphrasekeeps the old unprotected key (loudly warned);owner-trust --replacerotates the trusted owner key. - Owner-trust now prints a SHA256 fingerprint and requires a terminal
confirmation before pinning; the owner private key's permissions are
asserted (POSIX mode + Windows ACL). - Bound the replay ledger with time-based eviction (#77); mesh status shows
the held count. - mesh peek no longer mislabels expired large-message attachments as
[UNVERIFIED] (#65). mesh watch --followwarns when it would be a write-only pipe in an agent
session; join steers to the lifecycle hook (#57).mesh mcp-serve --harnessresolves identity from the pin at each startup,
somesh iamrenames take effect (#59, #60).- The generated .gitignore now uses a
.meshwire.*glob, closing a gap that
left the owner private key stageable.