ba
Simple task tracking for LLM sessions.
ba - because sometimes you need to go back before bd
A spiritual fork of beads (bd), keeping the simplicity of v0.9.6 with added session-based claiming for multi-agent coordination.
Philosophy
- Dead simple: Single binary, minimal dependencies
- Plain text: JSONL files, human-readable, git-friendly
- Multi-agent: Sessions claim issues, obvious ownership
- Zero infrastructure: No SQLite, no daemon - just files
Installation
# or build from source
Quick Start
# Show quick start guide for LLMs
# Initialize in your project
# Create issues
# List issues (excludes closed by default)
# Show issue details
Ownership-Based Workflow
Status is a side-effect of ownership transitions, not set directly:
# Take ownership (open/closed → in_progress)
# Abandon work (in_progress → open)
# Complete work (in_progress → closed)
# Close unclaimed issue (escape hatch)
This ensures every in-progress issue has an owner. Claiming a closed issue cleanly reopens it.
Modifying Issues
# Change priority
# Add/remove labels
# Add comments
Dependencies
Track blocking relationships between issues:
# Add a blocking dependency (blocker blocks id)
# Remove a blocking dependency
# Visualize dependency tree
# Output:
# ab-x7k2: Fix auth bug [OPEN]
# └── ab-y8m3: Add user model [IN_PROGRESS]
# Detect circular dependencies
Ready Queue
Show issues ready to work on (open + not blocked):
# Output:
# ID P TYPE TITLE
# ------------------------------------------------------------
# ab-x7k2 0 bug Fix critical auth bug
# ab-z9n4 1 feature Add dashboard
# ab-a1b2 2 task Write tests
#
# 3 issue(s) ready
An issue is "ready" when:
- Status is
open(notin_progressorclosed) - All blocking issues are
closed(or has no blockers)
Multi-Agent Coordination
When multiple LLM agents work on the same codebase:
# Claim an issue (caller provides their session ID)
# See what you've claimed
# Complete work
# Or release back to pool
The ownership model ensures no two agents work on the same issue. See Ownership-Based Workflow above.
Importing from Beads
Migrate issues from a beads (bd) export file:
# Import with new IDs (uses project prefix)
# Keep original beads IDs
The import handles dependencies automatically and provides clear error messages:
Imported 112 issues (0 skipped, 1 errors)
Errors:
Line 46: Issue 'as-9q7' - issue_type: Unknown type 'merge-request', expected bug/feature/task/epic/chore/refactor/spike
Only blocks dependencies are imported (other types like related, parent-child, discovered-from are skipped).
Issue Types
task- Default, general work itemepic- Container for grouping related issuesrefactor- Improving existing code (no new behavior)spike- Research/investigation (may not produce code)
Priorities
0- Critical (security, data loss, broken builds)1- High (major features, important bugs)2- Medium (default - nice-to-have features, minor bugs)3- Low (polish, optimization)4- Backlog (future ideas)
Storage
Data stored in .ba/ directory:
config.json- Project config (version, ID prefix)issues.jsonl- One issue per line, sorted by ID
Why JSONL?
- Git-friendly: One issue per line = conflicts are per-issue
- Human-readable: Easy to inspect with standard tools
- Grep-able:
grep ab-x7k2 .ba/issues.jsonl
IDs
Format: {prefix}-{random} (e.g., ab-x7k2)
- prefix: 2 chars derived from project path hash
- random: 4 chars lowercase alphanumeric
Same project always gets same prefix, different projects get different prefixes.
JSON Output
All commands support --json for programmatic use:
Acknowledgment
ba is inspired by beads by Steve Yegge - an excellent issue tracker for AI-assisted development. We loved beads v0.9.6's simplicity before it evolved into a full messaging/routing system. ba takes that original simplicity and adds an ownership-based state machine for multi-agent coordination.
License
Source-available. See LICENSE for details.