Skip to content

Catalyst Dev — Change Log

12.27.0

Jul 08, 2026

Recovery Loop Elimination & Escalation Fixes

This release closes five compounding loops that caused the recovery pass to silently discard verdicts, re-triage tickets indefinitely, and emit no-progress escalations forever. Recovery-pass sessions now persist a single verdict (fixed, leave-alone, or escalate) to the event log, ledger, and Linear in every case — and exhausted intents surface loudly as needs-human with a rendered brief instead of latching silently. Infinite escalation loops are capped and go terminal, triage re-dispatches are bounded per ticket, and the boot-resume approval gate finally has a CLI (boot-resume-approve.mjs --list / <ticket>) so gated recovery passes can actually be unblocked.

PRs

  • dev: CTL-1439 (P0a) — recovery-pass verdict persistence + surfacing (stop act-and-discard) (#2586) (af29551)
  • dev: CTL-1440 (P0b) — attempts-exhausted → loud escalation, RC3 defer-storm decoupling, truthful skip reasons (#2593) (1ef0e57)
  • dev: CTL-1443 (P1-loop-3) — operable boot-resume approval gate (approve CLI + 48h expiry into Needs-You + alert) (#2596) (a6aa271)
  • dev: CTL-1441 (P1-loop-2) — terminate the triage re-dispatch loop (cap + mismatch surfacing + WORKER_DIR hardening) (#2588) (9dd5309)
  • dev: CTL-1442 (P1-loop-1) — no-progress escalations go terminal after N asks (stop the every-10-min forever loop) (#2590) (001557c)

12.26.0

Jul 08, 2026

Linear Read Observability & Actuation Liveness

Every Linear read now emits a catalyst.linear.read event with source and result attributes, so your OTEL collector can derive read totals and a staleness histogram — and alert on replica bypasses before the 429 breaker trips. The delegate’s board-scan events now record whether a proposed move was actually dispatched, and a new checkActuationLiveness invariant flags sustained propose-but-never-dispatch conditions automatically. A negative cache on terminal-probe and census reads stops replica-miss tickets from firing live Linear reads every tick, which was the primary driver of breaker flaps.

PRs

  • dev: CTL-1403 — emit reads-by-source (catalyst.linear.read{source,result}) on every Linear read (#2582) (d23e8b1)
  • dev: CTL-1435 (WS-C C1+C2) — self-observing actuation-liveness (act-outcome on board-scan + checkActuationLiveness invariant) (#2576) (06bb61f)
  • dev: CTL-1436 (WS-A A4) — negative-cache fetchTicketState replica-MISS live reads (stop the issues-read breaker flap) (#2579) (7f99ddc)
  • dev: CTL-1437 (A4 follow-up) — widen probeBackoff to the every-tick terminal-Done sweep (#2581) (52d58cc)

12.25.0

Jul 07, 2026

Linear Breaker Observability & Board Health Actuation

The Linear circuit breaker now records why it opened (rate-limit 429 vs. timeout) and which caller triggered it, making the 12–22 daily trips on mini attributable and falsifiable from logs for the first time. On the board-health side, deferred recovery intents now have a live consumer so they actually dispatch instead of rotting, operator-sanctioned needs-human latches are suppressed from re-proposal so genuinely stuck tickets surface, and stale escalated recovery intents expire after 7 days instead of pinning tickets in needs-human forever. The top measured breaker driver — eligible empty-reconfirm firing a live Linear read every quiet tick — is also removed entirely; a replica-empty is now trusted directly with zero live Linear reads.

PRs

  • dev: CTL-1430 (WS-A A1) — instrument the Linear breaker (reason+caller on OPEN + durable linear.ratelimit.breaker event) (#2565) (ec03e6f)
  • dev: CTL-1431 (WS-B B1) — TTL on terminal recovery-intents + one-time June sweep (#2567) (9c5bb13)
  • dev: CTL-1432 (WS-B B2+B3) — dispatch deferred board-health intents + suppress sanctioned needs-human latches (#2570) (880261e)
  • dev: CTL-1433 (WS-A A2) — raise the eligible empty-reconfirm TTL above the reconcile interval (cut the top breaker driver, keep drift validation) (#2572) (96ea944)

12.24.0

Jul 04, 2026

Durable Fence Event Log & Done Path Fix

The fence write path now appends durable fence.claimed/fence.released events to the canonical event log instead of relying solely on Linear, eliminating the risk of fence emits triggering the admission freeze. A bug in fenceGuard that caused it to compare the wrong generation counter — blocking every ticket from reaching Done automatically on multi-host rosters — is now fixed by reading the correct cross-host claim generation from cluster-generation.json. Pino log levels are also now mapped to OTel SeverityNumber/SeverityText at emit time, so operational logs no longer arrive in Loki as UNKNOWN severity.

PRs

  • dev: CTL-1424 — otel-forward pino level → OTel SeverityNumber/Text at emit (#2558) (514fd7e)
  • dev: CTL-863 — durable fence→event-log migration (N=1-gated), supersedes the interim ReadFence cache (#2553) (0e70424)
  • dev: CTL-1157 (A1) — fence-guard reads the cross-host claim generation (unblocks the Done path) (#2563) (cb35036)

12.23.1

Jul 03, 2026

Linear Rate-Limit Freeze Fixes

A cluster of fixes targeting the shared Linear bucket saturation that was freezing fleet dispatch and silently stalling replicas. Fence-guard reads are now cached (45s TTL), anchor UUID lookups are cached permanently, and dispatch reads route through the replica instead of hitting Linear live — together dropping breaker trips from ~18 per 3 minutes to near zero. A cloud-sync stall watchdog now detects frozen replica sockets and self-heals via process restart rather than sitting silent for hours, and interactive claude sessions now load plugins from ~/catalyst/plugin-source on the same path as workers.

PRs

  • dev: cloud-sync stall watchdog + loud alert — stop silent replica freezes (#2547) (fd74bda)
  • dev: cluster-heartbeat — back off the shared bucket on a rate-class Linear 400/429 (CTL-1420 follow-up) (#2539) (01d8844)
  • dev: CTL-1420 — dispatch reads via replica (Stage 0: ownership→replica, eligible breaker-aware) (#2551) (32f34dd)
  • dev: CTL-863 — cache the fence entourage (ResolveIssueId anchor-UUID + GetIssueByIdentifier) to fully clear the shared bucket (#2554) (19e5a66)
  • dev: CTL-863 — interim in-process TTL cache for fence ReadFence to unfreeze the shared Linear bucket (#2552) (3cc975e)
  • dev: standard plugin-source loading for interactive sessions + drop marketplace guidance (#2549) (8c96b1f)

12.23.0

Jul 02, 2026

Warm Resume & Replica-First Reads

A daemon restart now continues in-flight SDK work from its existing transcript instead of cold-restarting — making fleet-wide stop/restart-all a routine, low-cost operation. Alongside that, replica-first Linear reads are now a standard reflex across every agent path: enforced in core context, phase-worker preambles, and a new PreToolUse hook that can catch and block bare linearis issues read calls before they hit the rate-limited API key.

PRs

  • dev: CTL-1397 enforcement — replica-first Linear reads as a standard prerequisite reflex (#2543) (98dfbac)
  • dev: CTL-1422 — warm resume: a daemon restart continues in-flight SDK work (#2544) (cca2892)

12.22.0

Jul 02, 2026

SDK Worker Registry & Fleet Resilience

This release introduces a unified in-process SDK worker registry that tracks live workers with heartbeats, sticky abort semantics, and disk projections — closing the liveness blind spots that left the scheduler, delegate queue, and worktree refresh timer unable to see workers running outside the bg executor. Alongside that, a Linear quota storm can no longer freeze fleet admission: when the circuit breaker is open, a provably-real replica-empty is now trusted directly instead of looping into a failing linearis reconfirm. Agent reads also move off the catalyst-linear CLI to direct SQLite queries against the local replica, giving agents full join support and a single, well-defined freshness rule; catalyst-linear is now a deprecated shim.

PRs

  • dev: CTL-1157 — Self-Healing Delegate wave 1 (board-health sees + acts on stuck work; shadow-gated, dark merge) (#2503) (32d2218)
  • dev: CTL-1397 — pivot agent Linear reads to direct SQLite; deprecate catalyst-linear CLI (#2514) (249c9d6)
  • dev: CTL-1402 — bump @catalyst-cloud/sdk → ^0.3.1 + telemetry:true (replica apply-failures observable) (#2517) (0e2883f)
  • dev: CTL-1410 (Phase A) — in-band terminal signal flips for event-only phases + SDK success safety net (#2524) (ba06b66)
  • dev: CTL-1410 (Phase B) — unified in-process SDK worker registry + liveness re-points (#2529) (89fd452)
  • dev: CTL-1421 — doctor asserts the worker plugin path is a fresh pristine plugin-source (#2537) (e1c48f3)
  • dev: catalyst-cloud#127 — bump @catalyst-cloud/sdk → ^0.4.0 (forward-compat filter + auto-reseed backfill) (#2525) (3d4bc40)
  • dev: CTL-1416 — bash-3.2-safe emit-complete session-end + hermetic thoughts fixture for its tests (#2535) (aaeba1e)
  • dev: CTL-1416 — make phase-agent-emit-complete bash-3.2-safe (aaeba1e)
  • dev: CTL-1418 — quiet catalyst-agent’s pino-unavailable shim notice (#2533) (7aa8af4)
  • dev: CTL-1420 — unfreeze fleet admission during a Linear quota storm (#2538) (b2955e1)

12.21.0

Jul 01, 2026

Linear Replica Board Discovery

All Linear reads in dispatched agents now route through the local Catalyst Cloud replica via catalyst-linear, eliminating the rate-limit burns and board freezes that were stalling the fleet. Discovery now gates on the writer heartbeat lock rather than WAL mtime, so quiet feeds stay replica-served instead of falling through to the API. Two telemetry gaps are also fixed: phase-turns events were wired to the wrong parameter and never reached the event log, and SDK workers were missing their Claude Code OTel metrics because the daemon env lacked the OTLP endpoint.

PRs

  • dev: CTL-1397 — replica-backed board-list discovery (board-freeze unstick) (#2502) (5392229)
  • dev: CTL-1397 — route remaining skill-prose Linear reads through catalyst-linear (#2511) (00ec028)
  • dev: CTL-1397 (1/n) — mandate Linear reads via catalyst-linear (linearis skill + research agents) (#2496) (27ab1fe)
  • dev: CTL-1397 (2/n) — route per-dispatch Linear reads through the replica (catalyst-linear) (#2501) (8a3e336)
  • dev: CTL-1397 (3/n) — trust the seed-complete replica-empty (durable board-freeze unstick) (#2509) (36482e7)
  • dev: CTL-1397 (4/n) — gate replica discovery on the writer heartbeat lock (close the quiet-feed linearis fallback) (#2512) (edd4b58)
  • dev: CTL-1406 — SDK phase workers emit session.context (dashboard panels 50/51) (#2508) (2ab5f57)
  • dev: CTL-1404 — SDK phase-agent workers emit claude_code_* OTel again (daemon env lacked the OTLP endpoint) (#2504) (1b726bb)
  • dev: CTL-1405 — sdkDispatch passes emitEvent in the wrong param → phase-turns telemetry never reached the event log (#2500) (6795089)
  • dev: CTL-1407 — provision the per-account rate-limit usage sampler on every host (#2507) (58f040e)

12.20.0

Jun 30, 2026

Linear Replica & SDK Executor Hardening

This release wires up the full infrastructure for agents to read Linear from a local Catalyst Cloud replica instead of hitting the rate-limited API directly — including the new catalyst-linear CLI that reads the replica first and falls back to linearis, and a supervised per-node replica writer that keeps the local DB fresh on every node class. The SDK executor path gets two security and correctness fixes (token scrubbing on rejection, same-tick slot budget), plus a daemon launcher fix that ensures the OAuth token survives non-login restarts so executor=sdk no longer silently falls back to bg. Run catalyst install --executor sdk to provision the executor lever and cloud-sync writer together without regression.

PRs

  • dev: CTL-1369 (4/n) — class-aware doctor install verification + phase_duration_ms promotion (#2469) (99e3231)
  • dev: CTL-1383 — uniform -h/—help + bare-usage on user-facing catalyst-* CLIs (#2459) (0b137a8)
  • dev: CTL-1387 — consolidated catalyst CLI reference page + cannot-drift guard (#2468) (d989dc0)
  • dev: CTL-1391 — catalyst-linear, the replica-first Linear read CLI (linearis fallback) (#2477) (f1746ad)
  • dev: CTL-1392 — agents read the Catalyst Cloud replica first (evidence-based fallback) (#2474) (5599fe9)
  • dev: CTL-1393 — cluster nodes auto-detect + refresh rotated SOPS secrets (loudly) (#2478) (bc652ee)
  • dev: CTL-1394 — per-node supervised CatalystReplica writer (unblock mini/mini-2 Linear rate limits) (#2481) (5cca4c5)
  • dev: CTL-1395 (1/n) — catalyst-cloud-sync heartbeat + freshness → Loki (uptime tile + OTL-40 signal) (#2488) (dbd79d6)
  • dev: CTL-1396 — make the SDK-executor rollout verifiable (doctor running-daemon check + phase-turns telemetry) (#2484) (59ac079)
  • dev: CTL-1401 — catalyst install/reinstall provisions the cloud-sync + executor levers (no reinstall regression) (#2492) (e964afe)
  • dev: CTL-1367 — close the 2 final pre-canary SDK-executor gates (token-scrub on rejection path + same-tick SDK slot budget) (#2475) (160df09)
  • dev: CTL-1372 — serve orch-monitor as a production React build (root-cause leak fix) (#2453) (0df476b)
  • dev: CTL-1382 — thin-launcher catalyst CLIs resolve their symlink before locating their driver (#2465) (3e8d78c)
  • dev: CTL-1385 — board rows use wrong design tokens (bright dividers + selected-state bg) (#2462) (0e223b7)
  • dev: CTL-1398 — daemon launcher sources claude-accounts.env so executor=sdk survives non-login restarts on every host (#2487) (bf5087e)

12.19.0

Jun 29, 2026

Per-Class Install Lifecycle

catalyst install, uninstall, and reinstall now work per node class — worker nodes get broker/exec-core/monitor daemons, developer and monitor nodes get the updater agent, and the distinction is enforced. Each run is a fully observable OTEL trace with phase-by-phase telemetry, automatic backup before any overwrite, and rollback to a known-good state if provisioning fails mid-flight. Use --dry-run to print the resolved plan for your node class before touching anything.

PRs

  • dev: CTL-1369 (3/n) — catalyst install|uninstall|reinstall per node class (#2452) (35339bb)
  • dev: CTL-1374 — PWA self-recovers stale lazy chunks after a redeploy (cache-control + preloadError reload) (#2447) (416ecb9)
  • dev: CTL-1375 — private-repo favicons re-probe past the cached org avatar + token-scope doctor check (#2445) (01b5208)
  • dev: CTL-1378 — board replica-title edges (parked fallback, queue payload, CATALYST_DIR) (#2449) (bb772a5)