Skip to content

Remove WIP branch preservation and resume — 3 branches created in 1,999 runs, 0 resumes ever #62

Description

@rssrn

Summary

WIP preservation (preserve_wiplabro-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: partialai-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

  1. 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.
  2. 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.
  3. 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).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions