v0.51.12 — 3-PR batch (cron subprocess return + custom provider routing + session runtime invariants)
🐛 Fixed
- #1746 by @Michaelyklam — Shorten cron profile lock for manual runs. Closes #1574. Returns from v0.51.11 deferral with the queue-drain blocker fixed (drain-then-join pattern + 200K-char regression test). Cron job body runs in a subprocess pinned to the selected profile context; parent stays responsive.
- #1752 by @Michaelyklam — Route
custom_providers[].modelsdict selections tocustom:<name>(slice of #1240 source-of-truth umbrella). Reconciles still-relevant slice from stale conflicting #1311. - #1753 by @Michaelyklam — Guard session-owned runtime invariants (refs #1694). Background terminal events no longer tear down active-pane runtime when an unrelated session finishes; approval/clarify pollers stop by owner-session.
🧪 Tests
4622 → 4632 passing (+10 regression tests). 0 regressions. Stably green on first try.
✅ Pre-release verification
- All 3 PRs CI-green + rebased onto master with NO conflicts (disjoint files:
api/config.py,static/messages.js,api/routes.py). - All JS files syntax-clean.
- Browser API sanity (11/11 endpoints) — all pass.
- Opus advisor: SHIP all 3, 0 MUST-FIX, 1 SHOULD-FIX filed as #1754 (
fork→spawnmigration in cron subprocess, architectural follow-up).
🙏 Closes
- #1574 (cron profile lock duration)
Full Changelog: v0.51.11...v0.51.12