Skip to content

Chorus v0.3.0

Choose a tag to compare

@raphael raphael released this 30 Oct 06:39
· 68 commits to main since this release
05ac14b

Chorus (github.com/goadesign/chorus) is a multi-agent coordination Model Context Protocol (MCP 2026-07-28) server built on Goa-AI and Pulse. v0.3.0 adds persistent Redis state across daemon restarts, suppresses self-echoes on send/read/chorus watch, automatically installs the Chorus Agent Skill (SKILL.md) via chorus setup, and adds client/server version inspection (chorus version and chorus status).

Highlights

1. Persistent Redis State & Zero-Drop Daemon Restarts

Previously, when chorus serve auto-started a local redis-server instance, it used an ephemeral temporary directory with persistence disabled and stopped Redis when chorus serve exited. If an in-flight read(wait_sec) long-poll delayed HTTP shutdown during chorus down && chorus up, the exiting server could stop the shared redis-server after the new server had already connected to it, wiping active swarms while GET /healthz continued returning a static 200 OK.

  • Persistent Detached Local Redis (~/.chorus/redis): Auto-started local redis-server subprocesses and Docker containers now persist data under ~/.chorus/redis (--appendonly yes --save 60 1) and run detached in their own session (Setsid: true), so channels, message streams, agent roles, and read watermarks survive chorus down && chorus up and binary upgrades.
  • Immediate Long-Poll Cancellation & Clean Process Handover: http.Server.BaseContext cancels in-flight read(wait_sec) requests immediately on SIGINT/SIGTERM, and stopBackgroundService waits for the old server PID to exit before returning.
  • Truthful /healthz Probe (Service.Ping): GET /healthz now verifies Redis connectivity via Service.Ping (with a 500ms timeout) and returns 503 Service Unavailable when Redis is unreachable or the service is closed.

2. Sender Self-Message Suppression

Previously, when an agent published a channel message—especially an @all broadcast—while running a concurrent background chorus watch or blocking read(wait_sec), the stream head notification fired before the sender's read watermark advanced, waking the sender's own watcher and echoing its own message back.

  • No Self-Echoes or Self-Wakeups: publish now drains pre-existing unread messages before acquiring the target semaphore, appendUnderSemaphore advances the sender's read watermark (cur:<sender>:<target>) to seq before writing mention keys or committing head:<target>, and readTargetDelta skips messages authored by the reading agent (strings.EqualFold(msg.Sender, agent)) while still advancing the sequence watermark. Agents never receive their own sent messages back on send, read, or chorus watch.

3. Automatic Skill Installation (chorus setup) & Version Inspection

Agents in environments without the Chorus skill installed sometimes attempted to invoke MCP tool names (chorus who, chorus send, chorus read) as CLI subcommands instead of calling the Chorus MCP server.

  • Automatic SKILL.md Installation: chorus setup installs the embedded skills/chorus/SKILL.md into .agents/skills/chorus/SKILL.md (project) and, with -global, into ~/.agents/skills, ~/.cursor/skills, ~/.gemini/config/skills, ~/.claude/skills, and ~/.codex/skills.
  • Self-Correcting CLI Guidance: Running chorus who|join|leave|send|read on the command line now returns an explicit error directing the agent to call the Chorus MCP tool directly (and to use chorus watch -agent <handle> only for background shell listening).
  • Client & Server Version Reporting:
    chorus version   # or chorus -version / --version / -v -> chorus v0.3.0
    chorus status    # -> running v0.3.0 (http://localhost:9440/mcp)
    chorus up inspects X-Chorus-Version on GET /healthz and automatically restarts the background daemon when the running server version mismatches the installed binary.

Install or Upgrade

No manual configuration migration is required. Run the installer or go install to upgrade both the binary, global skills, and background daemon:

curl -fsSL https://raw.githubusercontent.com/goadesign/chorus/main/scripts/install.sh | sh

Or via Go:

go install github.com/goadesign/chorus/cmd/chorus@v0.3.0
chorus setup -global
chorus up