v3.27.0

ruvnet/ruflov3.27.0Jul 14, 2026by ruvnet

AI Summary

A minor release fixing the daemon flywheel bug to prevent duplicate AI worker launches across worktrees.

Key Highlights

  • Cross-worktree job deduplication keyed on repository ID and worker config.
  • Global launch budget shared across daemons to prevent race conditions.
  • AI workers made opt-in rather than auto-launching.
  • New 'daemon stop --all' command to stop all instances.
  • Hook-handler fallback fix matching the session-restore template.

New Features

  • AI job deduplication
  • Global launch budget
  • Daemon stop all command
  • Cross-worktree optimization

Full Release Notes

## Highlights

**Daemon flywheel fix** (#2661) — opt-in AI workers, a global cross-daemon launch budget, cross-worktree job dedup, and `daemon stop --all`. Fixes the cardinality bug where N git worktrees of one repository scheduled N independent, uncapped AI worker launches.

- `git-workspace-identity.ts` — resolves a stable `repositoryId` shared across all worktrees of one repo (via `git rev-parse --git-common-dir`), separate from the per-worktree path.
- `ai-job-dedup.ts` — cross-worktree job dedup keyed on `sha256(repositoryId, head, workerType, configHash)`, backed by a shared registry at `~/.claude-flow/ai-jobs.json`.
- `global-ai-budget.ts` — a global launch budget (max concurrent + hourly cap) shared by every daemon on the machine, so the dedup optimization has a hard backstop even when two daemons race the same key.
- AI workers are now opt-in rather than auto-launching.
- `daemon stop --all` stops every daemon instance, not just the one bound to the current cwd.

**Hook-handler fallback fix** — the inline `hook-handler.cjs` fallback template (used when copying the real package helper fails) now spawns the funnel-refresh helper from `session-restore`, matching the fix already shipped in the hand-maintained helper.

## Verified after publish

- All three packages (`@claude-flow/cli`, `claude-flow`, `ruflo`) live at 3.27.0 on `latest`/`alpha`/`v3alpha`.
- Confirmed the macOS jetsam-kill/kernel-panic statusline fix (#2448) is intact: a real `npx @claude-flow/cli@3.27.0 init` produces a `settings.json` with zero `npx @claude-flow/cli@latest` invocations in any hook or the statusline — everything resolves a local binary directly via `node`.

## Packages

| Package | Version |
|---|---|
| `@claude-flow/cli` | 3.27.0 |
| `claude-flow` | 3.27.0 |
| `ruflo` | 3.27.0 |


## Follow-up

- Full technical writeup of the daemon flywheel bug + fix: https://gist.github.com/ruvnet/f4cda824aaf58e1f2dae72368e692220
- Issue thread + implementation-vs-spec gap notes: [#2661](https://github.com/ruvnet/ruflo/issues/2661#issuecomment-4965479851)
- Follow-up fixes landed in v3.27.1–v3.27.4: marketplace-checkout install validation (`dist/src/index.js` check + npx fallback for the funnel/advisor refresh), version-display max-candidate selection, baked-in version fallback for pure-npx renders, and persistent AgentDB memory on by default at `init` time.