From 30ca36c922fe96a1e4b95b1bb278f5a243252d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Guti=C3=A9rrez?= <35082514+alezmad@users.noreply.github.com> Date: Sat, 26 Sep 2026 21:16:48 +0100 Subject: [PATCH] chore(cli): 1.38.0 Co-Authored-By: Claude Opus 5.5 --- apps/cli/CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++++++++++ apps/cli/package.json | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index e98257e..5e9a149 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,46 @@ # Changelog +## 1.38.0 (2026-09-26) — messages reach the session they're meant for + +Source: flexicar-orchestrator report (9 bugs on 1.37.0) + "peers spread +messages to the wrong peers". Spec: +`.artifacts/specs/2026-09-26-session-identity-and-routing.md`; E2E drill: +`.artifacts/test-runs/2026-09-26-session-routing-drill.md`. Includes 1.37.1. + +### Wrong-peer noise (the root thread) +- Channel meta: `from_pubkey`/`from_id` are the sender's **session** key + (they carried the member key, so replies fanned out to every sibling + session); new `from_member_pubkey`. The skill now says reply to `from_pubkey`. +- One daemon resolver for every `/v1/send`: a member key maps to its only + live session, is refused with candidates when it has several, and needs + `--fanout` (expanded client-side to one DM per session). Duplicate names / + prefixes are ambiguous instead of first-match; control-plane rows are never + addressable. +- A session MCP without a resolved session no longer receives every sibling's + events; a broadcast now reaches each session exactly once. +- Broker logs member-key DMs from older clients (`member_target_dm`); + `CLAUDEMESH_MEMBER_DM_POLICY=reject` refuses them. + +### Session identity (bug1, bug3) +- A resumed/restarted claude re-attaches itself (MCP startup, auto-heal in + `send`, new `claudemesh session reattach`) with its persisted key, anchored + on claude's pid. The token lives next to the keypair, not the launch tmpdir. +- `send` never goes out silently as the member from inside a session + (`--as-member` to do it on purpose); the daemon answers 401 `session_unknown`. +- Keys don't change behind a session's back: one id per launch, non-UUID ids + persisted, daemon reload is load-only, no 24 h registry TTL. + +### Fixes +- bug2: undecryptable ciphertext is never injected into a session (dropped + + logged, or a placeholder for topic posts); drained pushes carry sender + + topic like live ones. +- bug4: outbox caps `session_ws_not_open` (from 1.37.1). +- bug5: `topic history` decrypts like `topic tail`. +- bug6: topic posts are labelled by the session that wrote them. +- bug7: a confirm-gated command without a TTY says why it stopped (`--yes`). +- bug8: the short id `send` prints resolves in `message status`. +- bug9: DMs to control-plane rows say so; `peer list --all` tags them. + ## 1.37.1 (2026-09-08) — daemon restart no longer blacks out the mesh Incident: after the local daemon restarted (launchd respawn), `peer list` diff --git a/apps/cli/package.json b/apps/cli/package.json index fc75043..824ec91 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "claudemesh-cli", - "version": "1.37.1", + "version": "1.38.0", "description": "Peer mesh for Claude Code sessions — CLI + MCP server.", "keywords": [ "claude-code",