Repository navigation
v2026.10.5
·
2289 commits
to main
since this release
Update now: run
cleo self-update. This release ships releases through a canary first, makescleo loginthe one setup step on a new machine, and fixes a regression that let a second full build run beside the first.
Highlights
- Releases go through a canary before
latest(#1847). Each stable version is first published as a release candidate under npm'scanarytag, installed from npm into a throwaway sandbox and health-checked. Only then is it published tolatest, all through OIDC with no npm token. A failed soak leaves users on the previous release. Try a candidate withnpm i -g @cleocode/cleo@canary. cleo loginis the one setup step (#1939). After you sign in,cleo loginlinks the project you are in and takes its first encrypted backup, or lists your cloud projects on a new machine.cleo cloud verify --deepdownloads the snapshots again and re-hashes them (#1947), and output that shows server-supplied names strips terminal control characters (#1958).- CLEO tells you when an update is out. An installed CLEO prints a notice on stderr when a newer release exists, and a hotfix gets a stronger notice (#1840, #1849).
- Less work at startup and in tests. More CLI commands start without loading the whole core library (#1855, #1859, #1868, T13126), and test runs started through CLEO refuse to grow into a whole-suite run (T13203, T13236).
Also in this release
- One full build machine-wide again (#1899, T13237): fixes the P0 regression from #1865 where a second full build could start beside the first.
- Backups: the global store gets backups and restore, backups restore onto the live
cleo.db(#1917, T13245, T13286), and the global-backup lock now outlasts a blockingVACUUM INTO(#1948, T13293). - Cloud: presence refreshes during normal CLI use, hourly and best-effort with no daemon (#1942, T13289);
cloud statusandcloud projects showlist the devices holding a project (#1943, T13290);cleo project linkregisters a new project with its v1 key once the matching cleo-nexus release is live (#1795, T13101). - Init and upgrade: the adapter install step that never ran is removed (#1883, T13128).
- CI and release tooling: arch gates, lint workflows, Lockfile Check and the changeset lint now run inside required CI, so a failing gate blocks the merge (#1929, #1930, #1932, #1937; T13263, T13279, T13281); PR unit shards run the changed packages and their dependents (#1821, T13142); darwin PRs run 2 macOS shards and macOS Build & Verify gets a 20-minute timeout (#1822, #1866, #1869; T13143, T13198, T13205); flaky tests are re-run once, then filed and quarantined (#1819, T13145);
ci:<pr>evidence accepts the jobs that cover a PR's changed paths (#1844, T13175); gate 36 compares migrations with the merge-base (#1951, T13294); checkouts are blobless with 5-minute lint timeouts (#1971, T13310). - Sync journal work (Stage C: change journal, apply/rebase, genesis cut, push/pull and related fixes) is merged but ships flag-gated and off by default:
sync.seal,sync.push,sync.pullandsync.strictstay in UNRELEASED_FLAGS.
Added
- cleo cloud verify --deep downloads the snapshots again and re-hashes their bytes and the journal tail (provenance: T13291)
- cleo doctor sync-triggers reports triggers that reference a missing table or column, and --repair fixes what CLEO owns (provenance: T12754)
- An installed CLEO announces a newer release on stderr, and a release planned as a hotfix gets a stronger notice every 15 minutes (provenance: T13137)
- A stable release reaches npm latest only after its release candidate installs from npm and passes a sandbox soak, all through OIDC with no npm token (provenance: T13144, T13181)
- A hotfix is flagged in @cleocode/cleo's published manifest by release.yml, from the plan's releaseKind, instead of a manual npm dist-tag (provenance: T13184)
Changed
- Every agent surface (CLEO-INJECTION.md, ct-cleo, the spawn prompt) now gives one governed path for tests, typechecks and builds: cleo run --wait --class, never a wrapper around cleo run or cleo verify, never raising heap or worker counts, targeted evidence over whole suites (provenance: T13134)
- Store tests now run with foreign keys ON, as production does; getDb no longer turns them off under vitest, and fixtures that seed out of FK order opt out explicitly with optOutOfForeignKeys(). (provenance: T13228)
Fixed
- Cloud human output strips terminal control sequences from server-supplied names and messages (provenance: T13295)
- Exodus copies each legacy source inside a rule-1 capture bracket and marks the sync set suspect; the bracket applies rule 2 to declared rebuilds, so a parent rebuild no longer cascade-deletes its children (provenance: T12785, T12774)
- A vault pull or restore now retires this store's replica as a vault restore and records it for S4; cloud status, projects show and restore name the retired replicas (provenance: T13109)
- cleo dash, stats and the other admin commands load about 640-970 modules and ~150 MB instead of ~3,000 and ~260 MB (provenance: T13126)
- cleo memory observe drops from ~710 MB to ~315 MB; no worker isolate or embedding model in one-shot commands (provenance: T13126)
- Runtime code imports contracts values from their leaf modules, so a store open no longer loads every contracts zod schema (provenance: T13126)
- verify, deps, tree, orchestrate, memory find, docs, nexus and doctor no longer load all of CORE; ~115-225 MB instead of ~255-280 MB (provenance: T13126)
- cleo check arch no longer demands a full build; gate 39 skips locally without a current build and CI enforces it (provenance: T13126)
- cleo show, find, list and current dispatch without loading the CORE barrel (provenance: T13126)
- cleo show, find, list and current load about 450 modules and ~135 MB instead of ~820 and ~190 MB (provenance: T13126)
- Opening a store reads and hashes each migration lineage once, not about a dozen times (provenance: T13126)
- cleo add, update and other mutations no longer fetch models.dev on every call; cleo config get ~120 MB instead of ~250 MB (provenance: T13126)
- Every cleo command loads less; cleo --version drops to 64 modules and about 55 MB (provenance: T13126)
- cleo add, update, start, complete, next and focus no longer load all of CORE; ~150-240 MB instead of ~260-295 MB (provenance: T13126)
- macOS memory pressure is now visible to admission: the darwin backend grades a kernel warning by RAM squeeze and swap and scores running out of headroom in absolute bytes, so the existing budget narrowing and cleo run's pause at backoff finally act on a Mac whose swap is nearly full, without flagging laptops that merely carry old swap (provenance: T13127)
- Core's utils-consuming dist files are emitted per file again, so a process holds one copy of each core module (provenance: T13129)
- A whole-suite run no longer takes the whole machine budget: heavy runs plan for half of it, every run is charged what its plan lets it start, a single-file test run takes one worker's share, CPU saturation narrows only heavy runs, and status marks whole-suite runs with their project and task (provenance: T13132)
- One admission ledger replaces the tool semaphore's slots, the governor's test/build/full-build slots, cleo run's per-class queues and the darwin one-slot rule: every heavy run shares one machine-wide memory budget and one FIFO queue, a run nested in an admitted run rides its admission (verified by process ancestry, not an env var), and a waiter blocked for a minute names the holders and any suspected wait cycle (provenance: T13133)
- Evidence scoping ignores CLEO's own hook files and project-declared runtime state, so they no longer force a full suite (provenance: T13135)
- The janitor reads a process's start time correctly when its name contains spaces, so an MCP server titled by npm keeps its grace period (provenance: T13146)
- A deferred migration from the legacy stores can no longer strand their data (provenance: T13158)
- A long-running cleo command that outlives an in-place upgrade keeps its exit code instead of crashing after its work is done; CLI chunk names may use any case (provenance: T13159)
- when the CLI cannot load the code that finishes a command, it prints the upgrade/reinstall notice only for a genuinely missing module, and any other load error as itself (provenance: T13159)
- cleo changeset add now quotes a summary that is not a plain YAML scalar (colon-space, quotes, backticks, newlines) and parses the rendered file back before writing, so it can no longer write a changeset the changeset lint rejects. (provenance: T13163)
- A failed mutation now writes its audit_log row, and the CLI's error exits no longer kill pending hook writes or buffered telemetry (provenance: T13164)
- cleo briefing loads ~710 modules and ~190 MB instead of ~3,000 and ~260 MB; cleo session status ~175 MB instead of ~320 MB (provenance: T13166)
- An aborted migration from the legacy stores can no longer strand their data (provenance: T13167)
- No CLEO code path calls a SignalDock host any more (SignalDock is retired), and cleo conduit peek no longer acks the messages it shows (provenance: T13169)
- A busy CPU no longer defers the sentient tick or other db-heavy work; the governor budgets every class but heavy test and build runs on memory pressure alone (provenance: T13170)
- The exodus write guard lifts per legacy source, so no table takes writes while its own copy is pending; a store no trigger can guard refuses the open (E_EXODUS_GUARD_FAILED); a deferral that ended in an abort refuses as the abort (provenance: T13171)
- superseded-store --reconcile recovers a legacy task whose id a newer task took, instead of silently skipping it (provenance: T13172)
- A merged PR that edits a CI workflow is attested by main's push CI; cleo done no longer plans a local whole-suite run for it (provenance: T13174)
- cleo release reconcile completes the existing release row for the version instead of failing on UNIQUE tasks_releases.version (provenance: T13176)
- A legacy task the reconcile recovered stays recovered after you retitle it, and cleo show says where it went (provenance: T13183)
- The main-push macOS run is no longer cancelled by the next push, so main gets a macOS verdict; release open names the newest main commit with a green macOS run (provenance: T13187)
- A run nested under an admitted run whose start time was never recorded rides its admission only with the holder's token (provenance: T13188)
- the evidence tool runner refuses to start a tool from inside a test runner (provenance: T13203)
- cleo doctor reports what an old CLEO left in the user-global Claude settings, with the manual removal steps; it never edits that file (provenance: T13221)
- the Claude Code adapter writes its hooks, plugin enable and hook scripts to the project's .claude/ only and can no longer write the user-global ~/.claude/settings.json (provenance: T13227)
- a project rooted at your home directory no longer gets CLEO's instruction block in ~/CLAUDE.md, ~/AGENTS.md or another provider instruction file, which providers load into every session under $HOME (provenance: T13227)
- cleo doctor also finds hand-written CLEO safestop hooks and says "no matcher" when an entry has none; cloud status counts this replica's folded transactions in the last sealed seq (provenance: T13221, T12998)
- cleo run refuses a whole-suite test run nobody asked for (a vitest run naming nothing, an empty or '.' filter, or pnpm test) unless --whole-suite, and refuses to start anything inside a test runner (exit 8) (provenance: T13236)
- cleo restore backup --snapshot | --id restores the live cleo.db safely; --file tasks.db no longer reports a restore that wrote a file nothing reads (provenance: T13240, T13258)
- the core agent installer links a project's agents into the project's .claude/agents and can no longer write the user-global ~/.claude/agents (provenance: T13241)
- backup recover and restore-by-id now restore the live cleo.db; the global store gets backups and a restore path; backup add writes one cleo.db copy (provenance: T13245, T13258, T13286)
- only the brain writer isolate writes an observe-time embedding directly; any other worker thread goes through the chokepoint (provenance: T13246, T13230)
- only the brain writer isolate re-points CLEO_DIR to each op's project; other worker threads keep their own (provenance: T13251, T13246)
- cleo init/upgrade, caamp instructions inject/update and CAAMP injectAll no longer write project instruction files in your home directory; Cursor's hooks are skipped there too (provenance: T13257)
- caamp's advanced instruction update reports a $HOME project as skipped, the same way cleo init does, instead of throwing (provenance: T13257)
- The legacy JSON import (cleo upgrade from todo.json) no longer fails tasks whose provenance session, parent or dependency comes later in the files; it runs in one transaction with foreign keys deferred, and drops every dangling reference with a warning naming it. (provenance: T13259)
- cleo run's whole-suite guard reads each matched workspace package's test script for pnpm -r / --filter, and follows a root script that delegates to them (provenance: T13277, T13241)
- cleo run's whole-suite guard follows pnpm's filter semantics for exclusions (--filter '!foo' selects every other package) and strips quotes inside package scripts (provenance: T13280)
- the built-in required-check list is cleocode's real gates (CI, Contracts Dep Lint); it no longer names Lockfile Check, a check that never reported (provenance: T13285)
- cleo login alone signs an agent in to Cleo Nexus and links the project; it no longer falls into the LLM-provider error without a terminal (provenance: T13288)