Renumber command fails with foreign key constraint error

When running 'bd renumber --force' after deleting issues, the command fails with: 'failed to rename bd-19 to temp ID: failed to update issue ID: constraint failed: FOREIGN KEY constraint failed (787)'. This suggests the renumber implementation doesn't properly handle foreign key constraints during the ID swap process. May need to disable foreign keys temporarily or use a different renumbering strategy.

Deeper investigation: All child tables (dependencies, labels, events, dirty_issues, issue_snapshots, compaction_snapshots, comments) have FK constraints to issues(id) ON DELETE CASCADE. When renumbering tries to UPDATE issues SET id = temp-uuid WHERE id = bd-49, the FK checks fire immediately despite PRAGMA foreign_keys = OFF being called. Issue might be that Go sql.DB connection pooling means the PRAGMA isn't applied to the actual connection doing the UPDATE. Testing with explicit connection (s.db.Conn()) to ensure PRAGMA sticks.


Agent 2 Issue 69

Created by agent 2


Agent 2 Issue 82

Created by agent 2


Agent 7 Issue 57


Agent 7 Issue 66


Updated Title


Agent 7 Issue 33

Created by agent 7


Agent 3 Issue 6


Agent 0 Batch 4 Issue 1


Integration Testing

Verify cache removal doesn't break any workflows


Agent 2 Batch 32 Issue 1


Agent 2 Batch 21 Issue 1


Install and test MCP Agent Mail locally

Install MCP Agent Mail on a single development machine and verify basic functionality.

Acceptance Criteria:
- Server installed via one-line installer
- Server running on port 8765
- Can register a project via HTTP
- Can register an agent identity
- Web UI accessible at /mail

Tested local installation. Server runs on port 8765, web UI works. MCP API tool execution has errors - needs debugging. See /tmp/bd-muls-report.md for details.


Agent 2 Issue 12

Created by agent 2


Test P1 priority


Agent 0 Issue 37

Created by agent 0


Comment test


Agent 1 Batch 21 Issue 1


Agent 5 Issue 32


Agent 1 Batch 8 Issue 1


Agent 2 Issue 56

Created by agent 2


Agent 5 Issue 89


Add tests for bd init --contributor wizard

Write integration tests for the contributor wizard:
- Test fork detection logic
- Test planning repo creation
- Test config setup
- Test with/without upstream remote
- Test with SSH vs HTTPS origins


Agent 3 Issue 57


Agent 6 Issue 85

Created by agent 6


Agent 6 Issue 14


Agent 2 Batch 11 Issue 1


Agent 3 Issue 78


Agent 5 Issue 42

Created by agent 5


Agent 7 Issue 10


Agent 4 Issue 31

Created by agent 4


Agent 5 Issue 63


Publish bd-wasm to npm

Package and publish WASM build to npm. Child of epic bd-44d0.

## Tasks
- [ ] Optimize WASM bundle (compression)
- [ ] Create README for npm package
- [ ] Set up npm publishing workflow
- [ ] Publish v0.1.0-alpha
- [ ] Test installation in clean environment
- [ ] Update beads AGENTS.md with installation instructions

## Package Name
bd-wasm (or @beads/wasm-cli)


Agent 9 Issue 97


Add guidance for self-hosting projects

The contributor-workflow-analysis.md is optimized for OSS contributors making PRs to upstream projects. However, it doesn't address projects like VC that use beads for their own development (self-hosting).

Self-hosting projects differ from OSS contributors:
- No upstream/downstream distinction (they ARE the project)
- May run automated executors (not just humans)
- In bootstrap/early phase (stability matters)
- Single team/owner (not multiple contributors with permissions)

Guidance needed on:
- When self-hosting projects should stay single-repo (default, recommended)
- When they should adopt multi-repo (team planning, multi-phase dev)
- How automated executors should handle multi-repo (if at all)
- Special considerations for projects in bootstrap phase

Examples of self-hosting projects: VC (building itself with beads), internal tools, pet projects


Agent 3 Issue 13


Agent 6 Issue 90


Agent 5 Issue 31

Created by agent 5


Agent 1 Issue 67


Agent 7 Issue 89

Created by agent 7


Agent 0 Batch 39 Issue 2


Agent 3 Batch 7 Issue 2


Agent 7 Issue 18

Created by agent 7


Agent 9 Issue 40


Agent 2 Issue 77


Agent 2 Batch 49 Issue 1


Agent 6 Issue 35

Created by agent 6


Agent 6 Issue 84

Created by agent 6


Make maxDepth configurable in bd dep tree command

Currently maxDepth is hardcoded to 50 in GetDependencyTree. Add --max-depth flag to bd dep tree command to allow users to control recursion depth. Default should remain 50 for safety, but users with very deep trees or wanting shallow views should be able to configure it.


Fix: --parent flag doesn't create parent-child dependency

When using `bd create --parent <id>`, the code generates a hierarchical child ID (e.g., bd-123.1) but never creates a parent-child dependency. This causes `bd epic status` to show zero children even though child issues exist.

Root cause: create.go generates child ID using store.GetNextChildID() but never calls store.AddDependency() with type parent-child.

Fix: After creating the issue when parentID is set, automatically add a parent-child dependency linking child -> parent.


Agent 0 Batch 0 Issue 1


Agent 8 Issue 94


Test issue with labels


Add daemon/client version compatibility checks

Verify daemon and client versions are compatible before allowing connections.


Agent 3 Issue 8


Implement reference scoring algorithm

Count references for each colliding issue: text mentions in descriptions/notes/design fields + dependency references. Sort collisions by score ascending (fewest refs first). This minimizes total updates during renumbering.


Agent 1 Issue 33


Agent 4 Issue 36


Agent 9 Issue 62


bd find-duplicates - AI-powered duplicate detection

Find semantically duplicate issues.

Approaches:
1. Mechanical: Exact title/description matching
2. Embeddings: Cosine similarity (cheap, scalable)
3. AI: LLM-based semantic comparison (expensive, accurate)

Uses embeddings by default for >100 issues.

Files: cmd/bd/find_duplicates.go (new)


Agent 0 Issue 4

Created by agent 0


Agent 2 Issue 67


Agent 1 Issue 38


Agent 0 Batch 31 Issue 2


Agent 3 Issue 71


Research Claude Code plugin structure and requirements

Study the plugin format, required files, and best practices.

Tasks:
- Review official plugin documentation
- Examine example plugins if available
- Document plugin.json schema
- Understand marketplace.json requirements
- Identify slash command format


Support P-prefix priority format (P0-P4) in create and update commands


Agent 4 Issue 93


Agent 5 Issue 34

Created by agent 5


Agent 0 Batch 14 Issue 1


Agent 7 Issue 4

Created by agent 7


Agent 2 Issue 92


Agent 8 Issue 45


Agent 5 Issue 34


Reduce sync rounds in multiclone tests

Analyze and reduce the number of sync rounds in hash multiclone tests.

Current state:
- TestHashIDs_MultiCloneConverge: 1 round of syncs across 3 clones
- TestHashIDs_IdenticalContentDedup: 2 rounds across 2 clones

Investigation needed:
- Profile to see how much time each sync takes
- Determine minimum rounds needed for convergence
- Consider making rounds configurable via env var

File: beads_hash_multiclone_test.go:70, :132


Agent 1 Issue 63

Created by agent 1


Agent 7 Issue 5


Agent 9 Issue 84


Agent 2 Batch 4 Issue 2


Agent 0 Issue 88


Agent 7 Issue 95

Created by agent 7


Agent 5 Issue 32

Created by agent 5


Agent 6 Issue 0

Created by agent 6


Agent 6 Issue 63


Agent 3 Issue 23


Agent 0 Batch 22 Issue 2


Daemon gets stuck when auto-import blocked by git conflicts

CRITICAL: The daemon enters a corrupt state that breaks RPC commands when auto-import is triggered but git pull fails due to uncommitted changes.

Impact: This is a data integrity and usability issue that could cause users to lose trust in Beads. The daemon silently fails for certain commands while appearing healthy.

Reproduction:
1. Make local changes to issues (creates uncommitted .beads/beads.jsonl)
2. Remote has updates (JSONL newer, triggers auto-import)
3. Daemon tries to pull but fails: 'cannot pull with rebase: You have unstaged changes'
4. Daemon enters bad state - 'bd show' and other commands return EOF
5. 'bd list' still works, daemon process is running, no errors logged

Technical details:
- Auto-import check runs in handleRequest() before processing RPC commands
- When import is blocked, it appears to corrupt daemon state
- Likely: deadlock, unclosed transaction, or storage handle corruption
- Panic recovery (server_lifecycle_conn.go:183) didn't catch anything - not a panic

Required fix:
- Auto-import must not block RPC command execution
- Handle git pull failures gracefully without corrupting state
- Consider: skip auto-import if git is dirty, queue import for later, or use separate goroutine
- Add timeout/circuit breaker for import operations
- Log clear warnings when auto-import is skipped

Without this fix, users in collaborative environments will frequently encounter mysterious EOF errors that require daemon restarts.


Add tests for internal/importer package

Currently 0.0% coverage. Need tests for JSONL import logic including collision detection and resolution.


Agent 9 Issue 64


Agent 3 Issue 55

Created by agent 3


Agent 0 Batch 16 Issue 1


Agent 7 Issue 55


Agent 9 Issue 74


Agent 0 Batch 3 Issue 2


Fix TestTwoCloneCollision to compare content not timestamps

The test at beads_twoclone_test.go:204-207 currently compares full JSON output including timestamps, causing false negative failures.

Current behavior:
- Both clones converge to identical semantic content
- Clone A: test-2="Issue from clone A", test-1="Issue from clone B"
- Clone B: test-1="Issue from clone B", test-2="Issue from clone A"
- Titles match IDs correctly, no data corruption
- Only timestamps differ (expected and acceptable)

Fix needed:
- Replace exact JSON comparison with content-aware comparison
- Normalize or ignore timestamp fields when asserting convergence
- Test should PASS after this fix

This blocks completion of bd-71107098.


Agent 4 Issue 86

Created by agent 4


Add Windows CI build to GitHub Actions

Add windows-latest job that builds bd.exe and runs unit tests to catch cross-platform issues


Agent 2 Issue 32

Created by agent 2


Agent 5 Issue 9


Agent 2 Batch 20 Issue 1


Agent 0 Batch 7 Issue 1


Agent 0 Issue 7

Created by agent 0


Agent 2 Batch 48 Issue 2


Agent 0 Issue 86


Agent 5 Issue 88

Created by agent 5


Agent 1 Issue 80

Created by agent 1


Agent 3 Issue 41

Created by agent 3


Agent 2 Batch 40 Issue 2


Agent 8 Issue 25


Agent 6 Issue 82


Agent 1 Batch 23 Issue 2


Agent 2 Batch 31 Issue 1


Add cross-repo issue references (future enhancement)

Support referencing issues across different beads repositories. Useful for tracking dependencies between separate projects.

Proposed syntax:
- Local reference: bd-100 (current behavior)
- Cross-repo by path: ~/src/other-project#bd-456
- Cross-repo by workspace name: @project2:bd-789

Use cases:
1. Frontend project depends on backend API issue
2. Shared library changes blocking multiple projects
3. System administrator tracking work across machines
4. Monorepo with separate beads databases per component

Implementation challenges:
- Storage layer needs to query external databases
- Dependency resolution across repos
- What if external repo not available?
- How to handle in JSONL export/import?
- Security: should repos be able to read others?

Design questions to resolve first:
1. Read-only references vs full cross-repo dependencies?
2. How to handle repo renames/moves?
3. Absolute paths vs workspace names vs git remotes?
4. Should bd-43 auto-discover related repos?

Recommendation:
- Gather user feedback first
- Start with read-only references
- Implement as plugin/extension?

Context: This is mentioned in bd-43 as approach #2. Much more complex than daemon multi-repo approach. Only implement if there's strong user demand.

Priority: Backlog (4) - wait for user feedback before designing


Agent 1 Issue 40


Code Health & Technical Debt Cleanup

Comprehensive codebase cleanup to remove dead code, refactor monolithic files, deduplicate utilities, and improve maintainability. Based on ultrathink code health analysis conducted 2025-10-27.

Goals:
- Remove ~1,500 LOC of dead/unreachable code
- Split 2 monolithic files (server.go 2,273 LOC, sqlite.go 2,136 LOC) into focused modules
- Deduplicate scattered utility functions (normalizeLabels, BD_DEBUG checks)
- Consolidate test coverage (2,019 LOC of collision tests)
- Improve code navigation and reduce merge conflicts

Impact: Reduces codebase by ~6-8%, improves maintainability, faster CI/CD

Estimated Effort: 11 days across 4 phases


Agent 2 Batch 7 Issue 1


Debug test 2


Agent 5 Issue 78


Agent 1 Issue 48

Created by agent 1


Agent 0 New Issue 45


Agent 4 New Issue 45


Agent 4 Issue 56

Created by agent 4


Agent 6 Issue 0


Agent 3 Issue 55


Update AGENTS.md and README.md with "bd daemons" documentation

Document the new "bd daemons" command and all subcommands in AGENTS.md and README.md. Include examples and troubleshooting guidance.


Agent 3 Issue 49

Created by agent 3


Agent 4 Issue 24


Agent 0 Issue 84


Agent 5 Issue 80


Agent 2 Issue 51

Created by agent 2


Agent 3 Issue 87


Agent 4 Issue 52


Merge PR #300: gitignore upgrade feature

PR #300 is ready to merge but has rebase conflicts with main.

**Context:**
- PR implements 3 mechanisms for .beads/.gitignore upgrade (bd doctor --fix, daemon auto-upgrade, bd init idempotent)
- Conflicts resolved locally but diverged branches make push difficult
- All fixes applied: removed merge artifact, applied new gitignore template
- Clean scope: only 6 files changed (+194/-42)

**Next steps:**
1. Option A: Merge via GitHub UI (resolve conflicts in web interface)
2. Option B: Fresh rebase on main and force push
3. Verify CI passes
4. Squash and merge

PR URL: https://github.com/steveyegge/beads/pull/300
Fixes: #274


Test update


Agent 0 Issue 65

Created by agent 0


Agent 2 Issue 75

Created by agent 2


Agent 6 Issue 11

Created by agent 6


Agent 4 Issue 62

Created by agent 4


Agent 1 Batch 12 Issue 2


Agent 2 Issue 46


Agent 0 Issue 25

Created by agent 0


Agent 0 Issue 5


Agent 3 Issue 59

Created by agent 3


Issue to reopen with reason


Agent 0 Batch 29 Issue 2


Base Issue 7


Agent 9 Issue 34


Agent 9 Issue 35


Add unit tests for config modes

Test all four orphan_handling modes: strict (fails), resurrect (creates tombstone), skip (logs warning), allow (imports orphan). Verify error messages and logging output for each mode.


Add storage cache eviction policy to daemon

Daemon caches DB connections forever in storageCache map (server.go:29). For users with 50+ repos, this causes memory leaks and file descriptor exhaustion.

Need LRU cache with:
- Max size limit (default: 50 repos)
- TTL-based eviction (default: 30min idle)
- Periodic cleanup goroutine

Location: internal/rpc/server.go:29-40


Agent 4 Issue 17


Agent 0 Issue 54

Created by agent 0


Agent 3 Issue 96


Agent 6 Issue 28

Created by agent 6


Agent 7 Issue 82

Created by agent 7


Agent 3 Batch 9 Issue 1


Agent 6 Issue 95

Created by agent 6


Add t.Parallel() to slow hash multiclone tests

Add t.Parallel() to TestHashIDs_MultiCloneConverge and TestHashIDs_IdenticalContentDedup so they run concurrently.

Expected savings: ~10 seconds (from 20s to ~11s)

Implementation:
- Add t.Parallel() call at start of each test function
- Verify tests don't share resources that would cause conflicts
- Run tests to confirm they work in parallel

File: beads_hash_multiclone_test.go:34, :101


Epic test


Switch from modernc.org/sqlite to ncruces/go-sqlite3 for WASM support

modernc.org/sqlite depends on modernc.org/libc which has no js/wasm support (platform-specific syscalls). Need to switch to ncruces/go-sqlite3 which wraps a WASM build of SQLite using wazero runtime.

Key differences:
- ncruces/go-sqlite3: Uses WASM build of SQLite + wazero runtime
- modernc.org/sqlite: Pure Go translation, requires libc for syscalls

This is a prerequisite for bd-62a0 (WASM build infrastructure).


Agent 3 Batch 48 Issue 1


Investigate TestRoutingIntegration failure

TestRoutingIntegration/maintainer_with_SSH_remote failed during pre-commit check with "expected role maintainer, got contributor".
This occurred while running `go test -short ./...` on darwin/arm64.
The failure appears unrelated to storage/sqlite changes.
Need to investigate if this is a flaky test or environmental issue.


Verify and test Claude Code plugin

Address remaining items from code review:

Critical:
1. Test plugin installation locally with /plugin marketplace add
2. Verify ${CLAUDE_PLUGIN_ROOT} variable works correctly
3. Test each slash command works
4. Test @task-agent execution
5. Verify MCP server connects properly

Documentation:
1. Clarify 'one-command installation' vs prerequisites
2. Add note about plugin development status
3. Verify all paths and examples work

Nice-to-have:
1. Add icon for marketplace (optional)
2. Add categories field to plugin.json
3. Add engines field for version compatibility

PLUGIN IMPLEMENTATION COMPLETE - READY FOR TESTING

What was built:
✅ .claude-plugin/plugin.json - Plugin metadata with MCP server config
✅ .claude-plugin/marketplace.json - Marketplace configuration
✅ 9 slash commands in .claude-plugin/commands/:
   - bd-ready, bd-create, bd-show, bd-update, bd-close
   - bd-workflow, bd-init, bd-stats, bd-version
✅ Task agent in .claude-plugin/agents/task-agent.md
✅ PLUGIN.md - Comprehensive documentation
✅ README.md - Updated with plugin section
✅ Version sync - All components at 0.9.2

Testing Instructions for Next Agent:
=====================================

1. INSTALL PLUGIN FROM GITHUB:
   /plugin marketplace add steveyegge/beads
   /plugin install beads

2. RESTART CLAUDE CODE (required for MCP server)

3. TEST SLASH COMMANDS:
   /bd-version        # Check versions (should show 0.9.2)
   /bd-workflow       # Show workflow guide
   /bd-stats          # Show project stats
   /bd-ready          # Find ready work
   /bd-create "Test plugin" task 2
   /bd-show bd-<id>

4. TEST MCP SERVER:
   /mcp               # Verify 'beads' server appears

5. TEST TASK AGENT:
   @task-agent        # If supported in Claude Code

6. VERIFY:
   - All commands work without errors
   - MCP tools are accessible
   - Version checking works
   - Documentation is accurate

Expected Issues:
- May need to adjust MCP server path variable (${CLAUDE_PLUGIN_ROOT})
- Task agent syntax might differ
- Some commands may need refinement based on actual usage

If testing fails, check:
- bd CLI is in PATH: which bd
- uv is installed: which uv
- MCP server logs in Claude Code
- PLUGIN.md troubleshooting section

Commit references:
- 9f38375: feat: Add Claude Code plugin for beads
- d25fc53: feat: Add version compatibility checking
- c0f1044: fix: Sync all component versions to 0.9.2
- a5c71f0: feat: Add version bump script
- a612b92: docs: Add version management to CLAUDE.md


Daemon doesn't clean up stale socket on startup

If daemon crashes, the socket file remains. Next startup fails with 'address already in use' even though no process is listening.

Fix: Before starting RPC server, check if socket exists and PID file shows dead process - remove stale socket.

Lines 520-532 in daemon.go create socket but don't clean up stale ones.


Agent 3 New Issue 35


Agent 0 Issue 63


Agent 0 Batch 41 Issue 2


Agent 1 Issue 90

Created by agent 1


Agent 3 Issue 43


Fixture Generator for Realistic Test Data

Create internal/testutil/fixtures/fixtures.go with functions to generate realistic test data at scale.

Functions:
- LargeSQLite(storage) - 10K issues, native SQLite
- XLargeSQLite(storage) - 20K issues, native SQLite
- LargeFromJSONL(storage) - 10K issues imported from JSONL
- XLargeFromJSONL(storage) - 20K issues imported from JSONL

Data characteristics:
- Epic hierarchies (depth 4): Epic → Feature → Task → Subtask
- Cross-linked dependencies (tasks blocking across epics)
- Realistic status/priority/label distribution
- Representative assignees and temporal data

Implementation:
- Single file: internal/testutil/fixtures/fixtures.go
- No config structs, simple direct functions
- Seeded RNG for reproducibility
- Reusable by both benchmarks and tests


Agent 7 Issue 54


Add simple cleanup command to delete closed issues

Users want a simple command to delete all closed issues without requiring Anthropic API key (unlike compact). Requested in GH #243.


Agent 2 Batch 22 Issue 2


Agent 0 Issue 85

Created by agent 0


Agent 4 Issue 89


Test issue 2


Add tests for Integration Layer Implementation

While implementing bd-wfmw, noticed missing tests

Reviewed existing coverage:
- Basic test coverage exists in lib/test_beads_mail_adapter.py
- Integration tests cover failure scenarios in tests/integration/test_mail_failures.py
- Good coverage of: enabled/disabled modes, graceful degradation, 409 conflicts, HTTP errors, config
- Missing: authorization headers detail, request body structure validation, concurrent reservation timing, TTL edge cases


Fix import failure on missing parent issues

Import process fails atomically when JSONL references deleted parent issues. Implement hybrid solution: topological sorting + parent resurrection to handle deleted parents gracefully while maintaining referential integrity. See docs/import-bug-analysis-bd-3xq.md for full analysis.


Agent 2 Batch 48 Issue 1


Agent 0 Issue 9

Created by agent 0


Agent 4 Issue 19

Created by agent 4


Agent 2 Batch 14 Issue 2


Agent 7 Issue 82


Agent 3 Issue 5

Created by agent 3


Agent 5 Issue 87


Agent 4 Issue 18

Created by agent 4


Agent 6 Issue 44

Created by agent 6


Investigate and optimize test suite performance

Test suite is taking very long to run (>45s for cmd/bd tests, full suite timing unknown but was cancelled).

This impacts development velocity and CI/CD performance.

Investigation needed:
- Profile which tests are slowest
- Identify bottlenecks (disk I/O, network, excessive setup/teardown?)
- Consider parallelization opportunities
- Look for redundant test cases
- Check if integration tests can be optimized


Agent 9 Issue 11


Agent 8 Issue 73


Agent 2 Issue 5

Created by agent 2


Agent 0 Batch 43 Issue 2


Agent 7 Issue 51


Agent 5 Issue 62


Add merge helper commands (bd sync --merge)

Add commands to merge beads branch back to main.

Tasks:
- Implement bd sync --merge command
- Implement bd sync --status command
- Implement bd sync --auto-merge (optional, for automation)
- Detect merge conflicts and provide guidance
- Show commit diff between branches
- Verify main branch is clean before merge
- Push merged changes to remote

Estimated effort: 2-3 days


Agent 9 Issue 26


Agent 4 Issue 70


Modify CreateIssue to support parent resurrection

Update internal/storage/sqlite/sqlite.go:182-196 to call TryResurrectParent before failing on missing parent. Coordinate with EnsureIDs changes for consistent behavior. Handle edge case where parent never existed in JSONL (fail gracefully).


Agent 0 Issue 52

Created by agent 0


Agent 0 Batch 34 Issue 2


Agent 7 Issue 4


Agent 2 Batch 18 Issue 2


Agent 6 Issue 19

Created by agent 6


Agent 4 Issue 37

Created by agent 4


Extract database search logic into helper function

The logic for finding a database in a beads directory is duplicated:
- FindDatabasePath() BEADS_DIR section (beads.go:141-169)
- findDatabaseInTree() (beads.go:248-280)

Both implement the same search order:
1. Check config.json first (single source of truth)
2. Fall back to canonical beads.db
3. Search for *.db files, filtering backups and vc.db

Refactoring suggestion:
Extract to a helper function like:
  func findDatabaseInBeadsDir(beadsDir string) string

Benefits:
- Single source of truth for database search logic
- Easier to maintain and update search order
- Reduces code duplication

Related to bd-e16b implementation.


Agent 3 Batch 38 Issue 2


Agent 0 Batch 25 Issue 1


Agent 7 Issue 65


Test Epic 2

## Overview

[Describe the high-level goal and scope of this epic]

## Success Criteria

- [ ] Criteria 1
- [ ] Criteria 2
- [ ] Criteria 3

## Background

[Provide context and motivation]

## Scope

**In Scope:**
- Item 1
- Item 2

**Out of Scope:**
- Item 1
- Item 2


Agent 4 New Issue 30


Agent 3 Issue 68


Agent 5 Issue 89

Created by agent 5


CLI accepts both hash IDs and aliases

Update all CLI commands to accept both hash IDs (bd-af78e9a2) and aliases (#42, or just 42).

## Parsing Logic
```go
// internal/utils/id_parser.go
func ParseIssueID(input string) (issueID string, err error) {
    // Hash ID: bd-af78e9a2
    if strings.HasPrefix(input, "bd-") {
        return input, nil
    }

    // Alias: #42 or 42
    aliasStr := strings.TrimPrefix(input, "#")
    alias, err := strconv.Atoi(aliasStr)
    if err != nil {
        return "", fmt.Errorf("invalid issue ID: %s", input)
    }

    // Resolve alias to hash ID
    return storage.GetIssueIDByAlias(alias)
}
```

## Commands to Update
All commands that accept issue IDs:

### 1. bd show
```bash
bd show bd-af78e9a2        # Hash ID
bd show #42                # Alias
bd show 42                 # Alias (shorthand)
bd show bd-af78e9a2 #42    # Mixed (multiple IDs)
```

### 2. bd update
```bash
bd update #42 --status in_progress
bd update bd-af78e9a2 --priority 1
```

### 3. bd close
```bash
bd close #42 --reason "Done"
```

### 4. bd dep add/tree
```bash
bd dep add #42 #1 --type blocks
bd dep tree bd-af78e9a2
```

### 5. bd label add/remove
```bash
bd label add #42 critical
```

### 6. bd merge
```bash
bd merge #42 #43 --into #41
```

## Display Format
Default to showing aliases in output:
```bash
$ bd list
#1   Fix authentication bug          P1  open
#2   Add logging to daemon           P2  open
#42  Investigate jujutsu integration P3  open
```

With `--format=hash` flag:
```bash
$ bd list --format=hash
bd-af78e9a2  Fix authentication bug          P1  open
bd-e5f6a7b8  Add logging to daemon           P2  open
bd-1a2b3c4d  Investigate jujutsu integration P3  open
```

## Files to Modify
- internal/utils/id_parser.go (new)
- cmd/bd/show.go
- cmd/bd/update.go
- cmd/bd/close.go
- cmd/bd/reopen.go
- cmd/bd/dep.go
- cmd/bd/label.go
- cmd/bd/merge.go
- cmd/bd/list.go (add --format flag)

## Testing
- Test hash ID parsing
- Test alias parsing (#42, 42)
- Test mixed IDs in single command
- Test error on invalid ID
- Test alias resolution failure


Agent 6 Issue 35


Import validation falsely reports data loss on collision resolution

## Problem

Post-import validation reports 'data loss detected!' when import count reduces due to legitimate collision resolution.

## Example

```
Import complete: 1 created, 8 updated, 142 unchanged, 19 skipped, 1 issues remapped
Post-import validation failed: import reduced issue count: 165 → 164 (data loss detected!)
```

This was actually successful collision resolution (bd-70419816 duplicated → remapped to-70419816), not data loss.

## Impact

- False alarms waste investigation time
- Undermines confidence in import validation
- Confuses users/agents about sync health

## Solution

Improve validation to distinguish:
- Collision-resolution merges (expected count reduction)
- Actual data loss (unexpected disappearance)

Track remapped issue count and adjust expected post-import count accordingly.


Agent 2 Issue 68


Agent 7 Issue 21


Agent 3 New Issue 20


Agent 7 Issue 38

Created by agent 7


bd import silently succeeds when database matches working tree but not git HEAD

**Critical**: bd import reports '0 created, 0 updated' when database matches working tree JSONL, even when working tree is ahead of git HEAD. This gives false confidence that everything is synced with the source of truth.

## Reproduction

1. Start with database synced to working tree .beads/issues.jsonl (376 issues)
2. Git HEAD has older version of .beads/issues.jsonl (354 issues)
3. Run: bd import .beads/issues.jsonl
4. Output: 'Import complete: 0 created, 0 updated'

## Problem

User expects 'bd import' after 'git pull' to sync database with committed state, but:
- Command silently succeeds because DB already matches working tree
- No warning that working tree has uncommitted changes
- User falsely believes everything is synced with git
- Violates 'JSONL in git is source of truth' principle

## Expected Behavior

When .beads/issues.jsonl differs from git HEAD, bd import should:
1. Detect uncommitted changes: git diff --quiet HEAD .beads/issues.jsonl
2. Warn user: 'Warning: .beads/issues.jsonl has uncommitted changes (376 lines vs 354 in HEAD)'
3. Clarify status: 'Import complete: 0 created, 0 updated (already synced with working tree)'
4. Recommend: 'Run git diff .beads/issues.jsonl to review uncommitted work'

## Impact

- Users can't trust 'bd import' status messages
- Silent data loss risk if user assumes synced and runs git checkout
- Breaks mental model of 'JSONL in git = source of truth'
- Critical for VC's landing-the-plane workflow


Agent 0 Batch 42 Issue 2


Fix cross-platform process management in daemon.go

Replace direct syscall.SysProcAttr assignments with configureDaemonProcess() helper in migrateToGlobalDaemon() and other start/stop flows


Testing & Validation

Ensure reliability through comprehensive testing.

Completed comprehensive Agent Mail test coverage analysis and implementation.

**Test Coverage Summary:**
- 66 total tests across 5 files
- 51 unit tests for HTTP adapter (0.02s)
- 15 integration tests for multi-agent scenarios (~55s total)

**New Tests Added:**
Created `test_multi_agent_coordination.py` (4 tests, 11s) covering:
1. Fairness: 10 agents competing for 5 issues → exactly 1 claim per issue
2. Notifications: End-to-end message delivery between agents
3. Handoff: Clean reservation transfer from agent1 to agent2
4. Idempotency: Double reserve/release by same agent

**Coverage Quality:**
✅ Collision prevention (race conditions)
✅ Graceful degradation (7 failure modes)
✅ TTL/expiration behavior
✅ Multi-agent coordination
✅ JSONL consistency
✅ HTTP error handling
✅ Authorization and configuration

**Intentionally Skipped:**
- Path traversal (validated elsewhere)
- Retry policies (nice-to-have)
- HTTPS/TLS (out of scope)
- Slow tests (50+ agents, soak tests)

See `tests/integration/AGENT_MAIL_TEST_COVERAGE.md` for details.

All tests pass. Agent Mail integration is well-tested and reliable for multi-agent scenarios.


Agent 2 Issue 47


Agent 3 Batch 48 Issue 2


Agent 7 Issue 6

Created by agent 7


Agent 1 Issue 2

Created by agent 1


Fix import zero-value field handling

Import uses zero-value checks (Priority != 0) to determine field updates. This prevents setting priority to 0 or clearing string fields. Export/import round-trip not fully idempotent for zero values. Consider JSON presence detection or explicit preserve-existing semantics. Location: cmd/bd/import.go:95-106


Agent 0 Issue 95


Agent 7 Issue 8

Created by agent 7


Agent 0 New Issue 10


Agent 1 Issue 72

Created by agent 1


Agent 1 Issue 12


Agent 2 Issue 4

Created by agent 2


Agent 2 Issue 32


Create backup and restore procedures

Disaster recovery procedures for Agent Mail data.

Acceptance Criteria:
- Automated daily snapshots (GCP persistent disk)
- SQLite backup script
- Git repository backup
- Restore procedure documentation
- Test restore from backup

File: deployment/agent-mail/backup.sh


Agent 5 Issue 29

Created by agent 5


Agent 7 Issue 94

Created by agent 7


Agent 1 Batch 9 Issue 1


Agent 5 Issue 21


Agent 7 Issue 59


Agent 4 Issue 90

Created by agent 4


Add log rotation for daemon.log

daemon.log grows forever without rotation. With sync every 5 minutes:
- ~105k log entries per year
- No size limit
- No cleanup
- Eventually fills disk

Need automatic log rotation with:
- Size-based rotation (default: 10MB)
- Age-based cleanup (default: 7 days)
- Compression of old logs
- Configurable retention

Location: cmd/bd/daemon.go:455


Agent 0 Batch 49 Issue 2


Agent 7 Issue 29

Created by agent 7


Agent 6 Issue 91


Agent 0 Issue 92

Created by agent 0


Agent 0 Issue 60


Agent 7 Issue 19

Created by agent 7


Agent 9 Issue 95


Remove Daemon Storage Cache

The daemon's multi-repo storage cache is the root cause of stale data bugs. Since global daemon is deprecated, we only ever serve one repository, making the cache unnecessary complexity. This epic removes the cache entirely for simpler, more reliable direct storage access.


Agent 4 Issue 68

Created by agent 4


Agent 2 Issue 89

Created by agent 2


Agent 4 Issue 19


Agent 3 Batch 18 Issue 2


Agent 0 Batch 34 Issue 1


npm package for bd with native binaries

Create an npm package that wraps native bd binaries for easy installation in Claude Code for Web and other Node.js environments.

## Problem
Claude Code for Web sandboxes are full Linux VMs with npm support, but cannot easily download binaries from GitHub releases due to network restrictions or tooling limitations.

## Solution
Publish bd as an npm package that:
- Downloads platform-specific native binaries during postinstall
- Provides a CLI wrapper that invokes the native binary
- Works seamlessly in Claude Code for Web SessionStart hooks
- Maintains full feature parity (uses native SQLite)

## Benefits vs WASM
- ✅ Full SQLite support (no custom VFS needed)
- ✅ All features work identically to native bd
- ✅ Better performance (native vs WASM overhead)
- ✅ ~4 hours effort vs ~2 days for WASM
- ✅ Minimal maintenance burden

## Success Criteria
- npm install @beads/bd works in Claude Code for Web
- All bd commands function identically to native binary
- SessionStart hook documented for auto-installation
- Package published to npm registry


Agent 5 Issue 41


Agent 3 Issue 47

Created by agent 3


Agent 7 Issue 3

Created by agent 7


Agent 2 Issue 85


Agent 0 Issue 56


Agent 3 Issue 53

Created by agent 3


Agent 2 Issue 45

Created by agent 2


Agent 7 Issue 33


Agent 4 Issue 29

Created by agent 4


Agent 7 Issue 75


Test numeric 1


Task B under epic


Manual task


Agent 2 Issue 97

Created by agent 2


Agent 2 Issue 27

Created by agent 2


Test auto-export timing


Agent 6 Issue 96


Agent 0 Issue 9


Test Issue


Agent 7 Issue 46


Prevent test pollution in production database

The bd-vxdr cleanup revealed test issues were created during manual testing in the production workspace (Nov 2-4, template feature development).

**Root cause:** Manual testing with `./bd create "Test issue"` pollutes the production .beads database.

**Prevention strategies:**
1. Use TEST_DB environment variable for manual testing
2. Add warning when creating issues with "Test" prefix
3. Improve developer docs about testing workflow
4. Consider adding `bd test-mode` command for isolated testing

**Implementation completed:**

1. ✅ Added warning when creating issues with "Test" prefix in production database
   - Shows yellow warning with ⚠ symbol
   - Suggests using BEADS_DB for isolated testing
   - Warning appears in create.go after title validation

2. ✅ Documented BEADS_DB testing workflow in AGENTS.md
   - Added "Testing Workflow" section in Development Guidelines
   - Includes manual testing examples with BEADS_DB
   - Includes automated testing examples with t.TempDir()
   - Clear warning about not polluting production database

3. ⚠ Decided against bd test-mode command
   - BEADS_DB already provides simple, flexible isolation
   - Additional command would add complexity without much benefit
   - Current approach follows Unix philosophy (env vars for config)

**Files modified:**
- cmd/bd/create.go - Added Test prefix warning
- AGENTS.md - Added Testing Workflow section

**Testing:**
- Verified warning appears when creating "Test" prefix issues
- Verified BEADS_DB isolation works correctly
- Built successfully with `go build`


Agent 3 Batch 40 Issue 1


Agent 3 Issue 40


Agent 4 Issue 16


Agent 0 Issue 45

Created by agent 0


Agent 7 Issue 42

Created by agent 7


Agent 5 New Issue 10


bd-hv01: Silent partial deletion failures cause DB inconsistency

Problem: deletion_tracking.go:76-77 logs deletion errors as warnings but continues. If deletion fails midway (database locked, disk full), some issues delete but others don't. System thinks all deletions succeeded.

Impact: Database diverges from JSONL, silent corruption, issues may resurrect on next sync.

Fix: Collect errors and fail the operation:
var deletionErrors []error
for _, id := range acceptedDeletions {
    if err := d.DeleteIssue(ctx, id); err != nil {
        deletionErrors = append(deletionErrors, fmt.Errorf("issue %s: %w", id, err))
    }
}
if len(deletionErrors) > 0 {
    return false, fmt.Errorf("deletion failures: %v", deletionErrors)
}

Files: cmd/bd/deletion_tracking.go:73-82


Agent 1 Issue 6


Fix Windows-specific test failures in CI

Several tests are failing on Windows but passing on Linux:

**Failing tests:**
- TestFindDatabasePathEnvVar
- TestHashIDs_MultiCloneConverge
- TestHashIDs_IdenticalContentDedup
- TestDatabaseReinitialization (all 5 subtests):
  - fresh_clone_auto_import
  - database_removal_scenario
  - legacy_filename_support
  - precedence_test
  - init_safety_check
- TestFindBeadsDir_NotFound
- TestMetricsSnapshot/uptime (in internal/rpc)

**CI Run:** https://github.com/steveyegge/beads/actions/runs/19015638968

These are likely path separator or filesystem behavior differences between Windows and Linux.

Fixed all Windows path issues:
1. TestFindDatabasePathEnvVar - expects canonicalized paths ✅
2. TestHashIDs tests - use platform-specific bd.exe command ✅
3. TestMetricsSnapshot/uptime - enforce minimum 1 second uptime ✅
4. TestFindBeadsDir_NotFound - allow finding .beads in parent dirs ✅
5. TestDatabaseReinitialization - fix git path conversion on Windows (git returns /c/Users/... but filepath needs C:\Users\...) ✅

CI run in progress to verify all fixes.


Agent 4 New Issue 0


Import reports misleading '0 created, 0 updated' when actually importing all issues

When running 'bd import' on a fresh database (no existing issues), the command reports 'Import complete: 0 created, 0 updated' even though it successfully imported all issues from the JSONL file.

**Steps to reproduce:**
1. Delete .beads/beads.db
2. Run: bd import .beads/issues.jsonl
3. Observe output: 'Import complete: 0 created, 0 updated'
4. Run: bd list
5. Confirm: All issues are actually present in the database

**Expected behavior:**
Report the actual number of issues imported, e.g., 'Import complete: 523 created, 0 updated'

**Actual behavior:**
'Import complete: 0 created, 0 updated' (misleading - makes user think import failed)

**Impact:**
- Users think import failed when it succeeded
- Confusing during database sync operations (e.g., after git pull)
- Makes debugging harder (can't tell if import actually worked)

**Context:**
Discovered during VC session when syncing database after git pull. The misleading message caused confusion about whether the database was properly synced with the canonical JSONL file.


Agent 1 Batch 21 Issue 2


Base Issue 8


Another epic


Add concurrent import race condition tests

Currently no tests verify behavior when multiple clones import simultaneously with external_ref matching.

Scenarios to test:
1. Two clones import same external_ref update at same time
2. Clone A imports while Clone B updates same issue
3. Verify transaction isolation prevents corruption
4. Document expected behavior (last-write-wins vs timestamp-based)

Related: bd-1022
Files: internal/importer/external_ref_test.go


Agent 1 Issue 11


Agent 1 Batch 23 Issue 1


Document 3-clone ID non-determinism in collision resolution

Document the known behavior of 3+ way collision resolution where ID assignments may vary based on sync order, even though content always converges correctly.

Updates needed:
- Update bd-71107098 notes to mark 2-clone case as solved
- Document 3-clone ID non-determinism as known limitation
- Add explanation to ADVANCED.md or collision resolution docs
- Explain why this happens (pairwise hash comparison is deterministic, but multi-way ID allocation uses sync-order dependent counters)
- Clarify trade-offs: content convergence ✅ vs ID stability ❌

Key points to document:
- Hash-based resolution is pairwise deterministic
- Content always converges correctly (all issues present with correct data)
- Numeric ID assignments in 3+ way collisions depend on sync order
- This is acceptable for most use cases (content convergence is primary goal)
- Full determinism would require complex multi-way comparison


Agent 7 Issue 31

Created by agent 7


Batch test 4


Implement resource limits and connection pooling

Add configurable limits for connections, file descriptors, and memory usage.


Agent 9 Issue 39


Agent 1 Issue 53

Created by agent 1


Global daemon should warn/reject --auto-commit and --auto-push

When user runs 'bd daemon --global --auto-commit', it's unclear which repo the daemon will commit to (especially after fixing bd-99 where global daemon won't open a DB).

Options:
1. Warn and ignore the flags in global mode
2. Error out with clear message

Line 87-91 already checks autoPush, but should skip check entirely for global mode. Add user-friendly messaging about flag incompatibility.


Agent 0 New Issue 20


Improve timestamp comparison readability in import

The timestamp comparison logic uses double-negative which can be confusing:

Current code:
if !incoming.UpdatedAt.After(existing.UpdatedAt) {
    // skip update
}

More readable:
if incoming.UpdatedAt.After(existing.UpdatedAt) {
    // perform update
} else {
    // skip (local is newer)
}

This is a minor refactor for code clarity.

Related: bd-1022
Files: internal/importer/importer.go:411, 488


Add bd hooks install command to embed git hooks in binary

Currently git hooks are installed via `examples/git-hooks/install.sh`, which only exists in the beads source repo. Users who install bd via installer/homebrew/npm can't easily install hooks.

**Proposal:**
Add `bd hooks install` command that:
- Embeds hook scripts in the bd binary (using go:embed)
- Installs them to .git/hooks/ in current repo
- Backs up existing hooks
- Makes them executable

**Commands:**
- `bd hooks install` - Install all hooks
- `bd hooks uninstall` - Remove hooks
- `bd hooks list` - Show installed hooks status

**Benefits:**
- Works for all bd users, not just source repo users
- More discoverable (shows in bd --help)
- Consistent with bd workflow
- Can version hooks with bd releases


Agent 2 Batch 33 Issue 1


Agent 1 Issue 14

Created by agent 1


Agent 0 Batch 44 Issue 2


Create npm package structure with package.json

Set up initial npm package structure for @beads/bd:

## Files to create
- npm/package.json - Package metadata, dependencies, scripts
- npm/bin/bd - CLI wrapper script that invokes native binary
- npm/.gitignore - Ignore downloaded binaries
- npm/README.md - Installation and usage instructions

## package.json structure
- Name: @beads/bd (scoped package)
- Main: index.js (exports binary path)
- Bin: bin/bd (CLI entry point)
- Scripts: postinstall (download binary)
- Keywords: issue-tracker, cli, beads, bd
- License: MIT

## Bin wrapper
Simple Node.js script that:
- Spawns native binary with child_process.spawn
- Passes through all arguments and stdio
- Exits with binary's exit code


GH#146: No color showing in terminal for some users

User reports color not working in macOS (Taho 26.0.1) with iTerm 3.6.4 and Terminal.app, despite color working elsewhere in terminal. Python rich and printf escape codes work.

Need to investigate:
- Is NO_COLOR env var set?
- Terminal type detection?
- fatih/color library configuration
- Does bd list show colors? bd ready? bd init?
- What's the output of: echo $TERM, echo $NO_COLOR


Agent 2 Batch 8 Issue 2


Agent 0 Issue 90

Created by agent 0


Agent 9 Issue 31


Agent 3 Issue 35

Created by agent 3


Investigate and upgrade to modernc.org/sqlite 1.39.1+

We had to pin modernc.org/sqlite to v1.38.2 due to a FOREIGN KEY constraint regression in v1.39.1 (SQLite 3.50.4).

**Issue:** [deleted:bd-47], GH #144

**Symptom:** CloseIssue fails with "FOREIGN KEY constraint failed (787)" when called via MCP/daemon, but works fine via CLI.

**Root Cause:** Unknown - likely stricter FK enforcement in SQLite 3.50.4 or modernc.org wrapper changes.

**Workaround:** Pinned to v1.38.2 (SQLite 3.49.x)

**TODO:**
1. Monitor modernc.org/sqlite releases for fixes
2. Check SQLite 3.50.5+ changelogs for FK-related fixes
3. Investigate why daemon mode fails but CLI succeeds (connection reuse? transaction isolation?)
4. Consider filing upstream issue with reproducible test case
5. Upgrade when safe


Add label-based filtering to bd ready command

Allow filtering ready work by labels to help organize work by sprint, week, or category.

Example usage:
  bd ready --label week1-2
  bd ready --label frontend,high-priority

This helps teams organize work into batches and makes it easier for agents to focus on specific categories of work.

Implementation notes:
- Add --label flag to ready command
- Support comma-separated labels (AND logic)
- Should work with existing ready work logic (unblocked issues)


Agent 4 Issue 53

Created by agent 4


Issue with labels


Agent 2 Issue 48


Agent 5 Issue 10


Agent 7 Issue 41

Created by agent 7


bd doctor doesn't detect version mismatches or stale daemons


Agent 1 Issue 63


Daemon fails to auto-import after git pull updates JSONL

After git pull updates .beads/issues.jsonl, daemon doesn't automatically re-import changes, causing stale data to be shown until next sync cycle (up to 5 minutes).

Reproduction:
1. Repo A: Close issues, export, commit, push
2. Repo B: git pull (successfully updates .beads/issues.jsonl)
3. bd show <issue> shows OLD status from daemon's SQLite db
4. JSONL on disk has correct new status

Root cause: Daemon sync cycle runs on timer (5min). When user manually runs git pull, daemon doesn't detect JSONL was updated externally and continues serving stale data from SQLite.

Impact:
- High for AI agents using beads in git workflows
- Breaks fundamental git-as-source-of-truth model
- Confusing UX: git log shows commit, bd shows old state
- Data consistency issues between JSONL and daemon

See WYVERN_SYNC_ISSUE.md for full analysis.

**Fixed in v0.21.2!**

The daemon auto-import is fully implemented:
- internal/autoimport package handles staleness detection
- internal/importer package provides shared import logic (used by both CLI and daemon)
- daemon's checkAndAutoImportIfStale() calls autoimport.AutoImportIfNewer()
- importFunc uses importer.ImportIssues() with auto-rename enabled
- All tests passing

The critical data corruption bug is FIXED:
✅ After git pull, daemon detects JSONL is newer (mtime check)
✅ Daemon auto-imports before serving requests
✅ No stale data served
✅ No data loss in multi-agent workflows

Verification needed: Run two-repo test to confirm end-to-end behavior.


Agent 7 Issue 53


Agent 4 Issue 12


Add orphan detection migration

Create migration to detect orphaned children in existing databases. Query: SELECT id FROM issues WHERE id LIKE '%.%' AND substr(id, 1, instr(id || '.', '.') - 1) NOT IN (SELECT id FROM issues). Log results, let user decide action (delete orphans or convert to top-level).


Agent 5 Issue 33

Created by agent 5


Agent 4 Issue 8

Created by agent 4


Agent 5 Issue 80

Created by agent 5


Agent 6 Issue 70


Clarify JSONL size bounds with multi-repo

The contributor-workflow-analysis.md states (line 226): 'Keep beads.jsonl small enough for agents to read (<25k)'

With multi-repo hydration, it's unclear whether this bound applies to:
- Each individual JSONL file (likely intention)
- The total hydrated size across all repos (unclear)
- Both (most conservative)

Clarification needed because:
- VC monitors .beads/issues.jsonl size to stay under limit
- With multi-repo, VC needs to know if each additional repo also has 25k limit
- Agents reading hydrated data need to know total size bounds
- Performance characteristics depend on total vs per-repo limits

Example scenario:
- Primary repo: 20k JSONL
- Planning repo: 15k JSONL
- Total hydrated: 35k
Is this acceptable or does it violate the <25k principle?


Agent 8 Issue 35


Agent 4 Issue 60

Created by agent 4


Agent 8 Issue 67


Agent 7 Issue 48

Created by agent 7


Agent 2 Batch 16 Issue 1


Agent 5 Issue 39

Created by agent 5


Agent 6 Issue 6

Created by agent 6


Agent 6 Issue 29


Agent 0 Issue 93


Agent 4 Issue 67


Agent 5 Issue 78

Created by agent 5


Agent 3 Issue 36

Created by agent 3


Agent 0 Batch 20 Issue 1


Agent 5 Issue 67


Run final validation and cleanup checks

Final validation pass to ensure all cleanup objectives met and no regressions introduced.

Validation checklist:
1. Dead code verification: `go run golang.org/x/tools/cmd/deadcode@latest -test ./...`
2. Test coverage: `go test -cover ./...`
3. Build verification: `go build ./cmd/bd/`
4. Linting: `golangci-lint run`
5. Integration tests
6. Metrics verification
7. Git clean check

Final metrics to report:
- LOC removed: ~____
- Files deleted: ____
- Files created: ____
- Test coverage: ____%
- Build time: ____ (before/after)
- Test run time: ____ (before/after)

Impact: Confirms all cleanup objectives achieved successfully

Validation completed:
- LOC: 52,372 lines total
- Dead code: 4 functions in import_shared.go (tracked in bd-6fe4622f)
- Build: ✓ Successful
- Test coverage: ~20-82% across packages
- Test failure: TestTwoCloneCollision (timeout issue)
- Linting: errcheck warnings present (defer close, fmt errors)
- Test time: ~20s

Issues found:
1. bd-6fe4622f: Remove unreachable import functions (renameImportedIssuePrefixes, etc)
2. TestTwoCloneCollision: Daemon killall timeout causing test failure
3. Linting: errcheck violations need fixing


Agent 5 Issue 25

Created by agent 5


Agent 4 Issue 43


Agent 2 Batch 14 Issue 1


Make auto-flush debounce duration configurable

flushDebounce is hardcoded to 5 seconds. Make it configurable via environment variable BEADS_FLUSH_DEBOUNCE (e.g., '500ms', '10s'). Current 5-second value is reasonable for interactive use, but CI/automated scenarios might want faster flush. Add getDebounceDuration() helper function. Located in cmd/bd/main.go:31.


Add telemetry and observability to daemon

Daemon has no metrics or observability. Cannot monitor:
- Request latency (p50, p95, p99)
- Cache hit/miss rates
- Active connections
- Error rates
- Resource usage over time

Needed for:
- Performance debugging
- Capacity planning
- Production monitoring
- SLA tracking

Location: internal/rpc/server.go


Agent 3 Issue 65


Agent 1 Batch 27 Issue 1


Optimize cmd/bd long-mode tests by switching to in-process testing

The long-mode CLI tests in cmd/bd are slow (1.4-4.4 seconds each) because they spawn full bd processes via exec.Command() for every operation.

Current approach:
- Each runBD() call spawns new bd process via exec.Command(testBD, args...)
- Each process initializes Go runtime, loads SQLite, parses CLI flags
- Tests run serially (create → update → show → close)
- Even with --no-daemon flag, there's significant process spawn overhead

Example timing from test run:
- TestCLI_PriorityFormats: 2.21s
- TestCLI_Show: 2.26s
- TestCLI_Ready: 2.29s
- TestCLI_Import: 4.42s

Optimization strategy:
1. Convert most tests to in-process testing (call bd functions directly)
2. Reuse test databases across related operations instead of fresh init each time
3. Keep a few exec.Command() tests that batch multiple operations to verify the CLI path works end-to-end

This should reduce test time from ~40s to ~5s for the affected tests.

Converted all CLI tests in cli_fast_test.go to use in-process testing via rootCmd.Execute(). Created runBDInProcess() helper that:
- Calls rootCmd.Execute() directly instead of spawning processes
- Uses mutex to serialize execution (rootCmd/viper not thread-safe)
- Properly cleans up global state (store, daemonClient)
- Returns only stdout to avoid JSON parsing issues with stderr warnings

Performance results:
- In-process tests: ~0.6s each (cached even faster)
- exec.Command tests: ~3.7s each
- Speedup: ~10x faster

Kept TestCLI_EndToEnd() that uses exec.Command for end-to-end validation of the actual binary.


Agent 1 Issue 99


Add circular dependency detection to bd doctor

Added cycle detection as Check #10 in bd doctor command. Uses same recursive CTE query as DetectCycles() to find circular dependencies. Reports error status with count and fix suggestion if cycles found.


Agent 0 Issue 19

Created by agent 0


Agent 4 Issue 99


Agent 5 Issue 23


Agent 0 Batch 9 Issue 1


Agent 5 New Issue 0


Agent 1 Issue 48


Agent 2 Issue 84


Agent 4 Issue 65

Created by agent 4


Agent 5 Issue 69

Created by agent 5


Implement reserved database name _.db

Auto-detection now skips .beads/_.db to prevent pollution when beads dogfoods itself. This allows beads to use its own issue tracker without interfering with other projects using beads in the same directory tree. Implementation includes filtering in findDatabase(), stopping directory walk when .beads/ is found, and documentation in README.md and CLAUDE.md.


Agent 7 Issue 22

Created by agent 7


Agent 2 Issue 56


Agent 2 New Issue 35


Add comprehensive tests for config.yaml issue-prefix migration

The GH #209 config.yaml migration lacks test coverage:

Missing tests:
- config.SetIssuePrefix() edge cases (empty file, comments, malformed YAML)
- config.GetIssuePrefix() with various config states
- MigrateConfigToYAML() automatic migration logic
- bd init writing to config.yaml instead of DB
- bd migrate DB→config.yaml migration path

Test scenarios needed:
1. SetIssuePrefix with empty config.yaml
2. SetIssuePrefix with existing config.yaml (preserves other settings)
3. SetIssuePrefix with commented issue-prefix line
4. SetIssuePrefix atomic write (temp file cleanup)
5. GetIssuePrefix fallback behavior
6. MigrateConfigToYAML when config.yaml missing prefix but DB has it
7. MigrateConfigToYAML when both missing (detect from issues)
8. MigrateConfigToYAML when config.yaml already has prefix (no-op)
9. Integration test: fresh bd init writes to config.yaml only
10. Integration test: upgrade from v0.21 DB migrates to config.yaml

Priority 1 because this is a user-facing migration affecting all users upgrading to v0.22.


Agent 4 Issue 0

Created by agent 4


Agent 8 Issue 76


Add tests for merge driver auto-config in bd init

Add comprehensive tests for the merge driver auto-configuration functionality in `bd init`.

**Test cases needed:**
- Auto-install in quiet mode
- Skip with --skip-merge-driver flag
- Detect already-installed merge driver
- Append to existing .gitattributes
- Interactive prompt behavior (if feasible)

**File:** `cmd/bd/init_test.go`


Agent 0 Issue 37


Agent 3 Issue 40

Created by agent 3


Agent 4 New Issue 35


Agent 7 Issue 49


Agent 5 Issue 3

Created by agent 5


Agent 8 Issue 17


Run final validation and cleanup checks

## Validation Results (Oct 31, 2025)

**Dead Code:** ✅ Removed 5 unreachable functions (~200 LOC)
- computeIssueContentHash, shouldSkipExport (autoflush.go)
- addDependencyUnchecked, removeDependencyIfExists (dependencies.go)
- isUniqueConstraintError (util.go)

**Tests:** ✅ All pass
**Coverage:**
- Main package: 39.6%
- cmd/bd: 19.5%
- internal/daemon: 37.8%
- internal/storage/sqlite: 58.1%
- internal/rpc: 58.6%

**Build:** ✅ Clean (24.5 MB binary)
**Linting:** 247 issues (mostly errcheck on defer/Close statements)
**Integration Tests:** ✅ All pass
**Metrics:** 55,622 LOC across 200 Go files
**Git:** 3 files modified (dead code removal)


Batch Issue 2


Isolate RPC server startup into rpc_server.go

Create internal/daemonrunner/rpc_server.go with StartRPC function. Move startRPCServer logic here and return typed handle.


Agent 7 Issue 10

Created by agent 7


Agent 3 Issue 85

Created by agent 3


Create cmd/bd/daemon_event_loop.go (~200 LOC)

Implement runEventDrivenLoop to replace polling ticker. Coordinate FileWatcher, mutation events, debouncer. Include health check ticker (60s) for daemon validation.


Agent 6 Issue 81


Agent 5 Issue 85

Created by agent 5


Agent 0 Issue 10


Agent 0 Issue 47


Agent 1 Issue 28


Agent 2 Issue 21


Agent 0 Issue 78


Agent 8 Issue 38


Agent 3 Issue 14

Created by agent 3


Add customizable time threshold for compact command

Currently compact uses fixed 30-day and 90-day tiers. Add support for custom time thresholds like '--older-than 60h' or '--older-than 2.5d' to allow more flexible compaction policies.

Examples:
  bd compact --all --older-than 60h
  bd compact --all --older-than 2.5d
  bd compact --all --tier 1 --age 48h

This would allow users to set their own compaction schedules based on their workflow needs.


Test child issue


Agent 3 Issue 11

Created by agent 3


Document hierarchical blocking behavior in README

The fix for bd-50 changes user-visible behavior: children of blocked epics are now automatically blocked.

**What needs documenting:**
1. README.md dependency section should explain blocking propagation
2. Clarify that 'blocks' + 'parent-child' together create transitive blocking
3. Note that 'related' and 'discovered-from' do NOT propagate blocking
4. Add example showing epic → child blocking propagation

**Example to add:**
```bash
# If epic is blocked, children are too
bd create "Epic 1" -t epic -p 1
bd create "Task 1" -t task -p 1
bd dep add task-1 epic-1 --type parent-child

# Block the epic
bd create "Blocker" -t task -p 0
bd dep add epic-1 blocker-1 --type blocks

# Now both epic-1 AND task-1 are blocked
bd ready  # Neither will show up
```


Agent 4 Issue 21

Created by agent 4


Fix silent error handling in RPC response writing

Marshal and write errors silently ignored in writeResponse, can send partial JSON and hang clients.

Location: internal/rpc/server_lifecycle_conn.go:228-232

Problem:
- json.Marshal error ignored - cyclic reference sends corrupt JSON
- Write error ignored - connection closed, no indication to caller
- WriteByte error ignored - client hangs waiting for newline
- Flush error ignored - partial data buffered

Current code:
func (s *Server) writeResponse(writer *bufio.Writer, resp Response) {
    data, _ := json.Marshal(resp)  // Ignored!
    _, _ = writer.Write(data)      // Ignored!
    _ = writer.WriteByte('\n')     // Ignored!
    _ = writer.Flush()             // Ignored!
}

Solution: Return errors, handle in caller, close connection on error

Impact: Client hangs waiting for response; corrupt JSON sent

Effort: 1 hour


Agent 0 Issue 50


Agent 8 Issue 58


Document CLI + hooks as recommended approach over MCP

Update documentation to position CLI + bd prime hooks as the primary recommended approach over MCP server, explaining why minimizing context matters even with large context windows (compute cost, energy, environment, latency).


Agent 1 Issue 62


Agent 2 Issue 66

Created by agent 2


Agent 8 Issue 27


Agent 2 Batch 37 Issue 1


Agent 3 Batch 13 Issue 2


Agent 1 Issue 73

Created by agent 1


Agent 1 Issue 37

Created by agent 1


Agent 6 Issue 12


Agent 2 Batch 42 Issue 1


Base Issue 3


Agent 5 Issue 94

Created by agent 5


Agent 5 Issue 74

Created by agent 5


bd-hv01: No snapshot versioning or timestamps causes stale data usage

Problem: If sync is interrupted (crash, kill -9, power loss), stale snapshots persist indefinitely. Next sync uses stale data leading to incorrect deletions.

Fix: Add metadata to snapshots with timestamp, version, and commit SHA. Validate snapshots are recent (< 1 hour old), from compatible version, and from expected git commit.

Files: cmd/bd/deletion_tracking.go (all snapshot functions)


Create version bump script

Create scripts/bump-version.sh to automate version syncing across all components.

The script should:
1. Take a version number as argument (e.g., ./scripts/bump-version.sh 0.9.3)
2. Update all version files:
   - cmd/bd/version.go (Version constant)
   - .claude-plugin/plugin.json (version field)
   - .claude-plugin/marketplace.json (plugins[].version)
   - integrations/beads-mcp/pyproject.toml (version field)
   - README.md (Alpha version mention)
   - PLUGIN.md (version requirements)
3. Validate semantic versioning format
4. Show diff preview before applying
5. Optionally create git commit with standard message

This prevents the version mismatch issue that occurred when only version.go was updated.

Related: bd-43 (version sync issue)


Agent 3 New Issue 10


Agent 1 Issue 50


Agent 0 Issue 4


Agent 2 Issue 15

Created by agent 2


Agent 0 Issue 17

Created by agent 0


Agent 3 Batch 2 Issue 2


Agent 2 Issue 48

Created by agent 2


Agent 2 Issue 77

Created by agent 2


Agent 2 Issue 80


Agent 2 Issue 2


Agent 9 Issue 23


Agent 8 Issue 32


Agent 7 Issue 23


Integration test: mutation to export latency

Measure time from bd create to JSONL update. Verify <500ms latency. Test with multiple rapid mutations to verify batching.

Test added to daemon_test.go as TestMutationToExportLatency().

Currently skipped with note that it should be enabled once bd-146 (event-driven daemon) is fully implemented and enabled by default.

The test structure is complete:
1. Sets up test environment with fast debounce (500ms)
2. SingleMutationLatency: measures latency from mutation to JSONL update
3. RapidMutationBatching: verifies multiple mutations batch into single export

Once event-driven mode is default, remove the t.Skip() line and the test will validate <500ms latency.


Agent 2 Batch 23 Issue 1


Agent 1 Issue 12

Created by agent 1


Agent 0 Batch 5 Issue 1


Test issue


Document external_ref in content hash behavior

The content hash includes external_ref, which has implications that should be documented.

Current behavior:
- external_ref is included in content hash calculation (collision.go:158-160)
- Changing external_ref changes content hash
- This means: local issue → add external_ref → different hash

Implications:
- Local issue + external_ref addition = looks like 'new content'
- May not match by content hash in some scenarios
- Generally correct behavior, but subtle

Action items:
- Document in code comments
- Add to ARCHITECTURE.md or similar
- Add test demonstrating this behavior
- Consider if this is desired long-term

Related: bd-1022
Files: internal/storage/sqlite/collision.go:158-160


Set up WASM build pipeline

Configure Go→WASM compilation pipeline. Child of epic bd-44d0.

## Tasks
- [ ] Create build-wasm.sh script (GOOS=js GOARCH=wasm)
- [ ] Test basic WASM module loading in Node.js
- [ ] Set up wasm_exec.js wrapper
- [ ] Add WASM build to CI/CD
- [ ] Document build process

## Validation
- bd.wasm compiles successfully
- Can load in Node.js without errors
- Bundle size <10MB


Agent 0 Issue 66


Agent 3 Issue 21

Created by agent 3


Agent 0 Batch 48 Issue 1


Agent 0 Issue 99


Agent 3 Batch 6 Issue 2


Agent 0 Issue 59


Tests take too long - unacceptable for project size

## Problem

Running `go test ./internal/importer/... -v` takes an unacceptably long time (minutes). For a project this size, tests should complete in seconds.

## Impact

- Slows down development iteration
- AI agents waste time waiting for tests
- Blocks rapid bug fixes and validation
- Poor developer experience

## Investigation Needed

- Profile which tests are slow
- Check for unnecessary sleeps, timeouts, or integration tests
- Look for tests that could be parallelized
- Consider splitting unit vs integration tests

## Goal

Test suite for a single package should complete in <5 seconds, ideally <2 seconds.

## Optimizations Applied

1. **Added t.Parallel() to CLI tests** (13 tests) - allows concurrent execution
2. **Removed unnecessary 200ms sleep** in daemon_autoimport_test.go - Execute() forces auto-import synchronously
3. **Reduced filesystem settle wait** from 100ms → 50ms on non-Windows platforms
4. **Optimized debouncer test sleeps** (9 reductions):
   - Before debounce waits: 30ms → 20ms, 20ms → 10ms
   - After debounce waits: 40ms → 35ms, 30ms → 35ms, etc.
   - Thread safety test: 100ms → 70ms
   - Sequential cycles: 50ms → 40ms (3x)
   - Cancel tests: 70-80ms → 60ms

## Results

### cmd/bd package (main improvement target):
- **Before**: 5+ minutes (timeout)
- **After**: ~18-20 seconds
- **Speedup**: ~15-18x faster

### internal/importer package:
- **After**: <1 second (0.9s)

### Full test suite (with `-short` flag):
- Most packages complete in <2s
- Total runtime constrained by sequential integration tests

## Known Issues

- TestConcurrentExternalRefImports hangs due to :memory: connection pool issue (bd-b121)
- Some sync_branch tests may need sequential execution (git worktree conflicts)


Agent 3 Issue 58

Created by agent 3


Agent 5 Issue 38


Agent 2 Batch 36 Issue 1


Agent 5 Issue 28


Create Python adapter library

Create beads_mail_adapter.py library that wraps Agent Mail HTTP calls with health checks and graceful degradation.

Acceptance Criteria:
- AgentMailAdapter class with health check on init
- enabled flag auto-disables if server unreachable
- All methods wrapped in try/catch (non-blocking failures)
- Methods: reserve_issue(), release_issue(), notify(), check_inbox()
- Environment-based configuration (AGENT_MAIL_URL, AGENT_MAIL_TOKEN)
- Unit tests for enabled/disabled modes

File: lib/beads_mail_adapter.py


Agent 1 Issue 44


Agent 5 Issue 97

Created by agent 5


Agent 2 Issue 9

Created by agent 2


Extract migration functions to migrations.go

Move migrateDirtyIssuesTable, migrateExternalRefColumn, migrateCompositeIndexes, migrateClosedAtConstraint, migrateCompactionColumns, migrateSnapshotsTable, migrateCompactionConfig, migrateCompactedAtCommitColumn, migrateExportHashesTable, migrateContentHashColumn to a separate migrations.go file


Agent 0 Batch 2 Issue 1


Agent 6 Issue 24

Created by agent 6


Agent 1 Batch 20 Issue 2


Agent 3 Batch 26 Issue 2


Agent 1 Issue 87

Created by agent 1


Agent 0 Batch 9 Issue 2


Agent 1 Batch 27 Issue 2


Agent 5 Issue 72

Created by agent 5


Agent 5 Issue 26


Agent 6 Issue 15

Created by agent 6


Update LINTING.md with current baseline

After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.


Agent 2 Issue 50

Created by agent 2


Fix linting error in migrate.go

Linter reports error:
```
cmd/bd/migrate.go:647:37: cleanupWALFiles - result 0 (error) is always nil (unparam)
```

The `cleanupWALFiles` function always returns nil, so the error return type should be removed or the function should actually return errors when appropriate.


Agent 4 Issue 59

Created by agent 4


Agent 6 Issue 20

Created by agent 6


Agent 0 Batch 31 Issue 1


Agent 0 Batch 19 Issue 1


Agent 8 Issue 82


Issue 2


Agent 0 Issue 33

Created by agent 0


Agent 1 Batch 15 Issue 1


Agent 6 Issue 84


Add 'bd onboard' command to configure AGENTS.md for AI agents

Create a 'bd onboard' command that automatically sets up AGENTS.md (and adds a note to CLAUDE.md if present) with instructions for AI agents to use beads instead of markdown TODOs.

Problem: Users report that AI agents get confused between beads issue tracking and markdown-based planning, leading to duplicate tracking systems and confusion about which to use.

Solution: Add 'bd onboard' command that:
1. Appends (or creates) AGENTS.md with beads workflow instructions
2. Includes command examples, issue types, priorities, and workflow
3. Adds note to CLAUDE.md if it exists, directing agents to use beads
4. Makes it clear agents should abandon markdown TODOs in favor of bd
5. Idempotent - safe to run multiple times

The onboarding content should emphasize:
- Use bd for ALL task tracking, not markdown TODOs
- How to check ready work, create/update/close issues
- When to use discovered-from dependencies
- Priority and issue type conventions
- Auto-sync behavior

This will reduce onboarding friction and prevent agents from creating parallel tracking systems.


Agent 1 Batch 13 Issue 1


Fix MCP server None/null crashes in list/ready/stats


Agent 7 Issue 53

Created by agent 7


Agent 2 Issue 61


Add optional post-merge git hook example for bd sync

Create example git hook that auto-runs bd sync after git pull/merge.

Add to examples/git-hooks/:
- post-merge hook that checks if .beads/issues.jsonl changed
- If changed: run `bd sync` automatically
- Make it optional/documented (not auto-installed)

Benefits:
- Zero-friction sync after git pull
- Complements auto-detection as belt-and-suspenders

Note: post-merge hook already exists for pre-commit/post-merge. Extend it to support sync.


Agent 0 Batch 2 Issue 2


Agent 9 Issue 27


Unit tests for Debouncer

Test debouncer batches multiple triggers into single action. Test timer reset on subsequent triggers. Test cancel during wait. Test thread safety.


Agent 2 Issue 62


Agent 1 Batch 14 Issue 1


Agent 7 Issue 57

Created by agent 7


Agent 2 Issue 70


Agent 4 Issue 81


Agent 2 Issue 12


Agent 7 Issue 28


Agent 2 Issue 43


Agent 4 Issue 66

Created by agent 4


Agent 6 Issue 53

Created by agent 6


Agent 3 Issue 32


Agent 0 Batch 49 Issue 1


Agent 0 Issue 3

Created by agent 0


Agent 5 Issue 36

Created by agent 5


Agent 0 Issue 42


Agent 1 New Issue 5


Agent 9 Issue 17


Agent 0 Issue 44


Agent 5 Issue 70

Created by agent 5


Agent 0 Issue 38

Created by agent 0


Agent 1 Issue 57


Agent 2 Batch 8 Issue 1


Agent 6 Issue 79

Created by agent 6


Test issue 2


Agent 0 Issue 27


Agent 6 Issue 96

Created by agent 6


Create plugin metadata files

Create .claude-plugin/plugin.json and marketplace.json.

Requirements:
- Name, description, version, author
- MCP server configuration bundling
- License and repository info
- Installation instructions


Implement bd quickstart command

Add bd quickstart command to show context-aware repo information: recent issues, database location, configured prefix, example queries. Helps AI agents understand current project state. Companion to bd onboard.


Agent 7 Issue 11

Created by agent 7


Agent 0 Issue 75

Created by agent 0


Agent 1 Issue 95

Created by agent 1


Agent 0 Issue 34


Agent 2 New Issue 5


Agent 7 Issue 77

Created by agent 7


Agent 3 Issue 70


Agent 1 Issue 49


Add fsnotify dependency to go.mod


Agent 2 Issue 20


Dogfood: Migrate beads repo to hash IDs

Final validation: migrate the beads project itself to hash-based IDs.

## Purpose
Dogfooding the migration on beads' own issue database to:
1. Validate migration tool works on real data
2. Discover edge cases
3. Verify all workflows still work
4. Build confidence for users

## Pre-Migration Checklist
- [ ] All bd-f8b764c9 child tasks completed
- [ ] All tests pass: `go test ./...`
- [ ] Migration tool tested on test databases
- [ ] Documentation updated
- [ ] MCP server updated and published
- [ ] Clean git status

## Migration Steps

### 1. Create Backup
```bash
# Backup database
cp -r .beads .beads.backup-1761798568

# Backup JSONL
cp .beads/beads.jsonl .beads/beads.jsonl.backup

# Create git branch for migration
git checkout -b hash-id-migration
git add .beads.backup-*
git commit -m "Pre-migration backup"
```

### 2. Run Migration (Dry Run)
```bash
bd migrate --hash-ids --dry-run > migration-plan.txt
cat migration-plan.txt

# Review:
# - Number of issues to migrate
# - Hash collision check (should be zero)
# - Text reference updates
# - Dependency updates
```

### 3. Run Migration (Real)
```bash
bd migrate --hash-ids 2>&1 | tee migration-log.txt

# Expected output:
# ✓ Backup created: .beads/beads.db.backup-1234567890
# ✓ Generated 150 hash IDs
# ✓ No hash collisions detected
# ✓ Updated issues table schema
# ✓ Updated 150 issue IDs
# ✓ Updated 87 dependencies
# ✓ Updated 234 text references
# ✓ Exported to .beads/beads.jsonl
# ✓ Migration complete!
```

### 4. Validation

#### Database Integrity
```bash
# Check all issues have hash IDs
bd list | grep -v "bd-[a-f0-9]\{8\}" && echo "FAIL: Non-hash IDs found"

# Check all issues have aliases
sqlite3 .beads/beads.db "SELECT COUNT(*) FROM issues WHERE alias IS NULL"
# Should be 0

# Check no alias duplicates
sqlite3 .beads/beads.db "SELECT alias, COUNT(*) FROM issues GROUP BY alias HAVING COUNT(*) > 1"
# Should be empty
```

#### Functionality Tests
```bash
# Test show by hash ID
bd show bd-

# Test show by alias
bd show #1

# Test create new issue
bd create "Test issue after migration" -p 2
# Should get hash ID + alias

# Test update
bd update #1 --priority 1

# Test dependencies
bd dep tree #1

# Test export
bd export
git diff .beads/beads.jsonl
# Should show hash IDs
```

#### Text Reference Validation
```bash
# Check that old IDs were updated in descriptions
grep -r "bd-[0-9]\{1,3\}[^a-f0-9]" .beads/beads.jsonl && echo "FAIL: Old ID format found"

# Verify hash ID references exist
grep -o "bd-[a-f0-9]\{8\}" .beads/beads.jsonl | sort -u | wc -l
# Should match number of hash IDs
```

### 5. Commit Migration
```bash
git add .beads/beads.jsonl .beads/beads.db
git commit -m "Migrate to hash-based IDs (v2.0)

- Migrated 150 issues to hash IDs
- Preserved aliases (#1-#150)
- Updated 87 dependencies
- Updated 234 text references
- Zero hash collisions

Migration log: migration-log.txt"

git push origin hash-id-migration
```

### 6. Create PR
```bash
gh pr create --title "Migrate to hash-based IDs (v2.0)" --body "## Summary
Migrates beads project to hash-based IDs as part of v2.0 release.

## Migration Stats
- Issues migrated: 150
- Dependencies updated: 87
- Text references updated: 234
- Hash collisions: 0
- Aliases assigned: 150

## Validation
- ✅ All tests pass
- ✅ Database integrity verified
- ✅ All workflows tested (show, update, create, deps)
- ✅ Text references updated correctly
- ✅ Export produces valid JSONL

## Files Changed
- `.beads/beads.jsonl` - Hash IDs in all entries
- `.beads/beads.db` - Schema updated with aliases

## Rollback
If issues arise:
\`\`\`bash
mv .beads.backup-1234567890 .beads
bd export
\`\`\`

See migration-log.txt for full details."
```

### 7. Merge and Cleanup
```bash
# After PR approval
git checkout main
git merge hash-id-migration
git push origin main

# Tag release
git tag v2.0.0
git push origin v2.0.0

# Cleanup
rm migration-log.txt migration-plan.txt
git checkout .beads.backup-*  # Keep in git history
```

## Rollback Procedure
If migration fails or has issues:

```bash
# Restore backup
mv .beads .beads.failed-migration
mv .beads.backup-1234567890 .beads

# Regenerate JSONL
bd export

# Verify restoration
bd list
git diff .beads/beads.jsonl

# Cleanup
git checkout hash-id-migration
git reset --hard main
```

## Post-Migration Communication

### GitHub Issue/Discussion
```markdown
## Beads v2.0 Released: Hash-Based IDs

We've migrated beads to hash-based IDs! 🎉

**What changed:**
- Issues now use hash IDs (bd-af78e9a2) instead of sequential (bd-cb64c226.3)
- Human-friendly aliases (#42) for easy reference
- Zero collision risk in distributed workflows

**Action required:**
If you have a local clone, you need to migrate:

\`\`\`bash
git pull origin main
bd migrate --hash-ids
git push origin main
\`\`\`

See MIGRATION.md for details.

**Benefits:**
- ✅ No more ID collisions
- ✅ Work offline without coordination
- ✅ Simpler codebase (-2,100 LOC)

Questions? Reply here or see docs/HASH_IDS.md
```

## Success Criteria
- [ ] Migration completes without errors
- [ ] All validation checks pass
- [ ] PR merged to main
- [ ] v2.0.0 tagged and released
- [ ] Documentation updated
- [ ] Community notified
- [ ] No rollback needed within 1 week

## Files to Create
- migration-log.txt (transient)
- migration-plan.txt (transient)

## Timeline
Execute after all other bd-f8b764c9 tasks complete (estimated: ~8 weeks from start)


Agent 7 Issue 40

Created by agent 7


Agent 6 Issue 58

Created by agent 6


Agent 4 New Issue 15


Agent 4 Issue 59


Agent 9 Issue 82


Agent 3 Batch 45 Issue 2


Agent 4 Issue 78


MCP server tools should accept workspace_root parameter

Oracle review found two additional issues: 1) Missing workspace_root on where_am_i tool, 2) set_context should always set env vars even when DB not found (so init works right after). Both fixed.


Agent 2 Issue 25


Agent 0 Issue 14

Created by agent 0


Agent 0 Batch 39 Issue 1


Agent 3 Batch 15 Issue 1


Agent 0 New Issue 0


Agent 1 Issue 7

Created by agent 1


Agent 3 Batch 24 Issue 1


Add comprehensive tests for sync branch daemon logic

The daemon sync branch functionality (bd-6545) was implemented but needs proper end-to-end testing.

Current implementation:
- daemon_sync_branch.go has syncBranchCommitAndPush() and syncBranchPull()
- daemon_sync.go has been updated to use these functions when sync.branch is configured
- All daemon tests pass, but no specific tests for sync branch behavior

Testing needed:
- Test that daemon commits to sync branch when sync.branch is configured
- Test that daemon commits to current branch when sync.branch is NOT configured (backward compatibility)
- Test that daemon pulls from sync branch and syncs JSONL back to main repo
- Test worktree creation and health checks during daemon operations
- Test error handling (missing branch, worktree corruption, etc.)

Key challenge: Tests need to run in the context of the git repo (getGitRoot() uses current working directory), so test setup needs to properly change directory or mock the git root detection.

Reference existing daemon tests in daemon_test.go and daemon_autoimport_test.go for patterns.


Agent 0 Batch 23 Issue 1


bd message: Fix inefficient client-side filtering for --unread-only


Modify EnsureIDs to support parent resurrection

Update internal/storage/sqlite/ids.go:189-202 to call TryResurrectParent before failing on missing parent. Add resurrection mode flag, log resurrected parents for transparency. Maintain backwards compatibility with strict validation mode.


Implement global N-way collision resolution algorithm

## Overview
Phase 3: Replace pairwise collision resolution with global N-way resolution that produces deterministic results regardless of sync order.

## Current Problem
ScoreCollisions (collision.go:228) compares issues pairwise:
```go
collision.RemapIncoming = existingHash < incomingHash
```

This works for 2-way but fails for 3+ way because:
- Each clone makes local decisions without global context
- No guarantee intermediate states are consistent
- Remapping decisions depend on sync order
- Can't detect transitive remap chains (test-1 → test-2 → test-3)

## Solution
Implement global resolution that:
1. Collects ALL versions of same logical issue
2. Sorts by content hash (deterministic)
3. Assigns sequential IDs based on sorted order
4. All clones converge to same assignments

## Implementation Tasks

### 1. Create ResolveNWayCollisions function
File: internal/storage/sqlite/collision.go

Replace ScoreCollisions with:
```go
// ResolveNWayCollisions handles N-way collisions deterministically.
// Groups all versions with same base ID, sorts by content hash,
// assigns sequential IDs. Returns mapping of old ID → new ID.
func ResolveNWayCollisions(ctx context.Context, s *SQLiteStorage,
    collisions []*CollisionDetail, incoming []*types.Issue) (map[string]string, error) {

    if len(collisions) == 0 {
        return make(map[string]string), nil
    }

    // Group by base ID pattern (e.g., test-1, test-2 → base "test-1")
    groups := groupCollisionsByBaseID(collisions)

    idMapping := make(map[string]string)

    for baseID, versions := range groups {
        // 1. Collect all unique versions by content hash
        uniqueVersions := deduplicateVersionsByContentHash(versions)

        // 2. Sort by content hash (deterministic!)
        sort.Slice(uniqueVersions, func(i, j int) bool {
            return uniqueVersions[i].ContentHash < uniqueVersions[j].ContentHash
        })

        // 3. Assign sequential IDs based on sorted order
        prefix := extractPrefix(baseID)
        baseNum := extractNumber(baseID)

        for i, version := range uniqueVersions {
            targetID := fmt.Sprintf("%s-%d", prefix, baseNum+i)

            // Map this version to its deterministic ID
            if version.ID != targetID {
                idMapping[version.ID] = targetID
            }
        }
    }

    return idMapping, nil
}
```

### 2. Implement helper functions

```go
// groupCollisionsByBaseID groups collisions by their logical base ID
func groupCollisionsByBaseID(collisions []*CollisionDetail) map[string][]*types.Issue {
    groups := make(map[string][]*types.Issue)
    for _, c := range collisions {
        baseID := c.ID  // All share same ID (that's why they collide)
        groups[baseID] = append(groups[baseID], c.ExistingIssue, c.IncomingIssue)
    }
    return groups
}

// deduplicateVersionsByContentHash keeps one issue per unique content hash
func deduplicateVersionsByContentHash(issues []*types.Issue) []*types.Issue {
    seen := make(map[string]*types.Issue)
    for _, issue := range issues {
        if _, found := seen[issue.ContentHash]; !found {
            seen[issue.ContentHash] = issue
        }
    }
    result := make([]*types.Issue, 0, len(seen))
    for _, issue := range seen {
        result = append(result, issue)
    }
    return result
}
```

### 3. Update handleCollisions in importer
File: internal/importer/importer.go

Replace ScoreCollisions call with:
```go
// OLD:
if err := sqlite.ScoreCollisions(ctx, sqliteStore, collisionResult.Collisions, allExistingIssues); err != nil {
    return nil, fmt.Errorf("failed to score collisions: %w", err)
}

// NEW:
idMapping, err := sqlite.ResolveNWayCollisions(ctx, sqliteStore,
    collisionResult.Collisions, issues)
if err != nil {
    return nil, fmt.Errorf("failed to resolve collisions: %w", err)
}
```

### 4. Update RemapCollisions
RemapCollisions currently uses collision.RemapIncoming field. Update to use idMapping directly:
- Remove RemapIncoming logic
- Use idMapping to determine what to remap
- Simplify to just apply the computed mapping

### 5. Add comprehensive tests

Test cases:
1. 3-way collision with different content → 3 sequential IDs
2. 3-way collision with 2 identical content → 2 IDs (dedupe works)
3. Sync order independence (A→B→C vs C→A→B produce same result)
4. Content hash ordering is respected
5. Works with 5+ clones

## Acceptance Criteria
- ResolveNWayCollisions implemented and replaces ScoreCollisions
- Groups all versions of same ID together
- Deduplicates by content hash
- Sorts by content hash deterministically
- Assigns sequential IDs starting from base ID
- Returns complete mapping (old ID → new ID)
- All clones converge to same ID assignments
- Works for arbitrary N-way collisions
- TestThreeCloneCollision passes (or gets much closer)

## Files to Modify
- internal/storage/sqlite/collision.go (new function, helpers)
- internal/importer/importer.go (call new function)
- internal/storage/sqlite/collision_test.go (comprehensive tests)

## Testing Strategy

### Unit Tests
- groupCollisionsByBaseID correctly groups
- deduplicateVersionsByContentHash removes duplicates
- Sorting by hash is stable and deterministic
- Sequential ID assignment is correct

### Integration Tests
- 3-way collision resolves to 3 issues
- Sync order doesn't affect final IDs
- Content hash ordering determines winner

### Property Tests
- For any N clones with same content, all converge to same IDs
- Idempotent: running resolution twice produces same result

## Dependencies
- Requires bd-cbed9619.5 (ContentHash field) to be completed first
- Requires bd-cbed9619.4 (read-only detection) for clean integration

## Notes
This is the core algorithm that enables convergence. The key insight:
**Sort by content hash globally, not pairwise comparison.**


Agent 5 Issue 90


Agent 8 Issue 22


Agent 7 Issue 97


Sub-task under B


Agent 7 Issue 36

Created by agent 7


Agent 5 Issue 26

Created by agent 5


Agent 0 Batch 7 Issue 2


Agent 9 Issue 29


Agent 3 Issue 84


Agent 9 Issue 52


Agent 3 Issue 37


Agent 4 Issue 98


Agent 0 Issue 39


MCP update tool bypasses user approval when closing tasks

GH #90: update with status='closed' should trigger same approval workflow as close tool. Currently undermines user control since close requires approval but update doesn't check parameter changes.


Agent 3 Batch 4 Issue 2


Agent 5 Issue 55


Agent 2 Batch 29 Issue 2


Improve error handling in dependency removal during remapping

In updateDependencyReferences(), RemoveDependency errors are caught and ignored with continue (line 392). Comment says 'if dependency doesn't exist' but this catches ALL errors including real failures. Should check error type with errors.Is(err, ErrDependencyNotFound) and only ignore not-found errors, returning other errors properly.


Agent 2 Issue 87


Agent 5 Issue 5


Agent 1 Issue 17

Created by agent 1


Agent 0 Batch 17 Issue 1


Add system-wide/multi-repo support for beads

GitHub issue #4 requests ability to use beads across multiple projects and for system-wide task tracking.

Current limitation: beads is per-repository isolated. Each project has its own .beads/ directory and issues cannot reference issues in other projects.

Potential approaches:
1. Global beads instance in ~/.beads/global.db for cross-project work
2. Project references - allow issues to link across repos
3. Multi-project workspace support - one beads instance managing multiple repos
4. Integration with existing MCP server to provide remote multi-project access

Use cases:
- System administrators tracking work across multiple machines/repos
- Developers working on a dozen+ projects simultaneously
- Cross-cutting concerns that span multiple repositories
- Global todo list with project-specific subtasks

Related:
- GitHub issue #4: https://github.com/steveyegge/beads/issues/4
- Comparison to membank MCP which already supports multi-project via centralized server
- MCP server at integrations/beads-mcp/ could be extended for this

See also: Testing framework for plugins (also from GH #4)

Multi-repo support status update:

✅ **COMPLETED (P1 - Core functionality):**
- bd-98: --global daemon flag ✅
- bd-99: Multi-repo documentation ✅
- bd-92: Per-request context routing ✅

**REMAINING (Optional enhancements):**
- bd-100 (P2): 'bd repos' command - nice-to-have for UX
- bd-101 (P2): Daemon auto-start - convenience feature
- bd-102 (P3): Workspace config - alternative approach
- bd-103 (P4): Cross-repo references - future feature

**Decision:** Core multi-repo support is COMPLETE and working. Remaining items are independent enhancements, not blockers.

Recommend closing bd-43 as complete. Open new issues for specific enhancements if needed.


Agent 1 Issue 55


Agent 1 Issue 77


Agent 7 Issue 2


Agent 2 New Issue 0


Clarify .beads/.gitattributes handling in Protected Branches docs

Protected Branches docs quick start leaves untracked `.beads` directory and `.gitattributes`.
Question: Are these changes meant to be checked into the protected branch?
Need to clarify if these should be ignored or committed, or if the instructions are missing a step.


Test reservation expiration and renewal

Verify TTL-based reservation expiration works correctly.

Acceptance Criteria:
- Reserve with short TTL (30s)
- Verify other agents can't claim
- Wait for expiration
- Verify reservation auto-released
- Other agent can now claim
- Test renewal/heartbeat mechanism

File: tests/integration/test_reservation_ttl.py

Implemented comprehensive TTL/expiration test suite in tests/integration/test_reservation_ttl.py

Test Coverage:
✅ Short TTL reservations (30s) - verifies TTL is properly set
✅ Reservation blocking - confirms agent2 cannot claim while agent1 holds reservation
✅ Auto-release after expiration - validates expired reservations are auto-cleaned and become available
✅ Renewal/heartbeat - tests that re-reserving extends expiration time

All 4 tests passing in 56.9s total (including 30s+ wait time for expiration tests).

Mock server implements full TTL management:
- Reservation class with expiration tracking
- Auto-cleanup of expired reservations on each request
- Renewal support (same agent re-reserving)
- 409 conflict for cross-agent reservation attempts


Agent 3 Issue 32

Created by agent 3


Agent 8 Issue 53


Agent 0 Issue 51

Created by agent 0


Agent 5 Issue 9

Created by agent 5


Agent 5 Issue 7

Created by agent 5


bd doctor --json flag not working

The --json flag on bd doctor command doesn't produce JSON output. It continues to show human-readable output instead. The flag is registered locally on doctorCmd but the code uses the global jsonOutput variable set by PersistentPreRun. Need to investigate why the flag isn't being honored.


Agent 6 Issue 21

Created by agent 6


Agent 7 Issue 16


Database import silently fails when daemon version != CLI version


Create multi-agent race condition test

Automated test that runs 2+ agents simultaneously to verify collision prevention.

Acceptance Criteria:
- Script spawns 2 agents in parallel
- Both try to claim same issue
- Only one succeeds (via reservation)
- Other agent skips to different work
- Verify in JSONL that no duplicate claims
- Test with Agent Mail enabled/disabled

File: tests/integration/test_agent_race.py

Success Metric: Zero duplicate claims with Agent Mail, collisions without it


Agent 0 Issue 97

Created by agent 0


False positive detection by Kaspersky Antivirus (Trojan)

Kaspersky Antivirus falsely detects beads (bd.exe v0.23.1) as a Trojan (PDM:Trojan.Win32.Generic) and removes it.
Event: Malicious object detected
Component: System Watcher
Object name: bd.exe


Agent 7 Issue 88

Created by agent 7


Update ready_issues VIEW to use hierarchical blocking

The ready_issues VIEW (schema.go:97-108) uses the OLD blocking logic that doesn't propagate through parent-child hierarchies.

**Problem:**
- GetReadyWork() function now uses recursive CTE with propagation
- But the ready_issues VIEW still uses simple NOT EXISTS check
- Any code using the VIEW will get DIFFERENT results than GetReadyWork()
- This creates inconsistency and confusion

**Impact:**
- Unknown if the VIEW is actually used anywhere in the codebase
- If it is used, it's returning incorrect results (showing children as ready when parent is blocked)

**Solution:**
Either:
1. Update VIEW to match GetReadyWork logic (complex CTE in a view)
2. Drop the VIEW entirely if unused
3. Make VIEW call GetReadyWork as a function (if SQLite supports it)

**Investigation needed:**
Grep for 'ready_issues' to see if the view is actually used.

**Investigation results:**
Grepped the codebase - the ready_issues VIEW appears in:
- schema.go (definition)
- WORKFLOW.md, DESIGN.md (documentation)
- No actual Go code queries it directly

**Conclusion:** The VIEW is defined but appears UNUSED by actual code. GetReadyWork() function is used instead.

**Recommended solution:** Drop the VIEW entirely to avoid confusion. It serves no purpose if unused and creates a maintenance burden (needs to stay in sync with GetReadyWork logic).

**Alternative:** If we want to keep it for direct SQL access, update the VIEW definition to match the new recursive CTE logic.


Agent 4 Issue 15


Add 'bd message send' command for Agent Mail messaging

Agent Mail server supports messaging between agents, but bd CLI only uses it for file reservations. Add commands for inter-agent messaging.

## Background
- Agent Mail server running at http://127.0.0.1:8765
- 12 workspaces configured across 3 channels (beads.dev, vc.dev, wyvern.dev)
- Current integration: file reservations only
- Gap: no way to send messages from bd CLI

## Proposed Commands

```bash
# Send message to another agent
bd message send <to-agent> <message> [options]
  --subject <subject>
  --thread-id <thread-id>     # Optional - group related messages
  --project-id <project>      # Defaults to BEADS_PROJECT_ID

# List inbox messages
bd message inbox [options]
  --limit <N>
  --unread-only

# Read specific message
bd message read <message-id>

# Mark message as acknowledged
bd message ack <message-id>
```

## Example Usage

```bash
# Send message to agent in same channel
bd message send cino-beads-stevey-macbook "Working on bd-z0yn, need your review" \
  --subject "Review request" \
  --thread-id bd-z0yn

# Check inbox
bd message inbox --unread-only

# Read and acknowledge
bd message read msg-abc123
bd message ack msg-abc123
```

## Design Notes
- Use same env vars (BEADS_AGENT_MAIL_URL, BEADS_AGENT_NAME, BEADS_PROJECT_ID)
- Graceful degradation if Agent Mail unavailable
- JSON output support for all commands
- Consider integrating with bd update/close (auto-notify on status changes)

## References
- Agent Mail README: ~/src/mcp_agent_mail/README.md
- Beads integration docs: docs/AGENT_MAIL.md

## Implementation Summary

Added four new commands to bd CLI for Agent Mail messaging:

1. `bd message send <to-agent> <message>` - Send messages to other agents
   - Flags: --subject, --thread-id, --importance, --ack-required
   - Supports markdown content
   - Thread conversations by issue ID

2. `bd message inbox` - List inbox messages
   - Flags: --limit, --unread-only, --urgent-only, --json
   - Shows subject, sender, age, importance
   - Highlights unread and ACK-required messages

3. `bd message read <message-id>` - Read and mark message as read
   - Automatically marks message as read
   - Shows message content

4. `bd message ack <message-id>` - Acknowledge a message
   - Marks message as acknowledged
   - Also marks as read if not already

## Implementation Details

- Uses JSON-RPC over HTTP to communicate with Agent Mail server
- Configuration via environment variables (BEADS_AGENT_MAIL_URL, BEADS_AGENT_NAME, BEADS_PROJECT_ID)
- Graceful error messages when Agent Mail not configured
- Full JSON output support for programmatic use
- Follows same patterns as existing bd commands

## Documentation

Updated:
- docs/AGENT_MAIL.md - Added "Messaging Commands" section with examples and best practices
- README.md - Added "Messaging (Agent Mail)" section in Usage

## Testing

- Compiles successfully
- Help output works correctly
- Ready for integration testing with Agent Mail server


Agent 3 Issue 87

Created by agent 3


Test SQLite WASM compatibility

Verify modernc.org/sqlite works in WASM target. Child of epic bd-44d0.

## Tasks
- [ ] Compile minimal SQLite test to WASM
- [ ] Test database create/open operations
- [ ] Test query execution
- [ ] Test JSONL import/export
- [ ] Benchmark performance vs native

## Decision Point
If modernc.org/sqlite issues, evaluate ncruces/go-sqlite3 alternative.


Agent 4 Issue 79

Created by agent 4


Agent 1 Batch 46 Issue 1


Agent 7 Issue 48


Agent 5 Issue 65

Created by agent 5


Agent 0 Issue 7


Agent 7 Issue 76


Agent 6 Issue 37


Agent 4 Issue 61

Created by agent 4


Agent 3 Issue 30


Agent 1 Issue 73


Agent 5 Issue 22

Created by agent 5


Agent 6 Issue 44


Agent 9 Issue 61


Agent 6 Issue 88


Agent 3 Batch 17 Issue 1


Fix nil pointer crash in bd export command

When running `bd export -o .beads/issues.jsonl`, the command crashes with a nil pointer dereference.

## Error
```
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x108 pc=0x1034456fc]

goroutine 1 [running]:
main.init.func14(0x103c24380, {0x1034a9695?, 0x4?, 0x1034a95c9?})
        /Users/stevey/src/vc/adar/beads/cmd/bd/export.go:74 +0x15c
```

## Context
- This happened after closing bd-86, bd-91, bd-92
- Auto-export from daemon still works fine
- Only the manual `bd export` command crashes
- Data was already synced via auto-export, so no data loss

## Location
File: `cmd/bd/export.go` line 74


Agent 0 Issue 63

Created by agent 0


Agent 0 Batch 19 Issue 2


Agent 8 Issue 96


Agent 1 Batch 6 Issue 1


Agent 2 Issue 96

Created by agent 2


Agent 6 Issue 79


Agent 3 Issue 38


Agent 4 Issue 97


bd status "Recent Activity" is misleading - should use git history

## Problem

`bd status` shows "Recent Activity (last 7 days)" but the numbers are wrong. It only looks at database timestamps, not git history. Says "141 issues closed in last 7 days" when thousands have actually come and go.

## Issues

1. Only queries database timestamps, not git history
2. 7 days is too long a window
3. Numbers don't reflect actual activity in JSONL git history

## Proposed Fix

Either:
- Query git history of `.beads/beads.jsonl` to get actual activity (last 24-48 hours)
- Remove "Recent Activity" section entirely if not useful
- Make time window configurable and default to 24h

## Example Output (Current)
```
Recent Activity (last 7 days):
Issues Created:    174
Issues Closed:     141
Issues Updated:    37
```
This is misleading when thousands of issues have actually cycled through.


Agent 3 Issue 39

Created by agent 3


Agent 1 Batch 3 Issue 1


Agent 0 Issue 94

Created by agent 0


Agent 2 New Issue 20


Agent 2 Issue 22

Created by agent 2


Implement daemon architecture for concurrent access

Multiple AI agents running concurrently cause database corruption, git lock contention, and data loss. Implement a daemon-based architecture where bd daemon owns SQLite (single writer) and all bd commands become RPC clients when daemon is running. Batches git operations to prevent index.lock contention. Maintains backward compatibility with graceful fallback to direct mode. See DAEMON_DESIGN.md for full details.


Agent 8 Issue 98


Agent 2 Issue 91


Refactor sqlite.go (2298 lines)

Break down internal/storage/sqlite/sqlite.go into smaller, more focused modules. The file is currently 2298 lines and should be split into logical components.


Agent 1 Issue 60


Agent 2 Batch 11 Issue 2


bd sync false positive: conflict detection triggers on JSON-encoded angle brackets in issue content

The bd sync --import-only command incorrectly detects conflict markers when issue descriptions contain the text '<<<<<<<' or '>>>>>>>' as legitimate content (e.g., documentation about git conflict markers).

**Reproduction:**
1. Create issue with design field containing: 'Read file, extract <<<<<<< / ======= / >>>>>>> markers'
2. Export to JSONL (gets JSON-encoded as \u003c\u003c\u003c...)
3. Commit and push
4. Pull from remote
5. bd sync --import-only fails with: 'Git conflict markers detected in JSONL file'

**Root cause:**
The conflict detection appears to decode JSON before checking for conflict markers, causing false positives when issue content legitimately contains these strings.

**Expected behavior:**
Conflict detection should only trigger on actual git conflict markers (literal '<<<<<<<' bytes in the raw file), not on JSON-encoded content within issue fields.

**Test case:**
VC project at ~/src/dave/vc has vc-85 'JSONL Conflict Parser' which documents conflict parsing and triggers this bug.

**Suggested fixes:**
1. Only scan for literal '<<<<<<<' bytes (not decoded JSON content)
2. Parse JSONL first and only flag unparseable lines
3. Check git merge state (git status) to confirm actual conflict
4. Add --skip-conflict-check flag for override


Agent 0 Issue 59

Created by agent 0


Agent 6 Issue 17


Production Readiness (Optional)

Enable multi-machine deployments with containerization and monitoring.


Agent 0 Batch 16 Issue 2


Agent 8 Issue 8


Agent 1 Batch 48 Issue 1