Skip to content

0.16.1 — no more silent delivery loss; per-node signing

Choose a tag to compare

@husker husker released this 22 Jul 21:17
298ef6a

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_line format), so a lifecycle hook deferring behind a plain
      mesh watch presence 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.
  • The agent-session watch warning now names the one-shot
    mesh watch --timeout re-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-passphrase keeps the old unprotected key (loudly warned); owner-trust --replace rotates 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 --follow warns when it would be a write-only pipe in an agent
    session; join steers to the lifecycle hook (#57).
  • mesh mcp-serve --harness resolves identity from the pin at each startup,
    so mesh iam renames take effect (#59, #60).
  • The generated .gitignore now uses a .meshwire.* glob, closing a gap that
    left the owner private key stageable.