Skip to content

All versions since 12.51.0

12.51.0

Aug 10, 2026

Triage Aging PRs & Orphaned Worktree Adoption

A new triage-aging-prs skill encodes a proven method for driving a stale PR backlog to zero — including traps around fork CI secrets, ruleset queries, and reviewer signal interpretation that aren’t obvious until they’ve cost you time. Operators also get a new adopt command for claiming orphaned worktrees. Several main-branch test and lint failures that were blocking every open PR from reaching a green check set are fixed as well.

PRs

  • dev: add triage-aging-prs skill (#3173) (0fa37c9)
  • dev: CTL-1642 operator adopt command for orphaned worktrees (#3175) (8180c80)
  • dev: CAT-47 reconcile orphan-stale recovery seams (#3169) (97d63a4)
  • dev: clear the 7 lint errors red on main in pr-status-backfill (#3179) (4d43b2e)
  • dev: unbreak main — inject the skills-dir seam in the install-profile tests (#3180) (90a9967)

12.52.0

Aug 10, 2026

Durable Phase Artifacts & Cross-Host Recovery

Six phase skills now write durable thought docs to the shared repo before emitting complete, enabling reconstruct-ticket-state.mjs to rebuild any in-flight ticket’s history from scratch on a fresh host. The sync gate rolls out behind catalyst.phaseArtifactSync.mode — default off is behavior-identical to today; set shadow to observe without blocking, or enforce to make sync failures fatal. This release also fixes orphaned worker directories that held tickets in-flight indefinitely, corrects claude-accounts.env sourcing on bg-executor nodes where it was silently never loading, and resolves a ps truncation bug that caused the forwarder identity check to fail on Linux CI.

PRs

  • dev: CAT-31 resolve ticket worktrees before dispatch (#3141) (5b40163)
  • dev: CTL-1490 — durable phase artifacts + cross-host ticket-state reconstruction (#2697) (797dfdc)
  • dev: CAT-24 reclaim empty and signal-less worker directories (#3176) (228fb4f)
  • dev: CAT-90 — source claude-accounts.env unconditionally, not gated on CATALYST_EXECUTOR (#3186) (27670c7)
  • dev: confirm SIGKILL reap before returning in forward-stop (CTL-1502) (#3172) (ec9f51b)
  • dev: CTL-1701 move synthetic test pids above the real-pid ceiling (#3197) (c051400)
  • dev: unbreak main — stop ps truncating the forwarder identity check (#3196) (e8ab2e4)

12.53.0

Aug 12, 2026

Daemon Reliability & Pipeline Hardening

Daemon logs are now rotated on restart instead of truncated — the previous run’s output is preserved as daemon.log.1 through .5 (configurable via CATALYST_LOG_RETAIN) so you have evidence when diagnosing a wedge. Two daemon-killing bugs are also fixed: an async EAGAIN spawn failure that could take down execution-core, and a zsh local path variable that silently emptied $PATH and caused phantom artifact_not_gate_visible phase failures. Automated merges from linked worktrees no longer fail with fatal: 'main' is already used by worktree — the merge now splits into a REST merge and a checkout-free remote ref delete.

PRs

  • dev: CTL-1755 preserve daemon logs across restarts (#3231) (9acf3c5)
  • dev: CTL-1774 — thread appendDelegateEvent through delegate-first routing seam (#3280) (4cb5ca0)
  • dev: CTL-1789 — emit phase.advance.applied and attribute who asserted each terminal (#3268) (52984b6)
  • dev: bound board-health delegate-lands grace (#3206) (6ec4226)
  • dev: CTL-1764 handle async spawn ‘error’ so EAGAIN cannot kill the daemon (#3230) (3a03870)
  • dev: CTL-1777 — fix write_phase_thoughts_doc under zsh (rename local path vars + static lint) (#3238) (05a10a5)
  • dev: CTL-1791 — delete claim.mjs dispatch-claim, the high-water+1 generation the CTL-736 fence forbids (#3269) (3a9025f)
  • dev: CTL-56 — worktree-safe merge (drop —delete-branch, checkout-free ref cleanup) (#3277) (f9690b5)

12.54.0

Aug 13, 2026

Scheduler Hardening & Diagnostic Truthfulness

Work-done probes now carry timeouts so a hung gh or git child cannot wedge the scheduler tick indefinitely, and probe matches are tightened to prevent one ticket’s document from falsely satisfying another’s done check. The config dump tool now reports each setting’s actual in-force value and where it came from, rather than echoing what the config file says — every row is bound to the reader that actually decides it. A torn first line in the event log no longer silently retires the rest of the month alongside it, and raw NUL bytes in five source files have been replaced with escape sequences so grep and project-wide searches no longer skip them.

PRs

  • dev: CTL-1793 — catalyst config dump that cannot assert what the reader would not produce (#3276) (77633e7)
  • dev: CTL-1801 — checks that cannot report a clean result from a check that never ran (#3285) (eb70d61)
  • dev: CTL-1808 — the fast-forward becomes a subscriber, not a call (part 1: the scanner) (#3316) (d190e87)
  • dev: CTL-1790 PR-1 — a work-done probe must not match another ticket’s document (#3286) (e785a6e)
  • dev: CTL-1804 — make the forwarder identity check say what it saw (#3317) (6ba92e5)
  • dev: CTL-1810 — bound every work-done probe spawn so a hung gh cannot wedge the scheduler tick (#3307) (37de564)
  • dev: CTL-1811 — make every source file visible to grep (#3312) (0636a0b)
  • dev: CTL-1813 — a torn first line must not retire the month beside it (#3318) (92f37be)
  • dev: unbreak main — CTL-56 guard scanned CHANGELOG prose as a call site (#3284) (6c86fd3)

12.54.1

Aug 14, 2026

Event Pipeline Integrity Fixes

This release addresses a cluster of reliability issues in the event pipeline: torn lines from concurrent bash appends, degenerate records destroyed in transit to Loki, double-counted drop metrics, and terminal events that went invisible to the worker-state projection when the primary emit path failed. Dependency installs that silently no-op’d after a transitive resolution change — leaving daemons running stale code — now detect the skew and force a relink. The commits-behind gauge is also fixed to measure the roots daemons actually run from rather than always reporting zero.

PRs

  • dev: CTL-1659 — a dependency fix that lands on main must reach the running cloud-sync writer (#3344) (1ce1c5a)
  • dev: CTL-1795 — dual-emit the v2 envelope from every v1 site, so a consumer filtering on event.name stops seeing a smaller universe (#3343) (b724db9)
  • dev: CTL-1809 — make a bash event append exactly one write(2), so a concurrent producer cannot splice two events into one line (#3350) (388edf4)
  • dev: CTL-1814 — stamp the orchestrator on fallback terminals, so worker state is not blind exactly when the primary path failed (#3342) (a834c9a)
  • dev: CTL-1817 — carry every envelope shape off-machine, so a rescue escalation is not destroyed in transit (#3325) (d14e477)
  • dev: CTL-1818 — count the events the forwarder throws away, on a surface that survives the throwing-away (#3341) (e60321f)
  • dev: CTL-1823 — count degenerate RECORDS at batch accept, so the detector cannot inflate during the outage that makes someone read it (#3347) (2e6cc71)
  • dev: CTL-1825 — measure code currency at every executing root, so a 24-behind node cannot report zero (#3345) (e4401a6)
  • dev: CTL-1831 — prove the install RELINKED, so a merged lockfile is not installed in name only (#3349) (3f60190)
  • dev: CTL-1832 — a triage escalation must carry its question, not an empty object (#3340) (0e92516)
  • dev: CTL-1835 — close the four residual gaps from #3349, and prove each closure (#3353) (725922a)

12.55.0

Aug 15, 2026

Event Schema Hardening & Installer Cloud Path

Every event flowing through the daemon is now validated against a measured schema derived from 1.1 million real log lines, so envelope drift fails loudly in CI rather than silently dropping data at runtime. The installer gains a --cloud-token / --cloud-account path that completes a full cloud-connected setup in one step — and deliberately refuses to guess your tenant if the account is omitted. Two supporting fixes land alongside: supplemental Linear reads now route through the local replica to stop burning shared API quota, and event name resolution is unified through a single shared boundary so no envelope shape can be visible to some readers and invisible to others.

PRs

  • dev: CTL-1819 — validate every event against one measured schema, so envelope drift fails loudly instead of silently losing data (#3380) (aec4886)
  • dev: CTL-1836 — give the installer a cloud path, and make it refuse to guess the tenant (#3365) (13d8a07)
  • dev: CTL-1806 — serve the board’s supplemental reads from the local replica, so a display render stops spending the shared Linear quota (#3355) (effcbc8)
  • dev: CTL-1834 — resolve every event’s name through one shared boundary, so a new envelope shape cannot be visible to some readers and invisible to others (#3356) (953d53e)
  • execution-core,orch-monitor: CTL-1723 item 1 + OTEL attribute manifest — phase-signal mtime ties break by pipeline ordinal; 17 v2-envelope keys manifested (b8cb40b)

12.56.0

Aug 15, 2026

Phase Agent Yield & Advancement Reliability

Phase agents can now declare a bounded wait with --status yield when delegating to a background job, so finishing work is no longer recorded as abandonment. The advancement sweep gains a durable once-per-edge idempotency guard keyed on the predecessor’s identity, preventing the same phase edge from firing multiple times in a single tick. Two supporting fixes round out the release: the Linear webhook monitor now detects 401 authentication failures via route-comparison against the GitHub control, and connected replicas report the schema bundle they actually loaded rather than a version string that may not reflect what’s in memory.

PRs

  • dev: CTL-1805 — durable once-per-edge advancement idempotency guard (#3404) (0d9e25f)
  • dev: CTL-1841 — Linear webhook 401 alarm (route-comparison detector) (#3364) (dfae529)
  • dev: CTL-1854 — let a phase agent declare a bounded wait, so finishing work is not recorded as abandonment (#3383) (3ebbf30)
  • dev: CTL-1869 — report the schema bundle the replica actually loaded (#3399) (309966f)

12.57.0 (2026-08-17)

Features

  • dev: CTL-1847 — the cloud feed can drive dispatch, behind off/shadow/enforce (#3439) (9193042)
  • dev: CTL-1891 inc 1 — a host recognises its own Linear write without asking who wrote it (#3437) (1c6f44f)

Bug Fixes

  • dev: CTL-1847 — restore DEFAULT_SETTLE_SEC; execute the parity CLI in tests (#3444) (385c9a2)
  • dev: CTL-1892 — the fleet has TWO app identities and both rotated; only one was seeded (#3436) (9ac3e07)
  • dev: CTL-1892 — the self-echo guard survives an app-actor rotation (#3428) (4e601ef)
  • dev: CTL-1901 — a mid-sweep readiness drop strands an already-stamped edge (#3448) (5f84a2b)
  • dev: CTL-1902 — readiness required the writer to be alive, not the feed to be arriving (#3449) (e530c25)
  • dev: CTL-1904 — the feed sees label changes the updated_at cursor cannot reach (#3446) (51a7f6a)
  • dev: pin @catalyst-cloud/sdk 0.8.4, closing the migrator/writer schema skew (#3426) (4997ebe)
  • dev: pin @catalyst-cloud/sdk 0.8.5, ending the pr_* frame loss (#3432) (88f24c3)
  • dev: pin @catalyst-cloud/sdk 0.8.6 — PRAGMA-accurate columns close the skew class at the root (#3433) (0be8892)
  • dev: pin @catalyst-cloud/sdk 0.8.7 — the replica tenant fence (#3434) (6dc1ab6)

12.58.0 (2026-08-19)

Features

  • dev: CTC-403 inc 1 — a host resolves Linear team and state ids from the replica, not from hand-written caches (#3501) (e42f861)
  • dev: CTC-633 — the disk sweeper reports free space, and stops keeping every worktree forever (#3504) (f757f74)
  • dev: CTL-1889 inc 1 — a host’s Linear writes go through the cloud write proxy, under ONE grant (#3489) (7d9e8cd)
  • dev: CTL-1889 inc 2 — every execution-core Linear comment goes through the cloud proxy under enforce (#3547) (3711854)
  • dev: CTL-1889 inc 3 — the cluster fence + heartbeat go through the cloud attachment proxy (CTC-692) (#3555) (e24bda2)
  • dev: CTL-1893 — the replica path derives from the ACCOUNT (increment 1: the resolver) (#3561) (61d6870)
  • dev: CTL-1908 — doctor reports when a login shell spends the FLEET’s Claude budget (#3506) (cd774d2)
  • dev: CTL-1908 — page at 80% of an armed account’s window, before the fleet stalls (#3526) (04e2ce5)
  • dev: CTL-1914/1917/1918 — the documented install ends with a working node, not a list of hand-steps (#3500) (0671d38)
  • dev: CTL-1916 — ship the cutover-verification tool instead of re-deriving it each session (#3496) (35035c5)
  • dev: CTL-1922 — ask skill: ask/decision-ticket SOP + threaded app-actor reply helper (#3480) (c9582a2)
  • dev: CTL-1922 — 👀 ack on the human’s latest comment; reply clears it; newest-first fix (#3484) (54203ef)
  • dev: CTL-1922 inc 2 — ask create / ask accept verbs that PROVE the ask is decidable (#3509) (92e32ca)
  • dev: CTL-1929 — run the GitHub producer in shadow, behind its OWN knob, with enforce refused by name (#3524) (773675a)
  • dev: CTL-1929 — the GitHub feed’s read + event layers, with both blockers named rather than papered over (#3513) (780d309)
  • dev: CTL-1929 — the GitHub leg’s enforce flip, suppressing smee PER NAME (#3535) (98ec1ed)
  • dev: CTL-1929 — the installer stops opening the GitHub smee tunnel once the feed is authoritative (#3540) (6a5f359)
  • dev: CTL-1929 — the sweep, the suppression set, and a parity ledger that can return INCONCLUSIVE (#3520) (aa599ed)
  • dev: CTL-1929 — wire check_suite.completed, and make BOTH remaining names’ coverage a property of the replica (#3560) (3fab3bb)
  • dev: CTL-1929 — wire pr.merged and per-push into the producer on schema 0.1.17 (#3544) (538214a)
  • dev: CTL-1931 — the dep-skew detector can see a writer running the WRONG checkout (#3493) (85f16a9)
  • dev: CTL-1935 — pin the catalyst-index serving root to a git SHA (COORD decision 2) (#3525) (d4084ca)
  • dev: CTL-1936 — a host bounds its own cloud write spend, and stops re-issuing a write that already converged (#3505) (4aec522)
  • dev: CTL-1943 — a dispatched phase narrates itself as a Linear agent session, without blocking the tick (#3529) (6a413b3)
  • dev: CTL-1944 — a fleet host proves it can materialize owner tokens, and installs direnv when it cannot (#3539) (b8adf84)
  • dev: CTL-1951 — the ROUTINE fleet reload advances the pinned indexer serving root, out of the broker’s event loop (#3542) (8cade58)
  • dev: CTL-1961 — register the reaction + issue-create proxy routes, measured at the dispatcher (#3647) (60c5c38)
  • dev: CTL-1975 — the uninstall could not remove two agents its own verify-clean fails on (#3606) (5d842e7)
  • dev: CTL-1993/CTL-2001 — the steward skill, and one canonical copy of the threading contract (#3612) (109da9c)
  • dev: CTL-1994 — a supervisor keeps a long-running role alive, so the SOP’s response times are a mechanism and not a promise (#3614) (f688265)
  • dev: CTL-1995 — the concierge skill: one door, one page, and no authority over stewards (#3615) (223aa30)
  • dev: CTL-1996 — AGENTS.md teaches the coordination roles, and CI catches the block drifting (#3618) (b48ec01)
  • dev: CTL-2042 — fleet host env-file materialization + doctor drift check (#3686) (da98683)

Bug Fixes

  • dev: COORD-236 — the 60-second cool-down that would have stopped the label storm already existed; it could not see a budget refusal (#3667) (f29dbba)
  • dev: CTL-1832 — the PLUGIN_ROOT guard scans SKILL.md only, and progressive disclosure has moved the uses into references/ (#3660) (79874f2)
  • dev: CTL-1906 — the parity harness counts the feed’s own events as smee under enforce (#3452) (17cd352)
  • dev: CTL-1909 — readiness un-armed on the sweep’s most common HEALTHY outcome (#3469) (bedc8c3)
  • dev: CTL-1910 + CTL-1913 — the cloud installer pinned an NXDOMAIN host and never validated the token (#3470) (65bd1cf)
  • dev: CTL-1918 — catalyst-doctor is CRASHING on every host (an extracted default referencing doctor’s own scope) (#3515) (a9ffd66)
  • dev: CTL-1920 — a writer re-seed is a torn read, not 400 changed tickets (#3481) (1c59b7b)
  • dev: CTL-1921 — every new worktree inherited 1.3 GB of other agents’ scratch checkouts (#3472) (59385d9)
  • dev: CTL-1928 — the join bundle stops re-creating the retired Linear smee path (#3485) (9251f2b)
  • dev: CTL-1929 — an EMPTY check_suite association is a fact, not a gap; emit it, and put the recovered PR where nothing routes on it (#3563) (094eff3)
  • dev: CTL-1929 — set aside the suite conclusions the mirror cannot store (CTC-719), and collapse an observation node’s duplicated deliveries (#3565) (e4134eb)
  • dev: CTL-1929 — the P8 gate compared a young table against a long window and fabricated a FAIL; window both sides (#3573) (41a1a17)
  • dev: CTL-1929 — the parity ledger compares only repos smee can deliver, so CLEAN is reachable (#3551) (03b9399)
  • dev: CTL-1929 — the parity ledger says when its WINDOW, not the feed, produced the gap (#3562) (29cf9cb)
  • dev: CTL-1929 — the preflight checks EVERY repo on the tunnel, because the ledger structurally cannot (#3569) (67a7862)
  • dev: CTL-1931 — the dep-skew detector can reach a verdict on a bun isolated-linker host (#3499) (8c4dc40)
  • dev: CTL-1937 — a cli/*.mjs run by a SHELL refuses on its own, and CI keeps it that way (#3516) (5464175)
  • dev: CTL-1937 — a mis-invoked CLI module cannot become a 7,592-process fork chain (#3511) (7ea8206)
  • dev: CTL-1947 — an account the poller CANNOT sample now says so, instead of leaving an absent series (#3545) (faaddb1)
  • dev: CTL-1949 — the documented ask create path filed nothing and exited 0, and cross-team asks carried the wrong labels (#3531) (b77e8d6)
  • dev: CTL-1952 — a fully successful narration was recorded as a failure; the session route answers per part (#3538) (6bf7180)
  • dev: CTL-1956 — the direnv provisioning a host actually needs, on hosts that have no brew (#3552) (457f025)
  • dev: CTL-1963 — doctor asserts the cloud-sync launchd label resolves to ~/Library/LaunchAgents (#3572) (3b7eaae)
  • dev: CTL-1968 — a scratch HOME is not a launchd sandbox, so the install paths refuse it (#3576) (b70211b)
  • dev: CTL-1976 — the gate reads the readiness file the PRODUCER writes, not one under the caller’s dir (#3585) (39037d1)
  • dev: CTL-1997 — two out-of-date skill instructions, each verified at file:line, and one the audit got wrong (#3630) (c7b9f2d)
  • dev: CTL-1998 — main is red on a guard that could not fire for the change it guards (#3656) (6f4afb6)
  • dev: CTL-1998 — two real phase-pipeline defects: an unbound $EMIT crash and a plan glob the dispatcher and the phase disagree about (#3653) (91284f7)
  • dev: CTL-2008 — the broker folds github.pr.* into pr_status_cache, because retiring smee left the table with no writer (#3633) (a79ad89)
  • dev: CTL-2019 — setup wrote the cloud account to a file and then refused to read it, so the whole install aborted (#3637) (88a7216)
  • dev: CTL-2022 — the parity ledger reads the stream enforce actually emits, and a marker moves the verdict (#3644) (4337d64)
  • dev: CTL-2024 — a cleared stall could never re-enter its phase, because the janitor’s unstick left CTL-1805’s advance marker standing (#3649) (3740736)
  • dev: CTL-2026 — doctor could certify a host whose live Linear write path is a directory it never looks at (#3679) (34cda74)
  • dev: CTL-2028 — a pid file naming a LIVE peer was clobbered on start and deleted on exit, so two brokers ran for 85 minutes and every status read clean (#3675) (cba6bed)
  • dev: CTL-2030 — doctor graded whether smee was CONFIGURED, so after the cutover it reported a dead route as wired (#3672) (8146056)
  • dev: CTL-2033 — the cross-host claim could not say why it lost, so a refused write and a lost race were the same value (#3664) (07a4469)
  • dev: CTL-2047 — a triage budget held by a failed scan printed the same line as a busy one (#3682) (e7b41a5)
  • dev: CTL-2048 — a fence the worker could not READ was reported as a fence it read and found STALE (#3685) (c511edb)
  • dev: CTL-879 — the sixth blind gate, found by reading the first instrument: the cross-host claim declines at log.debug (#3661) (5e84413)
  • dev: CTL-879 — the triage admission path declined 20 tickets an hour and wrote down nothing (#3659) (8002c5d)

12.59.0 (2026-08-20)

Features

  • dev: CTL-2000 — steward-first escalation (resolver-independent slice) (#3742) (87ca75d)
  • dev: CTL-2074 phase 1 — cloud-proxy identity config seam (bot.cloud.botUserId) (#3738) (bbb56cb)

Bug Fixes

  • dev: CTL-1754 — the escalation card read a key written on 0 of 44 live signals, so it always said “(no reason)” (#3699) (7f562b6)
  • dev: CTL-1851 — an SDK worker cannot outlive its daemon, so a restart is PROOF its ghost is dead (#3694) (61587c8)
  • dev: CTL-1889 inc 4 — a status write with no linearis stopped reporting itself applied (#3724) (741cbd5)
  • dev: CTL-2045 — the install proved the credential could READ, and the incident was a WRITE it never tested (#3706) (318268f)
  • dev: CTL-2050 — an artifact that proves a phase succeeded retracts the infra failure that buried it (#3690) (c90e30a)
  • dev: CTL-2068 — a claim the pipeline can overwrite is not a claim (#3712) (18d8eb9)
  • dev: CTL-2068 — the guard shipped INERT on mini; resolve the state map through a ladder (#3714) (f499dcb)
  • dev: CTL-2076 — setup_project_config preserves committed Linear identity on regen; surface the registry team-identity mismatch (CAT-52) (#3736) (ef5b0b1)
  • execution-core: OTL-67 — SDK-dispatched workers lose per-ticket OTEL_RESOURCE_ATTRIBUTES to settings.json pin (#3721) (4cc82ce)

12.60.0 (2026-08-20)

Features

  • dev: CTL-1785 phase 1 — entitlement seam (zero-import leaf, tri-state flag, local provider, off by default) (#3755) (cccf3b4)
  • dev: CTL-1786 phase 1 — lease-authority.mjs cloud client + auth-spike probe (#3756) (dcad0fe)
  • dev: CTL-1864 — publish slot-based active_count on node.heartbeat (#3768) (7051350)
  • dev: CTL-1974 — codify catalyst-dev:project-orchestrator as thin steward wrapper (#3759) (4de7a1a)
  • dev: CTL-1985 — catalyst enrol one-key host enrollment installer (#3758) (a903177)

Bug Fixes

  • execution-core: CTL-2090 — triage-capped ticket can no longer deadlock admission (#3787) (2a649dc)
  • execution-core: CTL-2103 — scrub PATH so the gh-unavailable test is deterministic (#3778) (be1840b)

12.61.0 (2026-08-21)

Features

  • dev: CTC-133 — CQRS fencing split + SDK replica cutover (#3762) (15450f1)
  • dev: CTL-1984 — re-arm claude-accounts.env without daemon restart (#3809) (b24dedc)
  • dev: CTL-2070 — a timely per-ticket actor source (fleet write-ledger) for the lane-claim guard (#3765) (cf9efd0)

Bug Fixes

  • dev: CTL-1783 — a deliberate reopen archives the stale worker dir, doesn’t get re-Done’d (#3723) (2d6ee09)
  • dev: CTL-2082 — refresh linear skill against linearis drift (#3750) (a93eca9)

12.62.0 (2026-08-21) Latest

Features

  • dev: CAT-170 correlated recovery-pass retry-cap alerts (lands #3209) (#3842) (d8fab3b)
  • dev: CAT-173 surface mutual fence standoffs (lands #3241) (#3839) (083e390)
  • dev: CAT-46 durable liveness anchor health checks (lands #3219) (#3841) (42efe53)
  • dev: CTL-1210 — split node config by lifecycle (cluster-secrets.json + node.json) (#3823) (8c0dc4b)
  • dev: CTL-1679 — recovery pass retries safe/retryable failures by default (#3835) (f594755)
  • dev: CTL-1958 — owner comms tools write through the cloud proxy, read from the replica; mint deleted (#3816) (cee3edf)
  • dev: CTL-2085 — auto-update claude CLI and Agent SDK on persistent hosts (#3817) (668c731)
  • dev: CTL-2151 — ask skill gains duplicate-search and blast-radius triage (#3866) (1bff497)

Bug Fixes

  • dev: CAT-116 — validate registry identity at dispatch revision (#3838) (5343dc1)
  • dev: CAT-124 close deferred recovery-pass review findings (#3836) (542d69e)
  • dev: CAT-139 — watchdog runner accepts an explicit —config path (#3833) (4f4c567)
  • dev: CAT-251 — prevent HOME-restoration leaks in tests (#3834) (bf5be52)
  • dev: CAT-47 commit the audit-comment dedup latch only on confirmed delivery (#3831) (5e6fee4)
  • dev: CTL-1550 — Bounded event-log coverage correctness (4 bugs: backfill probe, cap size, window clamp, first-line drop, per-event filter) (#3760) (d52d085)
  • dev: CTL-1596 — cluster secret sync hardening (5 latent bugs) (#3821) (80fd237)
  • dev: CTL-2052 — classify the refused proxy label-write, cool it down, and stop after N (#3815) (6069d8b)
  • dev: CTL-2056 — fix two fleet alarm blind spots (ratelimit-poller + escalation counter) (#3761) (fb66677)
  • dev: CTL-2108 — emit entitlement.restored.<host> when a shed host regains entitlement (#3840) (e6a0581)
  • dev: CTL-2137 — exclude listing-blocked bg sessions from the admission count (#3846) (7d8480d)
  • dev: trust the Tailscale MagicDNS name in the monitor’s reply-origin allowlist (#3830) (d8bde5d)