diff --git a/.beads/beads.jsonl b/.beads/beads.jsonl index d423792c..464d190d 100644 --- a/.beads/beads.jsonl +++ b/.beads/beads.jsonl @@ -98,7 +98,6 @@ {"id":"bd-5iv","content_hash":"229ad9764bd3eb8b09441adefce960aede63fd1b5466d52cc74f112f5bb610ac","title":"Test Epic","description":"## Overview\n\n[Describe the high-level goal and scope of this epic]\n\n## Success Criteria\n\n- [ ] Criteria 1\n- [ ] Criteria 2\n- [ ] Criteria 3\n\n## Background\n\n[Provide context and motivation]\n\n## Scope\n\n**In Scope:**\n- Item 1\n- Item 2\n\n**Out of Scope:**\n- Item 1\n- Item 2\n","design":"## Architecture\n\n[Describe the overall architecture and approach]\n\n## Components\n\n- Component 1: [description]\n- Component 2: [description]\n\n## Dependencies\n\n[List external dependencies or constraints]\n","acceptance_criteria":"- [ ] All child issues are completed\n- [ ] Integration tests pass\n- [ ] Documentation is updated\n- [ ] Code review completed\n","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-03T20:15:03.864229-08:00","updated_at":"2025-11-05T00:25:06.538749-08:00","closed_at":"2025-11-05T00:25:06.538749-08:00","source_repo":".","labels":["epic"]} {"id":"bd-5ohb","content_hash":"c7432e58e6518764c9e88b92b16becbb545e179f187becf13aa980f1b93c8192","title":"Issue to reopen with reason","description":"","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:00:18.583903-08:00","updated_at":"2025-11-07T19:00:18.629189-08:00","source_repo":"."} {"id":"bd-5ots","content_hash":"197fdfe95399e1becb827c6d1ab57d8ccdca19a84206d30b20102686f5384726","title":"SearchIssues N+1 query causes context timeout with GetLabels","description":"scanIssues() calls GetLabels in a loop for every issue, causing N+1 queries and context deadline exceeded errors when used with short timeouts or in-memory databases. This is especially problematic since SearchIssues already supports label filtering via SQL WHERE clauses.","acceptance_criteria":"- Optimize scanIssues to batch-load labels for all issues in one query\n- Or make label loading optional/lazy\n- Add test that calls SearchIssues repeatedly with label filters and short context timeouts","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T19:12:02.245879-08:00","updated_at":"2025-11-05T19:22:11.668682-08:00","closed_at":"2025-11-05T19:22:11.668682-08:00","source_repo":"."} -{"id":"bd-5xor","content_hash":"16f978c58b9988457aeb1eaff37fb17f12e91325549b38be10362a08923e9a2d","title":"Test issue 2","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-07T19:04:17.464306-08:00","updated_at":"2025-11-07T19:04:17.464306-08:00","source_repo":"."} {"id":"bd-6049","content_hash":"16c54bc547f4ab180aee39efbb197709a47a39047f5bc2dd59e6e6b57ca8bc87","title":"bd doctor --json flag not working","description":"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.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-02T17:08:18.170428-08:00","updated_at":"2025-11-02T18:41:01.376783-08:00","closed_at":"2025-11-02T18:41:01.376786-08:00","source_repo":".","comments":[{"id":4,"issue_id":"bd-6049","author":"stevey","text":"Fixed by removing the local --json flag definition in doctor.go that was shadowing the persistent --json flag from main.go. The doctor command now correctly uses the global jsonOutput variable.","created_at":"2025-11-05T08:38:46Z"}]} {"id":"bd-627d","content_hash":"5b3d3d69ceac28dcbfbc2c7ea2f7a6ff2a3a02bc58ce02dcf6b05f8469e8bddc","title":"AI-supervised database migrations for safer schema evolution","description":"## Problem\n\nDatabase migrations can lose user data through edge cases that are hard to anticipate (e.g., GH #201 where bd migrate failed to set issue_prefix, or bd-d355a07d false positive data loss warnings). Since beads is designed to be run by AI agents, we should leverage AI to make migrations safer.\n\n## Current State\n\nMigrations run blindly with:\n- No pre-flight validation\n- No data integrity verification\n- No rollback on failure\n- Limited post-migration testing\n\nRecent issues:\n- GH #201: Migration didn't set issue_prefix config, breaking commands\n- bd-d355a07d: False positive \"data loss\" warnings on collision resolution\n- Users reported migration data loss (fixed but broader problem remains)\n\n## Proposal: AI-Supervised Migration Framework\n\nUse AI to supervise migrations through structured verification:\n\n### 1. Pre-Migration Analysis\n- AI reads migration code and current schema\n- Identifies potential data loss scenarios\n- Generates validation queries to verify assumptions\n- Creates snapshot queries for before/after comparison\n\n### 2. Migration Execution\n- Take database backup/snapshot\n- Run validation queries (pre-state)\n- Execute migration in transaction\n- Run validation queries (post-state)\n\n### 3. Post-Migration Verification\n- AI compares pre/post snapshots\n- Verifies data integrity invariants\n- Checks for unexpected data loss\n- Validates config completeness (like issue_prefix)\n\n### 4. Rollback on Anomalies\n- If AI detects data loss, rollback transaction\n- Present human-readable error report\n- Suggest fix before retrying\n\n## Example Flow\n\n```\n$ bd migrate\n\n→ Analyzing migration plan...\n→ AI identified 3 potential data loss scenarios\n→ Generating validation queries...\n→ Creating pre-migration snapshot...\n→ Running migration in transaction...\n→ Verifying post-migration state...\n✓ All 247 issues accounted for\n✓ Config table complete (issue_prefix: \"mcp\")\n✓ Dependencies intact (342 relationships verified)\n→ Migration successful!\n```\n\nIf something goes wrong:\n```\n$ bd migrate\n\n→ Analyzing migration plan...\n→ AI identified issue: Missing issue_prefix config after migration\n→ Recommendation: Add prefix detection step\n→ Aborting migration - database unchanged\n```\n\n## Implementation Ideas\n\n### A. Migration Validator Tool\nCreate `bd migrate --validate` that:\n- Simulates migration on copy of database\n- Uses AI to verify data integrity\n- Reports potential issues before real migration\n\n### B. Migration Test Generator\nAI generates test cases for migrations:\n- Edge cases (empty DB, large DB, missing config)\n- Data integrity checks\n- Regression tests\n\n### C. Migration Invariants\nDefine invariants that AI checks:\n- Issue count should not decrease (unless collision resolution)\n- All required config keys present\n- Foreign key relationships intact\n- No orphaned dependencies\n\n### D. Self-Healing Migrations\nAI detects incomplete migrations and suggests fixes:\n- Missing config values (like GH #201)\n- Orphaned data\n- Index inconsistencies\n\n## Benefits\n\n1. **Catch edge cases**: AI explores scenarios humans miss\n2. **Self-documenting**: AI explains what migration does\n3. **Agent-friendly**: Agents can run migrations confidently\n4. **Fewer rollbacks**: Detect issues before committing\n5. **Better testing**: AI generates comprehensive test suites\n\n## Open Questions\n\n1. Which AI model? (Fast: Haiku, Thorough: Sonnet/GPT-4)\n2. How to balance safety vs migration speed?\n3. Should AI validation be required or optional?\n4. How to handle offline scenarios (no API access)?\n5. What invariants should always be checked?\n\n## Related Work\n\n- bd-b245: Migration registry (makes migrations introspectable)\n- GH #201: issue_prefix migration bug (motivating example)\n- bd-d355a07d: False positive data loss warnings","design":"## Architecture: Agent-Supervised Migrations (Inversion of Control)\n\n**Key principle:** Beads provides observability and validation primitives. AI agents supervise using their own reasoning. Beads NEVER makes AI API calls.\n\n## Phase 1: Migration Invariants (Pure Validation)\n\nCreate `internal/storage/sqlite/migration_invariants.go`:\n\n```go\ntype MigrationInvariant struct {\n Name string\n Description string\n Check func(*sql.DB, *Snapshot) error\n}\n\ntype Snapshot struct {\n IssueCount int\n ConfigKeys []string\n DependencyCount int\n LabelCount int\n}\n\nvar invariants = []MigrationInvariant{\n {\n Name: \"required_config_present\",\n Description: \"Required config keys must exist\",\n Check: checkRequiredConfig, // Would have caught GH #201\n },\n {\n Name: \"foreign_keys_valid\",\n Description: \"No orphaned dependencies or labels\",\n Check: checkForeignKeys,\n },\n {\n Name: \"issue_count_stable\",\n Description: \"Issue count should not decrease unexpectedly\",\n Check: checkIssueCount,\n },\n}\n\nfunc checkRequiredConfig(db *sql.DB, snapshot *Snapshot) error {\n required := []string{\"issue_prefix\", \"schema_version\"}\n for _, key := range required {\n var value string\n err := db.QueryRow(\"SELECT value FROM config WHERE key = ?\", key).Scan(\u0026value)\n if err != nil || value == \"\" {\n return fmt.Errorf(\"required config key missing: %s\", key)\n }\n }\n return nil\n}\n```\n\n## Phase 2: Dry-Run \u0026 Inspection Tools\n\nAdd `bd migrate --dry-run --json`:\n\n```json\n{\n \"pending_migrations\": [\n {\"name\": \"dirty_issues_table\", \"description\": \"Adds dirty_issues table\"},\n {\"name\": \"content_hash_column\", \"description\": \"Adds content_hash for collision resolution\"}\n ],\n \"current_state\": {\n \"schema_version\": \"0.9.9\",\n \"issue_count\": 247,\n \"config\": {\"schema_version\": \"0.9.9\"},\n \"missing_config\": [\"issue_prefix\"]\n },\n \"warnings\": [\n \"issue_prefix config not set - may break commands after migration\"\n ],\n \"invariants_to_check\": [\n \"required_config_present\",\n \"foreign_keys_valid\",\n \"issue_count_stable\"\n ]\n}\n```\n\nAdd `bd info --schema --json`:\n\n```json\n{\n \"tables\": [\"issues\", \"dependencies\", \"labels\", \"config\"],\n \"schema_version\": \"0.9.9\",\n \"config\": {},\n \"sample_issue_ids\": [\"mcp-1\", \"mcp-2\"],\n \"detected_prefix\": \"mcp\"\n}\n```\n\n## Phase 3: Pre/Post Snapshots with Rollback\n\nUpdate `RunMigrations()`:\n\n```go\nfunc RunMigrations(db *sql.DB) error {\n // Capture pre-migration snapshot\n snapshot := captureSnapshot(db)\n \n // Run migrations in transaction\n tx, err := db.Begin()\n if err != nil {\n return err\n }\n defer tx.Rollback()\n \n for _, migration := range migrations {\n if err := migration.Func(tx); err != nil {\n return fmt.Errorf(\"migration %s failed: %w\", migration.Name, err)\n }\n }\n \n // Verify invariants before commit\n if err := verifyInvariants(tx, snapshot); err != nil {\n return fmt.Errorf(\"post-migration validation failed (rolled back): %w\", err)\n }\n \n return tx.Commit()\n}\n```\n\n## Phase 4: MCP Tools for Agent Supervision\n\nAdd to beads-mcp:\n\n```python\n@server.tool()\nasync def inspect_migration(workspace_root: str) -\u003e dict:\n \"\"\"Get migration plan and current state for agent analysis.\n \n Agent should:\n 1. Review pending migrations\n 2. Check for warnings (missing config, etc.)\n 3. Verify invariants will pass\n 4. Decide whether to run bd migrate\n \"\"\"\n result = run_bd([\"migrate\", \"--dry-run\", \"--json\"], workspace_root)\n return json.loads(result.stdout)\n\n@server.tool() \nasync def get_schema_info(workspace_root: str) -\u003e dict:\n \"\"\"Get current database schema for migration analysis.\"\"\"\n result = run_bd([\"info\", \"--schema\", \"--json\"], workspace_root)\n return json.loads(result.stdout)\n```\n\n## Agent Workflow Example\n\n```python\n# Agent detects user wants to migrate\nmigration_plan = inspect_migration(\"/path/to/workspace\")\n\n# Agent analyzes (using its own reasoning, no API calls from beads)\nif \"issue_prefix\" in migration_plan[\"missing_config\"]:\n schema = get_schema_info(\"/path/to/workspace\")\n detected_prefix = schema[\"detected_prefix\"]\n \n # Agent fixes issue before migration\n run_bd([\"config\", \"set\", \"issue_prefix\", detected_prefix])\n \n# Now safe to migrate\nrun_bd([\"migrate\"])\n```\n\n## What Beads Provides\n\n✅ Deterministic validation (invariants)\n✅ Structured inspection (--dry-run, --explain)\n✅ Rollback on invariant failure\n✅ JSON output for agent parsing\n\n## What Beads Does NOT Do\n\n❌ No AI API calls\n❌ No external model access\n❌ No agent invocation\n\nAgents supervise migrations using their own reasoning and the inspection tools beads provides.","acceptance_criteria":"Phase 1: Migration invariants implemented and tested, checked after every migration, clear error messages when invariants fail.\n\nPhase 2: Snapshot capture before migrations, comparison after, rollback on verification failure.\n\nPhase 3 (stretch): AI validation optional flag implemented, AI can analyze migration code and generate custom validation queries.\n\nPhase 4 (stretch): Migration test fixtures created, all fixtures pass migrations, CI runs migration tests.","notes":"## Progress\n\n### ✅ Phase 1: Migration Invariants (COMPLETED)\n\n**Implemented:**\n- Created internal/storage/sqlite/migration_invariants.go with 3 invariants\n- Updated RunMigrations() to verify invariants after migrations\n- All tests pass ✓\n\n### ✅ Phase 2: Inspection Tools (COMPLETED \u0026 PUSHED)\n\n**Commit:** 1abe4e7 - \"Add migration inspection tools for AI agents (bd-627d Phase 2)\"\n\n**Implemented:**\n1. ✅ bd migrate --inspect --json - Shows migration plan\n2. ✅ bd info --schema --json - Returns schema details\n3. ✅ Migration warnings system\n4. ✅ Documentation updated in AGENTS.md\n5. ✅ All tests pass\n\n### ✅ Phase 3: MCP Tools (COMPLETED \u0026 PUSHED)\n\n**Commit:** 2493693 - \"Add MCP tools for migration inspection (bd-627d Phase 3)\"\n\n**Implemented:**\n1. ✅ inspect_migration(workspace_root) tool in beads-mcp\n2. ✅ get_schema_info(workspace_root) tool in beads-mcp\n3. ✅ Abstract methods in BdClientBase\n4. ✅ CLI client implementations\n5. ✅ All tests pass\n\n**All phases complete!** Migration inspection fully integrated into MCP server.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-02T12:57:10.722048-08:00","updated_at":"2025-11-02T14:31:25.095296-08:00","closed_at":"2025-11-02T14:31:25.095308-08:00","source_repo":"."} {"id":"bd-62a0","content_hash":"b8b2a58a86211a19aed9d21ec5215b4f14ef341ee95d4ed845e1412840d00fd7","title":"Create WASM build infrastructure (Makefile, scripts)","description":"Set up build tooling for WASM compilation:\n- Add GOOS=js GOARCH=wasm build target\n- Copy wasm_exec.js from Go distribution\n- Create wrapper script for Node.js execution\n- Add build task to Makefile or build script","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T21:58:07.286826-08:00","updated_at":"2025-11-02T22:23:49.376789-08:00","closed_at":"2025-11-02T22:23:49.376789-08:00","source_repo":".","dependencies":[{"issue_id":"bd-62a0","depends_on_id":"bd-44d0","type":"parent-child","created_at":"2025-11-02T22:23:49.423064-08:00","created_by":"stevey"}]} @@ -134,7 +133,6 @@ {"id":"bd-7fe8","content_hash":"106aa3a1717d3c2a6ff518a8881976fd70911b006714b04f47327959d7ca1444","title":"Fix linting error in migrate.go","description":"Linter reports error:\n```\ncmd/bd/migrate.go:647:37: cleanupWALFiles - result 0 (error) is always nil (unparam)\n```\n\nThe `cleanupWALFiles` function always returns nil, so the error return type should be removed or the function should actually return errors when appropriate.","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-02T09:29:37.279747-08:00","updated_at":"2025-11-02T09:46:52.18793-08:00","closed_at":"2025-11-02T09:46:52.18793-08:00","source_repo":".","dependencies":[{"issue_id":"bd-7fe8","depends_on_id":"bd-1231","type":"blocks","created_at":"2025-11-02T09:29:37.280881-08:00","created_by":"stevey"}]} {"id":"bd-7kua","content_hash":"2dedc0d0d5444db45ab146cc59f3c51bc4bfc3c864da43d3c086a9153613c29f","title":"Reduce sync rounds in multiclone tests","description":"Analyze and reduce the number of sync rounds in hash multiclone tests.\n\nCurrent state:\n- TestHashIDs_MultiCloneConverge: 1 round of syncs across 3 clones\n- TestHashIDs_IdenticalContentDedup: 2 rounds across 2 clones\n\nInvestigation needed:\n- Profile to see how much time each sync takes\n- Determine minimum rounds needed for convergence\n- Consider making rounds configurable via env var\n\nFile: beads_hash_multiclone_test.go:70, :132","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-04T01:24:18.405038-08:00","updated_at":"2025-11-04T10:26:34.449434-08:00","closed_at":"2025-11-04T10:26:34.449434-08:00","source_repo":".","dependencies":[{"issue_id":"bd-7kua","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:18.405883-08:00","created_by":"daemon"}]} {"id":"bd-7so1","content_hash":"65e5dcb12407f83aad0c37c06127fcf76cf00bf581adab726b221da75c6c7f74","title":"Issue 1 to reopen","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:20.12433-08:00","updated_at":"2025-11-07T19:04:20.224399-08:00","source_repo":"."} -{"id":"bd-7t1k","content_hash":"23f97088bca298f24d56312ee9aa5a14c4dd061a05eedae7e3f4d251786be4e1","title":"Blocked issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:05:35.418543-08:00","updated_at":"2025-11-07T19:05:35.418543-08:00","source_repo":"."} {"id":"bd-7zuj","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:05:35.38463-08:00","updated_at":"2025-11-07T19:05:35.38463-08:00","source_repo":"."} {"id":"bd-8072","content_hash":"32bd0e33433bbf535cb56eb47828ac80ebecc57512e9039420a39cd2342790d2","title":"Add import.orphan_handling config option","description":"Add configuration option to control orphan handling behavior: 'strict' (fail on missing parent, current behavior), 'resurrect' (auto-resurrect from JSONL, recommended default), 'skip' (skip orphaned issues with warning), 'allow' (import orphans without validation). Update CONFIG.md documentation.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:08.569239-08:00","updated_at":"2025-11-05T00:25:06.619278-08:00","closed_at":"2025-11-05T00:25:06.619278-08:00","source_repo":"."} {"id":"bd-812a","content_hash":"0d802dec82dff53e88e68bb4f1fef75754165a590996ff8b1578ff93e781622d","title":"Add unit tests for import ordering","description":"Test topological sort: import [child, parent] should succeed, import [parent.1.2, parent, parent.1] should sort correctly. Verify depth-based batching works. Test max depth limits.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T12:32:21.278448-08:00","updated_at":"2025-11-05T00:08:38.197477-08:00","closed_at":"2025-11-05T00:08:38.19748-08:00","source_repo":"."} @@ -201,7 +199,6 @@ {"id":"bd-bc2c6191","content_hash":"46ab7e965823421a1cc06fdbb3a1faa8ef31f0c46487cd05a4cec8127af8e480","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","acceptance_criteria":"- Document showing all cache dependencies\n- Confirmation that removing cache won't break MCP\n- List of tests that need updating\n\nFiles to examine:\n- internal/rpc/server_cache_storage.go (cache implementation)\n- internal/rpc/client.go (how req.Cwd is set)\n- internal/rpc/server_*.go (all getStorageForRequest calls)\n- integrations/beads-mcp/ (MCP multi-repo logic)\n\nTasks:\n- Document all callers of getStorageForRequest()\n- Verify req.Cwd is only set by RPC client for database discovery\n- Confirm MCP server doesn't rely on multi-repo cache behavior\n- Check if any tests assume multi-repo routing\n- Review environment variables: BEADS_DAEMON_MAX_CACHE_SIZE, BEADS_DAEMON_CACHE_TTL, BEADS_DAEMON_MEMORY_THRESHOLD_MB","notes":"Audit complete. See CACHE_AUDIT.md for full findings.\n\nSummary:\n- Cache was already removed in commit 322ab63 (2025-10-28)\n- server_cache_storage.go deleted (~286 lines)\n- All getStorageForRequest calls replaced with s.storage\n- All environment variables removed\n- MCP multi-repo works via per-project daemon architecture\n- All tests updated and passing\n- Only stale comment in server.go needed fixing","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-27T23:02:43.506373-07:00","updated_at":"2025-11-06T20:16:47.975903-08:00","closed_at":"2025-11-06T19:48:30.520616-08:00","source_repo":"."} {"id":"bd-bc7l","content_hash":"8aebd77c19946d60143f7b7f699d1bcf6e8792c347f6d7c41a2ffbba744bfa8e","title":"Issue 2 to reopen","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:14.942108-08:00","updated_at":"2025-11-07T19:07:15.014367-08:00","source_repo":"."} {"id":"bd-be7a","content_hash":"d9043a7a49f8e42dc88c3c01aaa178c1560b67c1637c3373b39c387272e8b725","title":"Create npm package structure with package.json","description":"Set up initial npm package structure for @beads/bd:\n\n## Files to create\n- npm/package.json - Package metadata, dependencies, scripts\n- npm/bin/bd - CLI wrapper script that invokes native binary\n- npm/.gitignore - Ignore downloaded binaries\n- npm/README.md - Installation and usage instructions\n\n## package.json structure\n- Name: @beads/bd (scoped package)\n- Main: index.js (exports binary path)\n- Bin: bin/bd (CLI entry point)\n- Scripts: postinstall (download binary)\n- Keywords: issue-tracker, cli, beads, bd\n- License: MIT\n\n## Bin wrapper\nSimple Node.js script that:\n- Spawns native binary with child_process.spawn\n- Passes through all arguments and stdio\n- Exits with binary's exit code","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T23:39:47.416779-08:00","updated_at":"2025-11-03T10:31:45.381258-08:00","closed_at":"2025-11-03T10:31:45.381258-08:00","source_repo":".","dependencies":[{"issue_id":"bd-be7a","depends_on_id":"bd-febc","type":"parent-child","created_at":"2025-11-02T23:40:32.923859-08:00","created_by":"daemon"}]} -{"id":"bd-bho9","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:20.005068-08:00","updated_at":"2025-11-07T19:00:20.005068-08:00","source_repo":"."} {"id":"bd-bpb4","content_hash":"2236f911e6f321a74aa61bdf702d24949e44a68ed511d12dd011aa4103c89230","title":"Issue 2","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:26.181632-08:00","updated_at":"2025-11-07T19:04:26.181632-08:00","source_repo":"."} {"id":"bd-buol","content_hash":"e669263cc97dca54d1ea22daa43e95902dacbc6db41520c4774896f0c05941ef","title":"Invert control for compact: provide tools for agent-driven compaction","description":"Currently compact requires Anthropic API key because bd calls the AI directly. This is backwards - we should provide tools (like all other bd commands) that let an AI agent perform the compaction. The agent decides what to keep/merge, not bd. Related to GH #243 complaint about API key requirement.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-07T00:27:28.498069-08:00","updated_at":"2025-11-07T00:27:28.498069-08:00","source_repo":"."} {"id":"bd-bvo2","content_hash":"2236f911e6f321a74aa61bdf702d24949e44a68ed511d12dd011aa4103c89230","title":"Issue 2","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:21.046126-08:00","updated_at":"2025-11-07T19:07:21.046126-08:00","source_repo":"."} @@ -231,7 +228,6 @@ {"id":"bd-d3e5","content_hash":"2eaf57cb617922924aadb6b04366a3ef058d386752c65e8471f2704b512ea30a","title":"Test issue 2","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T09:44:17.116768539Z","updated_at":"2025-11-02T09:45:20.780838695Z","closed_at":"2025-11-02T09:45:20.780838695Z","source_repo":"."} {"id":"bd-d3f0","content_hash":"d759327f1a1e4817d3e8ec212fd6af2607d0bb5e654201a6fc3640ad0a3b18fd","title":"Add 'bd comment' as alias for 'bd comments add'","description":"The command 'bd comments add' is verbose and unintuitive. Add 'bd comment' as a shorter alias that works the same way.\n\n## Rationale\n- More natural: 'bd comment \u003cissue-id\u003e \u003ctext\u003e' reads better than 'bd comments add \u003cissue-id\u003e \u003ctext\u003e'\n- Matches user expectations: users naturally try 'bd comment' first\n- Follows convention: other commands like 'bd create', 'bd show', 'bd close' are verbs\n\n## Implementation\nCould be implemented as:\n1. A new command that wraps bd comments add\n2. An alias registered in cobra\n3. Keep 'bd comments add' for backwards compatibility\n\n## Examples\n```bash\nbd comment bd-1234 'This is a comment'\nbd comment bd-1234 'Multi-line comment' --body 'Additional details here'\n```","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-02T17:13:18.82563-08:00","updated_at":"2025-11-03T22:20:30.223939-08:00","closed_at":"2025-11-03T22:20:30.223939-08:00","source_repo":"."} {"id":"bd-d4ec5a82","content_hash":"e0f9aa493571fdb0b5fd578993165042ad224bb2c00186564337732e6221d529","title":"Add MCP functions for repair commands","description":"Add repair commands to beads-mcp for agent access:\n- beads_resolve_conflicts()\n- beads_find_duplicates()\n- beads_detect_pollution()\n- beads_validate()\n\nFiles: integrations/beads-mcp/src/beads_mcp/server.py","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.071495-07:00","updated_at":"2025-11-06T19:37:39.601957-08:00","closed_at":"2025-11-06T19:27:19.170894-08:00","source_repo":"."} -{"id":"bd-d4rn","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:00:23.8969-08:00","updated_at":"2025-11-07T19:00:23.8969-08:00","source_repo":"."} {"id":"bd-d68f","content_hash":"1c806ae9c39bb28faaa8730350ce6b20bc25821e33583f537db1567b183bce6d","title":"Add tests for Comments API (AddIssueComment, GetIssueComments)","description":"Comments API currently has 0% coverage. Need tests for:\n- AddIssueComment - adding comments to issues\n- GetIssueComments - retrieving comments\n- Comment ordering and pagination\n- Edge cases (non-existent issues, empty comments)","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-01T22:40:58.980688-07:00","updated_at":"2025-11-01T22:53:42.124391-07:00","closed_at":"2025-11-01T22:53:42.124391-07:00","source_repo":"."} {"id":"bd-d76d","content_hash":"b65da5fe9f89a98f1e6fad6ee32d463126ef72785fec4d6dfa5a4774c6a8a393","title":"Modify EnsureIDs to support parent resurrection","description":"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.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:59.659507-08:00","updated_at":"2025-11-04T17:10:48.9102-08:00","closed_at":"2025-11-04T17:10:48.9102-08:00","source_repo":"."} {"id":"bd-d7e88238","content_hash":"b69ec861618b03129fad7807b085ee6365860cfd2e9901b49eb846e192b95a0d","title":"Rapid 3","description":"","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-10-30T17:12:58.189494-07:00","source_repo":"."} @@ -270,16 +266,13 @@ {"id":"bd-gm7p","content_hash":"4bc3ca7545527e791e7282ad7596cb39f024e20fda1845c3498ffef1ba0100fd","title":"Use in-memory filesystem for test git operations","description":"Use tmpfs/ramdisk for git operations in tests to reduce I/O overhead.\n\nOptions:\n1. Mount /tmp as tmpfs in CI (GitHub Actions supports this)\n2. Use Go's testing.TB.TempDir() which may already use tmpfs on some systems\n3. Explicitly create ramdisk for tests on macOS\n\nExpected savings: 20-30% reduction in git operation time","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-04T01:24:19.803224-08:00","updated_at":"2025-11-04T12:27:51.428975-08:00","closed_at":"2025-11-04T12:27:51.428978-08:00","source_repo":".","dependencies":[{"issue_id":"bd-gm7p","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:19.80414-08:00","created_by":"daemon"}]} {"id":"bd-gpe7","content_hash":"abafcc321674aa66d99dc353641fe183e510f4b89624adcaf8ffe0cea5ffb1ef","title":"Tests take too long - unacceptable for project size","description":"## Problem\n\nRunning `go test ./internal/importer/... -v` takes an unacceptably long time (minutes). For a project this size, tests should complete in seconds.\n\n## Impact\n\n- Slows down development iteration\n- AI agents waste time waiting for tests\n- Blocks rapid bug fixes and validation\n- Poor developer experience\n\n## Investigation Needed\n\n- Profile which tests are slow\n- Check for unnecessary sleeps, timeouts, or integration tests\n- Look for tests that could be parallelized\n- Consider splitting unit vs integration tests\n\n## Goal\n\nTest suite for a single package should complete in \u003c5 seconds, ideally \u003c2 seconds.","notes":"## Optimizations Applied\n\n1. **Added t.Parallel() to CLI tests** (13 tests) - allows concurrent execution\n2. **Removed unnecessary 200ms sleep** in daemon_autoimport_test.go - Execute() forces auto-import synchronously\n3. **Reduced filesystem settle wait** from 100ms → 50ms on non-Windows platforms\n4. **Optimized debouncer test sleeps** (9 reductions):\n - Before debounce waits: 30ms → 20ms, 20ms → 10ms\n - After debounce waits: 40ms → 35ms, 30ms → 35ms, etc.\n - Thread safety test: 100ms → 70ms\n - Sequential cycles: 50ms → 40ms (3x)\n - Cancel tests: 70-80ms → 60ms\n\n## Results\n\n### cmd/bd package (main improvement target):\n- **Before**: 5+ minutes (timeout)\n- **After**: ~18-20 seconds\n- **Speedup**: ~15-18x faster\n\n### internal/importer package:\n- **After**: \u003c1 second (0.9s)\n\n### Full test suite (with `-short` flag):\n- Most packages complete in \u003c2s\n- Total runtime constrained by sequential integration tests\n\n## Known Issues\n\n- TestConcurrentExternalRefImports hangs due to :memory: connection pool issue (bd-b121)\n- Some sync_branch tests may need sequential execution (git worktree conflicts)","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-05T00:54:47.784504-08:00","updated_at":"2025-11-05T10:55:27.261404-08:00","closed_at":"2025-11-05T01:41:57.544395-08:00","source_repo":"."} {"id":"bd-h4hc","content_hash":"43c11155d74ce32355129c3aac019c07279a4d31c0d58334e9fd5cb100108373","title":"Test child issue","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:00:42.368282-08:00","updated_at":"2025-11-05T13:01:11.64526-08:00","closed_at":"2025-11-05T13:01:11.64526-08:00","source_repo":"."} -{"id":"bd-h8um","content_hash":"942bdfde12b32d268a7643fb64e4f92fa466cb6564434283a38378f1ce44973e","title":"Issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:21.529003-08:00","updated_at":"2025-11-07T19:04:21.529003-08:00","source_repo":".","dependencies":[{"issue_id":"bd-h8um","depends_on_id":"bd-76cu","type":"blocks","created_at":"2025-11-07T19:04:21.586928-08:00","created_by":"daemon"}]} {"id":"bd-hsl3","content_hash":"10f9e86152715c67df6e6e4910c610574e7d83a41574d32956d755d1cf5e19aa","title":"Updated title","description":"","status":"in_progress","priority":0,"issue_type":"feature","created_at":"2025-11-07T19:07:12.92354-08:00","updated_at":"2025-11-07T19:07:12.94794-08:00","source_repo":"."} {"id":"bd-hv01","content_hash":"cfa89d4d4e1c183c1d602c61fe46d5fc1222db5362ac2d332735a36ee152d38a","title":"Deletions not propagated across multi-workspace sync","description":"## Problem\n\nWhen working with multiple beads workspaces (clones) sharing the same git remote, deleted issues keep coming back.\n\n## Reproduction\n\n1. Clone A deletes issue `bd-xyz` via `bd delete bd-xyz --force`\n2. Clone A daemon syncs and pushes to GitHub\n3. Clone B still has `bd-xyz` in its database\n4. Clone B daemon exports and pushes its JSONL\n5. Clone A pulls and imports → `bd-xyz` comes back!\n\n## Root Cause\n\n**No deletion tracking mechanism.** The system has no way to distinguish between:\n- \"Issue doesn't exist in JSONL because it was deleted\" \n- \"Issue doesn't exist in JSONL because the export is stale\"\n\nImport treats missing issues as \"not in this export\" rather than \"explicitly deleted.\"\n\n## Solution Options\n\n1. **Tombstone records** - Keep deleted issues in JSONL with `\"status\":\"deleted\"` or `\"deleted_at\"` field\n2. **Deletion log** - Separate `.beads/deletions.jsonl` file tracking all deleted IDs\n3. **Three-way merge** - Import compares: DB state, old JSONL, new JSONL\n4. **Manual conflict resolution** - Detect resurrection and prompt user\n\n## Related\n\n- Similar to resurrection logic for orphaned children (bd-cc4f)\n- beads-merge tool handles this better with 3-way merge","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T18:34:24.094474-08:00","updated_at":"2025-11-06T17:52:24.860716-08:00","closed_at":"2025-11-06T17:52:24.860716-08:00","source_repo":".","dependencies":[{"issue_id":"bd-hv01","depends_on_id":"bd-qqvw","type":"blocks","created_at":"2025-11-05T18:42:35.485002-08:00","created_by":"daemon"}]} {"id":"bd-hw3c","content_hash":"83359ec96e2b8fc9ce2ece25d56bfbc1c1f948b27dfa56cc7b3715dc86c6d024","title":"Fix GH #227: bd edit broken pipe errors","description":"bd edit command gets \"broken pipe\" errors when using daemon mode because editing can take minutes and the daemon connection times out.\n\nSolution: Force bd edit to always use direct mode (--no-daemon) since it's human-only and interactive.\n\nFixed by checking cmd.Name() == \"edit\" in main.go PersistentPreRun and setting noDaemon = true.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T14:36:04.289431-08:00","updated_at":"2025-11-05T14:36:08.103964-08:00","closed_at":"2025-11-05T14:36:08.103964-08:00","source_repo":"."} -{"id":"bd-i7ir","content_hash":"23f97088bca298f24d56312ee9aa5a14c4dd061a05eedae7e3f4d251786be4e1","title":"Blocked issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.310313-08:00","updated_at":"2025-11-07T19:04:22.310313-08:00","source_repo":"."} {"id":"bd-iou5","content_hash":"bfbbced6cfdc0a9746475fa63d6703aa863929836a302fc77c87f6e94fc892c6","title":"Detect and warn about outdated git hooks","description":"Users may have outdated git hooks installed that reference removed flags (e.g., --resolve-collisions). bd should detect this and warn users to reinstall.","design":"\n- Add version comments to hook templates (e.g., # bd-hooks-v0.21.0)\n- Check during 'bd info' or 'bd daemon start' (not every command to avoid overhead)\n- Compare installed hook version against current bd version\n- Warn with clear message: 'Git hooks are outdated (v0.X.Y), run: examples/git-hooks/install.sh'\n- Could also check if hooks exist but aren't installed at all","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-06T13:59:45.778781-08:00","updated_at":"2025-11-06T15:02:16.928192-08:00","closed_at":"2025-11-06T15:02:16.928192-08:00","source_repo":"."} {"id":"bd-iov0","content_hash":"6a7daf8069628210263fd1fdbf6b9890beab65b764bf0b019c1bb2bc104d5986","title":"Document -short flag in testing guide","description":"Add documentation about the -short flag and how it's used to skip slow tests. Should explain that developers can run 'go test -short ./...' for fast iteration and 'go test ./...' for full coverage.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-06T17:30:49.618187-08:00","updated_at":"2025-11-06T19:42:32.977698-08:00","closed_at":"2025-11-06T19:41:08.643188-08:00","source_repo":"."} {"id":"bd-irq6","content_hash":"67746afe139a143851078f4240fa40379c7b7d8559c906bca56acb2cdab537cc","title":"Remove unused global daemon infrastructure (internal/daemonrunner/)","description":"The internal/daemonrunner/ package (1,468 LOC) contains the old global daemon implementation that is no longer used. We now use per-workspace daemons.\n\nDeadcode analysis shows all these functions are unreachable:\n- Daemon.Start, runGlobalDaemon, setupLock\n- validateSingleDatabase, validateSchemaVersion\n- registerDaemon, unregisterDaemon\n- validateDatabaseFingerprint\n- Full git client implementation (NewGitClient, HasUpstream, HasChanges, Commit, Push, Pull)\n- Helper functions: isGitRepo, gitHasUpstream, gitHasChanges, gitCommit\n\nThe entire package appears unused since switching to per-workspace daemon architecture.\n\nFiles to remove:\n- daemon.go (9,436 bytes)\n- git.go (3,510 bytes) \n- sync.go (6,401 bytes)\n- fingerprint.go (2,076 bytes)\n- process.go (3,332 bytes)\n- rpc.go (994 bytes)\n- config.go (486 bytes)\n- logger.go (1,579 bytes)\n- flock_*.go (platform-specific file locking)\n- signals_*.go (platform-specific signal handling)\n- All test files\n\nTotal cleanup: ~1,500 LOC","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T19:30:50.936943-08:00","updated_at":"2025-11-06T19:35:10.646498-08:00","closed_at":"2025-11-06T19:35:10.646498-08:00","source_repo":"."} {"id":"bd-it3x","content_hash":"f0566e8e346569a0d4a90fdf77e8528f3524699ed7c1d6e3f98d5cc31bc7361d","title":"Issue with labels","description":"","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:07:18.388873-08:00","updated_at":"2025-11-07T19:07:18.388873-08:00","source_repo":".","labels":["backend","urgent"]} -{"id":"bd-iua5","content_hash":"34be64d334d86b421cb60e743f9d259a1e14f6d5fdc435a7094dc39dd8e4bb0f","title":"Test integration issue","description":"This is a real integration test","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:04:16.738615-08:00","updated_at":"2025-11-07T19:04:16.738615-08:00","source_repo":"."} {"id":"bd-iye7","content_hash":"5b39d4322d23d2a38968d81f5100cb438de4cc935f1d6d6be73e8db4be57f1bd","title":"Add path normalization to getMultiRepoJSONLPaths()","description":"From bd-xo6b code review: getMultiRepoJSONLPaths() does not handle non-standard paths correctly.\n\nProblems:\n- No tilde expansion: ~/repos/foo treated as literal path\n- No absolute path conversion: ../other-repo breaks if working directory changes\n- No duplicate detection: If Primary=. and Additional=[.], same JSONL processed twice\n- No empty string handling: Empty paths create invalid /.beads/issues.jsonl\n\nImpact:\nConfig with tilde or relative paths will fail\n\nFix needed:\n1. Use filepath.Abs() for all paths\n2. Add tilde expansion via os.UserHomeDir()\n3. Deduplicate paths (use map to track seen paths)\n4. Filter out empty strings\n5. Validate paths exist and are readable\n\nFiles:\n- cmd/bd/deletion_tracking.go:333-358 (getMultiRepoJSONLPaths function)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T19:31:51.882743-08:00","updated_at":"2025-11-06T19:35:41.246311-08:00","closed_at":"2025-11-06T19:35:41.246311-08:00","source_repo":".","dependencies":[{"issue_id":"bd-iye7","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.267906-08:00","created_by":"daemon"}]} {"id":"bd-j0rm","content_hash":"a9d63140e09a3aba769436c54c204e9369912a7d8d51d2aae9e68c8148357d3b","title":"Ready issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:05:35.35216-08:00","updated_at":"2025-11-07T19:05:35.35216-08:00","source_repo":"."} {"id":"bd-j5aj","content_hash":"2236f911e6f321a74aa61bdf702d24949e44a68ed511d12dd011aa4103c89230","title":"Issue 2","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:16.364549-08:00","updated_at":"2025-11-07T19:07:16.364549-08:00","source_repo":"."} @@ -298,7 +291,6 @@ {"id":"bd-la9d","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:02.01987-08:00","updated_at":"2025-11-07T19:07:02.01987-08:00","source_repo":"."} {"id":"bd-lwnt","content_hash":"ddfa247870eb3734ffa7a4d0da6fcd4a359d2b48e02d70aad8560ec4bc13afdc","title":"Test P1 priority","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T12:58:38.074112-08:00","updated_at":"2025-11-05T12:58:44.711763-08:00","closed_at":"2025-11-05T12:58:44.711763-08:00","source_repo":"."} {"id":"bd-m0h7","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:17.073978-08:00","updated_at":"2025-11-07T19:07:17.073978-08:00","source_repo":"."} -{"id":"bd-m5r5","content_hash":"d8808071441c4faaa429c2100b421348df1750118ac618c6d68437064eb060c5","title":"Blocking issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:04:22.279412-08:00","updated_at":"2025-11-07T19:04:22.279412-08:00","source_repo":"."} {"id":"bd-mg29","content_hash":"0273ac8ff18573f04346daeafa659063a91220c798c7363b0a00685b5a1bcc55","title":"Test issue 1","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:07:12.212555-08:00","updated_at":"2025-11-07T19:07:12.212555-08:00","source_repo":"."} {"id":"bd-mlcz","content_hash":"35434fed7e20e8b67f7b598c46ce5dc65c111de237ea38b36a88a671b023b58b","title":"Implement bd migrate command","description":"Add bd migrate command to move issues between repos with filtering. Should support: filtering by status/priority/labels, dry-run mode, preserving dependencies, handling source_repo field updates.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:04:29.902151-08:00","updated_at":"2025-11-05T18:42:52.536951-08:00","closed_at":"2025-11-05T18:42:52.536951-08:00","source_repo":".","dependencies":[{"issue_id":"bd-mlcz","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.072312-08:00","created_by":"daemon"}]} {"id":"bd-mn9p","content_hash":"89752e08d5a278ed301c655753e07bc2b564e710ce6d9e7e535bbd9ec48af182","title":"bd-hv01: Brittle string comparison breaks with JSON field reordering","description":"## Problem\ndeletion_tracking.go:125 uses string comparison to detect unchanged issues:\n\n```go\nif leftLine, existsInLeft := leftIndex[id]; existsInLeft \u0026\u0026 leftLine == baseLine {\n deletions = append(deletions, id)\n}\n```\n\nThis breaks if:\n- JSON field order changes (legal in JSON)\n- Timestamps updated by import/export\n- Whitespace/formatting changes\n- Floating point precision varies\n\n## Example Failure\n```json\n// baseLine\n{\"id\":\"bd-1\",\"priority\":1,\"status\":\"open\"}\n// leftLine (same data, different order)\n{\"id\":\"bd-1\",\"status\":\"open\",\"priority\":1}\n```\nThese are semantically identical but string comparison fails.\n\n## Fix\nParse and compare JSON semantically:\n```go\nfunc jsonEquals(a, b string) bool {\n var objA, objB map[string]interface{}\n json.Unmarshal([]byte(a), \u0026objA)\n json.Unmarshal([]byte(b), \u0026objB)\n return reflect.DeepEqual(objA, objB)\n}\n```\n\n## Files Affected\n- cmd/bd/deletion_tracking.go:125\n- cmd/bd/deletion_tracking.go:134-170 (buildIDToLineMap)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:35.090716-08:00","updated_at":"2025-11-06T18:46:55.889888-08:00","closed_at":"2025-11-06T18:46:55.889888-08:00","source_repo":".","dependencies":[{"issue_id":"bd-mn9p","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.790898-08:00","created_by":"daemon"}]} @@ -311,7 +303,6 @@ {"id":"bd-o43","content_hash":"4caa0f14a58127378a533362ec0292833b6d59195e503fab7505180c9c5c0438","title":"Add richer query capabilities to bd list","description":"Current bd list filters are limited to basic field matching (status, priority, type, assignee, label). This forces users to resort to piping through jq for common queries.\n\nMissing query capabilities:\n- Pattern matching: --title-contains, --desc-contains\n- Date ranges: --created-after, --updated-before, --closed-after\n- Empty/null checks: --empty-description, --no-assignee, --no-labels\n- Numeric ranges: --priority-min, --priority-max\n- Complex boolean logic: --and, --or operators\n- Full-text search: --search across all text fields\n- Negation: --not-status, --exclude-label\n\nExample use cases:\n- Find issues with empty descriptions\n- Find stale issues not updated in 30 days\n- Find high-priority bugs with no assignee\n- Search for keyword across title/description/notes\n\nImplementation approach:\n- Add query builder pattern to storage layer\n- Support --query DSL for complex queries\n- Keep simple flags for common cases\n- Add --json output for programmatic use","notes":"## Progress Update\n\n**Completed:**\n- ✅ Extended IssueFilter struct with new fields (pattern matching, date ranges, empty/null checks, priority ranges)\n- ✅ Updated SQLite SearchIssues implementation \n- ✅ Added CLI flags to list.go\n- ✅ Added parseTimeFlag helper\n- ✅ Comprehensive tests added - all passing\n\n**Remaining:**\n- ⚠️ RPC layer needs updating (internal/rpc/protocol.go ListArgs)\n- ⚠️ Daemon handler needs to forward new filters\n- ⚠️ End-to-end testing with daemon mode\n- 📝 Documentation updates\n\n**Files Modified:**\n- internal/types/types.go\n- internal/storage/sqlite/sqlite.go \n- cmd/bd/list.go\n- cmd/bd/list_test.go\n\n**Next Steps:**\n1. Update RPC protocol\n2. Update daemon handler \n3. Test with daemon mode\n4. Update docs","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T00:17:48.677493-08:00","updated_at":"2025-11-05T00:33:38.998433-08:00","closed_at":"2025-11-05T00:33:38.998433-08:00","source_repo":"."} {"id":"bd-oif6","content_hash":"5732dcbfd354e39ae9249cbae70f08ec1ccf026a812129519dfda5a8588e5ad1","title":"Vendor beads-merge Go code into internal/merge/","description":"Copy beads-merge source code from @neongreen's repo into bd codebase.\n\n**Tasks**:\n- Create `internal/merge/` package\n- Copy merge algorithm code\n- Add attribution header to all files\n- Update imports to use bd's internal types\n- Add LICENSE/ATTRIBUTION file crediting @neongreen\n- Keep original algorithm intact\n\n**Source**: https://github.com/neongreen/mono/tree/main/beads-merge","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.405283-08:00","updated_at":"2025-11-05T18:52:53.71713-08:00","closed_at":"2025-11-05T18:52:53.71713-08:00","source_repo":".","dependencies":[{"issue_id":"bd-oif6","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.69196-08:00","created_by":"daemon"}]} {"id":"bd-omx1","content_hash":"e61d74adb03fc8275c97242df8ce0e4146db7e49271e4e86c3379b4a3fbab0d8","title":"Add `bd merge` command wrapping 3-way merge logic","description":"Implement CLI command to invoke beads-merge functionality.\n\n**Interface**:\n```bash\nbd merge \u003coutput\u003e \u003cbase\u003e \u003cleft\u003e \u003cright\u003e\nbd merge --debug \u003coutput\u003e \u003cbase\u003e \u003cleft\u003e \u003cright\u003e\n```\n\n**Behavior**:\n- Exit code 0 on clean merge\n- Exit code 1 if conflicts (write conflict markers)\n- Support --debug flag for verbose output\n- Match beads-merge's existing behavior\n\n**File**: `cmd/bd/merge.go`","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T18:42:20.427429-08:00","updated_at":"2025-11-05T19:01:29.071365-08:00","closed_at":"2025-11-05T19:01:29.071365-08:00","source_repo":".","dependencies":[{"issue_id":"bd-omx1","depends_on_id":"bd-qqvw","type":"parent-child","created_at":"2025-11-05T18:42:28.709123-08:00","created_by":"daemon"},{"issue_id":"bd-omx1","depends_on_id":"bd-oif6","type":"blocks","created_at":"2025-11-05T18:42:35.436444-08:00","created_by":"daemon"}]} -{"id":"bd-ovfb","content_hash":"10f9e86152715c67df6e6e4910c610574e7d83a41574d32956d755d1cf5e19aa","title":"Updated title","description":"","status":"in_progress","priority":0,"issue_type":"feature","created_at":"2025-11-07T19:04:18.14297-08:00","updated_at":"2025-11-07T19:04:18.167504-08:00","source_repo":"."} {"id":"bd-p68x","content_hash":"65d91db2b3dea8e73af4b5830daf7b815c2b53dfdf7f7dbdd3e2ac24ea41c1ce","title":"Create examples for common workflows","description":"Add examples/ subdirectories: OSS contributor workflow, team branch workflow, multi-phase development, multiple personas (architect/implementer). Each with README and sample configs.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:04:30.128257-08:00","updated_at":"2025-11-05T19:08:39.035904-08:00","closed_at":"2025-11-05T19:08:39.035904-08:00","source_repo":".","dependencies":[{"issue_id":"bd-p68x","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.247515-08:00","created_by":"daemon"}]} {"id":"bd-pdwz","content_hash":"5c35a877ec5fa3af14a45a920764e7a4c289f93c427a479da7b335c068195af0","title":"Add t.Parallel() to slow hash multiclone tests","description":"Add t.Parallel() to TestHashIDs_MultiCloneConverge and TestHashIDs_IdenticalContentDedup so they run concurrently.\n\nExpected savings: ~10 seconds (from 20s to ~11s)\n\nImplementation:\n- Add t.Parallel() call at start of each test function\n- Verify tests don't share resources that would cause conflicts\n- Run tests to confirm they work in parallel\n\nFile: beads_hash_multiclone_test.go:34, :101","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-04T01:24:15.705228-08:00","updated_at":"2025-11-04T09:52:31.945545-08:00","closed_at":"2025-11-04T09:52:31.945545-08:00","source_repo":".","dependencies":[{"issue_id":"bd-pdwz","depends_on_id":"bd-l5gq","type":"blocks","created_at":"2025-11-04T01:24:15.706149-08:00","created_by":"daemon"}]} {"id":"bd-phr2","content_hash":"dad569e80b9fbb87d2a02b6f2c8260ad5d925c6c7a6481d226804c1e896537d5","title":"Test issue 0","description":"","status":"open","priority":0,"issue_type":"task","created_at":"2025-11-07T19:04:17.396273-08:00","updated_at":"2025-11-07T19:04:17.396273-08:00","source_repo":"."} @@ -319,7 +310,6 @@ {"id":"bd-q29r","content_hash":"dad569e80b9fbb87d2a02b6f2c8260ad5d925c6c7a6481d226804c1e896537d5","title":"Test issue 0","description":"","status":"open","priority":0,"issue_type":"task","created_at":"2025-11-07T19:07:12.18009-08:00","updated_at":"2025-11-07T19:07:12.18009-08:00","source_repo":"."} {"id":"bd-q2ri","content_hash":"472cf1c393423f4ec4a4e74a971be0f44fd4b8186ea276860fe0947d031e3eb1","title":"bd-hv01: Add comprehensive edge case tests for deletion tracking","description":"Need to add tests for: corrupted snapshot file, stale snapshot (\u003e 1 hour), concurrent sync operations (daemon + manual), partial deletion failure, empty remote JSONL, multi-repo mode with deletions, git worktree scenario.\n\nAlso refine TestDeletionWithLocalModification to check for specific conflict error instead of accepting any error.\n\nFiles: cmd/bd/deletion_tracking_test.go","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T18:16:26.849881-08:00","updated_at":"2025-11-06T20:16:47.977772-08:00","closed_at":"2025-11-06T19:55:39.700695-08:00","source_repo":".","dependencies":[{"issue_id":"bd-q2ri","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:15.104113-08:00","created_by":"daemon"}]} {"id":"bd-q652","content_hash":"6f82025a53153a5ac1398238a9d8c73ad4c3f9d49602ff8d983aefbf7432134c","title":"Database pollution in ~/src/dave/vc: 895 issues vs canonical 310","description":"~/src/dave/vc/.beads/beads.db has 895 total issues (675 open, 149 closed), but canonical ~/src/vc/.beads/vc.db has only 310 issues (230 open). This is 585 extra issues - likely pollution from other repositories.\n\nNeed to:\n1. Identify which issues are polluted (use detect-pollution)\n2. Compare issue IDs between dave/vc and canonical vc databases\n3. Determine pollution source (beads repo? other repos?)\n4. Clean up polluted database\n5. Root cause: why did pollution occur?","notes":"Investigation findings so far:\n- Polluted DB (~/src/dave/vc/.beads/beads.db): 241 issues (180 open, 43 closed)\n- Canonical DB (~/src/vc/.beads/vc.db): 310 issues (230 open, 62 closed)\n- Contradiction: Polluted has FEWER issues, not more (241 \u003c 310, diff of 69)\n- Only 1 unique ID in polluted: vc-55fi\n- All source_repo fields are set to \".\" in both databases\n- Issue description claims 895 issues in polluted vs 310 canonical - numbers don't match current state\n- Possible: Pollution was already partially cleaned, or issue description refers to different database?","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T00:07:37.999168-08:00","updated_at":"2025-11-07T00:13:32.179396-08:00","closed_at":"2025-11-07T00:13:32.179396-08:00","source_repo":"."} -{"id":"bd-qd25","content_hash":"f0566e8e346569a0d4a90fdf77e8528f3524699ed7c1d6e3f98d5cc31bc7361d","title":"Issue with labels","description":"","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:00:21.302685-08:00","updated_at":"2025-11-07T19:00:21.302685-08:00","source_repo":".","labels":["backend","urgent"]} {"id":"bd-qqvw","content_hash":"4ebc3fe07be2e97af495256d16475c1b69a98a4912cfc608c8bffc4017e37c4e","title":"Vendor and integrate beads-merge tool","description":"Incorporate @neongreen's beads-merge 3-way merge tool into bd to solve:\n- Multi-workspace deletion sync (bd-hv01)\n- Git merge conflicts in JSONL\n- Field-level intelligent merging\n\n**Repository**: https://github.com/neongreen/mono/tree/main/beads-merge\n\n**Integration approach**: Vendor the Go code with attribution, pending @neongreen's approval (GitHub issue #240)\n\n**Benefits**:\n- Prevents deletion resurrection bug\n- Smart dependency merging (union + dedup)\n- Timestamp handling (max wins)\n- Detects deleted-vs-modified conflicts\n- Works as git merge driver\n\n**Acceptance criteria**:\n- beads-merge code vendored into bd codebase\n- Available as `bd merge` command\n- Git merge driver setup during `bd init`\n- Tests verify 3-way merge logic\n- Documentation updated\n- @neongreen credited","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-05T18:41:59.500359-08:00","updated_at":"2025-11-06T15:40:24.796921-08:00","closed_at":"2025-11-06T15:40:24.796921-08:00","source_repo":"."} {"id":"bd-qs4p","content_hash":"46a4cf3491c85c38d7bf9e3ffc260c939d76e471d9dae41785de197269e3c05c","title":"bd import fails on duplicate external_ref with no resolution options","description":"When JSONL contains duplicate external_ref values (e.g., two issues both have external_ref='BS-170'), bd import fails entirely with no resolution options.\n\nUser must manually edit JSONL to remove duplicates, which is error-prone.\n\nExample error:\n```\nbatch import contains duplicate external_ref values:\nexternal_ref 'BS-170' appears in issues: [opal-39 opal-43]\n```\n\nShould handle this similar to duplicate issue detection - offer to merge, pick one, or clear duplicates.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T10:53:41.906165-08:00","updated_at":"2025-11-06T11:03:16.975041-08:00","closed_at":"2025-11-06T11:03:16.975041-08:00","source_repo":"."} {"id":"bd-r1pf","content_hash":"a5801e7c27c9a70bcfc3cc08f9fcd20cf8e1245cc5f4f7338b8d1e794971b759","title":"Test label","description":"","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-06T20:16:20.609492-08:00","updated_at":"2025-11-06T20:16:34.973855-08:00","closed_at":"2025-11-06T20:16:34.973855-08:00","source_repo":".","labels":[""," urgent "," bug "," critical "]} @@ -349,7 +339,6 @@ {"id":"bd-xi3q","content_hash":"a9d63140e09a3aba769436c54c204e9369912a7d8d51d2aae9e68c8148357d3b","title":"Ready issue","description":"","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-07T19:06:46.121803-08:00","updated_at":"2025-11-07T19:06:46.121803-08:00","source_repo":"."} {"id":"bd-xo6b","content_hash":"edf43a7439dbccd5f280111a1e277b758f5c2d4c57bd01c5086cfdd6118511e7","title":"Review multi-repo deletion tracking implementation","description":"Thoroughly review the multi-repo deletion tracking fix (bd-4oob):\n\nFiles changed:\n- cmd/bd/deletion_tracking.go: Added getMultiRepoJSONLPaths() helper\n- cmd/bd/daemon_sync.go: Updated snapshot capture/update logic for multi-repo\n- cmd/bd/deletion_tracking_test.go: Added 2 new tests (287 lines)\n\nReview focus areas:\n1. Correctness: Does getMultiRepoJSONLPaths() handle all edge cases?\n2. Performance: Calling getMultiRepoJSONLPaths() 3x per sync (snapshot capture, merge, base update) - should we cache?\n3. Error handling: What if some repos fail snapshot operations but others succeed?\n4. Race conditions: Multiple daemons in different repos?\n5. Test coverage: Are TestMultiRepoDeletionTracking and TestMultiRepoSnapshotIsolation sufficient?\n6. Path handling: Absolute vs relative paths, tilde expansion\n\nThis is fresh code - needs careful review before considering deletion tracking production-ready.","notes":"Code review completed. Overall assessment: Core deletion tracking logic is sound, but error handling and path handling issues make this not yet production-ready for multi-repo scenarios.\n\nKey findings:\n\nCRITICAL ISSUES (Priority 1):\n1. Inconsistent error handling in daemon_sync.go - snapshot/merge fail hard but base update warns. Can leave DB in inconsistent state with no rollback. See bd-sjmr.\n2. No path normalization in getMultiRepoJSONLPaths() - tilde expansion, relative paths, duplicates not handled. See bd-iye7.\n\nSHOULD FIX (Priority 2):\n3. Missing test coverage for edge cases - empty paths, duplicates, partial failures. See bd-kdoh.\n4. Performance - getMultiRepoJSONLPaths() called 3x per sync (minor issue). See bd-we4p.\n\nWHAT WORKS WELL:\n- Atomic file operations with PID-based temp files\n- Good snapshot isolation between repos\n- Race condition protection via exclusive locks\n- Solid test coverage for happy path scenarios\n\nVERDICT: Address bd-iye7 and bd-sjmr before considering deletion tracking production-ready for multi-repo mode.\n\nDetailed review notes available in conversation history.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-06T19:23:52.402949-08:00","updated_at":"2025-11-06T19:32:34.160341-08:00","closed_at":"2025-11-06T19:32:34.160341-08:00","source_repo":".","dependencies":[{"issue_id":"bd-xo6b","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T19:23:52.403723-08:00","created_by":"daemon"}]} {"id":"bd-yek6","content_hash":"f155913af8c58c0a7ea3da6a7d9e232e8cb29c3825f2d6f272a5417a449692a9","title":"CLI tests (cli_fast_test.go) are slow and should be integration tests","description":"The TestCLI_* tests in cmd/bd/cli_fast_test.go are taking 4-5 seconds each (40+ seconds total), making them the slowest part of the fast test suite.\n\nCurrent timings:\n- TestCLI_Import: 4.73s\n- TestCLI_Blocked: 4.33s \n- TestCLI_DepTree: 4.15s\n- TestCLI_Close: 3.59s\n- TestCLI_DepAdd: 3.50s\n- etc.\n\nThese tests compile the bd binary once in init(), but then execute it multiple times per test with filesystem operations. Despite being named \"fast\", they're actually end-to-end CLI integration tests.\n\nOptions:\n1. Tag with //go:build integration (move to integration suite)\n2. Optimize: Use in-memory databases, reduce exec calls, better parallelization\n3. Keep as-is but understand they're the baseline for \"fast\" tests\n\nTotal test suite currently: 13.8s (cmd/bd alone is 12.8s, and most of that is these CLI tests)","notes":"Fixed by reusing existing bd binary from repo root instead of rebuilding.\n\nBefore: 15+ minutes (rebuilding binary for every test package)\nAfter: ~12 seconds (reuses pre-built binary)\n\nThe init() function now checks for ../../bd first before falling back to building. This means `go build \u0026\u0026 go test` is now fast.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T20:19:12.822543-08:00","updated_at":"2025-11-05T20:31:19.321787-08:00","closed_at":"2025-11-05T20:31:19.321787-08:00","source_repo":"."} -{"id":"bd-yp9g","content_hash":"f0566e8e346569a0d4a90fdf77e8528f3524699ed7c1d6e3f98d5cc31bc7361d","title":"Issue with labels","description":"","status":"open","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:04:23.578661-08:00","updated_at":"2025-11-07T19:04:23.578661-08:00","source_repo":".","labels":["backend","urgent"]} {"id":"bd-yyhd","content_hash":"cdd43e0460cfe2e1c0f49728248d4bb441f5c6b17943dd9d13efe32de3e42147","title":"Issue to close","description":"","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T19:04:18.800395-08:00","updated_at":"2025-11-07T19:04:18.823022-08:00","closed_at":"2025-11-07T19:04:18.823022-08:00","source_repo":"."} {"id":"bd-z528","content_hash":"807c7f1f9d3d15e510c14de34ca1536a971f00d324b7c8684c07cb32ac74ddba","title":"Prevent test pollution in production database","description":"The bd-vxdr cleanup revealed test issues were created during manual testing in the production workspace (Nov 2-4, template feature development).\n\n**Root cause:** Manual testing with `./bd create \"Test issue\"` pollutes the production .beads database.\n\n**Prevention strategies:**\n1. Use TEST_DB environment variable for manual testing\n2. Add warning when creating issues with \"Test\" prefix\n3. Improve developer docs about testing workflow\n4. Consider adding `bd test-mode` command for isolated testing","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-07T16:07:28.255289-08:00","updated_at":"2025-11-07T16:07:28.255289-08:00","source_repo":"."} {"id":"bd-zbq2","content_hash":"3fec118fa6f489216810cbd5ba95a80799acc6d8dbeb12a3188695d649cb12c9","title":"bd export should verify JSONL line count matches database count","description":"After export completes, bd should verify that the JSONL file line count matches the number of issues exported. This would catch silent failures where the export appears to succeed but doesn't actually write all issues.\n\nReal-world scenario from VC project:\n- Ran direct SQL DELETE to remove 240 issues \n- Ran 'bd export -o .beads/issues.jsonl'\n- No error shown, appeared to succeed\n- But JSONL file was not updated (still had old line count)\n- Later session found all 240 issues still in JSONL\n- Had to repeat the cleanup\n\nIf export had verified line count, it would have immediately shown:\n Error: Export verification failed\n Expected: 276 issues\n JSONL file: 516 lines\n Mismatch indicates export failed to write all issues\n\nThis is especially important because:\n1. JSONL is source of truth in git\n2. Silent export failures cause data inconsistency\n3. Users assume export succeeded if no error shown\n4. The verification is cheap (just count lines)\n\nImplementation:\n- After writing JSONL, count lines in file\n- Compare to len(exportedIDs)\n- If mismatch, remove temp file and return error\n- Show clear error message with both counts","design":"In cmd/bd/export.go, after atomic rename (line ~301):\n\n1. Count lines in final JSONL file:\n - Read file and count newlines\n - Or reuse countIssuesInJSONL() helper (already exists)\n\n2. Compare to len(exportedIDs)\n\n3. If mismatch:\n - Log error with both counts\n - Optionally: remove the bad JSONL file (or leave for debugging?)\n - Return error (exit 1)\n\n4. Consider adding --skip-verify flag for edge cases\n\nEdge cases:\n- Partial line writes (corrupted file)\n- File system issues\n- Race conditions (another process modifying JSONL during export)\n\nThe countIssuesInJSONL() function already exists at line 20, can reuse it.","acceptance_criteria":"1. bd export verifies JSONL line count after write\n2. Clear error shown if mismatch detected\n3. Test case that simulates partial write failure\n4. Does not affect export performance significantly (line counting is fast)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-05T14:24:56.278249-08:00","updated_at":"2025-11-05T14:31:24.494885-08:00","closed_at":"2025-11-05T14:31:24.494885-08:00","source_repo":"."}