v0.81.0
Added
-
On-demand MR rework past the automatic cap, with optional guidance (#1202).
An owner can start one rework cycle on a completed run whose MR is open even after the automatic cap, from the run page's Rework now control,uzi run rework <run-id> [-m <guidance>], orPOST /api/runs/{id}/rework. It bypasses the cap, debounce, staleness and green-pipeline gates while keeping the branch, one-active-rework, kill-switch, token and open-MR guards. The cycle never counts against the automatic cap and atomically advances the consumed high-water so the watcher does not repeat those comments. The cap halt comment and notification now point at this action. -
The Judge page's group expander now shows the newest occurrence's full rationale, and gains a select-all checkbox (#1183, #1211).
Expanding a group fetches and renders the newest open occurrence's complete rationale above its occurrence list, in place of the clamped preview shown before you expand; a "Select all N shown" checkbox above the group list ticks every group currently on screen, for a bulk Mark done or Dismiss in one pass. -
uzi findings statsanduzi findings undo <id>join the findings CLI, andlist/review backlogcatch up on rendering (#1183, #1212).
uzi findings statsprints your Findings triage totals across every repo you own (or one, narrowed with--repo), the same number the web nav badge and tabs show;uzi findings undo <id>reverses a dismissal, keyed on the coordinate'sdisposition_id, which only--jsonsurfaces (the humanlistview still prints thefinding_idthatfile/dismissuse);uzi findings list --bucketnow also acceptsdone, and a dismissed row prints its reason while a done row prints "Done via #N";uzi review backlog's group line now reads "N open of M runs" (or "M runs, all settled") in place of a flat seen-in-N-runs count.
Changed
- Judge and the run page's judge panel now share one triage row and one vocabulary (#1183, #1211).
Every open recommendation, on/judgeand on the run page, now shows File issue · Mark done · Dismiss ▾ at equal weight in one row, replacing the run page's lone File issue button on its own line and/judge's per-run File issue buried inside the occurrence expander; the open state reads "To triage" everywhere it appears, the tab, the chip, the strip, and the status line, and a filed recommendation reads "Filed #N" in the same slot. On/judge, File issue no longer needs the expander open, it drafts straight from the group's newest open occurrence, the most recently judged run still open, tracked by a newjudged_atfield on the judge backlog occurrence API, while the group's other open runs stay open until you mark the whole group done. - The Findings backlog now matches Judge's triage page, including a filed finding turning Done when its issue closes on the forge (#1183, #1212).
Findings gains five counted tabs (To triage, Filed, Done, Dismissed, and a returning All), each coordinate can show its evidence and the runs it was seen in behind a row expander, a Dismiss ▾ menu offers Won't do and Not an issue with multi-select bulk dismiss and Undo from a toast, and once the issue you filed from a finding is closed on the forge uzi marks it Done by itself (labelled "Done via #N"), reopening it if the same bug reappears in a later run. - Appearance and Demo mode moved to their own Settings › Appearance tab (#1208).
The theme / mode / typeface controls and the per-device Demo mode toggle now live on a dedicated Appearance tab, second after Account & tokens, instead of as cards buried inside the Account & tokens tab. The controls behave exactly as before (only their home changed), and Account & tokens no longer lists appearance in its description. - The board search and toolbar are left-anchored on their own row (#1208).
On a wide viewport the board's search and controls no longer fling to the far-right edge with a dead gap after the title: they render as their own full-width row beneath the board title, left-aligned at every width, so search stays top-left and a wide window matches the normal-width layout. Sticky positioning, the/-to-focus shortcut, andEsc-to-clear are unchanged. - Boards open with empty columns hidden by default (#1208).
The Hide empty toggle now defaults on, so a board you have never configured opens without its empty label lanes. The choice is still remembered per board, so a board you explicitly set to show empty columns keeps showing them. - A worker follows a symlinked root instruction file in a cloned repo safely, and reads an untracked one (#1219).
The agent now loads a repo's root instruction file (CLAUDE.md/AGENTS.md) when it is a symlink, but only when the link resolves to a regular file inside the repo and outside.git; unsafe, broken, looping, escaping, non-file, and.git-targeting symlinks are ignored. An untracked or generated root instruction file is now picked up too, so the file is read before dependency install as before.
Fixed
- Resumed and recovering runs keep their approved plan and survive an empty SDK turn instead of failing terminally (#1197, #1213).
Autopilot now persists the approved plan before implementation, so a run resumed on another worker uses that plan rather than silently re-planning; it retries a positively empty SDK turn with bounded, budget-accounted backoff rather than failing the run, while still honoring real timeout, pause and cancellation outcomes; and it adds an automaticrecovery_waitwith server-owned capped backoff that requires a verified local checkpoint before a promotable park, so a failed capture retains and retries its source clone instead of reseeding destructively. Duplicate claims serialize through cleanup, and park/cancellation reports retry instead of abandoning a live claim. - The sweeper logs a pass that only promotes a run out of
limit_waitorrecovery_wait(#1218).
A tick whose only effect was releasing a rate-limit-held or recovery-held run left no log line, resuming the run invisibly; both promotions now count toward the "pass did something" total, so thesweeper passline reports them.