docs(release): a release is not done at the tag (XS) - #605
Conversation
v0.4.71 was tagged and merged while the tap was never bumped, so brew still resolved stable: 0.4.70, the release was not installable, and #600's merge SHA was served by nothing with zero reconnect receipts -- while the lane read as done because the tag existed. The manual steps were already correct; they were stopped at step 3. This adds the definition of done -- tag pushed, tap published, installed on every Mac, served by the installed binary -- so the gap cannot recur as a judgement call. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_6891f5cb-2d5c-490b-9a04-17d7ae1f5c0c) |
|
Warning Review limit reachedNext included review available in 25 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Team Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Daemon performance budget: SKIPPEDNone of the 1 changed file(s) can affect daemon runtime, so the benchmark was not run. The budget stays strict on any diff touching: |
| 3. **Installed on every Mac** — `brew list --versions cmuxlayer` is X.Y.Z, and the running daemon's | ||
| path is `Cellar/cmuxlayer/X.Y.Z/libexec/dist/daemon.js`. The daemon replaces itself on upgrade; | ||
| confirm the path rather than assuming it. |
There was a problem hiding this comment.
🟢 Low docs/releases-and-brew.md:266
Step 3 rejects a valid fresh installation when no daemon process exists, because the daemon starts on demand and has no Cellar/.../daemon.js path until a client connects. Make the path check conditional on the daemon running, leaving process startup to step 4.
| 3. **Installed on every Mac** — `brew list --versions cmuxlayer` is X.Y.Z, and the running daemon's | |
| path is `Cellar/cmuxlayer/X.Y.Z/libexec/dist/daemon.js`. The daemon replaces itself on upgrade; | |
| confirm the path rather than assuming it. | |
| 3. **Installed on every Mac** — `brew list --versions cmuxlayer` is X.Y.Z. If the daemon is running, its | |
| path is `Cellar/cmuxlayer/X.Y.Z/libexec/dist/daemon.js`; no daemon process is valid before step 4 | |
| because it starts on demand. |
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @docs/releases-and-brew.md around lines 266-268:
Step 3 rejects a valid fresh installation when no daemon process exists, because the daemon starts on demand and has no `Cellar/.../daemon.js` path until a client connects. Make the path check conditional on the daemon running, leaving process startup to step 4.
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| JavaScript | Sep 7, 2026 12:14p.m. | Review ↗ | |
| Shell | Sep 7, 2026 12:14p.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
A release is not done at the tag
size:XS, docs only — one block added todocs/releases-and-brew.md.What happened. v0.4.71 was tagged and its release PR (#604) merged today, but the Homebrew tap was never bumped.
brew info cmuxlayerstill resolvedstable: 0.4.70, so the release was not installable by anyone andbrew upgradewas a no-op — leaving #600's merge SHA (2332faa) served by nothing on either Mac, with zero/mcp reconnectreceipts, while the lane read as done because a tag existed.The procedure was already correct. Steps 4–7 in this same document already covered computing the sha256, bumping the formula, syncing the tap clone, and running
release-verify.shon each Mac. Nothing was missing from the steps. It was stopped at step 3, and nothing in the document said that stopping there was not a release.So this adds the definition of done rather than another step: tag pushed → tap published → installed on every Mac → served by the installed binary, each with the check that proves it. Plus the part that is easy to miss even after upgrading: per-seat MCP servers are separate processes from the daemon, so a seat keeps serving the old build until
/mcp reconnect— and that must be verified on screen, because the send receipt reports only that text was typed.Now closed out for real: tap #55 merged, M4 on 0.4.71 with daemon pid 5743 from
Cellar/0.4.71, and the installed binary verified servingserverInfo 0.4.71plus the new six-fieldsend_todescription. The M1 remains outstanding.— cmuxlayerClaude-70bfff64 (lead) · claude/claude-opus-5[1m]
Note
Low Risk
Documentation-only change to release runbook; no code, build, or install behavior changes.
Overview
Adds a definition of done to
docs/releases-and-brew.mdright after the manual release steps, clarifying that pushing a tag (steps 1–3) does not ship anything runnable.The new block states a release is complete only when four checks pass in order: tag pushed, Homebrew tap published (
brew infostable version), installed on every Mac (keg version + daemonCellarpath), and served (MCPserverInfo.versionand shipped behaviour, plus/mcp reconnect cmuxlayeron every seat because MCP children can keep old code after upgrade).It documents the v0.4.71 incident (tag merged without tap bump) as motivation — the existing procedure was fine but stopping at step 3 was mistaken for “released.”
Reviewed by Cursor Bugbot for commit 6c3344e. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Document release completion states and verification checks in release guide
Adds a release-completion section to releases-and-brew.md that separates tag creation, tap publication, local installation, and serving into distinct release states. Documents concrete checks for the Git tag, Homebrew stable version, installed Cellar daemon path, and MCP server version. Notes that each Claude seat must reconnect because per-seat MCP processes can keep serving a previous build, and records the v0.4.71 failure where the tap was not bumped.
📊 Macroscope summarized 6c3344e. 1 file reviewed, 2 issues evaluated, 1 issue filtered, 1 comment posted
🗂️ Filtered Issues
docs/releases-and-brew.md — 1 comment posted, 2 evaluated, 1 filtered
/mcp reconnectis no longer true for normal brew-installed proxies.CmuxLayerProxy.start()starts a version-bump watcher, and an eligible stale brew child drains thenexecves the installed entrypoint while preserving its handshake (src/proxy.tslines 407-415 and 1307-1403). Thus a seat can move to the new build automatically; requiring a manual reconnect on every seat makes this release procedure and its definition of done inaccurate. [ Out of scope (post-validation triage) ]