Summary
WIP preservation (preserve_wip → labro-wip/<run-id> branch → ai-handover label → resume via get_prior_wip_run) has never completed a single cycle in 1,999 runs. It spans ~68 references across 7 source modules, 7 test files and the dashboard. Proposal: remove it.
Usage data
Across 1,999 runs (98 non-skipped) in the published DB:
-
3 runs ever produced a wip_branch_url:
| run |
repo |
date |
outcome |
daf88b12 |
birdbird |
2026-08-11 |
failure |
3151100a |
newschart |
2026-08-04 |
failure |
2e985889 |
birdbird |
2026-07-18 |
failure |
All three are the same opencode provider error — a dead agent, not interrupted work.
-
0 resumes, ever. prior WIP branch found appears 0 times in labro.log.
-
ai-handover appears 0 times in the log — the human half of the handover loop has never been exercised.
-
3 orphan labro-wip/* branches are still live on GitHub: 2 in rssrn/birdbird, 1 in rssrn/newschart. None in rssrn/labro.
Two separate findings, worth keeping distinct
1. The feature is unexercised, not incoherent. The design is deliberate: partial → ai-handover label → comment saying "Remove the ai-handover label to re-queue this item" → the next run resumes from the branch. That is a sensible human-in-the-loop affordance. It has simply never been used. Removing it is a judgment call about whether we want the affordance, not a bug report.
2. Independently, it has a latent bug. preserve_wip fires on any non-success outcome, but store.get_prior_wip_run filters on partial only:
"SELECT wip_branch_url, summary FROM runs"
" WHERE item_url = ? AND outcome = 'partial' AND wip_branch_url IS NOT NULL"
All three real preserved branches are failure rows, so they were never eligible for resume. The failure-path half of the feature could not work even if someone did start removing labels. Fixing the bug would still leave a feature with 3 activations and 0 uses.
Why the agent already covers this
The three genuine partial runs (error_max_turns, issues 51/53/105) preserved nothing — and not because preservation failed: preserve_wip failed appears 0 times in the log, so those working copies were genuinely clean. Agents hold PUSH_DEFAULT and push their own branches; WIP preservation duplicates a capability the agent already has, and in practice the agent gets there first every time.
Scope
- Source (~68
wip references): cli.py (18), repo.py (18), post_run.py (12), store.py (8), prompt_builder.py (6), logger.py (5), agents/_subprocess.py (1), models.py.
- Dashboard:
src/data/DataSource.ts:37, src/data/SqlJsDataSource.ts:121,165, src/components/RunDrawer.tsx:210-214, src/test/a11y.test.tsx:44.
- Tests:
test_repo.py, test_cli_run.py, test_logger.py, test_prompt_builder.py, test_store.py, test_post_run.py, test_operator.py.
Decisions needed before implementing
- Keep the
wip_branch_url column. Stop writing it, but leave it in the schema and in the dashboard's read path so the 3 historical rows still render rather than breaking.
- Decide the replacement behaviour for
partial outcomes. post_run.py:340-410 currently routes partial to ai-handover + ai-contributed plus a handover comment. Removing WIP removes that path; something must still mark a partial run for a human.
- Delete the 3 orphan
labro-wip/* branches on rssrn/birdbird and rssrn/newschart as part of the cleanup — they are on public repos.
Keep one thing on the way out
Log a git status --porcelain diffstat on non-success outcomes. One log line, no branches, no schema — and it still answers the only question WIP preservation was ever asked: did the agent lose real work?
Related: #61 (clean checkout per run), #60 (crash handling and atomicity).
Summary
WIP preservation (
preserve_wip→labro-wip/<run-id>branch →ai-handoverlabel → resume viaget_prior_wip_run) has never completed a single cycle in 1,999 runs. It spans ~68 references across 7 source modules, 7 test files and the dashboard. Proposal: remove it.Usage data
Across 1,999 runs (98 non-skipped) in the published DB:
3 runs ever produced a
wip_branch_url:daf88b12failure3151100afailure2e985889failureAll three are the same opencode provider error — a dead agent, not interrupted work.
0 resumes, ever.
prior WIP branch foundappears 0 times inlabro.log.ai-handoverappears 0 times in the log — the human half of the handover loop has never been exercised.3 orphan
labro-wip/*branches are still live on GitHub: 2 inrssrn/birdbird, 1 inrssrn/newschart. None inrssrn/labro.Two separate findings, worth keeping distinct
1. The feature is unexercised, not incoherent. The design is deliberate:
partial→ai-handoverlabel → comment saying "Remove theai-handoverlabel to re-queue this item" → the next run resumes from the branch. That is a sensible human-in-the-loop affordance. It has simply never been used. Removing it is a judgment call about whether we want the affordance, not a bug report.2. Independently, it has a latent bug.
preserve_wipfires on any non-success outcome, butstore.get_prior_wip_runfilters onpartialonly:All three real preserved branches are
failurerows, so they were never eligible for resume. The failure-path half of the feature could not work even if someone did start removing labels. Fixing the bug would still leave a feature with 3 activations and 0 uses.Why the agent already covers this
The three genuine
partialruns (error_max_turns, issues 51/53/105) preserved nothing — and not because preservation failed:preserve_wip failedappears 0 times in the log, so those working copies were genuinely clean. Agents holdPUSH_DEFAULTand push their own branches; WIP preservation duplicates a capability the agent already has, and in practice the agent gets there first every time.Scope
wipreferences):cli.py(18),repo.py(18),post_run.py(12),store.py(8),prompt_builder.py(6),logger.py(5),agents/_subprocess.py(1),models.py.src/data/DataSource.ts:37,src/data/SqlJsDataSource.ts:121,165,src/components/RunDrawer.tsx:210-214,src/test/a11y.test.tsx:44.test_repo.py,test_cli_run.py,test_logger.py,test_prompt_builder.py,test_store.py,test_post_run.py,test_operator.py.Decisions needed before implementing
wip_branch_urlcolumn. Stop writing it, but leave it in the schema and in the dashboard's read path so the 3 historical rows still render rather than breaking.partialoutcomes.post_run.py:340-410currently routespartialtoai-handover+ai-contributedplus a handover comment. Removing WIP removes that path; something must still mark apartialrun for a human.labro-wip/*branches onrssrn/birdbirdandrssrn/newschartas part of the cleanup — they are on public repos.Keep one thing on the way out
Log a
git status --porcelaindiffstat on non-success outcomes. One log line, no branches, no schema — and it still answers the only question WIP preservation was ever asked: did the agent lose real work?Related: #61 (clean checkout per run), #60 (crash handling and atomicity).