Two fixes, both found by someone hitting them rather than by us.
#3196: an explicit database path now selects that database. The bridge cached one
registry globally, so the first caller decided the file for the whole process and
every later caller's --path or CLAUDE_FLOW_DB_PATH was accepted and then silently
ignored. A CLI write and an MCP write landed in two files, both reporting success,
and neither interface could see the other's rows. The 'memory list' command also
stopped
printing a confident total for one store while rows sat unread in its sibling —
it now names the store it did not read. Reported downstream by pacphi/agentic-kit#213.
#3267: Seraphina no longer passes a truncated reasoning dump off as coordination
guidance. The routed model spent its whole token budget reasoning and never
emitted its JSON, and the empty result read as "the swarm needs nothing" — the
one conclusion a coordinator must never reach by accident.
Claude-Session: https://claude.ai/code/session_013u4pmL9ZUAXb6usVQgNo67
Ships #3250: the agentbbs MCP tools gated on `await import('agentbbs')`, but the
published package is a CLI-only launcher with no importable entry point, so all
four federation_bbs_* tools reported degraded regardless of install state.
Replaced with a subprocess probe.
Includes the follow-up hardening: the probe's shell is now gated to win32
instead of always on. The probed binary comes from AGENTBBS_BIN, and under a
shell that argument is command-interpreted, so a crafted value executed a
trailing command (verified locally). POSIX now spawns without a shell.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_013u4pmL9ZUAXb6usVQgNo67
* fix(security): make the fast-uri CVE fix actually reach shipped packages (#3222)
3.39.1 bumped fast-uri only in the ROOT package.json. Post-publish validation
caught that this never reached users: a fresh `npm install ruflo@3.39.1`
still resolved fast-uri@3.1.5, squarely inside the advisory range
(GHSA-5jgf-p345-68v8, high, CVSS 7.5, >=3.1.3 <3.1.6).
Root cause: v3/@claude-flow/cli/package.json carried its own hard pin
"fast-uri": "3.1.5" in dependencies, and that is the package that actually
ships. The root bump did not override it -- the #2112 lesson recorded in
CLAUDE.md, that root overrides do NOT propagate to the published ruflo
wrapper, applies to the CLI package too.
- v3/@claude-flow/cli: fast-uri 3.1.5 -> ^3.1.6 (the shipping dependency)
- ruflo: add "fast-uri": ">=3.1.6" override so the wrapper cannot regress
independently of the CLI
Verified by fresh-installing the published tarball rather than trusting the
lockfile: that is what surfaced the gap in the first place.
Refs #3222, #2112
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01JJnDvpYYk2rTvjkudQUoCk
* fix(ci): refresh v3 pnpm lockfile for the fast-uri bump
The 3.39.2 fast-uri change touched v3/@claude-flow/cli/package.json but only
the npm lockfile was regenerated. v3/ is a separate pnpm workspace and CI runs
pnpm install --frozen-lockfile with working-directory: v3, which rejected the
mismatch (ERR_PNPM_OUTDATED_LOCKFILE) and cascaded into 34 failing checks --
every one an install failure, not a real regression.
Diff is 6 lines, fast-uri only: specifier 3.1.5 -> ^3.1.6, resolved 3.1.7.
Verified pnpm install --frozen-lockfile now exits 0.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01JJnDvpYYk2rTvjkudQUoCk
* fix(memory): stop reporting a gated native bridge as the active backend (#3228)
On Windows the #3024 kill-switch makes getRegistry() return null, so every
memory read/write silently falls back to the sql.js store (memory.db) instead
of the AgentDB corpus (agentdb-memory.db) the bridge would have opened. The
reporter measured the consequence: a canary store/retrieve round-trip SUCCEEDS
because both halves use the same unintended file, while an existing live-store
key returns found:false against 31,673 real rows.
The status surface hid the substitution. getHNSWStatus() gated its bridge
branch on whether the bridge MODULE was loaded -- which it is, even when the
registry is gated off -- so describeBackend() printed "sqlite (bridge,
brute-force cosine)" for a store the bridge never touched.
Gate on whether the bridge is permitted to be the active path rather than on
whether the module resolved. shouldDisableNativeBridge() is sync and a pure
function of platform + env, so it is a faithful discriminator and needs no
warm registry. describeBackend() now names the gate and its reason, so an
upgrade that changes which file receives writes says so.
This does not fix the opt-in allocation abort (#2948) or reroute the fallback
to the AgentDB corpus; both need Windows validation. It makes the silent case
loud, which is what the report asks for first.
Also bumps fast-uri 3.1.5 -> ^3.1.6 (resolves 3.1.7), clearing
GHSA-5jgf-p345-68v8 (high, host confusion via skipped IDN canonicalization)
and the ajv high that inherited it. Same change as #3222 by @aeonframework,
applied here because CI was never authorized to run on that PR.
Refs #3228, #3222, #2948, #3024
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01JJnDvpYYk2rTvjkudQUoCk
* chore(release): 3.39.0 -> 3.39.1
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01JJnDvpYYk2rTvjkudQUoCk
Ships the ADR-322C receipt number-domain fix (#3229 / #3235).
MINOR rather than patch: receipt output changes shape (fractional
candidatePolicy values become scale-12 decimal strings) and
policySchemaVersion moves v1 -> v2, so pre-fix receipts refuse promotion
with 'policy schema changed'. Not MAJOR because no CLI surface or MCP tool
signature changed.
Existing signed receipts stay valid as history and are deliberately NOT
migrated — re-encoding changes the content, hence the ID, hence invalidates
the signature. Re-establish a champion through the explicit reset path,
which already requires confirmation and a recorded reason.
Validated end to end against the built dist before publishing: a receipt
carrying the exact candidatePolicy from #3229 encodes to
{"alpha":"0.3","subjectWeight":1,"mmrLambda":"0.5","bodyWeight":"1.5",
"typePenaltyFactor":"0.5"}, contains zero fractional JSON numbers anywhere
in the payload, and verifies VALID.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01J2s8oQsAZjJtJ6inoYRFPj
Patch release covering the six commits landed since 3.38.21:
- #3221 gate EnhancedModelRouter's forwarded modelId on tier match
- #3169 wire embedding-cosine into SmartRetrieval's MMR step
- #3184 wire real cold-start measurement, drop the fabricated V2-vs-V3 benchmark
- #3177 bound two ReDoS patterns, stateless PII regexes, O(P) confidence pass
- #3204 fix two stale main-tree Test Suite failures
- #3203 add v3/@claude-flow/mcp to the root npm workspaces
3.38.22 is intentionally skipped: @claude-flow/cli's publish for that version
stuck in npm's "staged" state (published umbrellas, cli 404) and the registry
refused to republish over it even after unpublish, so all three packages moved
to .23 together to restore version lockstep.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_01Ff2xRKvYrqXJhefvcapfE1
Root package.json and v3/@claude-flow/cli/package.json pin
@claude-flow/mcp@3.0.0-alpha.10 (since 16b0dc4d5, release 3.38.17), but
the registry only has 3.0.0-alpha.1/7/8/9, and v3/@claude-flow/mcp was
the one bundled package not listed in the root workspaces (codex,
plugin-agent-federation and security are). Root `npm ci` therefore hit
the registry and failed with ETARGET on main and on every PR since
2026-08-22, before any test ran.
Listing the package as a workspace member makes npm resolve it locally
(lockfile entry: `"node_modules/@claude-flow/mcp": {"resolved":
"v3/@claude-flow/mcp", "link": true}`), matching how the other three
bundled packages already resolve. No version change; the pin stays
alpha.10 and the tarballs still bundle it.
Found by the 2026-09-05 PR-review mission (agent pr-review-ruflo):
verified in main's own Test Suite job and in 3 red jobs on #3177.
Claude-Session: https://claude.ai/code/session_019xHM4rAH4aaShb4DTr1n6s
Same defect as v3/@claude-flow/cli's package.json, already fixed in
68a9c9f6a: pinned to an unpublished 3.0.0-alpha.10 instead of the real
published ^3.0.0-alpha.9. Harmless in practice (bundled via
bundleDependencies + workspace link, verified npm install works either
way) but wrong to leave uncorrected. No republish needed for this alone.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_018ZkgSrVRWNMcXmaFiMZ7Z8
A subagent I spawned earlier (intended only to relay a status message)
went out of scope and independently ran its own full fix/verify/publish
cycle in parallel with mine on this same checkout, racing my edits. Between
its publish and a set of stale-cached `claude-flow daemon` background
processes self-healing package.json mid-write (#3005), @claude-flow/cli
was published twice in a row (3.38.17, 3.38.18) with a broken
`@claude-flow/mcp` dependency pin, and 3.38.18 additionally shipped
entirely missing the `@claude-flow/memory` dependency. claude-flow and
ruflo were published at 3.38.18 too, inheriting the same defect.
3.38.19 is the verified-correct cut: @claude-flow/mcp repinned to
^3.0.0-alpha.9 (published, has the #2990 fixes), @claude-flow/memory
present at ^3.0.0-alpha.23 (has the #2977 fix). Deprecating 3.38.17/3.38.18
on npm as a follow-up; this commit does not touch the doc/metadata files
that raced independently of the version bump.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_018ZkgSrVRWNMcXmaFiMZ7Z8
3.38.17 was published by a concurrent session mid-race with a stale
package.json (the @claude-flow/mcp pin had been reverted to the broken
3.0.0-alpha.10 by a background helper-refresh process just before publish;
see #3005). npm forbids republishing over an existing version, so cutting
3.38.18 with the verified-correct pin instead of trying to fix 3.38.17.
Also discovered @claude-flow/memory is NOT in @claude-flow/cli's
bundleDependencies (unlike @claude-flow/mcp/codex/security/plugin-agent-federation)
-- it's resolved from the registry via a normal ^3.0.0-alpha.22 semver range,
and that exact version is what's currently published, without the #2977 fix
from 8a8500194. Bumping @claude-flow/memory to 3.0.0-alpha.23 and re-pinning
@claude-flow/cli to ^3.0.0-alpha.23 so the fix actually reaches users --
otherwise 3.38.18 would ship pointing at an unfixed memory dependency.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_018ZkgSrVRWNMcXmaFiMZ7Z8
Fixes#2990's root cause at the publish layer: v3/@claude-flow/cli and the
claude-flow umbrella both pinned @claude-flow/mcp to 3.0.0-alpha.10, a
version that was never published (npm registry tops out at alpha.9). Since
@claude-flow/mcp is bundled (bundleDependencies) via a pnpm workspace link,
this didn't affect the monorepo build, but it broke plain `npm install`
against the published packages and left package.json/pnpm-lock.yaml
out of sync with what's actually resolvable. Repinned to ^3.0.0-alpha.9
(the real latest, which already carries the protocolVersion-string fix)
and regenerated v3/pnpm-lock.yaml accordingly.
Co-Authored-By: RuFlo <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_018ZkgSrVRWNMcXmaFiMZ7Z8
Cuts a release train off main after the 3 dream cycles landed unversioned:
- #3062 dream(swarm): bound MessageBus retry attempts, fix unreachable
message.failed (closes#3061)
- #3057 dream(memory): hybridSearch controller reachable via explicit
opt-in — was silently null-returning despite config flag
(closes#3056)
- #3049 dream(intelligence): discounted Thompson sampling for
model-router bandit — opt-in prior decay recovers faster after
workload shift (closes#3048)
No code changes in this commit — just the version bump across all three
publishable package.jsons.
Claude-Session: https://claude.ai/code/session_0118jMsYhwHD5dx2vStENsEB
Cuts a release train off main after the following PRs landed unversioned:
- #3060 fix(cli): honor MCP tool selection when listing (closes#3055)
- #3076 fix: resolve Claude Code launches on Windows (closes#3071)
- #3077 fix(hooks): persist real session-end state (closes#3063)
- #3044 dream(security): #3043 advisory scanner for untrusted settings.json
hooks/allow-rules — CVE-2025-59536-class defense-in-depth,
advisory-only (non-blocking), hardened against 6 concrete critic
bypasses.
No code changes in this commit — just the version bump across all three
publishable package.jsons.
Claude-Session: https://claude.ai/code/session_0118jMsYhwHD5dx2vStENsEB
Root cause: bridgeStoreEntry's post-write cache set stored only a partial
entry shape — { id, key, namespace, content, embedding } — with no `tags`,
no timestamps, no metadata, no access_count. The DB row itself had the
tags JSON-serialized correctly. But any subsequent bridgeGetEntry hit the
cache first and returned `tags: cached.tags || []` = `[]`, so
`memory_store({ tags })` → `memory_retrieve()` looked like it silently
dropped tags.
Fix: replace the partial write-through with cache invalidation. The next
read then re-fetches the row via the DB reader (which correctly parses
the tags JSON column) and repopulates the cache from the full shape.
Cleaner than expanding the write-through payload — future entry-shape
fields don't need to remember to update the cache-write signature.
Regression test verifies: store {tags:[a,b,c]} → get returns {tags:[a,b,c]}.
Proven to catch the bug: pre-fix the test fails (tags: [] returned);
post-fix it passes.
The same defect would have caused reads to see access_count stuck at 0
and drifted createdAt/updatedAt timestamps from the moment the cache
was first populated until eviction; cache invalidation fixes those too.
Release
- Bumps @claude-flow/cli, claude-flow, ruflo: 3.38.13 → 3.38.14 (PATCH).
Claude-Session: https://claude.ai/code/session_0118jMsYhwHD5dx2vStENsEB
Bug fixes
- #3045 statusline.cjs: getGitInfo() runs the 5-command git chain per render;
on large repos with concurrent Claude Code sessions this queued subprocesses
faster than they finished (reporter observed hundreds of orphan children +
load-avg in the hundreds). Added a per-cwd tmp file cache with 5s TTL —
dirty status still feels live, pileup is bounded.
- #3064 hooks post-task: the narrow ad-hoc regex /^[a-zA-Z0-9_-]+$/ silently
dropped every colon-namespaced plugin agent (ruflo-core:reviewer,
feature-dev:code-explorer, ...) — i.e. every Claude Code plugin agent. The
canonical validateIdentifier() upstream already allows ':' and '.', so the
redundant regex is removed. Regression test locks in 4 agent-shape cases,
proven to catch the bug: 2 pass / 2 fail on revert, 4 pass with fix.
- #3065 harness-gepa SKILL.md: unquoted colon in `description` broke YAML
parsing in `npx skills add`. Quoted the description; rephrased the bare
"(default:" to avoid the leading colon.
New plugin: ruflo-deepseek-harness
- plugins/ruflo-deepseek-harness/: sibling to ruflo-metaharness (ADR-150
shape). Two skills: `deepseek-chat` (non-reasoning) and `deepseek-reason`
(surfaces reasoning_content separately). Reads DEEPSEEK_API_KEY from env;
degrades gracefully (exit 0 with `{status: 'degraded', reason, hint}`)
when the key is missing or the API is unreachable. `--alert-on-error`
flag opts into hard exit 1 for CI gates. Smoke-tested locally.
Release
- Bump @claude-flow/cli, claude-flow, ruflo: 3.38.12 → 3.38.13 (PATCH:
bug fixes; the new plugin is scaffolding under plugins/ and not part of
the npm-published CLI packages).
Not fixed
- #3051 memory_store tags: current source's memory_store handler passes
tags straight through to storeEntry; a maintainer already verified live
round-trip works on fa13ee4ad. Reporter has not yet supplied the
ruflo/@claude-flow/cli version that hosted the affected MCP server,
so the affected release path is unknown. Left as-is pending that reply.
Claude-Session: https://claude.ai/code/session_0118jMsYhwHD5dx2vStENsEB
Ships #2989 (init --all-agents/--skip-claude/--only-claude/--cloud-mcp
were dead kebab-case flag reads) and #2991 (CLI hooks post-task
dropped the ADR-130 reinforced-by graph edge due to an unawaited
fire-and-forget write racing process.exit(0)).
Co-Authored-By: RuFlo <ruv@ruv.net>
Ships #2988: `hooks intelligence --train` now actually distills
(#2940) instead of printing a canned success message with no state
change behind it.
Co-Authored-By: RuFlo <ruv@ruv.net>
Publishes #2986 (fix(migrate): correct removed-agent install suggestion
and add `migrate fix --agents` restore, #2985) and #2987 (fix(mcp): mcp
start -t http exits after false-success table + doc drift, #2984). Pure
bug fixes, no breaking changes -> PATCH per repo semver policy.
@claude-flow/cli, claude-flow, ruflo published in lockstep at 3.38.2,
all three dist-tags (latest/alpha/v3alpha) verified against the live
registry, published tarball pulled and confirmed to contain both fixes.
Co-Authored-By: RuFlo <ruv@ruv.net>
Publishes the #2983 fixes (#2982/#2976 unordered LIMIT truncation in
memory search, #2968 sql.js persistence honesty). Pure bug fixes, no
API/behavior additions -> PATCH per repo semver policy.
Also corrects package-lock.json's top-level version field, which had
drifted to a stale 3.35.0 independent of this bump.
@claude-flow/cli, claude-flow, ruflo published in lockstep at 3.38.1,
all three dist-tags (latest/alpha/v3alpha) verified against the live
registry.
Co-Authored-By: RuFlo <ruv@ruv.net>
Parts A/B/C: pinned ruflo-core's marketplace-plugin MCP launch path
(local-bin-first resolver, mirroring hook-handler.cjs), registered 3
plugins missing from marketplace.json, implemented ADR-128's promised
`ruflo migrate` removed-agent detection, and shipped a warn-only CI
guard (scripts/smoke-init-scaffold-references.mjs) plus a deterministic
remap of 701 dead `npx claude-flow` references across 142 scaffold files.
Ref: #2971, ADR-382
Minor bump (not patch) because #2927/#2928 add backward-compatible CLI
flags (--routing-mode, --passthrough), not just bug fixes:
- fix(proxy): bump pinned meta-proxy release 0.4.0 -> 0.7.3 (#2925)
- fix(proxy): fall back to tar when Expand-Archive fails on Windows (#2926)
- fix(proxy): disclose what enabling cloud routing decides, --routing-mode (#2927)
- fix(proxy): make the passthrough plane reachable again after cloud routing (#2928)
Co-Authored-By: RuFlo <ruv@ruv.net>
@claude-flow/cli, claude-flow, and ruflo were published at 3.36.0 (and
@claude-flow/memory at 3.0.0-alpha.22, carrying the #2887 durability fix)
without the version bump landing back in git — this just reconciles the
committed package.json versions with what's actually live on npm, and bumps
the cli's @claude-flow/memory floor to the version that has the fix.
No code changes.
Co-Authored-By: RuFlo <ruv@ruv.net>
Minor bump: this release folds in PR #2956 (MetaHarness hardening — repair
the dependency contract, strict sequential promotion evidence, ADR-381) plus
a follow-up commit on that PR fixing 3 concurrency/epoch-boundary bugs found
during review that could silently violate the <=5% family-wise
false-promotion guarantee. All backward-compatible additions (new
optionalDependencies, new doctor checks, new CLI/MCP surface) — no breaking
changes, hence minor not major.
Also fixes a stale test assertion in distill-oracle.test.ts: the darwin
bench-run command now embeds the pinned @metaharness/darwin version
(MH_DARWIN_PIN) per the #2561 cold-npx regression guard, so the test's bare
'darwin bench run' substring check no longer matched the intentional pinned
output ('darwin@0.8.3 bench run').
Three-package lockstep bump (@claude-flow/cli, claude-flow, ruflo) per
CLAUDE.md's Publishing Rules, backed by scripts/audit-umbrella-version-lockstep.mjs.
CHANGELOG.md documents ADR-378/379/380 (AGNTCY runtime, npm Trusted
Publishing workflow, statusline segments) and the SLIM alpha-pin fix,
carried in main since the 3.33.0 release.
Co-Authored-By: RuFlo <ruv@ruv.net>
Adds the live Ruflo capability brain, governed federation and Cognitum product planes, source-bound concurrent harness contracts, ADRs 325-329, and the v3.32.28 guarded release train.