v0.51.20 — 5-PR contributor follow-on batch + 2 in-stage absorbs
Single-commit release rolling up 5 contributor PRs filed since v0.51.19, with one parallel-discovery resolution and two in-stage absorbs.
Constituent PRs
- #1828 by @Michaelyklam — Surface stale Kanban client recovery (closes #1823). Server-side 404 handler for unknown
/api/kanban/*routes, client-side stale-bundle UI withHard refresh nowbutton (unregisters service workers + clears Cache-API + reloads), board-pointer drift recovery (loadKanbanresolves boards before scoped requests; clears stale saved slug to default). - #1827 by @Michaelyklam — Sync Codex provider card models with picker (follow-up to v0.51.19 #1812). Replaces #1812's pure-live-fetch hook with a richer live + Codex-local-cache merge so the providers card matches the picker (which already shows
gpt-5.3-codex-sparkfrom #1680 via the local cache path). - #1826 by @Michaelyklam — Allow no-agent cron edits without prompt (closes #1820). Cron editor now distinguishes agent vs no-agent jobs: Mode badge in detail view,
disabledprompt textarea in edit form, validation/payload-skip for no-agent saves. - #1825 by @ai-ag2026 — Hide workspace file tree cruft by default (closes #1793). 21 default-hidden patterns (.DS_Store, Thumbs.db, .git, node_modules, pycache, etc.) with a "Show hidden files" toggle persisted in localStorage.
- #1822 by @ai-ag2026 — Workspace heading root actions (closes #1786). The "Workspace" panel heading is now interactive: click → root, right-click → Reveal in Finder / Copy file path.
Parallel-discovery resolution
- #1821 by @ai-ag2026 → closed as superseded by #1826. Same fix shape (cron form
requiredremoval + validation skip + payload omission), but #1826 covers more surface (Mode badge, disabled-prompt, i18n hint, screenshot, 4 tests vs 2). Convergent diagnosis acknowledged in close comment.
In-stage absorbs (during pre-release gate)
static/panels.js— Removed duplicateawait loadKanbanBoards()tail call inloadKanban(). PR #1828 added a pre-fetch at the start; the existing tail call was now redundant and doubled/api/kanban/boardstraffic under SSE-driven refreshes (250ms debounce). The 30-second_kanbanStartPolling()interval already picks up subsequent changes.tests/test_issue1807_codex_provider_card_live_models.py— AddedCODEX_HOMEisolation in_configure_codexhelper. v0.51.19's tests didn't isolate the Codex local model cache, but PR #1827's new_read_visible_codex_cache_model_ids()merging makes this load-bearing — without it the dev's real~/.codex/models_cache.jsonleaks into test output. Test-only.
Tests
- 4790 → 4805 collected (+15)
- 4794 passed, 8 skipped, 1 xfailed, 2 xpassed, 0 failed in 156.7s
- Browser API harness 11/11 endpoints green
- JS syntax check 3/3 modified files green (
node -con i18n.js, panels.js, ui.js) - No file deletions, no merge-conflict markers
Pre-release verification
- All 5 PRs CI-green individually
- Sibling rebase needed for #1822 + #1825 (both touched ui.js after
renderBreadcrumb()and adjacent index.html/style.css blocks). ui.js conflict resolved by concatenation (node -cclean). - Pre-stamp re-fetch: all 5 PR heads still match local rebases (no mid-sweep force-pushes).
- Opus advisor: SHIP. 1 fix absorbed in-release (loadKanbanBoards perf cleanup). 4 narrow follow-ups deferred to issues:
- Lowercase
'not found'404 string match could fire stale-client UI for genuine 404s (bounded false-positive). - PR #1826
_currentCronDetail.no_agentworks but_cronPreFormDetail.no_agentwould be more semantically precise. - PR #1825 i18n debt:
workspace_show_hidden_filesonly translated forde(7 locales English passthrough). - PR #1822 heading silently no-ops when
S.session.workspaceis falsy (cursor:pointer always set).
- Lowercase