Skip to content

fix(dispatch): close the report out on the run's outcome - #3

Merged
TimMikeladze merged 1 commit into
mainfrom
fix/dispatch-report-lifecycle
Sep 1, 2026
Merged

fix(dispatch): close the report out on the run's outcome#3
TimMikeladze merged 1 commit into
mainfrom
fix/dispatch-report-lifecycle

Conversation

@TimMikeladze

Copy link
Copy Markdown
Owner

A report moved to "dispatched" when its run started and never moved again, so one that had been handled and one that had been ignored looked the same, and dispatchAll skipped both forever.

A clean exit is not the same as the work being done. Under the default permission plan the agent can only propose: it writes a plan, asks whether to proceed, and exits 0 having touched nothing, with no one there to answer. That was recorded as a plain success on a stuck report, which reads as devbar ignoring what you sent while the run still costs money.

A finished run now resolves the report when the working tree changed, and reopens it as new otherwise, carrying a note that names plan mode as the reason when that is what happened. Reopening is not a retry: the finished task still guards its report, so nothing re-runs on its own.

Deciding that from git status --porcelain alone was wrong, and wrong in the common case. Porcelain names which paths are dirty, not their content, so a file already modified before a run and edited again during it produced byte-identical output — a real edit read as a no-op, and the report was reopened after being handled. gitSnapshot now stamps each dirty path with its size and mtime and the comparison is per file. That also fixes changedFiles, which shared the blind spot and never reported an edit to an already-dirty file.

Verification

All CI steps run locally and green: build, app build, type-check, lint (0 errors), format --check, test (199 pass / 0 fail). CI on the pushed branch is also green.

🤖 Generated with Claude Code

https://claude.ai/code/session_01339td96EX4bLYrbCNc4NTH

A report moved to "dispatched" when its run started and never moved again,
so one that had been handled and one that had been ignored looked the same,
and dispatchAll skipped both forever.

A clean exit is not the same as the work being done. Under the default
permission "plan" the agent can only propose: it writes a plan, asks whether
to proceed, and exits 0 having touched nothing, with no one there to answer.
That was recorded as a plain success on a stuck report, which reads as devbar
ignoring what you sent while the run still costs money.

A finished run now resolves the report when the working tree changed, and
reopens it as "new" otherwise, carrying a note that names plan mode as the
reason when that is what happened. Reopening is not a retry: the finished
task still guards its report, so nothing re-runs on its own.

Deciding that from `git status --porcelain` alone was wrong, and wrong in the
common case. Porcelain names which paths are dirty, not their content, so a
file already modified before a run and edited again during it produced
byte-identical output — a real edit read as a no-op, and the report was
reopened after being handled. gitSnapshot now stamps each dirty path with its
size and mtime and the comparison is per file. That also fixes changedFiles,
which shared the blind spot and never reported an edit to an already-dirty
file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ph2Rn26we5JcGUhtQckrdQ
@vercel

vercel Bot commented Sep 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
devbar Ready Ready Preview Sep 1, 2026 10:28pm UTC

@TimMikeladze
TimMikeladze merged commit afd04f0 into main Sep 1, 2026
6 checks passed
@TimMikeladze
TimMikeladze deleted the fix/dispatch-report-lifecycle branch September 1, 2026 22:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant