Start the agentic development loop to autonomously work through beads issues
Initiates an autonomous development loop that iteratively works through beads issues. The loop automatically selects the highest priority ready task (no blockers), claims it, and presents it for implementation.
# Start a new development loop
/bkff:startloop
# Resume a paused loop
/bkff:startloop --resume
bd ready)in_progressβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β START LOOP β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SELECT READY TASK β
β (highest priority, no blockers) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β
ββββββββββββ΄βββββββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Task Found β β No Tasks β
ββββββββ¬βββββββ ββββββββ¬βββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Claim Task β β LOOP STOPS β
β (in_progressβ β (complete) β
ββββββββ¬βββββββ βββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WORK ON TASK β
β β’ Implement changes β
β β’ Generate tests (/bkff:gentests) β
β β’ Run verification (/bkff:verifytask) β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β
ββββββββββββ΄βββββββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Success β β Failure β
ββββββββ¬βββββββ ββββββββ¬βββββββ
β β
βΌ βΌ
βββββββββββββββ βββββββββββββββ
β Close Task β β Retry with β
β Continue βββββββββ Backoff β
β Loop β ββββββββ¬βββββββ
ββββββββ¬βββββββ β
β ββββββββ΄βββββββ
β β Max Retries β
β β Exceeded β
β ββββββββ¬βββββββ
β β
β βΌ
β βββββββββββββββ
β β LOOP PAUSES β
β β (user input)β
β βββββββββββββββ
β
ββββββββββββββββββββββββ
β
βΌ
(back to SELECT)
Development Loop Status
βββββββββββββββββββββββββββββββββββββ
Status: running
Started: 2026-01-24T10:30:00Z
Completed: 0 tasks
βββββββββββββββββββββββββββββββββββββ
Working on: T015 Implement compliance check logic
Issue: beads-abc123
βββββββββββββββββββββββββββββββββββββ
The development loop has selected this task.
Work on implementing the task, then run verification.
When complete, the loop will automatically select the next task.
To pause: /bkff:cancelloop
Development Loop Status
βββββββββββββββββββββββββββββββββββββ
Status: running
Started: 2026-01-24T10:30:00Z
Completed: 5 tasks
Info: No ready tasks available
β Loop completed - all tasks done or blocked
Info: Loop resumed
Development Loop Status
βββββββββββββββββββββββββββββββββββββ
Status: running
Started: 2026-01-24T10:30:00Z
Completed: 3 tasks
βββββββββββββββββββββββββββββββββββββ
Working on: T018 Fix failing test
Issue: beads-def456
βββββββββββββββββββββββββββββββββββββ
Loop state is persisted in .bkff/loop-state.json:
{
"status": "running",
"started_at": "2026-01-24T10:30:00Z",
"current_task": {
"beads_id": "beads-abc123",
"task_id": "T015",
"title": "Implement compliance check logic",
"started_at": "2026-01-24T10:35:00Z"
},
"completed_tasks": [
{
"beads_id": "beads-xyz789",
"task_id": "T014",
"completed_at": "2026-01-24T10:34:00Z",
"duration_seconds": 240
}
],
"paused_reason": null,
"retry_count": 0,
"last_error": null
}
When errors occur, the loop implements exponential backoff:
| Attempt | Wait Time |
|---|---|
| 1 | 5 seconds |
| 2 | 10 seconds |
| 3 | 20 seconds |
| Max | Pause loop |
After max retries (default: 3), the loop pauses and waits for user input.
bd CLI must be available--resume)0 - Loop started/resumed successfully1 - Loop paused (issue encountered)2 - No ready tasks (all done or blocked)3 - Another loop already running/bkff:cancelloop - Stop the development loop/bkff:verifytask - Verify task completion/bkff:gentests - Generate tests for implemented code#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PLUGIN_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
source "$PLUGIN_DIR/lib/common.sh"
source "$PLUGIN_DIR/lib/loop-state.sh"
# Parse arguments
resume=false
for arg in "$@"; do
case "$arg" in
--resume) resume=true ;;
esac
done
# Validate prerequisites
require_worktree
require_beads
require_bd
# Handle resume
if [[ "$resume" == "true" ]]; then
if ! has_loop; then
error_exit "No loop to resume"
fi
resume_loop
print_loop_status
run_loop_cycle
exit $?
fi
# Check for existing loop
if has_loop; then
error_exit "A development loop is already active. Use --resume or run /bkff:cancelloop first."
fi
# Initialize new loop
init_loop
print_loop_status
# Start first cycle
run_loop_cycle
exit_code=$?
case $exit_code in
0) exit 0 ;; # Task selected, continue
1) exit 1 ;; # Paused
2) # No tasks
success "Loop completed - all tasks done or blocked"
cancel_loop
exit 0
;;
esac