Skip to content

All versions since 7.9.0

7.9.0

Apr 23, 2026

Dev UI Mockup Suite

Complete static mockup harness for the orch-monitor redesign with 6 new views (home, worker, orchestrator, briefing, comms, todos, agent graph), global keybindings, AI summarization endpoint, and brand V2 assets. Each mockup supports both design systems and includes detailed state variants for visual review. The harness includes drift detection for local dev marketplace registration and improved worker communication discipline guidelines.

PRs

  • dev: /api/summarize endpoint — configurable provider (CTL-144) (#249) (5029f9e)
  • dev: agent-graph.html mockup — React Flow hierarchy (CTL-140) (#259) (73e4947)
  • dev: briefing.html mockup — rollup + per-wave briefings + AI summarize button (CTL-141) (#256) (2d92853)
  • dev: comms.html mockup — channels + agent cards (CTL-139) (#254) (f881cf6)
  • dev: drift detector for registered local dev marketplace (CTL-121) (#255) (6f259ec)
  • dev: global keybinding system in mockup chrome.js (CTL-145) (#247) (e24a445)
  • dev: home.html mockup — orchestrators overview + standalone workers (CTL-136) (#250) (4a77e3b)
  • dev: ingest TodoWrite + build subagent tree in orch-monitor (CTL-143) (#248) (761c5b1)
  • dev: orch.html mockup — single-orchestrator dashboard (CTL-137) (#253) (ed2f0fe)
  • dev: todos.html mockup — standalone TodoWrite roll-up across workers (CTL-142) (#260) (c125765)
  • dev: worker comms posting discipline — budgets, escalation, severity (CTL-165) (#265) (160e615)
  • dev: worker.html mockup — first-class single-worker page (CTL-138) (#244) (439e758)
  • meta: 1200×630 OG / social preview card (CTL-152) (#264) (e0312ff)
  • meta: drawn wordmark + horizontal/stacked lockups (CTL-148) (#262) (81c6c98)
  • meta: monochrome mark variants + README hero image (CTL-154) (#263) (d776fd9)
  • meta: V2 favicon set — multi-res ICO, SVG, apple-touch, PWA icons (CTL-150) (#261) (5dfafaa)
  • dev: refuse worktree marketplace install unless —allow-worktree (CTL-120) (#251) (f264d9b)
  • dev: resolve catalyst-comms via plugin path (CTL-127) (#252) (1563bec)

7.10.0

Apr 24, 2026

Canonical Wave Dispatch & Chrome Navigation

The orchestration dispatcher now reads all waveN queues dynamically instead of hardcoded wave limits, so you can dispatch wave5 or wave10 without manual script edits. Click the Catalyst logo to return to the mockup gallery, use the new breadcrumb navigation, or press ⌘K for a filterable command palette with nav shortcuts and appearance controls. Worker usage and costs now aggregate correctly into state.json during monitoring phases.

PRs

  • dev: canonical orchestrate-dispatch-next reading all waveN queues (CTL-116) (#268) (7490be9)
  • dev: mockup chrome — clickable home, breadcrumb, ⌘K palette (CTL-166) (#266) (f503027)
  • drop precision-instrument + dual theme panels on brand mockup (CTL-178) (#270) (4070e92)
  • dev: aggregate worker usage/cost into orch state.json (CTL-115) (#269) (bcc0189)

7.11.0

Apr 25, 2026

Session State Tracking & Restart

Active sessions now show liveness status and crash detection via catalyst-session.sh status, with automated restart commands for crashed Claude sessions that preserves your conversation history. Orchestrator worktrees get readable names like orch-deal-to-opportunity-2026-04-25 and write completion markers for clear done/in-progress distinction. Post-merge verification runs automatically on merged PRs when allowSelfReportedCompletion is disabled, filing remediation tickets instead of blocking merge.

PRs

  • dev: /compound closing ritual writes compound-log entry at PR merge (CTL-159) (#276) (7116395)
  • dev: auto-file improvement findings at skill run end (CTL-176) (#274) (afc11ea)
  • dev: integrate todos panel into orch detail (CTL-171) (#279) (62a5c14)
  • dev: OSS-safe feedback routing — linear→github fallback + consent (CTL-183) (#272) (77101f5)
  • dev: post-merge verification for orchestrated workers (CTL-130) (#293) (df04e39)
  • dev: session state tracking + crash-resilient restart (CTL-192) (#294) (92c2dd0)
  • dev: session-centric Kanban home mockup (CTL-168) (#282) (0c5488f)
  • dev: tiered attention signals + reason glyphs (CTL-170) (#277) (06d7c60)
  • dev: add thoughts preflight assertions for orchestrated worktrees (CTL-195) (#291) (4444b36)
  • dev: workers exit at merging, orchestrator is authoritative merge-poller (CTL-133) (#292) (3c99019)

7.12.0

Apr 25, 2026

Session Outcome & Iteration Tracking

Catalyst now emits session outcome events (success, fail, abandoned) and iteration counters to your observability stack, enabling cost-per-successful-outcome analysis and complexity measurement. The claude_code_iteration_count_total metric tracks plan-replan and implement-fix cycles separately, giving you visibility into which tickets require more rework. Run your database migrations to add the new session tracking columns.

PRs

  • dev: emit claude_code.session.outcome at session end (CTL-157) (#278) (6505cb0)
  • dev: iteration_count counter for plan-implement-validate loops (CTL-158) (#280) (18a2b7d)

7.12.1

Apr 26, 2026

Warp Tab Directory Tracking

The launch-worktree-tab.sh script now supports --shell-eval mode to properly set the working directory in Warp tabs. When you open Catalyst worktree tabs, Warp’s path indicator will now show the actual worktree path instead of defaulting to the main checkout directory.

PRs

  • dev: Warp tab shows worktree CWD via —shell-eval mode (#298) (ea30621)

7.12.2

Apr 27, 2026

Shell Evaluation CWD Fixes

Fixed Warp terminal integration where --shell-eval mode would show incorrect directory paths, create unwanted shell block splits, and kill the tab’s shell on Claude exit. Warp’s file explorer and path indicator now correctly track worktree directories, and Claude sessions return cleanly to your shell without spawning extra blocks.

PRs

  • dev: drop exec from —shell-eval to preserve tab shell (CTL-201) (#307) (3ee4048)
  • dev: force Warp CWD update before exec in —shell-eval mode (CTL-199) (#302) (d7c9ad8)
  • dev: replace warp_precmd with OSC 7 to prevent block split (CTL-201) (#308) (1e512b3)

7.13.0

Apr 30, 2026

Orchestration Monitor Refresh

Unified Kanban board with view toggles, project filters, and GitHub-style PR status indicators across home, orchestration, and worker views. Worker detail pages now show hero metrics (elapsed time, tokens, cost) above the phase timeline, while the orchestration view promotes todos to the top with an expanded 5-column worker board. Polling loops now include explicit sleep intervals to prevent GitHub API rate limit exhaustion.

PRs

  • dev: refresh orch-monitor mockups — Kanban, PR icons, filters, worker board (CTL-202) (#311) (934404f)
  • dev: add explicit sleep to polling loops (CTL-203) (#313) (bf90290)
  • dev: revert chrome.js to single-system per CTL-178 (CTL-202 follow-up) (#314) (2a4a344)

7.14.0

May 03, 2026

Linear UUID Caching

New resolve-linear-ids.sh script fetches and caches Linear team and workflow state UUIDs to reduce API rate limiting during issue transitions. The linear-transition.sh command now reads cached UUIDs from .catalyst/config.json instead of making repeated API calls, with full backward compatibility when cache is absent.

PRs

  • dev: cache Linear UUIDs to reduce API rate limit pressure (CTL-207) (#323) (ce82a8c)

8.0.0

May 04, 2026

Orchestrator-Driven Deploy Lifecycle

Worker definition-of-done now extends through production deploy success, with orchestrator managing the merging → merged → deploying → done state machine after workers exit at “merging”. Event-driven GitHub deployment monitoring replaces polling across skills like merge-pr and orchestrate. New catalyst-events CLI provides tail and wait-for primitives over the unified GitHub/Linear/comms activity log, while Linear webhooks join GitHub webhooks for comprehensive event ingestion.

PRs

  • dev: orchestrator-driven deploy lifecycle for workers (CTL-211) (#344)
  • dev: auto-pull main in primary worktree after PR merge (CTL-198) (#304) (d6ae3ba)
  • dev: catalyst-events CLI + Linear webhooks + event-driven skill migration (CTL-210) (#343) (d70f7ee)
  • dev: config-driven webhook watch list (CTL-216) (#342) (854a85e)
  • dev: orchestrator-driven deploy lifecycle for workers (CTL-211) (#344) (fff5513)
  • dev: canonicalize workerCommand + close orchestrator scope leak (CTL-208) (#325) (8139771)
  • dev: move smee channel URL to per-machine Layer 2 config (CTL-217) (#341) (2970e6c)
  • dev: replace orch-monitor poll-everything with webhook-driven event ingestion (CTL-209) (#330) (39e9d13)
  • dev: unstick Orch Monitor Quality Gates CI workflow (CTL-215) (#335) (2801770)

8.1.0

May 04, 2026

Webhook Auto-Registration & Verification Fixes

The setup-webhooks.sh script now auto-registers Linear webhooks with --linear-register --webhook-url <url>, eliminating the manual GraphQL mutation step that previously blocked event-driven workflows. Fixed four critical bugs in orchestrate-verify.sh that caused verification failures on merged PRs and produced malformed output with integer comparison errors. Existing GitHub webhook subscriptions automatically upgrade to include release and workflow_run events on daemon restart.

PRs

  • dev: Linear webhook auto-registration in setup-webhooks.sh (CTL-224) (#353) (8cf4807)
  • dev: repair orchestrate-verify.sh — broken on merged PRs + integer-cmp errors (CTL-222) (#352) (e98ffea)
  • dev: webhook event mapper — missing release/workflow_run + bogus pr.merged on label changes (CTL-226) (#351) (0668d38)

8.2.0

May 06, 2026

Groq-Powered Semantic Event Routing

The catalyst-filter daemon now routes GitHub webhook and Linear events through Groq Llama 3.1 8B, letting orchestrators register natural-language intents instead of writing complex jq filters. Bidirectional comms enable mid-flight orchestrator messages to workers, and heartbeat watchdog detection catches stalled workers without LLM calls. Install the new CLIs with catalyst-filter start and setup-webhooks.sh --register-github-hooks.

PRs

  • dev: add catalyst-filter to plugin install scripts (CTL-259) (#423) (20b7807)
  • dev: bidirectional comms — workers read inbound messages at phase boundaries (CTL-249) (#403) (79aa258)
  • dev: catalyst-filter daemon — Groq-powered semantic event routing (CTL-256) (#421) (ceeb0ee)
  • dev: event-schema reference doc — derive from TypeScript types so agents don’t guess field names (#430) (e0b0821)
  • dev: expose webhookTunnel state in catalyst-monitor status —json (CTL-244) (#398) (643055d)
  • dev: heartbeat watchdog in filter daemon — detect stalled workers without LLM (CTL-261) (#428) (c8e337b)
  • dev: Linear issue events → filter daemon wake via bot-skip suppression (CTL-263) (#426) (a2bd391)
  • dev: orch-monitor activity feed for global event stream (CTL-225) (#358) (db72cf7)
  • dev: orch-monitor daemon liveness check as skill prerequisite (CTL-223) (#356) (7e906ce)
  • dev: orch-monitor version drift self-check on startup (CTL-237) (#381) (ab2edcf)
  • dev: orchestrate Phase 4 — event-driven Monitor + catalyst-events tail (CTL-243) (#378) (7f3e728)
  • dev: orchestrator DIRTY merge auto-recovery (CTL-232) (#386) (59222b6)
  • dev: persist Linear webhook registration to Layer 2 (CTL-238) (#382) (a730499)
  • dev: persistent interests + explicit deregistration in filter daemon (CTL-262) (#425) (d0ac7d9)
  • dev: reactive multi-event PR lifecycle subscription (CTL-228) (#379) (e407c24)
  • dev: SKILL.md for catalyst-filter — protocol docs for orchestrators (CTL-258) (#422) (e42a4ac)
  • dev: wait-for-github diagnostic checkpoint — update callers to two-phase pattern (CTL-251) (#404) (e03f455)
  • dev: wait-for-github skill — two-phase event wait with diagnostic checkpoint (CTL-247) (7738683)
  • dev: wire catalyst-filter into orchestrate Phase 4 (CTL-257) (#424) (43e36ff)
  • dev: wire Linear webhook delivery via smee.io end-to-end (CTL-242) (#396) (e58ae5f)
  • dev: worker-status-change emitter — severity tiers, coalesce, PR enrichment (CTL-229) (#387) (682e817)
  • dev: add monitor.* to config templates + verify GitHub webhook registration (CTL-254) (#409) (e09d077)
  • dev: add wait-for-github and catalyst-filter to CLAUDE_SNIPPET.md (CTL-268) (0b1adc4)
  • dev: add worker done comms hook to oneshot Phase 5 (CTL-236) (#388) (a8d4030)
  • dev: correct webhookTunnel field and add smee-client dependency (#435) (10edb77)
  • dev: install-cli.sh adds catalyst-events + defaults to ~/.local/bin (CTL-227) (#357) (5dfa3ac)
  • dev: make orchestrate-roll-usage.sh observable (CTL-233) (#380) (b61941d)
  • dev: orchestrate-fixup/followup WORKER_DIR fallback (CTL-231) (#377) (9386849)
  • dev: render DASHBOARD.md every Phase 4 cycle (CTL-230) (#385) (a618055)
  • dev: replace polling loops in merge-pr and create-pr with wait-for-github (CTL-250) (#402) (96ab764)
  • dev: scope-aware Monitor filter + no-awk-pipe warning (CTL-240) (#390) (7efc119)
  • dev: stamp orchestrator on github.* webhook events (CTL-234) (#391) (56083c9)
  • dev: update fixup/followup templates to CTL-133 exit-at-merging contract (CTL-248) (#401) (2454b19)
  • dev: upgrade setup prereq checks for event-driven pipeline (CTL-253) (#408) (2d7b8bf)

8.3.0

May 08, 2026

AI Activity Brief and Broker Evolution

The Catalyst plugin ecosystem now includes an AI-powered Activity Brief panel that generates executive summaries of the last 30m/1h/6h of development activity, plus a new /god skill for cross-project omniscient status monitoring. The core event filtering system has evolved into catalyst-broker with structured agent identity, automatic PR correlation, and deterministic routing for Linear ticket events. Run catalyst-monitor.sh forward-start to enable the new OTLP/PostHog/Cloudflare Analytics Engine telemetry forwarder that ships canonical events to external observability platforms.

PRs

  • dev: Activity Brief panel — AI summary of recent event activity (CTL-282) (#470) (e76bed7)
  • dev: add /god skill — cross-project omniscient status view (CTL-193) (#466) (0daed35)
  • dev: add color-coded source chips to activity feed (CTL-276) (#464) (01565e5)
  • dev: canonical OTel-shaped event envelope (CTL-300) (#501) (f2402c4)
  • dev: canonical SVC/SEV/TRACE columns in catalyst-hud (CTL-308) (#504) (1a50efb)
  • dev: catalyst-hud TUI — Ink-based terminal with scrollback, filter, detail pane, trace pivot (CTL-312) (#514) (db1e346)
  • dev: CTL-306 tail-and-forward daemon (canonical events → OTLP / PostHog / Cloudflare AE) (#516) (ecb71c7)
  • dev: deterministic event routing for PR lifecycle (CTL-284) (#496) (675cd81)
  • dev: enrich Linear issue events with human-readable descriptions (CTL-281) (#469) (5d1988c)
  • dev: evolve filter daemon into broker — structured agent identity, auto-correlation, ticket_lifecycle routing (CTL-303) (#515) (c0e5417)
  • dev: generalize filter.register to all agent types (CTL-269) (#441) (ddd493b)
  • dev: include message body in comms.message.posted events (CTL-279) (#468) (ad20724)
  • dev: multi-team webhook support + Layer 2 config alignment (CTL-273) (f6e1eee)
  • dev: per-repo color config for HUD scope chips (CTL-277) (#471) (f952bfa)
  • dev: per-team Linear webhook secrets + fix pre-existing bugs (CTL-285) (#474) (bbdb60f)
  • dev: populate traceId on webhook-emitted canonical events (CTL-310) (#509) (74e4150)
  • dev: rename catalyst-filter → catalyst-broker as primary CLI (CTL-315) (#521) (6e94290)
  • dev: replace console.* with pino structured logging in broker + forwarder (CTL-314) (#520) (8200ca8)
  • dev: webhook teardown script + auto-startup docs (CTL-219) (#513) (33b7b79)
  • dev: wire Linear webhook events into HUD activity feed (CTL-275) (#463) (510e6a7)
  • dev: align Linear webhook URL key with consumers (CTL-274) (#450) (bf6ba0c)
  • dev: catalyst-hud column alignment + event-name truncation (CTL-311) (#511) (f34af09)
  • dev: event filter bugs — Codex reviews silently dropped (CTL-270) (#443) (82b1d3f)
  • dev: keyed-format fallback for linearSmeeChannel (CTL-301) (#493) (332e8e3)
  • dev: read groq.apiKey from config.json when GROQ_API_KEY env var is absent (#445) (ec5c84e)
  • dev: read Linear webhookId from cross-project Layer 2 (CTL-272) (#449) (5ceb79e)
  • dev: replace polling with fs.watch reactive tailing in filter daemon (CTL-283) (#461) (c1cca6e)
  • dev: resolve symlink before deriving SCRIPT_DIR in catalyst-hud (#517) (de226e9)
  • dev: show repo chip on non-PR GitHub events (CTL-278) (#467) (d5b704e)

8.4.0

May 09, 2026

Event Log Analysis CLI

Query your event logs using either technical filters or plain English — get phase timing breakdowns, identify orchestration stalls, and analyze CI funnels from JSONL logs. Natural language queries like “show errors in the last hour” are translated to structured filters via Claude and work in both the CLI and live TUI. Legacy event formats are now handled gracefully to prevent the catalyst-hud loading hang.

PRs

  • dev: event log analysis CLI — phase-time, stalls, ci-funnel (CTL-307) (#523) (1f7158a)
  • dev: natural-language event query for catalyst-events + TUI (CTL-313) (#524) (0a8b235)
  • dev: guard against legacy events crashing catalyst-hud (#528) (f0bcf34)
  • dev: orchestrate-verify uses bun run test not bun test (CTL-317) (#531) (76fcbf8)

9.0.0

May 11, 2026

Catalyst HUD Bottom-Anchored Panels

Detail panes and help overlays now anchor to the bottom of your terminal with the event list expanding to fill all remaining space above. Event rows are self-explanatory — comms events show sender/recipient/type, filter events display as “wake”/“filter reg” instead of truncated names, and all text is cleaned of HTML/Markdown markup. Column headers stay pinned when detail panes are open, and the core catalyst-pm plugin now focuses on 12 essential strategy/PRD skills with ops features moved to dedicated sibling plugins.

PRs

  • pm: shrink catalyst-pm to 12 strategy/PRD skills (CTL-322) (#543)
  • pm: shrink catalyst-pm to 12 strategy/PRD skills (CTL-322) (#543) (43b1c89)
  • dev: bottom-anchor catalyst-hud detail pane (CTL-324) (#553) (9de7767)
  • dev: bottom-anchor catalyst-hud help panel (CTL-325) (#554) (474702d)
  • dev: broker writes canonical filter.wake events + HUD shows filter.* labels (CTL-331) (#558) (6a28db7)
  • dev: catalyst-hud — make comms rows self-explanatory (CTL-330) (#559) (37cdf68)
  • dev: catalyst-hud detail header — 24h datetime, prevent timestamp wrap (CTL-327) (#552) (8440c9b)
  • dev: catalyst-hud sticky column header (CTL-332) (#560) (8f4447a)
  • dev: catalyst-hud UI polish — live tail, scrollable panes, redesigned detail (#529) (b6fac3f)
  • dev: make catalyst-hud and install-cli resilient to plugin upgrades (#538) (3a07708)
  • dev: strip HTML and Markdown markup from catalyst-hud event details (CTL-326) (#551) (80870da)

9.1.0 (2026-05-13)

Broker Reliability & HUD Observability Overhaul

This release fixes a cascade of broker routing failures where canonical OTel event envelopes were being misread at multiple sites — filter.register events were silently ignored, deterministic PR routes never fired, and the Groq prose classifier was generating ~95% false positives (now gated off by default via CATALYST_BROKER_PROSE_ENABLED=0). The HUD gets substantial polish alongside: wake rows now show the target orchestrator and wake reason in context, SOURCE icons pick up Nerd Font glyphs, column widths adapt to terminal size, and a broker health chip surfaces interest count and API key status at a glance. Run plugins/dev/scripts/clean-prose-interests.sh && catalyst-monitor restart after updating to clear any stale test-residue interests from ~/catalyst/broker-interests.json.

Features

  • dev: broker comms_lifecycle + env-gate Groq prose path (CTL-357) (#607) (39adb7a)
  • dev: per-event UUID (event.id) across canonical emitters (CTL-344) (#580) (2b9acc9)

Bug Fixes

  • dev: API key health — startup warning, probe, status surface, gateway (CTL-343) (#579) (543449f)
  • dev: broker interests integrity + empty-state observability (CTL-352) (#602) (fd09601)
  • dev: broker prose-match suppression gate uses Groq intent (CTL-340) (#585) (6e864be)
  • dev: broker reads canonical filter.register events (CTL-336) (#567) (8abc0d5)
  • dev: broker skips self-emitted filter.wake/broker.daemon events (CTL-346) (#586) (33859e7)
  • dev: broker tryDeterministicRoute canonical-envelope read (CTL-359) (#609) (523b6fe)
  • dev: correct filter.wake predicate in skill docs (CTL-354) (#599) (b7193a4)
  • dev: delete retired filter-daemon directory (CTL-349) (#590) (d553c7e)
  • dev: HUD + broker observability rework (CTL-350) (#592) (3d9a02b)
  • dev: HUD filter row display — DETAILS, REF, and SOURCE (CTL-337) (#569) (944410e)
  • dev: HUD glyph fixes — NF v3 codepoint move + PR space (CTL-358) (#606) (17d30f4)
  • dev: HUD glyph polish — SOURCE icon prefix, PR symbol, REF/ORCH dedup (CTL-355) (#601) (3dfc153)
  • dev: HUD highlight uses inverse video for readable contrast (CTL-342) (#578) (a257e65)
  • dev: HUD in-progress glyph uses Nerd Font when available, else ellipsis (CTL-353) (#598) (8baceda)
  • dev: HUD polish + broker.daemon.shutdown event (CTL-351) (#595) (dd99679)
  • dev: install-cli.sh owns ~/.catalyst/bin + auto PATH bootstrap (CTL-339) (#571) (3284f5a)
  • dev: orchestrate-dispatch-next leaks parent stdin into worker (CTL-334) (#577) (8dfb293)
  • dev: pr_lifecycle interest refresh + auto-correlate at PR open (CTL-341) (#588) (eadab91)
  • dev: surface wake target + reason in HUD rows (CTL-348) (#587) (f1bfbb1)

9.2.0 (2026-05-14)

Claude Code Session Metadata & HUD Overhaul

Session context is now tracked and surfaced throughout the toolchain: catalyst-statusline.sh emits session.context events with model, context %, token count, cost, and turn number on every status bar render, and the HUD and web UI display them inline per worker. The monitor HUD also gets a round of focused improvements — the SOURCE and EVENT columns are merged into a single responsive column, the / filter now substring-matches across every field in the raw event JSON (with AND semantics for multi-token queries), the footer compacts to two lines with width-responsive hotkey hints, and the scroll anchor bug that hid filter matches above the viewport is fixed. Run catalyst-db.sh init after updating to apply the new claude_session_id and last_context_pct columns.

Features

  • dev: broaden HUD / filter to substring-match across all event fields (CTL-367) (#644) (f900348)
  • dev: enrich session events with Claude Code metadata (CTL-374) (#638) (d1f78e2)
  • dev: HUD — merge SOURCE + EVENT columns into single wider EVENT column (CTL-364) (#645) (2ad9d26)
  • dev: HUD footer cleanup — right-align event count, separator, width hints (CTL-363) (#627) (65cb93b)
  • dev: lift cicd.pipeline.run.status to typed canonical attribute (CTL-366) (#632) (3608818)
  • dev: orchestrator-id short form o-<repo>-<tickets> (CTL-373) (#637) (3353d8c)
  • dev: vcs.repository.name enrichment for linear/orchestrator/broker events (CTL-362) (#628) (c6e6138)

Bug Fixes

  • dev: canonical worker-event allowlist + schema-drift cleanup (CTL-370) (#635) (94ea15d)
  • dev: HUD DETAILS column truncates instead of wrapping (CTL-361) (#626) (0e4e267)
  • dev: HUD filtered viewport — autoFollow UP scroll anchor (CTL-368) (#630) (681f351)
  • dev: NL query — refresh prompt schema, add events catalog, inject current time (CTL-365) (#631) (506eb4f)
  • dev: orchestrate dispatch prompt teaches broker Pattern 3 preference (CTL-371) (#634) (ce2e0f2)
  • dev: reconcile orchestrate Phase 4 grep pipe with monitor-events prohibition (CTL-372) (#636) (4aeae33)
  • dev: require wake narration line per Monitor wake (CTL-369) (#633) (1bd684d)

9.3.0 (2026-05-15)

HUD Overhaul & Broker Observability

This release is a substantial rework of the orchestration monitor HUD — raw event names in their own column, a unified Claude Code-style prompt input, sortable Workers/Orchestrators tabs, a new Runs tab showing the full orchestrator → worker hierarchy, and progressive Escape to undo one filter layer at a time. On the broker side, workers in wait states are now visible (with countdown timers in the HUD), stale-heartbeat wakes are batched per interest instead of flooding per session, and duplicate wakes are suppressed when CI conclusion hasn’t changed. Every catalyst-* CLI now accepts --version to show the build SHA and source path, and catalyst-broker probe gives a fast O(1) daemon health check.

Features

  • dev: —version flag on every catalyst-* CLI + commit hash (CTL-390) (#667) (e6c85a1)
  • dev: add reason field to agent.checkout payload (CTL-402) (#725) (dab0fac)
  • dev: add SESSION column to HUD Interests dashboard (CTL-422) (#739) (bd0a61f)
  • dev: add wake-extract CLI + document wake payload schema (CTL-408) (#726) (939550e)
  • dev: add WORKER column to HUD interests table (CTL-427) (#743) (cd8b811)
  • dev: broker wait-loop visibility — worker.waiting/resumed events (CTL-403) (#717) (fa030f5)
  • dev: broker_claim_pr as easy path — probe command + fallback telemetry (CTL-409) (#744) (16cc5dc)
  • dev: emit orchestrator.status events for self-status announcements (CTL-405) (#738) (c1679bb)
  • dev: expand REPO column coverage across canonical event emitters (CTL-385) (#665) (baf2d7d)
  • dev: HUD — relocate EVENT-ID from row to detail pane (CTL-393) (#684) (13af477)
  • dev: HUD — show raw event.name in EVENT column; split icon into its own 1-char column (CTL-391) (#668) (eb7e70d)
  • dev: HUD — unified Claude-Code-style prompt input box (CTL-386) (#688) (4d569e3)
  • dev: HUD :since — first-class filter (overlay, ESC, footer chip) (CTL-387) (#663) (3e71819)
  • dev: HUD broker/worker dashboard view (CTL-392) (#678) (917ebdb)
  • dev: HUD Claude Code-style full-width input bar with separate status line (CTL-417) (#736) (e641ea4)
  • dev: HUD Escape progressively undoes state — scope reset + live-tail resume (CTL-423) (#740) (3321ace)
  • dev: HUD Runs tab showing orchestrator → tickets/workers hierarchy (CTL-426) (#742) (f3c85e6)
  • dev: HUD unified active-filter indicator in footer (CTL-389) (#685) (bb74832)
  • dev: HUD user-configurable column display and order (CTL-394) (#691) (77ae454)
  • dev: HUD Workers/Orchestrators tabs — sortable columns (CTL-425) (#741) (165d7a7)
  • dev: HUD wrap-mode toggle — ‘w’ key to flip truncate/wrap (CTL-384) (#683) (b8584e1)
  • dev: per-event-class DETAILS formatting for GitHub and Linear events (CTL-418) (#732) (db3f111)
  • dev: populate vcs.pr.number + vcs.ref.name on check_suite/workflow_run (CTL-396) (#687) (efdae78)
  • dev: surface prose interest disabled status in HUD (CTL-421) (#720) (e38636e)
  • dev: wire SubagentStop/Stop hooks as agent.checkout fallback (CTL-404) (#714) (5d313e7)

Bug Fixes

  • dev: add 1-character left margin to HUD root container (CTL-430) (#734) (37777c9)
  • dev: add retry loop to broker_claim_pr and broker_register_comms (CTL-429) (#731) (3c87905)
  • dev: apply wrap=truncate to all HUD columns to eliminate ghost chars (CTL-416) (#730) (d34c71f)
  • dev: batch stale-heartbeat wakes + HUD wake recipient visibility (CTL-419) (#722) (c2ebc63)
  • dev: build-orchestrator-filter drops github.pr.merged when PR not yet in signal files (CTL-398) (#737) (b493715)
  • dev: dedupe filter.wake emissions by (source_event_id, interest_id) (CTL-406) (#712) (985e62e)
  • dev: drop comms.message.posted from Groq queue when no deterministic match (CTL-397) (#718) (8f3780b)
  • dev: enrich filter.wake reasons for check_suite non-success/failure conclusions (CTL-399) (#728) (cfb499a)
  • dev: HUD — eliminate ghost chars in DETAILS via explicit width (CTL-395) (#686) (73c058e)
  • dev: HUD — truncate long orchestrator IDs in ORCH column (CTL-383) (#662) (4b869fc)
  • dev: HUD detail pane no longer pins selected event at list top (CTL-420) (#733) (795b2f7)
  • dev: HUD pivot keys o/t pause live mode before scoping (CTL-388) (#664) (9604fb7)
  • dev: orchestrate-verify.sh false-positive on post-merge branch lookup (CTL-400) (#735) (ef3f8e1)
  • dev: populate REPO column for linear.* and filter.wake events (CTL-412) (#724) (8b928eb)
  • dev: reject range operators on wrong-typed fields in NLQ DSL (CTL-415) (#729) (c150a6b)
  • dev: remove stale filter-input.test.ts after FilterInput.tsx deletion (#689) (6b871d7)
  • dev: remove unnecessary type assertions left by CTL-394 worker (#694) (e6dee50)
  • dev: remove unused ink-text-input dependency from orch-monitor (#690) (0fa7777)
  • dev: route bare durations to since-filter in HUD query input (CTL-414) (#727) (2f0126c)
  • dev: route session.heartbeat to broker watchdog liveness map (CTL-401) (#711) (f5d7649)
  • dev: suppress redundant broker wakes when downstream state unchanged (CTL-407) (#719) (2a5293e)
  • dev: surface toState, actorName, and scalar fields in Linear webhook canonical payload (CTL-424) (#721) (9e6e494)
  • dev: use Date.getTime() for since-filter comparison in HUD (CTL-413) (#723) (81f0e34)

10.0.0 (2026-05-18)

Phase-Agent Pipeline Launch

This release ships the full 9-phase agent pipeline: triage → research → plan → implement → verify → review → PR → merge → deploy monitoring. Orchestrations now dispatch each phase as a claude --bg worker, advance automatically via broker phase_lifecycle events, and resume when a phase hits its turn cap rather than burning the error-recovery budget. Two blocking dispatch bugs (a skill gate that rejected slash-command invocation and a bg job ID parser that captured backgrounded instead of the hex ID) are also fixed, meaning this is the first release where phase workers can actually run end-to-end.

⚠ BREAKING CHANGES

  • dev: turn-cap exhaustion → automated handoff continuation (CTL-484) (#844)

Features

  • dev: add phase_lifecycle interest type to broker daemon (CTL-447) (#795) (840f2ef)
  • dev: add phase-triage + phase-monitor-deploy skills (CTL-451) (#802) (decabfd)
  • dev: add verifying/reviewing transition keys for phase-agent observability (CTL-454) (#797) (303e96a)
  • dev: ADR-drift detector for morning-briefing Step 3 (CTL-459) (#806) (d442e87)
  • dev: briefing-followup action handlers — calendar/ticket/orchestrate/email (CTL-463) (#813) (63383aa)
  • dev: briefing-followup ADR-drift resolution flow (CTL-464) (#815) (8207175)
  • dev: briefing-followup resolution write-back (CTL-465) (#816) (7881962)
  • dev: briefing-followup skill MVP — load + present agenda (CTL-462) (#808) (bd875bf)
  • dev: catalyst-hud surfaces per-phase signal files (CTL-476) (#835) (2a821fa)
  • dev: event-source workers/*.json via broker projection (CTL-483) (#842) (f6c1bdb)
  • dev: HUD WORKER column strips orch prefix (CTL-431) (#755) (4b89cbe)
  • dev: morning-briefing skill MVP (CTL-457) (#804) (d02bdaf)
  • dev: multi-output briefing fan-out (CTL-458) (#807) (3e25223)
  • dev: orchestrator state-machine rewrite + —bg cutover (CTL-452) (#809) (487cc38)
  • dev: phase-agent skill scaffold + dispatch helper (CTL-448) (#799) (29e91c7)
  • dev: phase-implement + phase-pr + phase-monitor-merge skills (CTL-449) (#803) (eb3c008)
  • dev: phase-research + phase-plan + phase-verify + phase-review skills (CTL-450) (#801) (e3a4294)
  • dev: research-curate contradiction detection + CONTRADICTIONS.md (CTL-468) (#810) (185814f)
  • dev: research-curate skill — inventory + staleness + INDEX.md (CTL-467) (#805) (dce7f14)
  • dev: turn-cap exhaustion → automated handoff continuation (CTL-484) (#844) (a521ca9)

Bug Fixes

  • dev: catalyst-events tail/wait-for exit when parent dies (CTL-439) (#762) (bc5b657)
  • dev: consolidate HUD Header chip row onto single line (CTL-434) (#758) (0737ed9)
  • dev: HUD filter input + status row span full terminal width (CTL-433) (#757) (5532042)
  • dev: HUD interests footer drops ‘ago’ suffix on null timestamps (CTL-432) (#754) (46887d2)
  • dev: populate session_metrics from worker stream cost data (CTL-455) (#798) (6eeb7ec)
  • dev: unbreak phase-agent dispatch end-to-end (CTL-490) (#848) (ba6fd03)
  • dev: widen HUD Interests TYPE column to 18 + add margin before WATCHES (CTL-438) (#761) (cf97d3c)
  • dev: wire orchestrate-roll-usage into monitor loop + enable phase-agents dispatch (CTL-487) (#845) (3807a0f)

10.1.0 (2026-05-18)

OTEL Cost Attribution for Phase-Agent Workers

Phase-agent workers spawned via claude --bg now inherit OTEL_RESOURCE_ATTRIBUTES from the orchestrator, so Grafana cost panels correctly attribute their spend to the right Linear ticket, branch, and project. Previously, those labels were empty and the “Cost by Linear Ticket” panel silently dropped phase-agent costs — in one dogfood run, ~75% of spend went unattributed. No migration steps required.

Features

  • dev: propagate OTEL_RESOURCE_ATTRIBUTES to phase-agent claude —bg children (CTL-492) (#862) (19166f0)

10.2.0 (2026-05-28)

Session Continuity & Linear Stability

This release focuses on two things: keeping phase workers alive across reboots and machine restarts, and stopping the Linear API rate-limit storms that were halting the execution-core daemon. Boot-resume now passes --resume-session so in-flight workers pick up where they left off instead of starting fresh, with a dual-schema fallback that handles both old and new Claude Code state formats. On the Linear side, a circuit breaker throttles retries on 429s, cross-team label errors are correctly classified as unrecoverable (ending the per-tick retry loops against ADV tickets), and per-event scoping polls are replaced with webhook-captured fields — cutting the baseline Linear call volume significantly. Several correctness fixes also land: the one-worker-per-ticket invariant is now enforced with a liveness gate, yield tombstones no longer crash the scheduler tick, and sub-agent costs are included in phase mirror footers.

Features

  • dev: aggregate sub-agent-inclusive cost/token totals for the phase mirror footer (CTL-666) (#1123) (5bf0e2f)
  • dev: boot-resume passes —resume-session for true session continuation (CTL-690) (#1155) (b52c4c7)
  • dev: capture Linear webhook scoping fields + drop per-event scoping poll (CTL-681) (#1138) (545e2f6)
  • dev: cold-start detection signal for execution-core recovery (CTL-640) (#1071) (9221ef8)
  • dev: Linear state TTL cache for execution-core daemon (CTL-634) (#1069) (43917b3)
  • dev: machine-level config fallback for phase-agent-dispatch (CTL-689) (#1152) (23eae98)
  • dev: repoint broker watchdog to claude-agents liveness (CTL-672) (#1163) (6f1c7bf)
  • dev: route triage/research/implement/pr phase workers to Sonnet (CTL-689) (#1150) (c5061e6)

Bug Fixes

  • dev: add Linear rate-limit circuit breaker + drop redundant triaged label (CTL-679) (#1136) (c5e550d)
  • dev: carry project/linear.key/orchestration in canonical-event resource block (CTL-636) (#1070) (f011f12)
  • dev: classify Linear cross-team label-UUID errors as missing-label (#1137) (e336f36)
  • dev: enforce one-worker-per-ticket — liveness-gate reclaim + reap on remediate cycle (CTL-661) (#1107) (a4bbfea)
  • dev: make phase-emit-complete.sh sourceable under zsh (CTL-618) (#1067) (ebde111)
  • dev: make phase-triage body resilient to slash-arg substitution (CTL-602) (#1031) (fab4c66)
  • dev: orchestrate-dispatch-next phase-fork bugs — phase-aware RUNNING count + stdin drain guard (CTL-605) (#1068) (c19dea5)
  • dev: phase-mode turn-cap continuation — orchestrate-revive fires —resume in phase-agents mode (CTL-613) (#1099) (b3d5b49)
  • dev: resolve session UUID from resumeSessionId + formal config schemas (CTL-710) (#1181) (2fedd98)
  • dev: stop execution-core label-retry storm on missing workspace labels (CTL-585) (#1007) (b9e06e1)
  • dev: stop scheduler tick from crashing on yield-tombstone files (CTL-702) (#1170) (b732664)
  • dev: supersede guard for predecessor reaping (CTL-606) (#1072) (a6c7f1c)
  • execution-core: broaden reclaim trigger to cover stale bg jobs (CTL-588) (#988) (30f1655)
  • execution-core: reclaim dead phase-implement workers via commit-state probe (CTL-574) (#985) (747a3f6)

10.2.1 (2026-05-28)

Scheduler Test Isolation Fix

Eight scheduler tests were silently failing on any machine with active background workers — CI passed because it runs sandboxed, masking a regression introduced by the CTL-705 preemption sweep. The fix injects liveBackgroundCount: () => 0 into the affected test fixtures so local dev environments with live pipelines no longer see false failures. No production code changed and no migration is needed.

Bug Fixes

  • dev: inject liveBackgroundCount in scheduler tests broken by CTL-705 preemption (CTL-715) (#1188) (9e1dedf)

10.2.2 (2026-05-28)

Startup Triage Sweep Fix

Tickets already in an eligible state when the dev daemon boots — or that appear between webhook deliveries — now get triage dispatched automatically. Previously, these fell into a permanent retry loop because the startup reconcile never checked for missing triage artifacts; manual intervention was required after every daemon restart. No migration needed.

Bug Fixes

  • dev: auto-dispatch triage for pre-existing eligible tickets at startup (CTL-711) (#1191) (954b31e)

10.3.0 (2026-05-30)

Live Worker/Ticket Board

The monitor now serves a real-time Worker and Ticket board at the default / route, replacing the old polling dashboard as the primary view (legacy dashboard still available at /legacy). Board data is pushed over SSE from a single shared snapshot — no more per-tab polling hammering the server — with updates triggered reactively on state changes rather than a fixed tick. The Workers view also gains a Status ↔ Pipeline column toggle so you can group live workers by liveness or by phase, and worker cards now show a session short-code to distinguish revived duplicate workers from the same ticket.

Features

  • dev: board real-time layer — async assembleBoard + reactive SSE push (CTL-733) (#1230) (f034a14)
  • dev: live Worker/Ticket board UI wired to execution-core (CTL-727) (#1216) (0d5aac0)
  • dev: real shadcn components + Linear-style board UX (CTL-727) (#1219) (d8396d2)
  • dev: serve the Worker/Ticket board from the monitor (CTL-730) (#1229) (50e9b2e)
  • dev: Workers board Status↔Pipeline column toggle (CTL-732) (#1228) (4468bc7)

Bug Fixes

  • dev: stabilize main — revive idle/budget gaps + cache-only de-starvation reconciliation (CTL-735 / CTL-736 PR-0) (#1234) (dbabfbb)
  • dev: worker session short-code to distinguish revive-duplicates (CTL-727) (#1223) (b3d1fdf)

10.4.0 (2026-05-31)

Deterministic Worker Lifecycle Engine

The revive-storm guard stack — roughly 14 heuristic dampers that tried to guess whether a worker was dead — is replaced by three deterministic primitives: an atomic single-flight claim with fencing tokens, a state.json death trigger that reads local lifecycle state instead of the eventually-consistent claude agents snapshot, and a progress probe that stops futile respawns by checking whether a worker actually made commits or produced output before deciding to revive it. Separately, per-step model, effort, and preamble overrides are now live in dispatch via a small rules engine in the workflow descriptor, so large or epic tickets can launch the plan worker with max effort and a different model while every other case stays byte-identical to before. The board real-time client also shifts to a SharedWorker with an IndexedDB cache, cutting upstream SSE connections to one per browser instead of one per tab.

Features

  • dev: atomic single-flight worker claim + fencing token (CTL-736 Phase 1) (#1235) (d09fb2b)
  • dev: board SharedWorker + IndexedDB real-time client (CTL-733 PR-2b) (#1242) (4a76d27)
  • dev: CTL-736 Phase 2-3 — state.json death trigger + progress probe (retire the revive-storm guard stack) (#1245) (0a0624a)
  • dev: per-step conditional levers — model/effort/preamble in dispatch (descriptor v1.1) (#1239) (673bdc1)

Bug Fixes

  • dev: clear verify/remediate claim tombstones on cycle reset (CTL-736 GATE-0) (#1237) (5c50ded)

10.5.0 (2026-06-03)

Point-Driven Effort & Pipeline Reliability

Ticket point estimates now drive --effort flags and /workflows postamble automatically across the plan, implement, verify, and review phases — 1pt maps to medium, 3/5pt to high, and 8/13pt to xhigh with workflows. Four reliability fixes ship alongside: workers that die before their first turn now self-heal by re-issuing the phase command on revive; the orchestration monitor’s Done column no longer surfaces mid-pipeline tickets that haven’t reached monitor-deploy; parked workers no longer spuriously re-dispatch when the bot posts its own clarifying question; and workflow_id in the sessions table is no longer polluted with stale daemon session ids, making per-run cost attribution queries accurate.

Features

  • dev: CTL-747 per-phase effort + dynamic-workflow execution driven by ticket points (#1262) (0b7bbe0)

Bug Fixes

  • dev: CTL-736 revive re-issues the phase command so a pre-first-turn death self-heals (#1263) (084a522)
  • dev: CTL-745 gate synthetic done on terminal pipeline state (#1287) (b65bc27)
  • dev: CTL-752 neutralize frozen-daemon workflow_id leak + doc join queries (#1274) (d499be9)
  • dev: CTL-756 self-echo guard for handleCommentWake (#1283) (7319d7c)

10.6.0 (2026-06-04)

Autotuning Execution Core & Per-Worker Observability

The execution core now includes a setpoint-seeking autotuner that converges maxParallel toward a host-configurable target — including at idle, where it previously stalled at 1. Per-worker OpenTelemetry is fully wired into the background-worker model, so phase workers now emit correctly tagged metrics in Grafana, Dash0, and Honeycomb instead of untagged or mis-attributed signal. A reaper poll-fallback fix stops predecessor workers from leaking into liveCount and starving the parallel queue.

Features

  • dev: CTL-760 per-worker OpenTelemetry for the background-worker execution model (#1294) (5399a29)
  • dev: CTL-770 setpoint-seeking autotuner + CTL-771 autotune OTel gauges (#1307) (6f4cfd9)

Bug Fixes

  • dev: CTL-769 give the execution-core reaper a poll-fallback drain (#1304) (068795d)
  • dev: CTL-770 reach idle convergence — autotuner no longer bails at bgCount===0 (#1308) (3cc5c99)

11.0.0 (2026-06-05)

Ticket Gantt, Smarter Autotuner & Signal Reliability

Clicking a ticket card in the orchestration monitor now opens a three-tab drawer — a wall-clock Gantt of per-phase spans colored by phase type, a cost and token breakdown, and the full comms stream for that ticket. The autotuner gets two significant fixes: macOS hosts no longer false-clamp maxParallel to 1 due to os.freemem() under-reporting available memory, and scale decisions now attribute CPU and memory to Claude’s own process tree so the tuner holds steady when another process is causing host pressure rather than shedding workers unnecessarily. A longstanding wedge where phase workers silently skipped the signal-file flip on claude --bg dispatch is also resolved by threading orchestrator context through the surviving settings.env channel.

Features

  • dev: CTL-734 ticket-detail drill-in — kibo-ui Gantt of per-phase worker spans (#1319) (5b5d562)
  • dev: CTL-761 emit revive/attempt count as OTEL dimensions on terminal phase events (#1321) (087e4b1)
  • dev: CTL-775 demand-driven autotuner — saturation-gated up, Claude-attributed down (#1316) (1da9db8)
  • dev: document and enforce the Linear app-actor botUserId requirement (#1282) (a4bb94d)

Bug Fixes

  • dev: CTL-623 residual — describe-pr sibling-ref prose + ci-describe-pr body_file fix (#1322) (cab4e9b)
  • dev: CTL-731 residual — default eligibleQuery to Todo + Release-As 11.0.0 (#1331) (f9345bd)
  • dev: CTL-766 persist real tailer offset in otel-forward checkpoint (#1310) (1ddf24a)
  • dev: CTL-772 platform-aware available memory — stop autotuner false-clamping to 1 on macOS (#1311) (a06c481)
  • dev: CTL-777 reliable phase-worker signal flip via surviving settings.env channel (step 1) (#1326) (ccab289)
  • dev: repair removeLabel (linearis rejects —label-mode remove) + hermetic test guard (#1327) (0e80e26)

11.0.1 (2026-06-05)

Pre-Push Hook Suppression Fix

Automated phase-agent pushes no longer trigger locally-installed pre-push hooks (trunk, trufflehog, fmt, tests) that were causing CPU and memory spikes during concurrent worktree dispatches. The fix passes -c core.hooksPath=/dev/null per git call — no persistent config changes, no --no-verify — so your interactive pushes are completely unaffected.

Bug Fixes

  • dev: CTL-693 suppress pre-push hooks on automated phase-agent pushes (#1328) (c831e58)

12.0.0 (2026-06-06)

Compound Engineering Loop & Daemon Reliability

This release introduces the Compound Engineering MVP (Slice 1): phase skills now log per-ticket friction as work happens, phase-research injects relevant past learnings before starting, and the morning briefing surfaces a friction digest and pending compound decisions for approval. Alongside that, a significant batch of daemon reliability fixes lands — worktree removal now requires positive evidence of merged+clean+no-session+provenance before any deletion (closing a real data-loss vector), liveness snapshot wedges that held new-work dispatch indefinitely are resolved at both the population and in-tick aging layers, and per-tick Linear reads are batched into a single query to collapse what was ~3,000–4,400 individual ticket reads per hour down to one batched request per TTL window. The plugin layout also reorganizes: catalyst-foundry is a new plugin for framework setup skills, catalyst-legacy topology is corrected, and compound is renamed compound-estimate — update any slash-command references accordingly.

⚠ BREAKING CHANGES

  • dev: plugin reorg — catalyst-foundry plugin, legacy topology fix, compound-estimate rename (CTL-786) (#1350)

Features

  • dev: account-level rate-limit usage poller (CTL-787) (#1358) (2e65fc9)
  • dev: authenticate the daemon as the Catalyst Orchestrator app-actor (isolated bucket) (#1348) (51accc4)
  • dev: compound-engineering Slice 1 — engineering compound loop MVP (CTL-789) (#1361) (01740eb)
  • dev: CTL-784 batch per-tick Linear reads into one filtered query (#1349) (e19308c)
  • dev: plugin reorg — catalyst-foundry plugin, legacy topology fix, compound-estimate rename (CTL-786) (#1350) (0995954)
  • dev: portable daemon env / proxy-audit template + prerequisite checks (#1343) (0a59075)
  • dev: read Linear bot creds + self-echo botUserIds from global config.linear.bot.{worker,orchestrator} (back-compat) (#1347) (150cc94)
  • dev: source machine-local execution-core.env on daemon start (#1341) (388db14)

Bug Fixes

  • dev: defer CTL-731 liveness deadline verdict so a completed read survives loop starvation (CTL-790) (#1360) (5f416a4)
  • dev: evidence-gate worktree removal — never delete without merged+clean+no-session+provenance (CTL-791) (#1363) (42e1c4e)
  • dev: warm the liveness snapshot + tolerate in-tick aging so dispatch isn’t held forever (CTL-792) (#1365) (e9534cf)

12.1.0 (2026-06-08)

Distributed Orchestration & Daemon Hardening

This release lays the foundation for multi-host orchestration: the scheduler now uses rendezvous hashing to partition ticket ownership across a cluster roster and soft-claims each ticket before dispatch, becoming a safe no-op on single-host setups until you add a second host to .catalyst/hosts.json. Alongside that, the daemon gets significant reliability improvements — phase workers now self-stop after emitting complete (eliminating 7-hour idle zombies), cold-start recovery distinguishes cheap phases (auto-resume) from expensive ones (operator greenlight required), and a new standalone catalyst-agent samples host metrics and Claude account rate-limit usage across multiple accounts. Fresh-machine setup is also substantially more reliable, with no-sudo install fallbacks, correct humanlayer and gh CLI install paths, and a vendored replacement for the crashing humanlayer thoughts init command.

Features

  • dev: auto-run compound learning per ticket + relocate stores to thoughts/shared/retros/ (CTL-831) (#1428) (c30ca97)
  • dev: catalyst-agent — standalone host telemetry + multi-account Claude usage agent (CTL-812) (#1413) (a6d7921)
  • dev: CTL-639 clean cold-start recovery — CTL-646 label lifecycle + CTL-644 cheap/gate policy (#1481) (093f4c8)
  • dev: CTL-778 — halt-on-complete, daemon self-heal + reaper backstop (#1486) (d5f715d)
  • dev: CTL-783 draft-PR-early: implement opens draft on first commit; phase-pr flips ready (#1419) (f618445)
  • dev: CTL-845 — vendor worktree-thoughts-init.sh, fix humanlayer crash on fresh install (#1458) (8ef8739)
  • dev: CTL-850 wire HRW ownership + Linear-CAS claim into new-work dispatch (#1473) (ceb7a79)
  • dev: CTL-854 — fresh-host registry bootstrap + silent-idle observability (#1465) (663f563)
  • dev: CTL-859 host identity + heartbeat foundation (#1470) (0174016)
  • dev: Gateway L1(a) — full-descriptor ticket_state schema + UUID→identifier index (CTL-821) (#1414) (3f17c67)
  • dev: Gateway L1(b) — webhook write-through with create/update/remove descriptor fold (CTL-822) (#1415) (1079c06)
  • dev: Gateway L1(c) — daemon read client over the durable descriptor store (CTL-823) (#1416) (3dfe01a)
  • dev: make setup-catalyst.sh safe for headless environments (CTL-842) (#1456) (4dd39d5)
  • dev: monitor board — add Todo + Triage columns + surface queued tickets (CTL-767) (#1411) (83526a3)
  • dev: ticket-retro — cross-ticket retrospective view + briefing Plan-today callout (CTL-814) (#1410) (2e65659)
  • pm: close the estimation feedback loop — recurring corpus refresh from real actuals (CTL-813) (#1400) (f066c82)

Bug Fixes

  • catalyst-agent: add PATH to launchd plist so usage domain works (#1480) (8e4aec8)
  • dev: add turn-cap-exhausted to TERMINAL set in signal-reader (CTL-830) (#1431) (381cc27)
  • dev: catalyst-agent disk probe reads the APFS Data volume on macOS (CTL-812) (#1427) (911fd89)
  • dev: catalyst-agent skips unlabeled usage samples + normalizes hostname (CTL-812) (#1454) (4002858)
  • dev: CTL-703 — invert no-linear-prose guard: teardown is the Done writer now (#1399) (dc77a0a)
  • dev: CTL-834 cool-down held-label converger + classify exclusive-group label conflicts (#1483) (4e117ef)
  • dev: CTL-844 fresh-machine installer gaps — no-sudo, npm humanlayer, real gh CLI, bun required (#1457) (0c5e94d)
  • dev: CTL-846 liveness-gate proxy env at daemon launch + harden docs (#1459) (7bbb585)
  • dev: fold reaper-metrics into O(1) counters, drop the unbounded events[] (CTL-793) (#1383) (4ac303c)
  • dev: ghost-breaker — reclaim jobLifecycle-alive-but-FRESH-agents-absent workers (CTL-809) (#1385) (fca33be)
  • dev: hermetic CATALYST_DIR preload — tests can’t pollute the real event log (CTL-810) (#1412) (eed3ae2)
  • dev: merge per-project secrets config to preserve unprompted keys (CTL-843) (#1455) (3956c9f)
  • dev: otel-forward floats as doubleValue + agent OTLP body = event name (CTL-812) (#1421) (2032436)
  • dev: relocate CONCEPTS.md to thoughts/shared/ so it syncs (CTL-789) (#1390) (2deb8e0)
  • dev: strengthen implementProbe with plan-phase completeness gate (CTL-663) (#1434) (0098e48)

Performance Improvements

  • dev: incremental countTicketEventsInWindow — kill the per-tick full-log rescan (CTL-802) (#1387) (d2685ab)

12.2.0 (2026-06-08)

Gherkin Tickets & Scheduler Hardening

The new gherkin-ticket skill rewrites ticket authoring around use cases first: actor-led titles, tiered Gherkin scenarios, and a REWRITE mode that reorganizes without dropping technical detail. Auto-fires on ticket-creation language or invoke it directly as /catalyst-dev:gherkin-ticket. This release also closes several scheduler reliability gaps: pre-spawn orphan claims that wedged phases indefinitely are now reaped and retried, persistent per-team reconcile failures surface as visible events instead of silent starvation, and workspace-scoped label preflight no longer fires false alarms on every boot.

Features

  • dev: CTL-877 gherkin-ticket skill — use-case-first ticket authoring (#1504) (e379efb)

Bug Fixes

  • dev: CTL-835 add scope to linear-comment-post OAuth mint (invalid_scope) (#1491) (42d20ac)
  • dev: CTL-837 GC pre-spawn orphan phase claim → unwedge claim-lost loop (#1492) (f437290)
  • dev: CTL-841 self-heal missing wt/ dir in catalyst-monitor start (#1497) (a29c5f3)
  • dev: CTL-867 escalate persistent per-team reconcile failure to a visible event (#1494) (8f57f41)
  • dev: CTL-868 — zombie-staleness hardening + orphan-detected sweep event (#1487) (b34e506)
  • dev: CTL-869 detect proxy env leak into interactive shells (CTL-846 regression class) (#1493) (c604ebe)
  • dev: CTL-874 preflight queries workspace-scoped labels (not —team) (#1499) (9d8fd84)

12.3.0 (2026-06-08)

Gherkin-Ticket Standard in Ticket Creation

New tickets created via the linear and create-tickets skills now automatically follow the gherkin-ticket format — outcome-first titles, use-case openers, and tiered Gherkin bodies with technical detail tucked under ## Technical notes. Both paths enforce this as a hard gate, so the backlog can’t drift back to mechanism-first titles. The phase-triage skill also assesses conformance and flags non-conformant tickets in triage comments, without touching classification logic or auto-rewriting anything.

Features

  • dev: CTL-880 wire gherkin-ticket standard into ticket-creation skills (#1508) (4b21363)

12.4.0 (2026-06-09)

Cache-Backed Read-Model & Board Redesign Foundation

This release lays the architectural foundation for the upcoming board and detail-page redesign. The orchestration monitor’s read-model now assembles once from durable caches and fans out to all clients — no more synchronous Linear API calls per request — and every BFF endpoint (ticket detail, artifacts, search, ticket run history) reads exclusively from broker-cached data. Alongside that, the board gains deep-linkable routes via TanStack Router, a single ordering source shared between the board and the detail pager, a typed read-model client contract enforced at compile time across the web UI and terminal HUD, and an edge-to-edge app shell built on the shadcn Sidebar primitive. Two dependency bugs are also fixed: epic-to-child deadlocks and false blockers from prose-scraped ticket mentions.

Features

  • dev: BFF1 cache-backed read-model core (CTL-883) (#1559) (417271b)
  • dev: BFF11 broker fence projection into cache (CTL-923) (#1563) (de3d6b3)
  • dev: BFF4 phase runs as run entities + verbatim signal (CTL-886) (#1564) (55e0bee)
  • dev: BFF6 board payload model/startedAt/pid/sess_id (CTL-888) (#1562) (c234c74)
  • dev: BFF7 cache-backed ticket detail / artifacts / search endpoints (CTL-889) (#1567) (1179aa1)
  • dev: BFF9 retire legacy linearis poller onto durable cache (CTL-921) (#1566) (d9c050a)
  • dev: FND1 deep-linkable routes (TanStack Router) (CTL-881) (#1557) (36348c2)
  • dev: FND2 resolveList() + jotai nav store (CTL-882) (#1565) (633ad43)
  • dev: HUD1 shared read-model client contract (CTL-919) (#1568) (2eda1de)
  • dev: SHELL1 edge-to-edge app shell + left nav (CTL-891) (#1569) (41c1000)

Bug Fixes

  • dev: CTL-838 stop inferring dependencies from prose — link them, triage analyzes for missed ones (#1556) (cf29cf0)
  • dev: CTL-878 stop self-inflicted epic→child dependency deadlock (#1510) (5f2e388)
  • dev: CTL-883 keep bun:sqlite out of the Node-loaded vite.config import graph (#1561) (03537d0)
  • dev: CTL-927 exempt doc-phase workers from the cold-snapshot zombie-floor mtime kill (#1571) (c3394f8)

12.5.0 (2026-06-11)

Observe Suite, Redesigned Shell & Agent Reliability

This release ships the full OBSERVE analytics suite (Telemetry, FinOps, and FleetOps surfaces with live Prometheus/Loki charts, cost breakdowns, and host health), a heavily reworked shell with unified routing, Linear-quality ticket detail pages, and a new swimlane board that shares one scroll axis across all groups. On the reliability side, workers now fence irreversible side-effects against cluster takeover, parked needs-input workers release their concurrency slot and resume when unblocked, and a belief-store rule layer tracks liveness, blocker rank, and escalation decisions each tick. The dirty-worktree rebase storm, boot-resume no-op, and stale eligible-projection bugs are also fixed.

Features

  • dev: belief store obs_relation — record blocking edges as facts each tick (CTL-964) (#1690) (df5bd89)
  • dev: belief-store Step 1 — per-tick liveness fact collector (CTL-933) (#1630) (bc853c5)
  • dev: beliefs SSE endpoint /api/beliefs/stream + BeliefTail cursor (CTL-967) (#1700) (baf71e5)
  • dev: BFF10 per-entity host/team/generation (CTL-922) (#1576) (294bd81)
  • dev: BFF12 fence-aware Answer/Unblock read-model mutation endpoint (CTL-924) (#1589) (87a4c38)
  • dev: BFF2 cluster grouping + liveness overlay (CTL-884) (#1575) (f766acf)
  • dev: BFF3 cross-node live-tail SSE fan-in (CTL-885) (#1590) (8d0e0a4)
  • dev: BFF5 live EC-worker transcript tail SSE (CTL-887) (#1573) (83332b3)
  • dev: BFF8 fence-aware stop-worker mutation (CTL-890) (#1574) (89714a2)
  • dev: board shared column headers + single horizontal scroll across swimlanes (CTL-950) (#1656) (6bc5de4)
  • dev: board shows one method-correct estimate + dependency chips; estimate read-model projection (CTL-957) (#1685) (5180b85)
  • dev: BOARD2 display-options popover — density is a knob (CTL-906) (#1609) (e6e48bb)
  • dev: BOARD3 row swimlanes by team / project / host-node (CTL-907) (#1611) (d7984ba)
  • dev: BOARD4 dense List view as an alternate board layout (CTL-908) (#1613) (7b4edd5)
  • dev: bounded stall-diagnostician wake wiring + evidence capture (CTL-937) (#1641) (410a3ac)
  • dev: closed-loop intent layer — stop-storm, fire-once, pager-fail (CTL-936) (#1643) (b4fe04b)
  • dev: CTL-1000 — wrappers resolve from healthy pristine checkout (cache fallback + loud warning + —version source) (#1768) (4665b14)
  • dev: CTL-1003 ticket detail v3 — Linear-parity chrome, prose, tabs, rail cards, relations (+CTL-999 off-board) (#1758) (ef8a8d9)
  • dev: CTL-1012 project branding in lane headers + detail rails (#1769) (b2f8d1f)
  • dev: CTL-768 — release parked worker slot (needs-input → hold-stop + revive-with-resume) (#1736) (c59c9be)
  • dev: CTL-864 — workers fence irreversible side-effects against cluster takeover (generation token through dispatch + 5 skill guards) (#1780) (f6affb5)
  • dev: CTL-966 advance_to phase-prediction shadow comparator (#1704) (c97dee7)
  • dev: CTL-981 nav final calibration — weight 500 + contrast /72 for label presence (#1708) (2cf8971)
  • dev: CTL-989 unify app shell — single router, AppShell on every screen, URL=source-of-truth (#1735) (74e0a2c)
  • dev: CTL-996 ticket detail — Linear-calm reading column + right rail + visible tabs (#1745) (6436f1d)
  • dev: DETAIL1 shared detail chrome + pager + keyboard (CTL-912) (#1584) (de7911f)
  • dev: DETAIL2 ticket detail page skeleton (CTL-913) (#1597) (9c325f0)
  • dev: DETAIL3 worker page skeleton + Loki history tail (CTL-914) (#1600) (a21da5c)
  • dev: DETAIL4 wire per-phase model/startedAt/pid/sess_id (CTL-915) (#1602) (84ea09d)
  • dev: DETAIL5 re-skinned command palette + cheatsheet (CTL-916) (#1599) (e191d5e)
  • dev: DETAIL6 telemetry / burn metrics off OTEL (CTL-917) (#1605) (00f8288)
  • dev: DETAIL7 live activity tail (CTL-918) (#1606) (9a4ed26)
  • dev: dispatch workers with —plugin-dir from per-host pluginDirs config (#1614) (9f21ff3)
  • dev: HOME1 calm master-detail Inbox home (CTL-899) (#1581) (9067471)
  • dev: HOME2 status glyph + phase strip (CTL-900) (#1594) (399d1d7)
  • dev: HOME3 reframed groups + per-row durations (CTL-901) (#1595) (8129d78)
  • dev: HOME4 reading pane — ask/options/About/View-in-Claude (CTL-902) (#1601) (1d5bef0)
  • dev: HOME5 one verb clears item + resumes the paused agent (CTL-903) (#1607) (2a53fec)
  • dev: HOME6 calm all-clear empty state (CTL-904) (#1593) (b56d511)
  • dev: HUD2 terminal HUD consumes the shared read-model (CTL-920) (#1583) (fc7e1f9)
  • dev: left-nav restyle v2 — natural-case headers, right twistie, Linear selected state (CTL-977) (#1701) (fbdc1ae)
  • dev: LIFECYCLE SPINE real per-phase cost/tokens + artifact links + prominent Gantt (CTL-953) (#1664) (ec1f054)
  • dev: Linear-style board scroll — dual-sticky group labels + per-cell overscroll chaining (CTL-958) (#1669) (9463edb)
  • dev: list view on TanStack Data Table — default stage/status grouping (CTL-955) (#1663) (c4dc73b)
  • dev: live terminal screen pane for pre-transcript workers (CTL-938) (#1629) (78f3edb)
  • dev: motion — animate board/list/queue state & position transitions (CTL-952) (#1659) (2c57400)
  • dev: nav proportion v3 — 16px icons, muted labels, twistie beside label, Projects heading (CTL-980) (#1706) (5ad727a)
  • dev: OBSERVE FinOps surface — cost routes + hero(today-vs-7d + cache-ROI) + breakdowns (OBS-9/10/11) (#1716) (f0615c6)
  • dev: OBSERVE FleetOps surface — host health + stuck/dead reap hints + reconcile (OBS-18) (#1719) (1f02983)
  • dev: OBSERVE foundation — chart grammar + panel honesty kit + shell (OBS-1/2/5) (#1713) (7603f5f)
  • dev: OBSERVE Telemetry surface — hero + live tail + errors/tools/latency + events heatmap (OBS-6/7/8) (#1714) (3cd51ab)
  • dev: one-checkout node updates — hotpatch pulls the pluginDirs checkout, parity reports drift (CTL-940, CTL-941) (#1626) (f704bb5)
  • dev: one-checkout node updates — hotpatch pulls the pluginDirs checkout, parity reports drift (CTL-940, CTL-941) (#1627) (b61524e)
  • dev: one-nav board shell — project-grouped sidebar, quiet display popover, engaged swimlanes, contrast pass (CTL-930, CTL-944) (#1636) (78ec17b)
  • dev: per-project nav icons — auto-detect repo favicon + manual override (CTL-961) (#1682) (d310722)
  • dev: pristine main-only plugin-source checkout + merge-to-main auto-refresh (CTL-992, CTL-993) (#1743) (0280976)
  • dev: queue — group workers by all activity states, blocked pinned bottom with blockers (CTL-947) (#1654) (5372b61)
  • dev: React Flow dependency graph — backlog graph + per-ticket dep sub-graph (CTL-948) (#1655) (8a5d697)
  • dev: recursive dependency beliefs over obs_relation — blocker_rank/cycle_detected/ready (CTL-965) (#1699) (e360841)
  • dev: SHELL2 Dense Board inside the shell (CTL-892) (#1579) (657b740)
  • dev: SHELL3 OPERATE/OBSERVE nav IA + brand + footer (CTL-893) (#1580) (32fb41f)
  • dev: SHELL5 top strip — single search palette + ’/’ open (CTL-895) (#1588) (ee4607c)
  • dev: SHELL6 live nav badges/dots from read-model (CTL-896) (#1591) (05c5b67)
  • dev: SHELL7 config-driven workspace switcher (CTL-897) (#1603) (dde9d9f)
  • dev: SHELL8 footer per-node cluster health + node filter (CTL-898) (#1604) (da688e3)
  • dev: single-click opens detail page, drawer removed, Linear-style pager + Esc-restore (CTL-951) (#1658) (d22b6f3)
  • dev: stratified belief rules + provenance + catalyst why (CTL-934) (#1635) (b9231bc)
  • dev: supplemental estimate fallback — board shows real Linear estimates for legacy tickets (CTL-974) (#1692) (bbe55d3)
  • dev: SURF1 Workers grid grouped/filtered by host node (CTL-909) (#1596) (573bbbc)
  • dev: SURF2 wide ranked Queue depth surface (CTL-910) (#1598) (b04c883)
  • dev: SURF3 Settings surface (persisted prefs) (CTL-911) (#1585) (5461865)
  • dev: ticket detail — real title + Linear-quality markdown description (#1733) (8973797)
  • dev: ticket detail v2 — PM status hero + consolidated lifecycle + Cost/Activity tabs (#1730) (9eecfb5)
  • dev: triage estimates in the project’s estimation method, cached with TTL — one estimate not two (CTL-954) (#1657) (64b4b14)
  • dev: turn-zero gate — stop+replace workers that never start their first turn (CTL-932) (#1631) (0b34dd7)
  • dev: worker detail v2 — one rail + ticket link + structured Now view + workflow telemetry (#1729) (5495905)

Bug Fixes

  • dev: board surface SkeletonDashboard — free a connection slot for the lazy board chunk (CTL-945) (#1639) (cf44dde)
  • dev: board swipe hijack — contain overscroll + edge bump (CTL-973) (#1686) (aeaa4ba)
  • dev: board wheel guard froze horizontal scroll at the resting left edge (#1710) (5d8ddd1)
  • dev: CTL-1006 — boot-resume on daemon bounces + phase-regression guard (no more restart-manufactured stalls) (#1763) (d8c6d5a)
  • dev: CTL-1010 swimlanes fill the board height — flex distribution + lane scroll (#1765) (a9fb26d)
  • dev: CTL-1014 — repo-identity resolver honors canonical catalyst.repository key (#1772) (924d65b)
  • dev: CTL-926 — eligible projection refreshes when blocked_by relations change out-of-band (#1771) (5cdd6b1)
  • dev: CTL-928 truthful queue-board liveness — dead bg-workers excluded, idle-between-phases lane (#1610) (86e09b2)
  • dev: CTL-929 exempt zero-dep tickets from the triage→research read-failure fail-safe hold (#1592) (6fe3a83)
  • dev: CTL-978 queue must not count dead workers as in-flight (#1703) (2bb64c7)
  • dev: CTL-979 ADVA favicon — case-normalize repo key + add monorepo icon paths (#1702) (3283ba1)
  • dev: CTL-990 — kill the dirty-worktree rebase loop (root fix + typed precheck + recreate guard + dispatch timeout) (#1734) (cd88a63)
  • dev: dedupe obs_relation symmetric edges within a tick (CTL-964 follow-up) (#1711) (33fb204)
  • dev: dependency graph — draw edges, scope labels, /dep-graph SPA fallback, knip cleanup (CTL-959) (#1668) (c70c65a)
  • dev: detail page fills full viewport height — no white gap (CTL-949) (#1651) (7974c7c)
  • dev: escalate stuck once — single escalate_human executor, exactly-once page (CTL-962) (#1693) (9e91c41)
  • dev: estimate fallback query uses team+number filter — fixes 400 error (CTL-976) (#1695) (5c17b01)
  • dev: FinOps hero + spend cards collapsed to 2px (shrink-0 on scroll-column children) (#1717) (86a2bc6)
  • dev: make Linear-audit mitmproxy strictly opt-in, add NO_PROXY safety guard (CTL-946) (#1640) (da51c5a)
  • dev: OBSERVE Telemetry Loki queries — model/tool latency + tail field extraction (#1715) (0275934)
  • dev: restore board surface + scope + dual-axis scroll on detail return (CTL-971) (#1683) (5edc063)
  • dev: turn-zero cap branch is terminal — no post-escalation respawn (CTL-932) (#1633) (8c7d3a0)
  • dev: unify board phase with phase-agent-type + remediate column + lens label (CTL-972) (#1687) (09d6e4e)
  • dev: wire applyNeedsHuman in scheduler + clean up dead code in diagnostician (CTL-937) (#1642) (2982ba6)
  • dev: wire board→detail-page navigation + SPA fallback for /ticket /worker (CTL-942) (#1632) (1532302)
  • dev: wire intentDb + appendIntentEvent into runTick; pin bgJobId in kill postcondition (CTL-936) (#1644) (0a4e898)

12.6.0 (2026-06-12)

Dispatch Board & Stall-Janitor Overhaul

This release is dense. The Queue surface is renamed Dispatch (with a /queue redirect for bookmarks), and the board now distinguishes held, retrying, and gave-up tickets with distinct chips and buckets instead of a blanket “waiting” label. A new stall-janitor (Pass 0j) detects orphaned worktrees and ghost sessions, auto-clears artifact-retry-exhausted stalls once a prior-phase artifact arrives, and ships a classify-then-act unstuck sweep (Pass 0u, opt-in via CATALYST_UNSTUCK_SWEEP) for the stalled/needs-human backlog. On the UI side, Cmd+K now covers actions, settings commands, and live ticket search; the sidebar shows per-project worker presence dots and inbox attention badges; and dead ghost sessions are correctly excluded from the admission-gate slot count so work stops getting blocked by terminal sessions that were never cleaned up.

Features

  • dev: chrome batch — one header per surface, numbered slots, overlay scrollbars, titles first (CTL-1018/1035/1036/1041) (1051cae)
  • dev: CTL-1004 — stall-janitor: targeted orphan reap-requests + ghost-session kill-intents (shadow-first) (#1817) (a581efd)
  • dev: CTL-1005 — J3 artifact-complete auto-clear + CTL-1004 J2-enforce fix (#1821) (c35ac18)
  • dev: CTL-1008 — unified event log OTel completeness (#1793) (3a3fa00)
  • dev: CTL-1009 — OTel attribute conformance manifest + drift guard (#1830) (d46efa7)
  • dev: CTL-1013 elevation inversion — dark chrome lowest, content and cards stack lighter (#1788) (108a957)
  • dev: CTL-1015 queue becomes a capacity-centric control tower — slots hero, dispatch ranking, motion (#1790) (c6c8a52)
  • dev: CTL-1022 card type reads as a colored symbol; description tooltip removed (#1796) (47d8bdc)
  • dev: CTL-1023 work-type dimension on phase telemetry (catalyst.ticket.type) (#1806) (f1de97a)
  • dev: CTL-1024 Cmd+K command palette — action registry, settings commands, ticket search (#1851) (1ca339d)
  • dev: CTL-1027 per-project color picker + swimlane tint (#1854) (12fd997)
  • dev: CTL-1032 status strip counts honestly — active, dead, free, waiting (#1803) (ee85ff1)
  • dev: CTL-1033 elevation v2 — perceptible surface ladder + one token system across every page (fa8bedd)
  • dev: CTL-1034 sidebar — collapsible sections, real project headings, child indentation (#1808) (be27787)
  • dev: CTL-1037 sidebar presence — per-project worker dots, honest counts, inbox attention badges (#1825) (a27b5b5)
  • dev: CTL-1049 back-stack entry state — fresh defaults on push, exact restore on back/escape (1d8eb32)
  • dev: CTL-1050+1039 stack service health — Fleet Ops strip, inbox outage events, proportional severity (#1846) (d74f63c)
  • dev: CTL-1052 sidebar full-width/height, adjacent twisties, overlay dots, settings consolidation (#1844) (81c853d)
  • dev: CTL-1054 Queue becomes Dispatch + uniform slot-card anatomy (#1848) (d1168e5)
  • dev: CTL-1055 exclude terminal ghost sessions from admission-gate count (#1860) (489f36e)
  • dev: CTL-1058 — fix advance-shadow input-skew false disagreements via EDB-locked oracle (#1862) (477556b)
  • dev: CTL-1064 — Auto-Unstuck Deep-Dive Sweep (classify-then-act, Pass 0u) (#1880) (e5e99f9)
  • dev: CTL-1066 — queue board distinguishes held, retrying, and gave-up tickets (#1875) (c2e8929)
  • dev: CTL-1068 — retract orphaned held labels for admitted-then-failed tickets (#1878) (0cd8281)
  • dev: CTL-1071 — Catalyst Warm-Textbook Identity Spike (#1883) (9d34b28)
  • dev: CTL-729 — hung-worker watchdog + needs-attention surfacing (board + Inbox) (#1814) (095e514)
  • dev: CTL-863 — surviving hosts take over a dead host’s tickets and fence the zombie’s Linear writes (#1795) (a7b4d0e)

Bug Fixes

  • dev: CTL-1020 dependency graph draws its edges — directed blocker arrows (0f7a9a9)
  • dev: CTL-1028 plumb cluster generation through triage dispatch path (#1859) (cb8bdad)
  • dev: CTL-1031 — Linear label changes reach the read-model (Inbox lights up) (#1798) (ad21f42)
  • dev: CTL-1044 — shadow clock records evidence (operator-event appender + daemon wiring) (#1819) (10f16d8)
  • dev: CTL-1045 — stall-janitor enforce-readiness hardening (J2 kill-storm, J3 cause + prior-signal, once-marker) (#1826) (4dacdfb)
  • dev: CTL-1046 cross-team rows show titles on the control tower (4fdf722)
  • dev: CTL-1048 detail pages scroll from anywhere — dead wheel zones removed (#1837) (02a1391)
  • dev: CTL-1057 — gate HRW read-side filter on multiHost, add membership warning (#1863) (9ab5804)
  • dev: CTL-1075 — fix plan/implement dispatch gates silently fail open on macOS bash 3.2 (#1877) (af1387d)
  • dev: janitor shadow verdicts reach the log + dispatch failures carry stderr (#1847) (eb84808)

12.7.0 (2026-06-13)

Workers Dispatch/Board Split & Node Drain Mode

The Workers surface now splits into two dedicated screens — Dispatch (ControlTower) and Board (WorkerSwimlaneBoard) — toggled from the app-shell header, eliminating the sticky column header overlap and giving each view its own scroll container. Node drain mode lands alongside it: run catalyst-execution-core drain to stop a node from accepting new tickets while in-flight work finishes, with a HUD display and --off toggle to resume. This release also fixes phase workers stranding commits on transient bgIsolation branches, hardens the artifact gate to resolve paths against the ticket worktree rather than the process cwd, and prevents stale-ref PRs by push-verifying HEAD before announce and merge.

Features

  • dev: CTL-1051 — push-verify HEAD before announce/merge to prevent stale-ref PRs (#1891) (882f032)
  • dev: CTL-1062 — surface governance modes in heartbeat + CLI (#1908) (b92085f)
  • dev: CTL-1063 — dev-time Datalog compiler for belief engine rules (#1884) (ffa7c16)
  • dev: CTL-1077 — hot-reload full stack on merge to main (#1893) (c0c5c64)
  • dev: CTL-1081 — phase artifacts land where the gate looks for them (#1904) (ceea9f7)
  • dev: CTL-1095 — node drain mode: refuse new-work admission, CLI toggle, HUD display (#1928) (66cbb44)
  • dev: CTL-1098 — Workers surface: Dispatch/Board split screens (#1934) (478e224)

Bug Fixes

  • dev: CTL-1060 — otel-forward reliability: DLQ drain fix, stack lifecycle, lag metric (#1909) (a308ae2)
  • dev: CTL-1078 — classify retraction-sweep auth/scope failures correctly and break per-tick storm (#1894) (f27f2b7)
  • dev: CTL-1079 — retraction sweep reads label state from broker cache (#1898) (74e4cfc)
  • dev: CTL-1082 — restore vertical scroll to the Workers surface (#1902) (3ba1e7e)
  • dev: CTL-1083 — The Workers grouping switcher and dep-graph navigation should work (#1905) (f628bf9)
  • dev: CTL-1085 — removeLabel UUID overwrite fixes cross-team label collision (#1930) (7c6410b)
  • dev: CTL-1086 — keep synthetic test events out of the live fleet event log (#1929) (a8e667a)
  • dev: CTL-1087 — Service Health reads catalyst.* recency + infers collector from Loki state (#1912) (2b1eae5)
  • dev: CTL-1088 — restarting monitor must not dirty the pristine plugin clone (#1914) (31deaba)
  • dev: CTL-1097 — resolve artifact gate dir against signal.worktreePath (#1932) (62cb760)
  • dev: CTL-1105 — stop phase workers stranding commits on transient bgIsolation branches (#1945) (c308f99)

12.8.0 (2026-06-14)

Execution Tab & Governance Rulebook

Open any ticket in the orch-monitor and click the new Execution tab to see a structured breakdown of what happened — current phase, a narrative summary, phase Gantt with timings and idle gaps, artifacts table, and an exceptions list — without digging through logs. The Governance Rulebook (/rules, keyboard shortcut g r) surfaces all 17 belief-engine rules across 6 strata in Plain English, Datalog, and the exact SQL the engine runs, with live firing-rate badges when belief recording is active. Escalated tickets that hit the remediate cycle cap now show a CTA-led explanation card in the detail pane with the blocking finding, why the worker gave up, and what you need to decide — no more bare Respond buttons with no context. This release also fixes a silent 12-hour plugin-checkout outage caused by dirty worktrees, adds self-healing refresh with a checkout-lag alarm after consecutive failures, and patches a bash 3.2 crash that left the entire fleet down after a catalyst-stack restart with no arguments.

Features

  • dev: checkout-lag alarm on persistent refresh failure (CTL-1106 Phase 2) — (70fe374)
  • dev: CTL-1099 — Warm/Slate brand theme system (warm default, Settings picker, semantic-invariant) (#1944) (e93ae79)
  • dev: CTL-1102 — Execution tab (model layer + useJourney hook + full UI) (#1965) (e336115)
  • dev: CTL-1103 — Governance Rulebook textbook surface (#1972) (fa27e59)
  • dev: CTL-1106 — self-healing plugin-checkout refresh + checkout-lag alarm (#1949) (70fe374)
  • dev: CTL-1108 — populate humanQuestion for remediate-cycle-cap-exhausted escalations (#1952) (cdb1058)
  • dev: CTL-1110 — escalated ticket detail pane CTA-led explanation card (#1957) (86aeea0)
  • dev: CTL-1120 — prevent orch-monitor build artifacts from dirtying worktree (#1974) (405f6a2)

Bug Fixes

  • dev: CTL-1107 — guard empty start_args array in cmd_restart under bash 3.2 (#1976) (a23bc61)
  • dev: CTL-1111 — _find_layer2_config drift warning + phase skill stderr pass-through (#1969) (15cb905)
  • dev: CTL-1118 — SHA-aware rebuild guard for catalyst-monitor hot-reload (#1968) (88afded)
  • dev: CTL-1119 — workflow-scope push handling for phase agents (#1975) (72e4feb)
  • dev: self-healing plugin-checkout refresh (CTL-1106 Phase 1) — fetch+reset —hard (70fe374)

12.9.0

Jun 15, 2026

Process Pipeline Visualization & Fleet Stability

Click any worker row in the orch-monitor to see its real-time metrics and activity feed, plus a new /process route that maps the daemon’s 9-phase FSM pipeline with live ticket dots overlaid on each phase. Desktop client launches server-agnostic with setup screen for any Catalyst instance. Critical fleet memory leak fixed — execution-core now runs for months without restart, with bounded background workers and job directory cleanup.

PRs

  • dev: CTL-1011 — make applyAssignee self-assign loud (config-missing & scope-failure) (#2046) (34077e3)
  • dev: CTL-1101 — /process route FSM machine map in orch-monitor (#1970) (62e3fde)
  • dev: CTL-1112/1149 — Catalyst desktop client (consolidated, server-agnostic) (#2019) (0897b44)
  • dev: CTL-1132 — tickets board visual polish (column fill, tray lift, band separation, sidebar gap) (#2005) (7e84e90)
  • dev: CTL-1144 — tickets board polish (balanced columns, card elevation, full-height bands, total count) (#2008) (1be0d13)
  • dev: CTL-1146 — card elevation (tray s1→s0) & band hue bump (6→9%) (#2016) (85240d2)
  • dev: CTL-1148 — fix selected toggle chip fill in light themes (#2015) (3bcb73a)
  • dev: CTL-1158 — surface PR merge-state on BoardTicket for stuck-PR inbox attention (#2033) (a2ca8e1)
  • dev: CTL-1150 — add triage-artifact guard to scheduler Pass 2 new-work dispatch (#2038) (67434e0)
  • dev: CTL-1161 — broker webhook-independent merge refresh (#2034) (609134f)
  • dev: CTL-1165 — bound the execution-core fleet (reap-leak fix, 5 drivers) (#2045) (4915f7d)
  • dev: CTL-863 follow-up — fence sweep-2 cycle label write + remove thoughts symlinks from tracking (#1809) (8f6b49d)

12.10.0 (2026-06-16)

Multi-Node Cluster Onboarding & Failed-Phase Escalation

Two gaps that let work fall through silently are closed in this release: failed phases now surface identically to stalled ones — inbox row, amber nav dot, /queue Needs You bucket, and a Linear needs-human label with the worker’s structured explanation attached. On the infrastructure side, catalyst-join.sh and catalyst cluster join-token make adding a second node a one-line operation: mint a short-TTL token on the seed, run the curl | bash on the joining node, and the script handles Tailscale preflight, bundle fetch, config merge, and service installation with full resumability on retry. This release also ships worker-dir GC to prevent per-tick I/O blowup as worker directories accumulate, the orch-monitor as an installable PWA, launchd auto-start via catalyst-stack install-services, and editable project settings saved server-side from the monitor.

Features

  • dev: CTL-1131 — durable needsHumanSince anchor + escalation signal persistence (Phases 1–2) (#1995) (ada430e)
  • dev: CTL-1133 — installable PWA for the orch-monitor (#2049) (1289b5a)
  • dev: CTL-1152 — config-driven, server-authoritative project roster in the monitor (#2031) (51f56be)
  • dev: CTL-1153 — editable project settings in the monitor (server-saved) (#2092) (57c8f12)
  • dev: CTL-1166 — catalyst-stack install-services (launchd auto-start on boot) (#2047) (15925c3)
  • dev: CTL-1168 + CTL-1178 — Linear-match Tickets board (fixed columns, per-column flat scroll, viewport-capped grouped lanes) (#2044) (f70de89)
  • dev: CTL-1170 — async sweeps to unblock heartbeat event loop (#2058) (d086770)
  • dev: CTL-1172 — labeled service-health indicator in the orch-monitor footer (#2055) (c301d36)
  • dev: CTL-1173 Phase 2 — fix applyAssignee read-back to verify Issue.delegate.id (#2064) (68181f1)
  • dev: CTL-1175 — orphan-PR detect+notify sweep raises Needs-You inbox row (#2065) (6d2ac03)
  • dev: CTL-1180 — surface failed phases as needs-human (monitor + daemon) (#2095) (9a8027b)
  • dev: CTL-1184 — catalyst-cluster join-token + join-token-store.mjs seam module (#2097) (df2b838)
  • dev: CTL-1185 — catalyst-join.sh one-line node onboarding (#2110) (5122573)
  • dev: CTL-1203 — secrets 600 hygiene: installer enforcement + doctor assertion (#2104) (d9fd590)
  • dev: CTL-1205 — worker-dir GC to prevent per-tick I/O blowup (#2112) (9c5d933)
  • dev: CTL-1206 — flat board per-column scroll restoration (#2113) (9b1db6d)
  • dev: CTL-935 shadow comparators + disagreement report + flag-live verification (#2101) (6922530)

Bug Fixes

  • dev: CTL-1169 — daemon-health hysteresis (stop the degraded↔healthy notification flap) (#2052) (e045155)
  • dev: CTL-1171 — broker liveness heartbeat (stop the idle-broker false-down) (#2056) (8f28285)
  • dev: CTL-1181 — loud needs-human escalation + proactive token detour in phase-pr (#2093) (e1adadd)

12.11.0 (2026-06-17)

Cluster Control Plane & Autonomous Recovery

This release lands two major systems: a GitOps cluster control plane (catalyst cluster sync, cluster-repo-first roster, SOPS-encrypted secrets) and a fully wired autonomous recovery pass that now acts on stalled tickets rather than just classifying them — resolving merge conflicts, rebasing, and re-dispatching phases before escalating to a human. The reaper also gains the ability to auto-remove squash-merged worktrees, and N dashboard clients now share a single backend SSE tail instead of spawning separate full-log reads per connection.

Features

  • dev: CTL-1135 — additive caused_by on the event envelope (#2123) (47035f2)
  • dev: CTL-1186 — catalyst doctor: fail-closed activation gate for new cluster nodes (#2109) (6c4d910)
  • dev: CTL-1188 — catalyst cluster CLI (status/add/remove/rename/set-anchor/drain/tune) (#2116) (d062a42)
  • dev: CTL-1208 — curated color-tinted project icon set picker (Phosphor glyphs) (#2115) (5b14eca)
  • dev: CTL-1211 — cluster control-plane (catalyst-cluster repo + SOPS) load-side: cluster-sync, cluster-repo-first roster, schema versioning, observability verbs (#2181) (8f55595)
  • dev: CTL-1212 — grouped project settings page (Identity/Source/Workflow) + three-tier nav + one-click gear (#2127) (4de6396)
  • dev: CTL-1214 — durable cluster-node installer (PATH-B #1#6 + adversarially-verified hardening) (#2159) (fd85d21)
  • dev: CTL-1215 — consolidate monitor event-log reads behind a shared tail + bound caches (#2135) (95ec3a2)
  • dev: CTL-1218 — reaper auto-removes squash-merged worktrees (provenance + GitHub merge signal + queue drain) (#2143) (3ae063f)
  • dev: CTL-1219 — wire unstuck-sweep deterministic act-seams (ships off/inert) (#2140) (460e2c3)
  • dev: CTL-1222 — deep-link notifications to action surfaces (#2154) (9731ff7)
  • dev: CTL-1224 — route SSE backlog + live tail through the shared event-ring (N clients = one tail) (#2141) (0ea15c5)
  • dev: CTL-1225 — first-click Save + confirmation + cross-project reset (Project Settings) (#2144) (755df8c)
  • dev: CTL-1226 — searchable icon grid picker backed by full Phosphor set (#2145) (72057f6)
  • dev: CTL-1233 — hybrid Phosphor loader + virtualized All-icons picker (#2168) (9805069)
  • dev: CTL-1235 — emit running version + commit + drift-from-main (agent telemetry) (#2169) (73fe804)
  • dev: recovery-pass skill — goal-driven senior-engineer pipeline-unstick agent (#2184) (047e701)

Bug Fixes

  • dev: CTL-1176 — raise escalation bar: merge conflicts → BOUNDED-LLM, not HUMAN (#2156) (ad9c426)
  • dev: CTL-1176 — real recovery actuators (emit/post/seam/remediate/cooldown) + DIAGNOSE evidence + inbox reader (#2163) (3863adb)
  • dev: CTL-1176 — wire reasoningRecoveryPass into scheduler as autonomous Pass 0r (#2157) (ab9e110)
  • dev: CTL-1191 — HRW-gate the 3 recovery passes over the surviving roster + terminal-state filter (#2173) (38ed942)
  • dev: CTL-1235 — clean metric names (drop _ratio suffix on build_info/commits_behind) (#2171) (2df7f6c)
  • dev: CTL-1237 — stamp host.name on bg-worker OTEL attrs (claude_code host_name=null) (#2167) (768d5ac)

12.12.0 (2026-06-17)

Cross-Host Control Plane & Monitor Stability

This release lands the cross-host single control plane: multiple machines now publish and merge liveness heartbeats correctly, fixing a Linear GraphQL bug that silently blocked all cross-host heartbeat writes and a merge-ordering issue that caused the self-host to appear degraded. The broker now detects when the monitor goes silent (via an out-of-process ingestion-silence detector) and raises a disk-readable alarm instead of staying falsely green. A batch of monitor stability fixes ships alongside: RSS no longer ratchets to multi-GB from repeated full event-log reads, the icon picker’s virtualizer scroll container renders correctly, stale dist chunks no longer accumulate across rebuilds, and the broker now runs bun install automatically when dependencies change after a pull.

Features

  • dev: cross-host liveness → single control plane (CTL-1251) (#2197) (4804777)
  • dev: CTL-1122 — out-of-process ingestion-silence detector (PR1) (#2216) (be4fa5f)
  • dev: CTL-1156 parameterize monitor server project config path (#2213) (6388415)
  • dev: CTL-1223 broker runs bun install after pull when deps changed; surface silent vite-build failures (#2210) (74650e7)
  • dev: CTL-1240 wire gateway tier into scheduler tick (Linear read-hammer fix) (#2209) (729cfaf)
  • dev: recovery-pass — agent-coordination comments + verify-the-work-not-the-status check (#2204) (9d03c0b)
  • dev: recovery-pass — context/mode script (signals+log+Linear-cache, HRW-filtered) + sweep SOP (#2198) (92d49f1)
  • dev: recovery-pass — forbid —admin/force-merge past failing CI (#2202) (ad7fe23)

Bug Fixes

  • analytics: catalyst-agent reads Claude token from credentials file, not just Keychain (#2219) (30ce8cb)
  • dev: cluster-heartbeat publish actually works + newest-wins liveness merge (CTL-1255) (#2203) (c52e10a)
  • dev: CTL-1243 route source_conflict stall to bounded-LLM; add linearTerminal guard (#2208) (86fd7d9)
  • dev: CTL-1252 collapse FQDN host names to first DNS label (#2218) (4f7ee3d)
  • dev: CTL-1253 — show detected repo favicons in the project icon picker (#2222) (f501512)
  • dev: CTL-1254 — stage+swap monitor UI build so dist chunks don’t accumulate (#2220) (26b236b)
  • dev: CTL-1257 — memoize un-ringed event-log readers off the 3s board-recompute (bound monitor RSS) (#2223) (0d39abb)
  • dev: monitor repoOwners from registry, not stale committed roster (§13 — fixes Adva icon 404) (#2189) (8a9275c)
  • dev: remove CSS Size Containment from virtualizer scroll container (CTL-1254) (#2211) (5cbcd93)
  • dev: surface recovery-pass/remediate explanation in inbox row + detail card (#2206) (f41ed2c)

12.13.0 (2026-06-19)

Board Health & Log Observability

The broker now periodically reconciles board cache state and labels against live Linear, closing the gap where a missed webhook left tickets lying about their status indefinitely. Dead doc-phase workers that go transcript-silent are detected and reclaimed, unblocking slots that previously sat starved for up to six hours. Grafana Alloy is installed and auto-started per host to ship daemon logs into Loki, queryable by stable node name alongside the existing OTel event streams.

Features

  • dev: CTL-1245 — revive dead-but-running-signalled workers (#2195) (8c420f8)
  • dev: CTL-1260 — reframe recovery-pass into the board-health delegate (#2254) (33101d6)
  • dev: CTL-1262 — tag otel-forward events with stable catalyst.node.name resource attr (#2242) (c6c0000)
  • dev: CTL-1263 — install + register + auto-start the Alloy log-shipper per host (#2248) (8cd288a)
  • dev: CTL-1277 — periodic broker reconcile of board cache state+labels vs live Linear (#2264) (bbf9b22)
  • dev: CTL-1279 — sensing-substrate cookbook + wire recovery-pass to it (#2261) (e6479a0)
  • dev: CTL-1282 — cache reconcile async + re-entrancy guard (non-blocking) (#2270) (9736317)
  • dev: off-the-shelf Grafana Alloy daemon-log shipper config (CTL-1261) (#2243) (425356c)

Bug Fixes

  • dev: CTL-1258 — render resolved project icon (glyph|favicon) consistently across all orch-monitor surfaces (#2225) (983905d)
  • dev: CTL-1277 — broker boot-crash (pino logger binding) (#2265) (472adfe)
  • dev: log-shipper service.name + catalyst.node.name tagging (semconv) + brew formula (#2250) (fa9c244)

12.14.0 (2026-06-19)

Recovery Observability & Cache Coverage

The recovery delegate now emits recovery.tick and recovery.decision events to Loki on every pass, so you can finally distinguish a board where the delegate examined items and handed them to humans from one it silently never processed. Control-loop numerics from those events — plus scheduler parallelism and autotune gauges — are promoted into OTel attributes, making queue depth, action breakdowns, and decision rules chartable in dashboards. The board-cache reconciler also fixes a starvation bug where only the alphabetical prefix of tickets ever reconciled; per-tier rotation cursors now ensure both active-pipeline and Backlog tickets are covered across passes, which should clear the phantom “stuck” tickets that were showing as open PRs despite being done.

Features

  • dev: CTL-1287 — recovery delegate emits per-tick recovery.tick/recovery.decision (#2276) (ae419a6)
  • dev: CTL-1291 — chartable control-loop numerics via OTel attribute promotion (#2282) (29db3b4)

Bug Fixes

  • dev: CTL-1285 — Alloy log-shipper survives via dedicated KeepAlive LaunchAgent (#2273) (849929d)
  • dev: CTL-1288 — cache reconcile covers the whole board via per-tier rotation cursors (#2278) (ca8b808)

12.15.0 (2026-06-21)

Stale Worktree Reclamation & Fleet Hardening

The automated stale-worktree sweeper now uses a multi-signal classifier to distinguish safe-to-delete, salvageable, and active worktrees — with battery-aware deferral, a per-run removal cap, and OTel instrumentation per sweep. Alongside that, several fleet-reliability fixes land: the board dispatch gate now routes on delegate instead of assignee (unwedging boards where human assignment blocked every Todo ticket), the recovery-pass bounded-LLM FIX rung is repaired after a missing evidence.signal field made it structurally dead in production, and a daemon boot-breaking missing export from config.mjs is resolved. PWA push notifications for the orch-monitor and a gitleaks CI secret-scanning gate round out the release.

Features

  • dev: CTL-1030 — Automated stale-worktree reclamation (multi-signal classifier) (#1827) (8a5b127)
  • dev: CTL-1093 — node identity survives hostname change without splitting fleet history (#1927) (780cca3)
  • dev: CTL-1167 — PWA push notifications for orch-monitor (#2057) (2b24ebb)
  • dev: CTL-1204 — gitleaks secret-scanning CI gate + optional pre-commit hook (#2297) (0099e67)
  • dev: CTL-1290 — board-health delegate (shadow-first) (#2295) (8a6b46b)
  • dev: CTL-1292 — catalyst-join provisions a member node to fully-operational state (#2286) (3fae97e)

Bug Fixes

  • dev: board deriveAttention cross-checks Linear terminal state (CTL-1239) (#2205) (5c7decd)
  • dev: CTL-1174 — gate dispatch on delegate-ONLY + delegate-on-Todo (unwedge the board) (#2285) (60c0783)
  • dev: CTL-1242 — reap stale signals + needs-human fix for terminal/merged tickets (#2212) (6136362)
  • dev: CTL-1297 — HRW owner preempts stale cross-host claim (TTL-based) (#2296) (848ca4e)
  • dev: CTL-1299 — populate evidence.signal so recovery-pass bounded-LLM FIX rung fires (#2300) (8e7a69d)
  • dev: restore export on getCatalystRepoDir — daemon boot broken fleet-wide (#2291) (406f28b)

12.16.0 (2026-06-22)

Board-Health Holistic Dispatch & Cloud Token Provisioning

Board-health now dispatches a single holistic recovery-pass delegate on enforce scans, carrying full board context to the anchored ticket rather than triggering per-move fan-out. A multi-host correctness fix ensures selectAnchor only picks tickets this host owns via HRW, so a foreign-owned anchor no longer silently blocks actuation of self-owned work. Separately, CATALYST_CLOUD_TOKEN is now provisioned into the machine-level environment from the cluster repo via a new projection script, with an advisory doctor check — local-only behavior is unchanged until you opt into the cloud path.

Features

  • dev: CTL-1300 — board-health delegate ACTS (holistic recovery-pass dispatch on enforce) (#2301) (43aaec9)
  • dev: CTL-1307 — machine-level CATALYST_CLOUD_TOKEN from catalyst-cluster repo (#2316) (9ff454d)

Bug Fixes

  • dev: CTL-1302 — board-health selectAnchor prefers a self-owned ticket (multi-host) (#2305) (72e4945)

12.17.0 (2026-06-27)

Node-Class Awareness & Fleet Observability

This release introduces node classes (developer, worker, monitor) as a first-class concept across the fleet — every telemetry signal now carries catalyst.node.class, and catalyst-doctor grades nodes against their class-specific rubric instead of treating every machine as a worker activation gate. The standalone catalyst-updater daemon ships as the new sole plugin-pull owner for daemonless developer nodes, with verify-updater and verify-node providing objective pass/fail smoke tests for the GATE-3 cutover. Scheduler reliability gets significant hardening: stale-fenced orphan dirs no longer burn Linear OAuth quota, timed-out linearis reads now trip the circuit breaker so a degraded pass short-circuits instead of paying the full cap N times, and the board now sources real ticket titles from the CTC replica instead of falling back to bare IDs.

Features

  • dev: board sources ticket titles from the CTC replica (real titles, not bare IDs) (#2421) (f3f3245)
  • dev: CTL-1092 — Cluster Capacity Visibility (#1942) (aab5b3c)
  • dev: CTL-1214 — cluster-driven project roster + config-scope schema/doctor (Phases 1,2,5) (#2419) (d65e3d9)
  • dev: CTL-1322 — admission state visible in telemetry + UI (heartbeat block + FleetOps holding) (#2336) (299ba0c)
  • dev: CTL-1328 — Agent Beliefs surface + belief narratives & shape (#2345) (52312f0)
  • dev: CTL-1330 — Tier-1 daemon instrumentation (tick timing + event-loop delay + liveness.refresh logs) (#2349) (e476ce2)
  • dev: CTL-1330 Tier 3 — execution-core OTLP spans (scheduler.tick flame graph + liveness.refresh) (#2354) (e75e5e4)
  • dev: CTL-1331 FU-1 — async the per-item Pass 0r recovery dispatch (recovery-pass p99 crater) (#2366) (f1fc61a)
  • dev: CTL-1331 Phase A — async board-health delegate queue (inert land) (#2365) (77b6305)
  • dev: CTL-1337 — per-tick trace_id shared by scheduler.tick span + tick-timing log (#2363) (89dfa20)
  • dev: CTL-1340 — inert read-replica tier for the scheduler’s per-signal terminal checks (#2373) (e6dee9e)
  • dev: CTL-1344 — node-class seam (getNodeClass) + Layer-2 catalyst.node.class (#2399) (32c8bd6)
  • dev: CTL-1346 — read-replica resolver is node-class + Layer-2 aware (#2402) (2f5a451)
  • dev: CTL-1348 — standalone catalyst-updater daemon (sole plugin-pull owner) + OTel logs/traces/metrics (#2412) (5b20e9f)
  • dev: CTL-1349 — verify-updater, an objective adoption smoke test for GATE-3 (#2423) (f5347b3)
  • dev: CTL-1355 (1/n) — verify-node, a class-aware local node-profile check (all types) (#2424) (9503378)
  • dev: CTL-1355 (2/n) — catalyst-doctor grades a node against its class-specific rubric (#2425) (ae33fbb)
  • dev: CTL-1364 — scheduler.op span tier + default rawExec/claude-agents timeout (#2404) (60c5837)
  • dev: CTL-1365a — executor flag + resolution seam + catalyst.dispatch.mode telemetry (inert, default bg) (#2406) (19754bd)
  • dev: CTL-1365b — SDK executor (sdkRunPhaseAgent) + shared pre-launch refactor [HOLD FOR REVIEW] (#2408) (cf26bbe)
  • dev: CTL-1366 — Linear-data freshness gauge + data_stale alert (Phase 1) [HOLD FOR REVIEW] (#2410) (28cf4ad)
  • dev: CTL-1367 — SDK executor pre-canary hardening (#2417) (679deba)
  • dev: CTL-1368 — catalyst.node.class as a core fleet-wide resource dimension (#2422) (e1240be)
  • dev: inbox surfaces parked needs-human tickets from the cache (#2414) (a941208)
  • dev: split the conflated recovery-pass scheduler lap into recovery-pass + reclaim (#2367) (c74738b)
  • dev: wire Serena code-understanding MCP into research/analysis agents (#2369) (c996d95)

Bug Fixes

  • dev: CTL-1311 — board crashes (React #185) on any ?scope= — kill the URL↔atom self-heal loop (#2322) (c150fae)
  • dev: CTL-1315 — J4 reaper skips terminal triage-done dirs (inFlight gate) (#2328) (6d2f58d)
  • dev: CTL-1317 — Rulebook crashes on /rules (undefined s.length) — read cfg as { rows } (#2327) (f658825)
  • dev: CTL-1321 — exec-core boots accepting work by default (clear stale drain flag on boot) (#2335) (d7a9844)
  • dev: CTL-1323 — a recovery-pass-only worker dir strands its ticket from the new-work pull (#2338) (206103e)
  • dev: CTL-1324 — keep the scheduler responsive while cleaning up old worktrees (#2344) (81e72ce)
  • dev: CTL-1329 — stale-fenced orphan dirs no longer burn Linear OAuth quota (#2347) (37a0581)
  • dev: CTL-1332 — log shipper keeps full pino JSON body so Tier-1 fields reach Loki (#2352) (14386a3)
  • dev: CTL-1334 — log-shipper emits short host.name (first DNS label) so logs join metrics (#2362) (d948f56)
  • dev: CTL-1336 — thread warm agents snapshot into Pass 0a phantom sweep (zero-spawn liveness) (#2361) (d03e000)
  • dev: CTL-1338 — tracing.mjs degrades to no-op when @opentelemetry/api is absent (unbreak orch-monitor quality) (#2360) (4a8f6ab)
  • dev: CTL-1339 — cap the hot per-signal linearis read so a 429 stall can’t wedge the scheduler tick (#2371) (2d49bfe)
  • dev: CTL-1341 — a timed-out linearis read trips the breaker so a degraded pass short-circuits (#2375) (8e7a428)
  • dev: CTL-1362 — per-tick trace_id unique across restarts (boot nonce) (#2397) (bf09451)
  • dev: CTL-1363 — cluster-claim resolveIssueId via issue(id:) (unwedge fleet dispatch) (#2403) (21a7145)
  • dev: dedupe nav projects + repo icon auto-detect (#2418) (8eb398e)
  • dev: orch-monitor project roster reads config cwd-independently (#2413) (1766666)
  • dev: reclaim terminal-check trusts the read-replica regardless of age (crater the reclaim lap) (#2368) (d5c9b1f)
  • dev: repo-icon empty-favicon → avatar fallback (no blank icons) (#2420) (b7ca52f)

12.18.0

Jun 28, 2026

Catalyst CLI Router & Node Backup

This release adds a top-level catalyst command that routes to all existing tools by verb (start, stop, doctor, update, and more), with any unrecognized subcommand auto-delegating to the matching catalyst-<x> script. Alongside it, catalyst-backup lets you snapshot a node’s full restorable state — config, credentials, database, and daemon inventory — before any install or uninstall phase touches it, with a manifest-driven restore that refuses to run against a live node. The release also ships a completion-signal-driven Linear reconciler that moves tickets to Done only when work is explicitly declared complete, not inferred from PR events, and fixes two icon-picker recovery bugs where stale cached bundles and poisoned manifest promises left icons blank even after the dist was healthy.

PRs

  • dev: CTL-1369 (1/n) — top-level catalyst CLI router + catalyst.install.* telemetry contract (#2429) (3734d01)
  • dev: CTL-1369 (2/n) — catalyst-backup: capture/restore a node’s restorable state (#2446) (76e1266)
  • dev: CTL-1371 — deterministic PR→Linear state reconciler (no native automation) (#2431) (70feab0)
  • dev: CTL-1370 — icon-picker manifest load self-heals after a transient chunk failure (#2428) (88f26e5)
  • dev: CTL-1371 — make the reconcile timer multi-team/fleet-functional (#2443) (7adecc6)
  • dev: CTL-1372 — bound orch-monitor renderer memory growth on long sessions (#2434) (1a8fd3e)
  • dev: CTL-1373 — icon-picker Reload hard-recovers the PWA (unregister SW + clear caches) (#2441) (6bf17cb)

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)

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.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.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.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.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.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.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.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.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.28.0

Jul 09, 2026

Liveness Off Linear

Cross-host dead-host detection now reads from Loki instead of Linear, eliminating the ~120 heartbeat writes per hour that were tripping the rate-limit breaker. Two live-deploy bugs in the initial reader were caught and fixed: stale streams no longer win the newest-host race, and in-flight ticket enrichment now runs as a separate fail-open query. The switch is gated behind CATALYST_LIVENESS_READ_SOURCE=loki — set it on all hosts simultaneously to enable; unset to revert instantly.

PRs

  • dev: CTL-1420 (#17) — move cross-host liveness off Linear → event log + Loki (PR1a: heartbeat carries in-flight tickets) (#2575) (ff99913)
  • dev: CTL-1420 (#17) — read cross-host liveness from Loki + retire the Linear heartbeat publish (PR1b) (#2604) (9924aa2)
  • dev: CTL-1420 (#17) follow-up — loki-liveness reader: newest-across-streams + two-query tickets (#2606) (4aa925b)
  • dev: CTL-1443 follow-up — sync CLI reference for boot-resume-approve (unblocks CI) (#2603) (7d34bd8)
  • dev: CTL-1451 (A4 final widening) — probeBackoff on the recovery-filter + reclaim terminal reads (kills the ADV-1433 read-storm) (#2608) (6d4928f)
  • dev: CTL-1452 — parity test exempts action:skip STALL_CATEGORY_MAP entries (restores exec-core CI on main) (#2610) (6e550ba)

12.29.0

Jul 13, 2026

Two-Axis Worker State Model

Worker state transitions now fan out through a single recordTransition chokepoint that writes to all five sinks — Linear Status, worker-status label, event log, OTLP, and broker table — on every confirmed state change, with per-sink fail-open isolation so one unavailable sink can’t block the others. A new convergeDispositionLabel function enforces full disposition precedence (needs-human > needs-input > blocked > queued), and the worker-status Linear label group is provisioned automatically by setup-execution-core-states.sh. The HUD queue UI now reflects the corrected disposition buckets, and waiting has been renamed to queued throughout.

PRs

  • dev: CTL-764 two-axis worker-state model — recordTransition chokepoint, worker-status labels, convergeDispositionLabel (#2597) (2ebbed3)
  • dev: CTL-764 follow-up — Codex round-3 emission gating + gitleaks allowlist (greens main) (#2631) (27781cf)
  • dev: CTL-764 follow-up — Codex round-4 emission/fallback edge cases (#2632) (3fa0429)
  • dev: CTL-764 follow-up — declare synthesizeOrphanTickets in board-data.d.mts (greens main quality gate) (#2630) (96ea021)

12.29.1

Jul 14, 2026

Thenable-Aware Removal Confirmation

The removeLabel async bug is fixed — previously, inspecting a Promise’s .removed property always returned undefined, so failed removals were silently treated as successful. The fix makes the result handler thenable-aware, deferring the admission clear emission until the async write actually resolves or rejects.

PRs

  • dev: CTL-764 follow-up — round-5: thenable-aware removal confirmation (#2636) (2df9d10)

12.30.0

Jul 15, 2026

Codex Executor & Worker Label Ownership

The daemon can now dispatch phase workers to OpenAI Codex via a new codex-exec executor adapter, routed per-phase through executorByPhase config with zero behavior change until you explicitly flip a phase to it. Linear boards now show which node owns each in-flight ticket via stamped worker:<host> labels — ownership is board-filterable and readable from the local replica without a live Linear call. Both worker-label provisioning paths (reconcile_worker_host_labels and reconcile_worker_status_labels) are hardened against the current Linear API’s isGroup:true requirement, which broke fresh-workspace installs; run the setup script on any new node to provision labels cleanly.

PRs

  • dev: CTL-1457 codex-exec executor adapter — daemon dispatches phase workers on Codex (#2639) (1ae616a)
  • dev: CTL-1481 worker:<host> label ownership — Linear board shows which node owns each ticket (#2650) (47946d7)
  • dev: CTL-1481 follow-up — worker group create needs isGroup:true (live API drift) (#2651) (f6099a9)
  • dev: CTL-1483 mirror isGroup:true fix to reconcile_worker_status_labels (#2653) (e1d5d0c)

12.30.1

Jul 17, 2026

Replica-Read Detector Fixed

The Linear replica-read detector introduced in a prior release was never actually firing, leaving agents free to burn the shared API quota on reads the replica could have served. The fix rewrites the command-word matching from a single anchored regex to a token walk that correctly resolves the real command past environment assignments, wrapper prefixes like direnv exec ., and shell keywords — and now recognizes both linear and linearis. The enforce mode remedy path is also corrected to an absolute location so it’s actually sourceable in the repos where the hook now fires.

PRs

  • dev: CTL-1420 replica-read detector was blind to the linear alias + wrapper prefixes (#2658) (19f7ada)

12.31.0

Jul 19, 2026

Agent House Rules & Replica Read Fix

Two changes land together to make unattended agents less error-prone. A new “Working the Loop” block is now seeded into every project’s AGENTS.md via agents-house-rules.md, teaching agents to subscribe to the unified event log instead of polling GitHub or CI, detect automated review approvals via reactions, and read Linear tickets from the local replica rather than the live API. Alongside that, the replica-read instruction itself is corrected — background agents were silently falling through to bare linearis because linear_read_ticket is a shell function that never resolves in an unattended Bash session; the instruction now leads with the sqlite3 form that works in any shell. Run check-project-setup.sh to verify your projects have the new reflex markers in place.

PRs

  • dev: agent house-rules block + checkup (CTL general-instructions) (#2663) (e6e67db)
  • dev: CTL-1420 replica-read rule pointed bg/daemon agents at a shell function not on PATH (#2661) (efd9a2b)

12.32.0

Jul 21, 2026

Agent House-Rules Auto-Seeding & Inbox Polish

Any repo you enroll in Catalyst now automatically receives the “Working the Loop” agent house-rules block — seeded into AGENTS.md (or CLAUDE.md if that’s what the repo uses) without any manual setup. The block itself has been hardened: Linear reads must go through the catalyst-dev:linearis skill rather than raw API calls or hand-rolled sqlite, and a contradictory degraded escape that could reintroduce shared-quota burn has been removed. Inbox rows also get a cleaner look — favicon restored, unwrapped ID, two-line title, and corrected pane accent.

PRs

  • dev: auto-seed agent house-rules on every enrolled repo + Codex-hardened block (#2666) (97aa6de)
  • dev: CTL-1127 — inbox row: restore favicon, unwrap ID, two-line title, drop verb cluster, fix pane accent (#1991) (2cda8d5)
  • dev: CTL-682 — wait-watcher skips background agents; pin scheduler test live-count seam (#2670) (4fd98b2)
  • dev: drop the Linear-API degraded escape (contradicted the absolute replica rule) (#2668) (507b227)

12.33.0

Jul 22, 2026

Dispatch Roster Failover & Worktree Repair

Offline and never-live hosts no longer strand their share of the ticket backlog — dispatch ownership now hashes over a liveness-filtered roster with restore-side deflap hysteresis, so a live host picks up any slice whose owner has gone dark. A separate fix repairs worktrees whose thoughts/shared was left as a plain directory instead of a symlink, so handoffs and research written into reused worktrees actually sync instead of silently accumulating in a dead-end local dir.

PRs

  • dev: CTL-1091 Phase 1 — route dispatch gates through the surviving roster (#2671) (2fb23ee)
  • dev: CTL-1497 — repair thoughts/shared on the worktree reuse path; guards test -L not -d (#2685) (c4bf08c)

12.34.0

Jul 23, 2026

Autonomous PR Block Recovery

When a PR fails to merge, the recovery pass now probes GitHub live — checking CI status, unresolved bot review threads, and review decisions — and routes autonomously: bounded fixes get dispatched to a worker, while genuine human gates (CHANGES_REQUESTED from a person, no open PR found) escalate with specific context instead of an opaque failure message. A CATALYST_EXECUTOR_BY_PHASE JSON env var also lands in this release, letting you set durable per-phase executor routing in execution-core.env without it being wiped by the broker’s periodic git reset. The recovery pass feature ships behind CATALYST_RECOVERY_PASS=shadow|enforce and is off by default.

PRs

  • dev: CTL-1496 recovery-pass drives blocked PR to merge instead of escalating (#2689) (bec5e03)
  • dev: CTL-1457 follow-up — CATALYST_EXECUTOR_BY_PHASE env override (durable per-node routing) (#2655) (3afb50a)

12.35.0

Jul 23, 2026

Agent Browser Leak Fix & Scheduler Hardening

Leaked agent-browser Chrome processes that outlived their worker sessions — sometimes pegging a CPU core indefinitely — are now reaped automatically by a new vector in the hourly orphan sweep, which targets runaway or idle Chrome-for-Testing instances while leaving personal Chrome untouched. Workers also receive an idle-timeout environment variable at dispatch so agent-browser shuts itself down after 5 minutes of inactivity on supported versions. Two scheduler fixes round out the release: phantom ticket directories (like .catalyst) no longer poison board-health checks, and a transient source conflict during dispatch-time rebase now triggers a single retry against a fresh base before parking the ticket as needs-human.

PRs

  • dev: CTL-1500 reap leaked agent-browser Chrome + idle-timeout + setup-tooling ownership (#2702) (74fa0a8)
  • dev: CTL-1504 guard scheduler census sites + classify not-found (stop CTC-phantom board-health poison) (#2698) (6d6d154)
  • dev: CTL-1505 retry rebase against fresh origin/<base> before parking a source conflict (#2701) (17de576)

12.36.0

Jul 25, 2026

Cloud-Sync Self-Heal & Daemon Health Responder

Two fixes targeting the root causes of the 2026-07-23 replica-writer outage. The cloud-sync writer now exits cleanly within a bounded timeout on both stall and shutdown paths, writes a breadcrumb when it self-heals, and detects half-open sockets in roughly 2 ticks instead of 80+ minutes using SDK lastFrameAt. A new stateless launchd sweep runs every 3 minutes to catch the case where the writer dies and launchd fails to respawn it — kicking it back with a bounded, escalating retry rather than depending on KeepAlive alone. After merging, run catalyst-stack install-services on affected nodes and verify with catalyst doctor.

PRs

  • dev: CTL-1509 daemon-health responder — stateless launchd sweep kickstarts a dead/stale cloud-sync writer (bounded, escalating) (#2710) (6e0ec37)
  • dev: CTL-1508 exit-safe cloud-sync self-heal + selfheal breadcrumb + lastFrameAt stall classifier (#2709) (1e33520)

12.37.0

Jul 26, 2026

Daemon Stability & Memory Audit Remediation

This release fixes a cluster of runtime reliability issues discovered during a live memory and health audit on production nodes. The most impactful changes stop a 115-second scheduler stall caused by reading a 300 MB event log on every tick (now a bounded cursor scan), close a file-descriptor leak in the delegate-runner that was trending toward EMFILE, and silence ~300 spurious “daemon degraded” phone notifications per day by replacing a naked edge trigger in the notification filter with a 180-second sustained-state hold. Also included: per-process RSS/heap OTel gauges on every daemon so future leaks can be attributed to a specific service, edge-triggered fleet-health probes that fire once per degradation episode instead of on every tick, and a health-responder backstop that now supervises the host-metrics sampler so a silently dead agent gets auto-kickstarted rather than going unnoticed for days.

PRs

  • dev: CTL-1503 edge-triggered fleet-health probe (hysteresis band + recovered event + durable latch) (#2704) (a4dc53e)
  • dev: CTL-1517 per-process RSS/heap OTel gauge on every daemon (leak attribution) (#2732) (8c85824)
  • dev: CTL-1518 health-responder supervises com.catalyst.agent sampler (self-heal backstop) (#2731) (b3ae705)
  • dev: CTL-1510 health-responder hardening — token-aware exit-0 gate, sweep lock, cron backstop + 5 more edges (#2714) (92ac2ec)
  • dev: CTL-1513 bash-3.2 comment-parsing crash in _token_provisioned (production hotfix) (#2719) (ffd7da1)
  • dev: CTL-1514 tail event log by cursor in execution-core (stop 115s scheduler stalls) (#2729) (ac009d9)
  • dev: CTL-1515 bound orch-monitor readBacklog/readTunnelEventStats fallbacks (chunked scan) (#2730) (9ea4502)
  • dev: CTL-1516 bound broker _emittedWakeCache + heartbeat/orchestrator maps (#2728) (2001242)
  • dev: CTL-1519 close delegate-runner log fd after detached spawn (fd leak → EMFILE) (#2727) (5709d17)
  • dev: CTL-1522 hold daemon-degraded notifications so a transient heartbeat stall never pushes (#2739) (5b56cef)
  • dev: CTL-1523 stop the broker reporting daemon-degraded on an idle fleet (#2740) (4a58ddd)

12.38.0

Jul 27, 2026

Dual-Harness Migration & Event Loop Fix

Run migrate-dual-harness.sh to migrate a single-harness repo (Claude-only or Codex-only) to the vendor-neutral dual-harness layout where both Claude Code and Codex share the same instructions and skills — checkup §10 and a new foundry skill handle the split automatically. A daemon event loop stall that caused 72–97 second heartbeat gaps during worktree cleanup bursts is also resolved, along with a fix that stamps provider delivery IDs onto webhook envelopes so the smee-vs-cloud parity harness can actually join on them.

PRs

  • dev: CTL-1530 dual-harness migration (migrate-dual-harness.sh + checkup §10 + foundry skill) (#2753) (0afc204)
  • dev: CTL-1524 unblock the daemon event loop in wt-cleanup-drain (free provenance gate first + bounded burst) (#2747) (d31c9c6)
  • dev: CTL-1532 stamp the provider delivery id on webhook envelopes (#2751) (708437b)

12.39.0

Jul 29, 2026

Supervised Watchers, Orphan Reaper & Board Health

Channel-watchers now run as supervised launchd daemons that emit a heartbeat every interval and trigger a broker dead-man’s switch alert when a watcher goes silent for more than three intervals. The orphan reaper drops its node/bun/turbo allowlist and now reaps any process whose cwd sits under a deleted worktree, batching the cwd lookups into a single lsof call to keep sweep cost under 730 ms. Two new board-health checks round out the release: one flags in-flight tickets with no worker, no signal file, and no open PR, and one bounds every read of the monthly event log to a time-covering tail — cutting a 341 MB scan from 1,114 MB peak RSS to 143 MB flat.

PRs

  • dev: CTL-1423 — supervised background channel-watchers with (6701521)
  • dev: CTL-1423 — Supervised background channel-watchers with heartbeat + dead-man’s-switch alerting (#2557) (6701521)
  • dev: CTL-1475 flag work that claims to be in flight while nothing owns it (#2763) (d022893)
  • dev: CTL-1531 reap orphaned processes by ownership evidence, not a node/bun allowlist (#2756) (c0267ba)
  • dev: CTL-1529 bound every read of the monthly event log (time-covering tail + shared per-tick scan) (#2757) (ab49964)

12.39.1

Jul 30, 2026

Needs-Human Clears on Reply

When a developer responds to a parked ticket, it now immediately drops off the “Needs you” list — no matter whether the worker directory still exists. Previously, most parked tickets were permanently stuck in that state because the clear was gated on a local directory that gets cleaned up after a worker is reaped.

PRs

  • dev: CTL-1567 clear needs-human the moment a human responds (#2796) (2f71e13)

12.40.0

Jul 31, 2026

Inbox Conversation Surface & Linear API Burn Fixes

The inbox is now a full conversation surface: you can read a parked ticket’s ask summary, thread, and suggested replies — and post a response as yourself without leaving the inbox. Alongside this, a cluster of Linear API quota fixes lands together: the Workers page now reads peer liveness and capacity from Loki instead of a stale Linear anchor, the broker authenticates as the app actor so reconcile reads no longer bill your personal API bucket, and several scheduler paths that were firing live Linear probes on every tick now use the replica or a cooldown window instead.

PRs

  • dev: CTL-1569 make the inbox a conversation surface (ask summary + thread + inline reply) (#2801) (1d59e75)
  • dev: CTL-1574 ticket activity feed (Discussion) in monitor inbox + ticket page (#2815) (d22b757)
  • dev: CTL-1551 budget the peer-liveness live window for transport lag (#2809) (8ad9ff5)
  • dev: CTL-1551 Workers page reads peer liveness+capacity from Loki, not the dead Linear anchor (#2808) (3b095af)
  • dev: CTL-1570 stop the phantom sweep spending a live Linear read per tick on workerless dirs (#2803) (8028469)
  • dev: CTL-1571 cache-reconcile reads the replica, not live Linear (#2824) (59fa625)
  • dev: CTL-1577 broker authenticates to Linear as the app-actor (#2814) (0a209a1)
  • dev: CTL-1580 stop per-tick live probes of stuck tickets; instrument the invisible reads (#2825) (ea6db1b)

12.41.0

Jul 31, 2026

Slot Deck Fixes & Direnv Profile Sync

The slot deck now correctly shows which slots are occupied — SDK/executor workers are visible to the deck, held tickets are separated into a “Held — awaiting you” section rather than ranked as imminent dispatches, and header counts derive from the deck’s own boxes so the two can never contradict each other. Triage admission is now level-triggered, meaning tickets already sitting in Triage when a worker dir vanishes get picked up on the next sweep instead of stranded. cluster-sync also gains a new syncProfileFiles step that materializes direnv profiles from a SOPS bundle, so worker repos get the right environment variables on every host without hand-provisioning files.

PRs

  • dev: CTL-1585 discussion newest-first in inbox, inline on detail page, Spec tab renamed Detail (#2832) (bc34131)
  • dev: CTL-1595 cluster-sync materializes direnv profiles from a SOPS bundle (#2849) (a0daa05)
  • dev: CTL-1581 slot deck renders occupancy, not ownership — counts derive from the boxes (#2826) (719bc9a)
  • dev: CTL-1588 queue humanHold falls back to replica labels when the webhook-fed store has gaps (#2845) (9d40a77)
  • dev: CTL-1588 slot deck sees SDK-executor workers; queue partitions human-held tickets (#2840) (df05fa6)
  • dev: CTL-1589 level-triggered triage sweep — pick up tickets already sitting in Triage (#2843) (4fc6993)
  • dev: CTL-1593 capture the recovery cursor before reconcileAll so boot telemetry can’t shift it (#2844) (45343f8)

12.42.0

Aug 02, 2026

Worktree Guard & DNS Rebinding Fix

The monitor’s reply endpoint now validates Origin against a trusted allowlist of loopback addresses, local hostnames, and non-loopback IPs — closing a DNS rebinding hole where an attacker-controlled page could post Linear comments as the operator. Separately, every shell-side git worktree remove --force call now runs a safety check that refuses removal if your current directory is inside the target or any process holds an open handle under it, protecting against accidental self-deletion that the Node reaper never covered.

PRs

  • dev: CTL-1417 — worktree-removal self-protection guard (#2556) (24b9a76)
  • dev: CTL-1573 validate reply Origin against a trusted allowlist, not the request Host (#2857) (10ecce7)

12.43.0

Aug 03, 2026

Deployment Mode Resolver & Credential Hardening

This release introduces a unified deployment-mode resolver (single-host, cluster, or cloud) that reads identically in bash and JS, with advisory doctor checks and gated tunnel/webhook behavior wired across execution-core, orch-monitor, and catalyst-join.sh. It also fixes a live credential outage: daemon processes now re-arm their GitHub token from disk on every cluster-sync tick rather than inheriting a frozen env at boot, and linear-reconcile-cli correctly falls back to LINEAR_API_KEY when LINEAR_API_TOKEN is absent. Several reliability fixes round out the release: stale needs-human/blocked labels can no longer be re-applied to tickets already terminal in Linear, escalated recovery intents no longer latch permanently past their 7-day TTL, and the board no longer shows zero tickets for teams registered only in cluster.json.

PRs

  • dev: CTL-1603 — fix board showing zero tickets for cluster-only teams (#2868) (47a8c78)
  • dev: CTL-1610 — fix escalated-intent permanent latch and actuation-liveness blind spot (#2882) (69dd8ad)
  • dev: CTL-1616 secret-contract registry pair + cluster-sync derivation (PR1) (#2902) (1275440)
  • dev: CTL-1617 deployment-mode resolver in isolation (PR1 of 7) (#2895) (581ad4f)
  • dev: CTL-1617 doctor deployment-mode tunnel-consistency check (PR6 of 7) (#2906) (4ac3bea)
  • dev: CTL-1617 execution-core wiring + advisory deployment-mode doctor checks (PR2 of 7) (#2899) (374c1b3)
  • dev: CTL-1617 gate catalyst-join webhook wiring on declared deployment mode (PR5 of 7) (#2913) (1b983f3)
  • dev: CTL-1617 gate orch-monitor smee tunnels on deployment mode (PR3 of 7) (#2900) (a73ce21)
  • dev: CTL-1605 — route worker-status labels through a terminal-aware chokepoint (#2872) (8855c10)
  • dev: CTL-1612 arm daemon credentials from the shared secret files at boot (#2884) (ea5d031)
  • dev: CTL-1617 jq-exact lone-surrogate acceptance in the deployment-mode reader (#2907) (84e7682)
  • dev: CTL-1617 whole-document lone-surrogate parity + architecture-doc precision (#2904) (6b1cfd8)
  • dev: CTL-1619 adopt LINEAR_API_KEY fallback in linear-reconcile-cli —graphql (#2893) (bb0fff5)
  • dev: CTL-1620 resolve the rescue prompt template from plugins/dev/templates (#2892) (cf13213)

12.44.0 (2026-08-04) Latest

Features

  • dev: CTL-1616 cloud-token name-resolver unification + Groq resolveApiKey adoption (PR5) (#2927) (be673ea)
  • dev: CTL-1616 doctor cloud-guard escalation + shadow-diffed Layer-2 stragglers (PR6) (#2929) (56fbe72)
  • dev: CTL-1616 doctor secret-contract shadow pass (PR2, zero grade change) (#2916) (0377813)
  • dev: CTL-1616 fold the 9-file Linear read into the secret contract + doctor cutover (PR3) (#2919) (01294fc)
  • dev: CTL-1616 fold the OAuth-mint trio + read-only 4th onto the secret contract (PR4) (#2924) (22afee0)
  • dev: CTL-1622 setup-catalyst prompts for and persists catalyst.deployment.mode (#2912) (3af40d2)
  • dev: CTL-1628 catalyst-runtime-root resolver — fold Tier 1 duplicates + 4 latent resolver bugs (Phase A2) (#2946) (c01ef76)
  • dev: CTL-1628 root bun workspace + turbo (Phase A1) (#2945) (a61c8a8)

Bug Fixes

  • dev: CTL-1616 clear the sticky export attribute on the value breadcrumb (#2926) (ea1e474)
  • dev: CTL-1616 declare the split-brain Layer-2 layout unsupported + finish the observe-only story (#2931) (ca7ec68)
  • dev: CTL-1616 divergence check round 3 — reject relative paths, per-service remedy, no committed ticket prefix (#2939) (6c134b1)
  • dev: CTL-1616 divergence check round 4 — prefix-agnostic assertion + no dead-end remedy (#2941) (b811eb0)
  • dev: CTL-1616 harden the layer2-path-divergence check (#2931 round-2 Codex x2) (#2938) (694dc20)
  • dev: CTL-1616 keep the resolved secret VALUE out of child-process environments (#2925) (2c6901c)
  • dev: CTL-1616 PR6 follow-up — observe-only Layer-2 shadow + doctor coherence (#2929 Codex x4) (#2930) (64dddf5)
  • dev: CTL-1617 align doctor webhook-ingestion with the declared deployment mode (#2918) (d1d66e9)
  • dev: CTL-1617 close the three late #2918 Codex findings on the mode-aligned doctor grant (#2920) (905dbaa)
  • dev: CTL-1617 harden the join webhook-wiring gate (Codex follow-up to #2913) (#2914) (0bd14f8)
  • dev: CTL-1628 A1 isolate bun sniff from project config (Codex #2966 post-merge) (#2967) (ef09cb4)
  • dev: CTL-1628 A1 multiline-tolerant jq-less packageManager sniff (Codex #2948 post-merge) (#2964) (bac5434)
  • dev: CTL-1628 A1 post-merge hardening (Codex #2945 threads) (#2948) (c3f6944)
  • dev: CTL-1628 A1 retry TMPDIR when safe-cache mktemp fails (Codex #2972 post-merge) (#2975) (14bd0b6)
  • dev: CTL-1628 A1 sniff scratch-dir hardening + tier fallthrough (Codex #2967 post-merge) (#2972) (92226cb)
  • dev: CTL-1628 A1 tiered packageManager detection (Codex #2964 post-merge) (#2966) (1f22f0e)
  • dev: CTL-1628 A1 verify TMPDIR parent + scratch-dir before trusting it (Codex #2975 post-merge) (#2977) (27517ec)
  • dev: CTL-1628 A2 post-merge hardening (Codex #2946 threads) (#2947) (831a469)
  • dev: CTL-1628 comment-wake emission accounting + cross-host dedup reset (Codex #2970 post-merge) (#2973) (36e4cf4)
  • dev: CTL-1628 credit survives throw + early-path needs-input dedup clear (Codex #2974 post-merge) (#2976) (666044d)
  • dev: CTL-1628 delete unreachable catalyst-filter daemon body (keep alias) (#2949) (6a7d4cd)
  • dev: CTL-1628 freeze-cause telemetry mirror, legacy hydration default, persist retry (#2968) (8fffff5)
  • dev: CTL-1628 heartbeat publisher — require Linear anchor only in linear read-source mode (#2958) (3247e76)
  • dev: CTL-1628 orch-monitor roster readers → cluster.json roster (stop-worker fence + cross-node tail) (#2959) (7d5b93d)
  • dev: CTL-1628 retire ADR-018 JSON-shadow scaffolding + unused recordWorkerTransition module; document CTL-532 as the live projection (#2961) (3600198)
  • dev: CTL-1628 single-consume early-write credit + disposition-scoped dedup reset (Codex #2973 post-merge) (#2974) (c877a25)
  • dev: CTL-1628 surface eligible-set projection-write failure as health event (#2960) (c04f1a7)
  • monitor: mint app-actor Linear token on monitor start (supersedes #2905) (#2978) (f6fdeb9)
  • monitor: post-merge hardening — scan reachability, stop-cancels-remint, bash probe status (#2979) (34c5467)