Bug Report
Related to: #2 (Approval gate timeout leaves pipeline unrecoverable)
Summary
Two compounding UX failures occur after a diff gate timeout:
- The user is dropped to a raw bash prompt with no recovery guidance
- 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
- Run
devloop run "..." — diff gate appears
- Let the gate time out (120s)
- Pipeline stops — user returned to
bash-3.2$ with no hint
- User types
devloop continue TASK-20260517-001721
- DevLoop:
Unknown command — interpreting as natural language task
- DevLoop starts a new pipeline:
Architecting... Copilot designing spec: "continue TASK-20260517-001721"
- 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")
Bug Report
Related to: #2 (Approval gate timeout leaves pipeline unrecoverable)
Summary
Two compounding UX failures occur after a diff gate timeout:
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 paneSteps to Reproduce
devloop run "..."— diff gate appearsbash-3.2$with no hintdevloop continue TASK-20260517-001721Unknown command — interpreting as natural language taskArchitecting... Copilot designing spec: "continue TASK-20260517-001721"Observed Behavior
After timeout, no guidance — raw bash prompt:
devloop continuemisrouted as a feature description:Two Live View panes open simultaneously — original (rejected-at-diff) + new misrouted one.
Why This Is a Bad UX
continueis the most natural recovery verb — any user unfamiliar with the docs will type itTASK-YYYYMMDD-HHMMSSis unambiguousExpected Behavior
1. Recovery hint printed after gate timeout:
2.
devloop continuerecognized as alias fordevloop resume:3. NL router detects TASK-ID pattern and routes correctly:
4. Resume reuses existing tmux session — no duplicate Live View pane.
Suggested Fix
continueas alias forcmd_resumein the command dispatcherTASK-[0-9]+-[0-9]+, route tocmd_resumenotcmd_run_approval_gate()cmd_resume, detect existing tmux session and attach rather than creating new Live ViewEnvironment
_approval_gate "diff")