3.7 KB · updated 2026-07-06 · md

v0.8.0.md

docs/release-notes/v0.8.0.md

Tesserae v0.8.0 — tesserae engine --all: one engine for every project

<!-- translations:start -->

한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch

<!-- translations:end -->

Released 2026-06-13 · PyPI · GitHub release · pip install --upgrade tesserae==0.8.0

Until now the refresh engine was one process per project: N registered projects meant N daemons to start, stop, and remember. v0.8.0 adds fleet mode — a single process that keeps every project registered in ~/.tesserae/registry.json fresh.

tesserae engine --all

1. One process, every registered project

tesserae engine --all supervises one per-project engine unit per registry entry, each with its own watchers and debounced recompile loop. Registering or unregistering a project takes effect without restarting — the fleet reconciles against the registry every 10 seconds, restarts units whose registered root moved, and revives units whose thread died. Projects whose directory is missing on disk are skipped with a warning rather than failing the fleet.

The existing single-project mode is unchanged: tesserae engine --project X behaves exactly as before, and a fleet refuses to double-own a project that already has a standalone engine running.

2. Fleet-wide compile throttling

Concurrent compiles from different projects share the same LLM CLI accounts and rate limits. The fleet serializes them through a shared semaphore — --compile-slots N (default 1) caps how many compiles run at once across the whole fleet. This composes with v0.7.2's per-project compile lock: the flock guards against external compiles, the semaphore schedules internal ones.

3. Robust lifecycle, reviewed hard

The fleet went through three rounds of adversarial review (Codex, xhigh reasoning effort) before merging; everything found was fixed and is covered by tests:

  • Shutdown never abandons a compile. Unit threads are non-daemon and stop fan-out waits — with periodic log warnings — until each unit finishes its current pipeline, on every exit path including a crashing reconcile.
  • Race-free pidfile. The global ~/.tesserae/engine.pid is acquired with O_CREAT|O_EXCL under a sidecar flock, so two concurrent starts can never both win — and a fleet only ever removes a pidfile it still owns. Platforms without flock refuse automatic stale reclaim with a clear manual-removal message instead of racing.
  • A bad registry can't kill the fleet. Corrupt JSON, unreadable files, wrong-shaped or falsey projects values, and malformed individual entries all keep the current units running (logged, retried next tick) instead of tearing everything down.

4. CLI details

--all is mutually exclusive with --project; --debounce and --interval apply to every unit in fleet mode; --once runs one bounded refresh per project sequentially (CI-friendly). TESSERAE_REGISTRY and TESSERAE_FLEET_PIDFILE override the registry and pidfile locations.

Upgrading from v0.7.2

Drop-in; no config changes. Existing tesserae engine invocations behave identically. To adopt fleet mode, register your projects (tesserae projects / the MCP register_project tool) and run tesserae engine --all.