Catalyst Dev — Change Log
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.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.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.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.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.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
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
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.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.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)
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.