Skip to content

docs(release): a release is not done at the tag (XS) - #605

Merged
EtanHey merged 1 commit into
mainfrom
docs/release-done-definition
Sep 7, 2026
Merged

docs(release): a release is not done at the tag (XS)#605
EtanHey merged 1 commit into
mainfrom
docs/release-done-definition

Conversation

@EtanHey

@EtanHey EtanHey commented Sep 7, 2026

Copy link
Copy Markdown
Owner

A release is not done at the tag

size:XS, docs only — one block added to docs/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 cmuxlayer still resolved stable: 0.4.70, so the release was not installable by anyone and brew upgrade was a no-op — leaving #600's merge SHA (2332faa) served by nothing on either Mac, with zero /mcp reconnect receipts, 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.sh on 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 serving serverInfo 0.4.71 plus the new six-field send_to description. 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.md right 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 info stable version), installed on every Mac (keg version + daemon Cellar path), and served (MCP serverInfo.version and shipped behaviour, plus /mcp reconnect cmuxlayer on 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
  • line 272: The statement that every per-seat MCP process keeps serving the old build until /mcp reconnect is no longer true for normal brew-installed proxies. CmuxLayerProxy.start() starts a version-bump watcher, and an eligible stale brew child drains then execves the installed entrypoint while preserving its handshake (src/proxy.ts lines 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) ]

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>
@cursor

cursor Bot commented Sep 7, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 25 minutes.

Check out review usage here.

View limit details

Limit 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.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Team

Run ID: 46dfa192-f4b0-46e5-991b-fe9d1696eed7

📥 Commits

Reviewing files that changed from the base of the PR and between 96fed5f and 6c3344e.

📒 Files selected for processing (1)
  • docs/releases-and-brew.md

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Daemon performance budget: SKIPPED

None of the 1 changed file(s) can affect daemon runtime, so the benchmark was not run.

The budget stays strict on any diff touching: src/, benchmarks/, scripts/bench-daemon, scripts/check-daemon-benchmark, package.json, bun.lock, package-lock.json, tsconfig, .github/workflows/ci.yml.

Comment thread docs/releases-and-brew.md
Comment on lines +266 to +268
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 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.

Suggested change
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.

@deepsource-io

deepsource-io Bot commented Sep 7, 2026

Copy link
Copy Markdown

DeepSource Code Review

We reviewed changes in 96fed5f...6c3344e on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

PR Report Card

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.

@EtanHey EtanHey added the size:XS Tight-loop PR size: 20 or fewer hand-written lines changed label Sep 7, 2026
@EtanHey
EtanHey merged commit aa35ee4 into main Sep 7, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS Tight-loop PR size: 20 or fewer hand-written lines changed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant