Skip to content

Catalyst Dev — Change Log

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