Skip to content

devloop continue misrouted as NL task after gate timeout — spawns duplicate architect + Live View #3

@shaifulshabuj

Description

@shaifulshabuj

Bug Report

Related to: #2 (Approval gate timeout leaves pipeline unrecoverable)

Summary

Two compounding UX failures occur after a diff gate timeout:

  1. The user is dropped to a raw bash prompt with no recovery guidance
  2. When the user types devloop continue TASK-ID (natural recovery attempt), it is misrouted as a natural language task — spawning a brand-new architect phase on top of the already-completed worker, and opening a duplicate Live View pane

Steps to Reproduce

  1. Run devloop run "..." — diff gate appears
  2. Let the gate time out (120s)
  3. Pipeline stops — user returned to bash-3.2$ with no hint
  4. User types devloop continue TASK-20260517-001721
  5. DevLoop: Unknown command — interpreting as natural language task
  6. DevLoop starts a new pipeline: Architecting... Copilot designing spec: "continue TASK-20260517-001721"
  7. A second Live View pane opens alongside the original stuck one

Observed Behavior

After timeout, no guidance — raw bash prompt:

✘ Diff rejected at approval gate — pipeline stopped
Task: TASK-20260517-001721   Inspect: git diff HEAD
bash-3.2$ devloop continue TASK-20260517-001721

devloop continue misrouted as a feature description:

DevLoop v5.1.0
Unknown command — interpreting as natural language task
Tip: devloop do continue TASK-20260517-001721 to be explicit next time

Natural language task: "continue TASK-20260517-001721"
Full pipeline: "continue TASK-20260517-001721"
Stages: arch -> work -> review -> [fix loop x3 max]

[1] Architecting...
Copilot designing spec: "continue TASK-20260517-001721"
Calling copilot for spec generation...

Two Live View panes open simultaneously — original (rejected-at-diff) + new misrouted one.

Why This Is a Bad UX

  • continue is the most natural recovery verb — any user unfamiliar with the docs will type it
  • The NL router should never treat a TASK-ID pattern as a feature description — TASK-YYYYMMDD-HHMMSS is unambiguous
  • Spawning a new architect phase wastes time, creates a duplicate spec, and confuses the session state
  • Zero guidance is printed at the point of failure

Expected Behavior

1. Recovery hint printed after gate timeout:

Tip: Run 'devloop resume TASK-20260517-001721' to retry the gate
     Run 'devloop resume TASK-20260517-001721 --approve-diff' to skip gate and go to review

2. devloop continue recognized as alias for devloop resume:

devloop continue TASK-20260517-001721
# same as: devloop resume TASK-20260517-001721

3. NL router detects TASK-ID pattern and routes correctly:

devloop continue TASK-20260517-001721
# NL router sees TASK-ID arg → suggests: did you mean 'devloop resume TASK-20260517-001721'?

4. Resume reuses existing tmux session — no duplicate Live View pane.

Suggested Fix

  • Add continue as alias for cmd_resume in the command dispatcher
  • Add TASK-ID guard in NL pre-router: if any arg matches TASK-[0-9]+-[0-9]+, route to cmd_resume not cmd_run
  • Print recovery hint with exact commands at gate timeout in _approval_gate()
  • In cmd_resume, detect existing tmux session and attach rather than creating new Live View

Environment

  • DevLoop: v5.1.0
  • NL router: unknown-command fallback in main dispatcher
  • Gate: diff gate (_approval_gate "diff")

Metadata

Metadata

Labels

bugSomething isn't workinggood first issueGood for newcomers

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions