Skip to content

v2.8.0 - Reliability & Board UX

Choose a tag to compare

@theyashgupta theyashgupta released this 05 Aug 19:51
· 264 commits to main since this release
v2.8.0
f52ba62

Dispatch has always had a slightly dishonest relationship with finished work. Drag a ticket to Done and the workspace was gone: worktrees removed, tmux session killed, terminal closed. Which is fine right up until somebody asks you a question about that ticket an hour later and there is nothing left to ask. This release fixes that, and then fixes the problem it creates.

A card reaching Done now schedules its cleanup instead of performing it. The workspace, the worktrees, and the live Claude session all survive for a window you choose, seven days by default, so a finished ticket stays answerable. The obvious consequence is that Done fills up, and the board was never sized for that. So the second half of this release makes the board stay fast with hundreds of completed cards on it. The rest is a batch of accuracy work on the signals the board shows you, because a board that tells you something slightly wrong is worse than one that says nothing.

See it

Dispatch v2.8.0 deferred cleanup and the Done column

Higher-quality video: dispatch-v2.8.0-deferred-cleanup.webm

Done keeps the session alive

Dropping a card into Done no longer pops a cleanup prompt. It stamps a due date and gets out of your way. The card shows how long it has left, counting down in days and switching to hours once it is close, and everything that made it useful while it was running still works: open the terminal, type into it, prompt the agent, resume it. Nothing about it is read only.

The delay lives in a new Cleanup tab in Settings, expressed in days. Zero means clean up immediately on arrival, which is exactly the old behaviour if you want it back. The value is validated on the server rather than in the input box, so a bad number is rejected with a real error rather than quietly clamped to something you did not ask for, and changing the setting never reaches back and reschedules cards that are already waiting. A card keeps whatever due date it was given.

Cleanups run on their own once due, including ones that came due while Dispatch was not running, and they run exactly once. Stopping the app for a week and starting it again does the right thing on boot. If the cleanup finds uncommitted work in a worktree it refuses, leaves the session and worktrees completely alone, and tells you which repo and how many files. It does not retry on a timer, because a destructive action that keeps quietly trying until it succeeds is not a safety check. It waits for you. There is a Clean up now button in the panel header for when you are ready, and it goes through the same confirmation, including the discard path, as before.

The Done column now separates cards still waiting for cleanup from cards already cleaned, so you can tell at a glance which ones still have something to open.

One subtlety that took a second pass to get right. Because Done cards now hold live sessions for days, restarting the backend used to sweep their terminal processes as orphans, since the boot reconcile deliberately skipped Done. That is fixed: a Done card with a live session keeps its terminal and its status channel across restarts, without reopening the guarantee that a parked card never gets promoted on its own.

A board that stays fast as Done fills up

Before this release, every board update sent every card, to every connected browser, on every change. With a handful of tickets that is invisible. With several hundred finished ones it is not, and deferred cleanup makes that pile up on purpose.

Done now loads in pages of fifty with a button at the foot of the column telling you how many are left. The rest of the board is untouched, because Done is the only column that grows without bound. Cards still waiting for cleanup always load first, so the ones you might actually want are never the ones hiding behind a button. The column badge keeps showing the true total, not the number currently loaded, because a board that under reports how much work you have finished would be its own small lie.

The measured effect at five hundred completed cards: the initial board payload and each live update both dropped from about 124 kB to about 16 kB, roughly a factor of eight. Moving a card used to send the entire board back in the response as well, which nothing was reading, so that is gone too. Numbers before and after are recorded in the repo rather than asserted here.

Since most of Done is no longer loaded in the browser, there is a search box on the board. Type an identifier or part of a title and it searches every card on the server, including ones well past the loaded page, and opening a result opens the detail panel straight away rather than making you page down to it first. Cmd+K focuses it. On a phone it collapses to an icon.

Signals that admit when they do not know

The PR and dev server indicators on a card were sometimes silently wrong, and a failed check looked identical to a confirmed absence. Both now distinguish "there is no PR" from "I could not check", so a broken CLI or an expired login shows up as an unknown state instead of quietly reading as good news. That applies on the card, in the detail panel, and on the individual ticket rows of a group card.

The PR lookup was also wrong in ways that only showed up in multi repo workspaces: data a repo returned successfully could be discarded because a different repo failed in the same pass, and an unreachable remote was reported as an authentication problem. Detection now runs on its own schedule rather than riding another loop, a preview port is only advertised once something actually answers on it, and detection recovers when a dev server starts late, restarts, or moves port instead of latching onto its first answer forever. It also stops probing entirely when nothing has a session, and no longer probes cards parked in Done.

One owner per column transition

The reported symptom was specific: prompting an agent whose card sat in Agent Done or In Review did not always bring the card back to In Progress, and occasionally a card landed in Agent Done with no agent having said anything. Both come from two independent status channels disagreeing about who owns a transition.

Every column changing trigger is now written down against every source column, with a single owner for each pair, and that specification is executable rather than a document that drifts. Prompting a card in Agent Done or In Review returns it to In Progress reliably, not only the first time. Agent Done can only be reached by a real completion signal, so it is no longer available as a drag target or in the move picker, and a drop there is refused outright rather than quietly rerouted to a neighbouring column. A genuine completion still moves the card. The In Progress and Needs Input behaviour that already worked was left exactly as it was, and is checked against a recorded corpus of real agent output so this release could not trade a working edge for a broken one.

Group cards, the Inbox, and touch

Starting a session across several tickets used to produce a card titled by gluing the identifiers together. It now gets a short generated title describing the work, with the count and identifiers alongside, editable before you create it, and a sensible fallback if generation fails. The title is generated in the background so the modal never makes you wait, concurrent requests for the same set share one run, and titles containing awkward things like status markers or unusual line breaks can no longer confuse the session that reads them.

An empty To Do column with tickets sitting in the Inbox now says so and offers a way through, with a live count of what is waiting, instead of looking like there is simply no work. The Inbox closes on Escape and resets when you switch views.

The detail panel resize handle works under touch on tablets. It was not a missing listener: the handle declared no touch behaviour, so the browser claimed the gesture as a scroll and cancelled the drag halfway through, which is why the panel always snapped back. Resizing by touch no longer scrolls the page, selects text, or leaks input into the terminal, and the terminal reflows as you drag. On a phone the panel is full screen, so there is deliberately no handle there, and desktop resizing is unchanged.

Smaller fixes

Group member tickets no longer inflate the Inbox waiting count or turn up as their own results in search. Manual moves into columns that should not accept them are refused at the API rather than passing through. Long titles wrap in the panel header instead of pushing buttons off the edge on a narrow screen, and the Agent Done caption no longer overflows its column header. Group member badges wrap rather than clipping the last one. A card open in the detail panel cannot be closed out from under you by the board updating around it.

Full changelog: v2.7.2...v2.8.0

Requires Node ≥ 22.22, tmux, ttyd, git, and the Claude Code CLI. Setup is in the README.