Repository navigation
Chorus v0.3.0
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 localredis-serversubprocesses 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 survivechorus down && chorus upand binary upgrades. - Immediate Long-Poll Cancellation & Clean Process Handover:
http.Server.BaseContextcancels in-flightread(wait_sec)requests immediately onSIGINT/SIGTERM, andstopBackgroundServicewaits for the old server PID to exit before returning. - Truthful
/healthzProbe (Service.Ping):GET /healthznow verifies Redis connectivity viaService.Ping(with a 500ms timeout) and returns503 Service Unavailablewhen 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:
publishnow drains pre-existing unread messages before acquiring the target semaphore,appendUnderSemaphoreadvances the sender's read watermark (cur:<sender>:<target>) toseqbefore writingmentionkeys or committinghead:<target>, andreadTargetDeltaskips 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 onsend,read, orchorus 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.mdInstallation:chorus setupinstalls the embeddedskills/chorus/SKILL.mdinto.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|readon the command line now returns an explicit error directing the agent to call the Chorus MCP tool directly (and to usechorus 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 upinspectsX-Chorus-VersiononGET /healthzand 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 | shOr via Go:
go install github.com/goadesign/chorus/cmd/chorus@v0.3.0
chorus setup -global
chorus up