diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index d87b28f6..4d275389 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -127,6 +127,7 @@ {"id":"bd-1juu","title":"Merge: obsidian-mjxeci6l","description":"branch: polecat/obsidian-mjxeci6l\ntarget: main\nsource_issue: obsidian-mjxeci6l\nrig: beads\nagent_bead: bd-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T13:44:06.098083-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-02T17:14:50.490086-08:00","closed_at":"2026-01-02T17:14:50.490086-08:00","close_reason":"Orphaned MR - obsidian stopped (merged no-op), branch never pushed"} {"id":"bd-1jylp","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T00:42:19.49972-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:42:19.562255-08:00","closed_at":"2026-01-11T00:42:19.562255-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1l5vn","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T07:56:14.028903-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T07:56:14.071442-08:00","closed_at":"2026-01-11T07:56:14.071442-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-1l7cm","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:25:54.564703-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:25:54.620403-08:00","closed_at":"2026-01-12T02:25:54.620403-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1ls","title":"Override test","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","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-03T20:15:10.01471-08:00","updated_at":"2025-11-03T22:07:10.946574-08:00","closed_at":"2025-11-03T22:07:10.946574-08:00"} {"id":"bd-1mc7t","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:10:16.382073-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:10:16.416022-08:00","closed_at":"2026-01-11T00:10:16.416022-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1mzt","title":"Client self-heal: remove stale pid when lock free + socket missing","description":"When client detects:\n- Socket is missing AND\n- tryDaemonLock shows lock NOT held\n\nThen automatically:\n1. Remove stale daemon.pid file\n2. Optionally auto-start daemon (behind BEADS_AUTO_START_DAEMON=1 env var)\n\nThis prevents stale artifacts from accumulating after daemon crashes.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-07T16:42:12.75205-08:00","updated_at":"2025-11-07T22:07:17.342845-08:00","closed_at":"2025-11-07T21:21:15.317562-08:00","dependencies":[{"issue_id":"bd-1mzt","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.753099-08:00","created_by":"daemon"}]} @@ -134,6 +135,7 @@ {"id":"bd-1p8jx","title":"Digest: mol-refinery-patrol","description":"Patrol: Queue empty, no branches processed, inbox clear","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:04:23.826002-08:00","updated_at":"2026-01-10T23:04:23.826002-08:00","closed_at":"2026-01-10T23:04:23.82595-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-1pj6","title":"Proposal: Custom status states via config","description":"Proposal to add 'custom status states' via `bd config`.\nUsers could define an optional issue status enum (e.g., awaiting_review, review_in_progress) in the config.\nThis would enable multi-step pipelines to process issues where each step correlates to a specific status.\n\nExamples:\n- awaiting_verification\n- awaiting_docs\n- awaiting_testing\n","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-11-20T18:55:48.670499-05:00","updated_at":"2025-12-09T18:38:37.668809171-05:00","closed_at":"2025-11-28T23:18:45.862553-08:00"} {"id":"bd-1pr6","title":"Time-dependent worktree detection tests may be flaky","status":"hooked","priority":3,"issue_type":"task","created_at":"2025-12-26T01:21:22.065353-08:00","updated_at":"2025-12-30T15:44:43.360441-08:00"} +{"id":"bd-1qyxt","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:16:51.038541-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-12T18:16:51.087133-08:00","closed_at":"2026-01-12T18:16:51.087133-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-1rh","title":"cmd/bd test suite is absurdly slow - 279 tests taking 8+ minutes","description":"# Problem\n\nThe cmd/bd test suite is painfully slow:\n- **279 tests** in cmd/bd alone\n- Full suite takes **8+ minutes** to run\n- Even with the 16 slowest integration tests now tagged with `integration` build tag, the remaining tests still take forever\n\nThis makes the development loop unusable. We can't wait 8+ minutes every time we want to run tests.\n\n# Root Cause Analysis\n\n## 1. Sheer Volume\n279 tests is too many for a single package. Even at 0.1s per test, that's 28 seconds minimum just for cmd/bd.\n\n## 2. Each Test Creates Full Database + Temp Directories\nEvery test does heavy setup:\n- Creates temp directory (`t.TempDir()` or `os.MkdirTemp`)\n- Initializes SQLite database\n- Sets up git repo in many cases\n- Creates full storage layer\n\nExample from the tests:\n```go\nfunc setupCLITestDB(t *testing.T) string {\n tmpDir := createTempDirWithCleanup(t)\n runBDInProcess(t, tmpDir, \"init\", \"--prefix\", \"test\", \"--quiet\")\n return tmpDir\n}\n```\n\nThis happens 279 times!\n\n## 3. Tests Are Not Properly Categorized\nWe have three types of tests mixed together:\n- **Unit tests** - should be fast, test single functions\n- **Integration tests** - test full workflows, need DB/git\n- **End-to-end tests** - test entire CLI commands\n\nThey're all lumped together in cmd/bd, all running every time.\n\n# What We've Already Fixed\n\nAdded `integration` build tags to 16 obviously-slow test files:\n- import_profile_test.go (performance benchmarking tests)\n- export_mtime_test.go (tests with time.Sleep calls)\n- cli_fast_test.go (full CLI integration tests)\n- delete_test.go, import_uncommitted_test.go, sync_local_only_test.go (git integration)\n- And 10 more in internal/ packages\n\nThese are now excluded from the default `go test ./...` run.\n\n# Proposed Solutions\n\n## Option 1: Shared Test Fixtures (Quick Win)\nCreate a shared test database that multiple tests can use:\n```go\nvar testDB *sqlite.SQLiteStorage\nvar testDBOnce sync.Once\n\nfunc getSharedTestDB(t *testing.T) storage.Storage {\n testDBOnce.Do(func() {\n // Create one DB for all tests\n })\n return testDB\n}\n```\n\n**Pros**: Easy to implement, immediate speedup\n**Cons**: Tests become less isolated, harder to debug failures\n\n## Option 2: Table-Driven Tests (Medium Win)\nCollapse similar tests into table-driven tests:\n```go\nfunc TestCreate(t *testing.T) {\n tests := []struct{\n name string\n args []string\n want string\n }{\n {\"basic issue\", []string{\"create\", \"Test\"}, \"created\"},\n {\"with description\", []string{\"create\", \"Test\", \"-d\", \"desc\"}, \"created\"},\n // ... 50 more cases\n }\n \n db := setupOnce(t) // Setup once, not 50 times\n for _, tt := range tests {\n t.Run(tt.name, func(t *testing.T) {\n // test using shared db\n })\n }\n}\n```\n\n**Pros**: Dramatically reduces setup overhead, tests run in parallel\n**Cons**: Requires refactoring, tests share more state\n\n## Option 3: Split cmd/bd Tests Into Packages (Big Win)\nMove tests into focused packages:\n- `cmd/bd/internal/clitests` - CLI integration tests (mark with integration tag)\n- `cmd/bd/internal/unittests` - Fast unit tests\n- Keep only essential tests in cmd/bd\n\n**Pros**: Clean separation, easy to run just fast tests\n**Cons**: Requires significant refactoring\n\n## Option 4: Parallel Execution (Quick Win)\nAdd `t.Parallel()` to independent tests:\n```go\nfunc TestSomething(t *testing.T) {\n t.Parallel() // Run this test concurrently with others\n // ...\n}\n```\n\n**Pros**: Easy to add, can cut time in half on multi-core machines\n**Cons**: Doesn't reduce actual test work, just parallelizes it\n\n## Option 5: In-Memory Databases (Medium Win)\nUse `:memory:` SQLite databases instead of file-based:\n```go\nstore, err := sqlite.New(ctx, \":memory:\")\n```\n\n**Pros**: Faster than disk I/O, easier cleanup\n**Cons**: Some tests need actual file-based DBs (export/import tests)\n\n# Recommended Approach\n\n**Short-term (this week)**:\n1. Add `t.Parallel()` to all independent tests in cmd/bd\n2. Use `:memory:` databases where possible\n3. Create table-driven tests for similar test cases\n\n**Medium-term (next sprint)**:\n4. Split cmd/bd tests into focused packages\n5. Mark more integration tests appropriately\n\n**Long-term (backlog)**:\n6. Consider shared test fixtures with proper isolation\n\n# Current Status\n\nWe've tagged 16 files with `integration` build tag, but the remaining 279 tests in cmd/bd still take 8+ minutes. This issue tracks fixing the cmd/bd test performance specifically.\n\n# Target\n\nGet `go test ./...` (without `-short` or `-tags=integration`) down to **under 30 seconds**.\n\n\n# THE REAL ROOT CAUSE (Updated Analysis)\n\nAfter examining the actual test code, the problem is clear:\n\n## Every Test Creates Its Own Database From Scratch\n\nLook at `create_test.go`:\n```go\nfunc TestCreate_BasicIssue(t *testing.T) {\n tmpDir := t.TempDir() // ← Creates temp dir\n testDB := filepath.Join(tmpDir, \".beads\", \"beads.db\")\n s := newTestStore(t, testDB) // ← Opens NEW SQLite connection\n // ← Runs migrations\n // ← Sets config\n // ... actual test (3 lines)\n}\n\nfunc TestCreate_WithDescription(t *testing.T) {\n tmpDir := t.TempDir() // ← Creates ANOTHER temp dir\n testDB := filepath.Join(tmpDir, \".beads\", \"beads.db\")\n s := newTestStore(t, testDB) // ← Opens ANOTHER SQLite connection\n // ... actual test (3 lines)\n}\n```\n\n**This happens 279 times!**\n\n## These Tests Don't Need Isolation!\n\nMost tests are just checking:\n- \"Can I create an issue with a title?\"\n- \"Can I create an issue with a description?\"\n- \"Can I add labels?\"\n\nThey don't conflict with each other. They could all share ONE database!\n\n## The Fix: Test Suites with Shared Setup\n\nInstead of:\n```go\nfunc TestCreate_BasicIssue(t *testing.T) {\n s := newTestStore(t, t.TempDir()+\"/db\") // ← Expensive!\n // test\n}\n\nfunc TestCreate_WithDesc(t *testing.T) {\n s := newTestStore(t, t.TempDir()+\"/db\") // ← Expensive!\n // test\n}\n```\n\nDo this:\n```go\nfunc TestCreate(t *testing.T) {\n // ONE setup for all subtests\n s := newTestStore(t, t.TempDir()+\"/db\")\n \n t.Run(\"basic_issue\", func(t *testing.T) {\n t.Parallel() // Can run concurrently - tests don't conflict\n // test using shared `s`\n })\n \n t.Run(\"with_description\", func(t *testing.T) {\n t.Parallel()\n // test using shared `s`\n })\n \n // ... 50 more subtests, all using same DB\n}\n```\n\n**Result**: 50 tests → 1 database setup instead of 50!\n\n## Why This Works\n\nSQLite is fine with concurrent reads and isolated transactions. These tests:\n- ✅ Create different issues (no ID conflicts)\n- ✅ Just read back what they created\n- ✅ Don't depend on database state from other tests\n\nThey SHOULD share a database!\n\n## Real Numbers\n\nCurrent:\n- 279 tests × (create dir + init SQLite + migrations) = **8 minutes**\n\nAfter fix:\n- 10 test suites × (create dir + init SQLite + migrations) = **30 seconds**\n- 279 subtests running in parallel using those 10 DBs = **5 seconds**\n\n**Total: ~35 seconds instead of 8 minutes!**\n\n## Implementation Plan\n\n1. **Group related tests** into suites (Create, List, Update, Delete, etc.)\n2. **One setup per suite** instead of per test\n3. **Use t.Run() for subtests** with t.Parallel()\n4. **Keep tests that actually need isolation** separate (export/import tests, git operations)\n\nThis is way better than shuffling tests into folders!","notes":"## Progress Update (2025-11-21)\n\n✅ **Completed**:\n- Audited all 280 tests, created TEST_SUITE_AUDIT.md ([deleted:bd-c49])\n- Refactored create_test.go to shared DB pattern ([deleted:bd-y6d])\n- Proven the pattern works: 11 tests now run in 0.04s with 1 DB instead of 11\n\n❌ **Current Reality**:\n- Overall test suite: Still 8+ minutes (no meaningful change)\n- Only 1 of 76 test files refactored\n- Saved ~10 DB initializations out of 280\n\n## Acceptance Criteria (REALISTIC)\n\nThis task is NOT complete until:\n- [ ] All P1 files refactored (create ✅, dep, stale, comments, list, ready)\n- [ ] Test suite runs in \u003c 2 minutes\n- [ ] Measured and verified actual speedup\n\n## Next Steps\n\n1. Refactor remaining 5 P1 files: dep_test.go, stale_test.go, comments_test.go, list_test.go, ready_test.go\n2. Measure actual time improvement after each file\n3. Continue with P2 files if needed to hit \u003c2min target","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T11:37:47.886207-05:00","updated_at":"2026-01-08T20:20:48.332191-08:00","closed_at":"2026-01-08T20:20:48.332191-08:00","close_reason":"Test suite now runs in ~17 seconds (was 8+ minutes). Issue is stale - optimizations were made.","dependencies":[{"issue_id":"bd-1rh","depends_on_id":"bd-c49","type":"blocks","created_at":"2025-11-21T11:49:26.347518-05:00","created_by":"daemon"}]} {"id":"bd-1ri4","title":"Test prefix bd-","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.240483-08:00","created_by":"stevey","updated_at":"2025-12-27T14:24:50.419881-08:00","deleted_at":"2025-12-27T14:24:50.419881-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-1slh","title":"Investigate charmbracelet-based TUI for beads","description":"Now that we've merged the create-form command (PR #603) which uses charmbracelet/huh, investigate whether beads should have a more comprehensive TUI.\n\nConsiderations:\n- Should this be in core or a separate binary (bd-tui)?\n- What functionality would benefit from a TUI? (list view, issue details, search, bulk operations)\n- Plugin/extension architecture vs build tags vs separate binary\n- Dependency cost vs user experience tradeoff\n- Target audience: humans who want interactive workflows vs CLI/scripting users\n\nRelated: PR #603 added charmbracelet/huh dependency for create-form command.","notes":"Foundation is in place (lipgloss, huh), but not a priority right now","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-17T14:20:51.503563-08:00","updated_at":"2026-01-02T00:17:14.232446-08:00"} @@ -170,6 +172,7 @@ {"id":"bd-2997","title":"bd-hv01: No snapshot versioning or timestamps causes stale data usage","description":"Problem: If sync is interrupted (crash, kill -9, power loss), stale snapshots persist indefinitely. Next sync uses stale data leading to incorrect deletions.\n\nFix: Add metadata to snapshots with timestamp, version, and commit SHA. Validate snapshots are recent (\u003c 1 hour old), from compatible version, and from expected git commit.\n\nFiles: cmd/bd/deletion_tracking.go (all snapshot functions)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-06T18:16:21.816748-08:00","updated_at":"2025-11-06T19:34:51.677442-08:00","closed_at":"2025-11-06T19:34:51.677442-08:00","dependencies":[{"issue_id":"bd-2997","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.968471-08:00","created_by":"daemon"}]} {"id":"bd-29c128e8","title":"Update AGENTS.md with event-driven mode","description":"Document BEADS_DAEMON_MODE env var. Explain opt-in during Phase 1. Add troubleshooting for watcher failures.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.433145-07:00","updated_at":"2025-12-16T01:00:47.312932-08:00","closed_at":"2025-10-29T15:53:24.019613-07:00"} {"id":"bd-29fb","title":"Implement bd close --continue flag","description":"Auto-advance to next step in molecule when closing an issue. Referenced by gt-um6q, gt-lz13. Needed for molecule navigation workflow.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:17:55.032875-08:00","updated_at":"2025-12-23T01:26:47.255313-08:00","closed_at":"2025-12-23T01:26:47.255313-08:00"} +{"id":"bd-2a0fn","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:14:20.824431-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:14:20.869986-08:00","closed_at":"2026-01-12T02:14:20.869986-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-2b34","title":"Refactor cmd/bd/daemon.go for testability and maintainability","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-31T22:28:19.689943-07:00","updated_at":"2025-11-01T19:20:28.102841-07:00","closed_at":"2025-11-01T19:20:28.102847-07:00"} {"id":"bd-2b34.1","title":"Extract daemon logger functions to daemon_logger.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.343617-07:00","updated_at":"2025-11-01T20:31:54.434039-07:00","closed_at":"2025-11-01T20:31:54.434039-07:00"} {"id":"bd-2b34.2","title":"Extract daemon server functions to daemon_server.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-31T22:28:42.345639-07:00","updated_at":"2025-11-01T21:02:58.338168-07:00","closed_at":"2025-11-01T21:02:58.338168-07:00"} @@ -197,6 +200,7 @@ {"id":"bd-2fs7","title":"Move pour/ephemeral under bd mol subcommand","description":"For consistency, bd pour and bd ephemeral should become bd mol pour and bd mol ephemeral:\n\nCurrent:\n bd mol list # Available protos\n bd mol show \u003cid\u003e # Proto details\n bd pour \u003cproto\u003e # Create mol ← sticks out\n bd ephemeral \u003cproto\u003e # Create ephemeral ← sticks out \n bd mol bond \u003cproto\u003e \u003cparent\u003e # Attach to existing mol\n bd mol squash \u003cid\u003e # Condense to digest\n bd mol burn \u003cid\u003e # Discard\n\nProposed:\n bd mol list\n bd mol show \u003cid\u003e\n bd mol pour \u003cproto\u003e # Moved under mol\n bd mol ephemeral \u003cproto\u003e # Moved under mol\n bd mol bond \u003cproto\u003e \u003cparent\u003e\n bd mol squash \u003cid\u003e\n bd mol burn \u003cid\u003e\n\nAll molecule operations should be under bd mol for discoverability and consistency.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T23:36:23.945902-08:00","created_by":"stevey","updated_at":"2025-12-26T23:41:01.096333-08:00","closed_at":"2025-12-26T23:41:01.096333-08:00"} {"id":"bd-2g79w","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:14:48.858858-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:14:48.893797-08:00","closed_at":"2026-01-11T00:14:48.893797-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-2gkg","title":"Fix path casing mismatch on macOS causing sync failures (GH#880)","description":"bd sync fails with exit status 128 when daemon started from terminal with different path casing than git worktree registry. macOS case-insensitive filesystem causes mismatch. Fix: normalize paths using realpath or canonical lowercase when daemon starts.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T16:09:19.727279-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T16:11:30.968102-08:00","closed_at":"2026-01-04T16:11:30.968102-08:00","close_reason":"Fixed: use utils.PathsEqual() for case-insensitive path comparison in worktree validation"} +{"id":"bd-2hg17","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:47:51.141032-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:47:51.203589-08:00","closed_at":"2026-01-12T02:47:51.203589-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-2hnb4","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T08:41:55.248729-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T08:41:55.319098-08:00","closed_at":"2026-01-11T08:41:55.319098-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-2ifg","title":"bd-hv01: Silent partial deletion failures cause DB inconsistency","description":"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.\n\nImpact: Database diverges from JSONL, silent corruption, issues may resurrect on next sync.\n\nFix: Collect errors and fail the operation:\nvar deletionErrors []error\nfor _, id := range acceptedDeletions {\n if err := d.DeleteIssue(ctx, id); err != nil {\n deletionErrors = append(deletionErrors, fmt.Errorf(\"issue %s: %w\", id, err))\n }\n}\nif len(deletionErrors) \u003e 0 {\n return false, fmt.Errorf(\"deletion failures: %v\", deletionErrors)\n}\n\nFiles: cmd/bd/deletion_tracking.go:73-82","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:16:19.465137-08:00","updated_at":"2025-11-06T18:46:55.901973-08:00","closed_at":"2025-11-06T18:46:55.901973-08:00","dependencies":[{"issue_id":"bd-2ifg","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.833477-08:00","created_by":"daemon"}]} {"id":"bd-2k5f","title":"GH#510: Document sync-branch worktree behavior","description":"User confused about beads creating worktree on main branch. Need docs explaining sync-branch worktree mechanism. See: https://github.com/steveyegge/beads/issues/510","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-14T16:31:58.800071-08:00","updated_at":"2025-12-16T01:27:29.057639-08:00","closed_at":"2025-12-16T01:27:29.057639-08:00"} @@ -274,7 +278,7 @@ {"id":"bd-3ee1","title":"Sync sanitize incorrectly removes newly created issues","description":"## Problem\n\nThe sync sanitize process incorrectly identifies newly created issues as 'deleted issues resurrected by git merge' and removes them from the local JSONL file.\n\n## Reproduction\n\n1. Create a new issue: bd create --title='Test issue'\n2. Run bd sync\n3. Observe: New issue appears in sanitize removal list\n4. Issue is removed from local JSONL but preserved on beads-sync branch\n\n## Observed Behavior\n\nDuring sync, the sanitize step outputs:\n```\n→ Sanitized JSONL: removed 738 deleted issue(s) that were resurrected by git merge\n - bd-08ea (newly created issue!)\n - bd-tnsq (newly created issue!)\n ...\n```\n\nThe newly created issues get removed locally but remain on beads-sync branch.\n\n## Expected Behavior\n\nNewly created issues should NOT be removed by sanitize. The sanitize should only remove issues that:\n1. Were previously deleted (have tombstones or are in deletions manifest)\n2. Are being resurrected from old git history\n\n## Root Cause Investigation\n\nThe sanitize logic likely compares the local DB snapshot against some reference and incorrectly classifies new issues as 'resurrected deleted issues'. Possible causes:\n- Snapshot protection logic not accounting for new issues\n- Deletion manifest containing stale entries\n- Race condition between export and sanitize\n\n## Impact\n\n- New issues disappear from local JSONL after sync\n- Issues remain on beads-sync but cause confusion\n- Multi-agent workflows affected when agents can't see new issues locally\n- Requires manual intervention to recover\n\n## Files to Investigate\n\n- cmd/bd/sync.go - sanitize logic\n- cmd/bd/snapshot_manager.go - snapshot comparison\n- Deletion manifest handling\n\n## Acceptance Criteria\n\n- [ ] Newly created issues survive sync without being sanitized\n- [ ] Only truly deleted/resurrected issues are removed\n- [ ] Add test case for this scenario","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-12-14T00:45:26.828547-08:00","updated_at":"2025-12-16T01:06:10.358958-08:00","closed_at":"2025-12-14T00:54:44.772671-08:00"} {"id":"bd-3ee2c7e9","title":"Add \"bd daemons\" command for multi-daemon management","description":"Add a new \"bd daemons\" command with subcommands to manage daemon processes across all beads repositories/worktrees. Should show all running daemons with metadata (version, workspace, uptime, last sync), allow stopping/restarting individual daemons, auto-clean stale processes, view logs, and show exclusive lock status.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-10-26T16:53:40.970042-07:00","updated_at":"2025-12-14T12:12:46.496973-08:00","closed_at":"2025-11-02T17:12:34.62102-08:00"} {"id":"bd-3eju","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:50:02.86334-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:50:02.896232-08:00","closed_at":"2026-01-07T00:50:02.896232-08:00","close_reason":"auto-closed session event"} -{"id":"bd-3en6c","title":"Fix: FOREIGN KEY constraint on bd create (GH#956)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #956. bd create fails with sqlite FOREIGN KEY constraint error.","status":"open","priority":1,"issue_type":"bug","created_at":"2026-01-09T22:20:03.739681-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T01:47:18.633193-08:00"} +{"id":"bd-3en6c","title":"Fix: FOREIGN KEY constraint on bd create (GH#956)","description":"dispatched_by: mayor\n\nGitHub issue #956. bd create fails with sqlite FOREIGN KEY constraint error.","status":"hooked","priority":1,"issue_type":"bug","assignee":"beads/polecats/garnet","created_at":"2026-01-09T22:20:03.739681-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T19:35:37.540119-08:00"} {"id":"bd-3f6a","title":"Add concurrent import race condition tests","description":"Currently no tests verify behavior when multiple clones import simultaneously with external_ref matching.\n\nScenarios to test:\n1. Two clones import same external_ref update at same time\n2. Clone A imports while Clone B updates same issue\n3. Verify transaction isolation prevents corruption\n4. Document expected behavior (last-write-wins vs timestamp-based)\n\nRelated: bd-1022\nFiles: internal/importer/external_ref_test.go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-02T15:32:11.286956-08:00","updated_at":"2025-11-02T17:08:52.042337-08:00","closed_at":"2025-11-02T17:08:52.04234-08:00"} {"id":"bd-3f80d9e0","title":"Improve internal/daemon test coverage (currently 22.5%)","description":"Daemon functionality needs better coverage:\n- Auto-start behavior\n- Lock file management\n- Discovery mechanisms\n- Connection handling\n- Error recovery\n\nCurrent coverage: 58.3% (improved from 22.5% as of Nov 2025)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T14:06:30.832728-07:00","updated_at":"2025-12-14T12:12:46.518292-08:00","closed_at":"2025-11-15T14:13:47.303529-08:00"} {"id":"bd-3gc","title":"Audit remaining cmd/bd files for error handling consistency","description":"Extend ERROR_HANDLING_AUDIT.md to cover: daemon_sync.go, update.go, list.go, show.go, close.go, reopen.go, dep.go, label.go, comments.go, delete.go, compact.go, config.go, validate.go and other high-usage command files","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-24T00:28:55.890991-08:00","updated_at":"2025-12-02T17:11:19.730805433-05:00","closed_at":"2025-11-28T23:37:52.251887-08:00"} @@ -325,6 +329,7 @@ {"id":"bd-495i6","title":"Merge: topaz-mk9abkx5","description":"branch: polecat/topaz-mk9abkx5\ntarget: main\nsource_issue: topaz-mk9abkx5\nrig: beads\nagent_bead: bd-beads-polecat-topaz\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:31:31.043597-08:00","created_by":"stevey","updated_at":"2026-01-10T21:53:13.173233-08:00","closed_at":"2026-01-10T21:53:13.173233-08:00","close_reason":"Branch no longer exists on remote","labels":["gt:merge-request"]} {"id":"bd-49kw","title":"Workaround for FastMCP outputSchema bug in Claude Code","description":"The beads MCP server (v0.23.1) successfully connects to Claude Code, but all tools fail to load with a schema validation error due to a bug in FastMCP 2.13.1.\n\nError: \"Invalid literal value, expected \\\"object\\\"\" in outputSchema.\n\nRoot Cause: FastMCP generates outputSchema with $ref at root level without \"type\": \"object\" for self-referential models (Issue).\n\nWorkaround: Use slash commands (/beads:ready) or wait for FastMCP fix.\n","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-20T18:55:39.041831-05:00","updated_at":"2025-12-23T23:49:44.371623-08:00","closed_at":"2025-12-23T23:49:44.371623-08:00"} {"id":"bd-49oe","title":"Cache GetGitDir() for additional optimization","description":"Code review finding from bd-7di fix.\n\nGetGitDir() at line 17 is not cached but is called by:\n- GetGitHooksDir()\n- GetGitRefsDir()\n- GetGitHeadPath()\n\nIf any of those are called multiple times, we still spawn extra git processes. Consider adding sync.Once caching similar to the other functions.\n\nFile: internal/git/gitdir.go","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-25T22:08:52.736529-08:00","updated_at":"2026-01-04T15:22:08.706244-08:00","closed_at":"2025-12-30T22:14:16.659122-08:00","close_reason":"Already implemented. GetGitDir() uses getGitContext() which is cached via sync.Once. The gitContext struct (line 13-19) holds gitDir and is populated once by initGitContext(). All dependent functions (GetGitHooksDir, GetGitRefsDir, GetGitHeadPath) benefit from this caching. No changes needed."} +{"id":"bd-49qzb","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:30:39.669568-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T19:30:39.736008-08:00","closed_at":"2026-01-12T19:30:39.736008-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4aao","title":"Fix failing integration tests in beads-mcp","description":"The `beads-mcp` test suite has failures in `tests/test_bd_client_integration.py` (assertion error in `test_init_creates_beads_directory`) and errors in `tests/test_worktree_separate_dbs.py` (setup failures finding database). These need to be investigated and fixed to ensure a reliable CI baseline.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:53:28.4803-05:00","updated_at":"2025-12-09T18:38:37.676638171-05:00","closed_at":"2025-11-25T21:39:20.967106-08:00"} {"id":"bd-4aeed709","title":"bd resolve-conflicts - Git merge conflict resolver","description":"Automatically resolve JSONL merge conflicts.\n\nModes:\n- Mechanical: ID remapping (no AI)\n- AI-assisted: Smart merge/keep decisions\n- Interactive: Review each conflict\n\nHandles \u003c\u003c\u003c\u003c\u003c\u003c\u003c conflict markers in .beads/beads.jsonl\n\nFiles: cmd/bd/resolve_conflicts.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-28T14:48:17.457619-07:00","updated_at":"2025-10-30T17:12:58.218109-07:00","closed_at":"2025-10-28T15:47:33.037021-07:00"} {"id":"bd-4b5r","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:34:15.351132-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T17:34:15.385705-08:00","closed_at":"2026-01-07T17:34:15.385705-08:00","close_reason":"auto-closed session event"} @@ -345,6 +350,7 @@ {"id":"bd-4f43s","title":"PR Sheriff Standing Orders","description":"## Role: PR Sheriff (Emma)\n\nReview incoming PRs on steveyegge/beads and farm out \"easy wins\" to crew workers.\n\n## Easy-Win Criteria (NO human discretion needed)\n- Bug fixes with clear reproduction and solution\n- Documentation fixes (typos, broken links, clarifications)\n- Simple feature additions that align with existing patterns\n- Shell script fixes (portability, edge cases)\n- Test additions for existing functionality\n\n## NOT Easy-Wins (leave for human to review)\n- Security-related changes\n- Architectural decisions\n- API changes\n- Anything controversial or requiring product judgment\n- PRs that touch core functionality in non-obvious ways\n\n## PR States to Skip\n\n**STOP. READ THIS CAREFULLY.**\n\nThe search query filters out PRs we do not touch. If the search returns nothing,\nWE ARE DONE. Do not go hunting for more PRs. Do not run `gh pr list` without\nthe filter. Do not \"check on\" PRs that were filtered out.\n\n- **Changes requested** - SKIP. Human already reviewed. Waiting on contributor. NOT OUR PROBLEM.\n- **Draft PRs** - SKIP. Not ready for review.\n\nIf a PR has \"Changes requested\" status, it means the human already looked at it\nand asked for changes. The contributor needs to respond. We do not re-review,\nwe do not check status, we do not touch it AT ALL.\n\n## Workflow\n1. Run: gh pr list --repo steveyegge/beads --state open --search \"review:none review:approved -review:changes_requested\"\n2. **If this returns nothing, you are DONE. Stop. Do not proceed to step 3.**\n3. For each PR returned, review with: gh pr view \u003cnum\u003e --repo steveyegge/beads\n4. Categorize: easy-win, needs-human, or skip (spam/stale)\n5. For easy-wins: create bead, sling to available crew worker\n6. Track assignments in beads\n7. NO need to send reports to mayor - human will review PRs on their own schedule\n\n## Available Crew\n- dave, fang, giles, grip, wolf\n\n## Commands\n- gh pr list --repo steveyegge/beads --state open --search \"review:none review:approved -review:changes_requested\"\n- gh pr view \u003cnum\u003e --repo steveyegge/beads\n- gh pr diff \u003cnum\u003e --repo steveyegge/beads\n- gt sling \u003cbead-id\u003e beads/crew/\u003cname\u003e -m \"context\"","status":"hooked","priority":1,"issue_type":"task","assignee":"beads/crew/emma","created_at":"2026-01-08T14:16:52.562453-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T01:43:43.826946-08:00"} {"id":"bd-4f582ec8","title":"Test auto-start in fred","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-30T17:46:16.668088-07:00","updated_at":"2025-10-31T12:00:43.185723-07:00","closed_at":"2025-10-31T12:00:43.185723-07:00"} {"id":"bd-4ff2","title":"Fix CI failures before 0.21.3 release","description":"CI is failing on multiple jobs:\n1. Nix flake: Tests fail due to missing git in build environment\n2. Windows tests: Need to check what's failing\n3. Linux tests: Need to check what's failing\n4. Linter errors: Many unchecked errors need fixing\n\nNeed to fix before tagging v0.21.3 release.","notes":"Fixed linter errors (errcheck, misspell), Nix flake git dependency, and import database discovery bug. Tests still failing - need to investigate further.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-01T23:52:09.244763-07:00","updated_at":"2025-11-02T12:32:57.748324-08:00","closed_at":"2025-11-02T12:32:57.748329-08:00"} +{"id":"bd-4g8x2","title":"Session ended: gt-beads-beads/refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:23:21.452075-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T17:23:21.498819-08:00","closed_at":"2026-01-12T17:23:21.498819-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4h14a","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T06:31:33.130362-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T06:31:33.194991-08:00","closed_at":"2026-01-11T06:31:33.194991-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4h3","title":"Add test coverage for internal/git package","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:23.497486-05:00","updated_at":"2025-12-09T18:38:37.677633071-05:00","closed_at":"2025-11-28T21:55:45.2527-08:00","dependencies":[{"issue_id":"bd-4h3","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.277639-05:00","created_by":"daemon"}]} {"id":"bd-4hh5","title":"bd sync false-positive force-push detection","description":"bd sync incorrectly detected a force-push when comparing against a commit from main branch instead of beads-sync.\n\nEvidence:\n- bd sync reported: 'Previous known commit: f4d3f674, Current remote commit: 4d24f794'\n- f4d3f674 is a valid beads-sync commit\n- 4d24f794 is a MAIN branch commit: 'refactor: remove unused isFirstRig param (gt-fugmy)'\n\nRoot cause: bd sync is comparing against wrong branch or storing wrong commit reference.\n\nImpact: False force-push warnings during normal operation, requires manual --accept-rebase.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:13:45.102272-08:00","created_by":"mayor","updated_at":"2026-01-04T23:11:19.073963-08:00","closed_at":"2026-01-04T23:11:19.073963-08:00","close_reason":"Fixed false-positive force-push detection (bd-4hh5):\n- Changed fetch to use explicit refspec: +refs/heads/beads-sync:refs/remotes/origin/beads-sync\n- This ensures the remote-tracking ref is always created/updated\n- Without explicit refspec, git fetch only updates existing refs, causing stale comparisons\n- The + prefix ensures force-update even for non-fast-forward cases"} @@ -369,6 +375,7 @@ {"id":"bd-4pv","title":"bd export only outputs 1 issue after auto-import corrupts database","description":"When auto-import runs and purges issues (due to git history backfill bug), subsequent 'bd export' only exports 1 issue even though the database should have many.\n\nReproduction:\n1. Have issues.jsonl with 55 issues\n2. Auto-import triggers and purges all issues via git history backfill\n3. Run 'bd export' - only exports 1 issue (the last one created before corruption)\n\nThe database gets into an inconsistent state where most issues are purged but export doesn't realize this.\n\nWorkaround: Rebuild database from scratch with 'rm .beads/beads.db \u0026\u0026 bd init --prefix bd'","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:28:40.828866-08:00","updated_at":"2025-11-28T17:28:55.545056-08:00","closed_at":"2025-11-27T22:50:35.036227-08:00"} {"id":"bd-4q8","title":"bd cleanup --hard should skip tombstone creation for true permanent deletion","description":"## Problem\n\nWhen using bd cleanup --hard --older-than N --force, the command:\n1. Deletes closed issues older than N days (converting them to tombstones with NOW timestamp)\n2. Then tries to prune tombstones older than N days (finds none because they were just created)\n\nThis leaves the database bloated with fresh tombstones that will not be pruned.\n\n## Expected Behavior\n\nIn --hard mode, the deletion should be permanent without creating tombstones, since the user explicitly requested bypassing sync safety.\n\n## Workaround\n\nManually delete from database: sqlite3 .beads/beads.db 'DELETE FROM issues WHERE status=tombstone'\n\n## Fix Options\n\n1. In --hard mode, use a different delete path that does not create tombstones\n2. After deleting, immediately prune the just-created tombstones regardless of age\n3. Pass a skip_tombstone flag to the delete operation\n\nOption 1 is cleanest - --hard should mean permanent delete without tombstone.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T01:33:36.580657-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-4qfb","title":"Improve bd doctor output formatting for better readability","description":"Improve bd doctor output formatting for better readability.\n\n## Current State\nDoctor output is a wall of text with:\n- All checks shown (even passing ones)\n- No visual hierarchy\n- Hard to spot failures in long output\n\n## Target Output\n\n```\n$ bd doctor\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n Current version: 0.34.0\n Latest version: 0.35.0\n Fix: bd hooks install\n\n─────────────────────────────────────────────────\n✓ Passed (24) [use --verbose to show details]\n─────────────────────────────────────────────────\n```\n\nWith --verbose:\n```\n$ bd doctor --verbose\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n ...\n\n─────────────────────────────────────────────────\n✓ Passed (24)\n─────────────────────────────────────────────────\n\n Database\n ✓ Database exists\n ✓ Database readable\n ✓ Schema up to date\n \n Git Hooks\n ✓ Pre-commit hook installed\n ✓ Post-merge hook installed\n ⚠ Hooks version mismatch (see above)\n \n Sync\n ✓ Sync branch configured\n ✓ Remote accessible\n ...\n```\n\n## Implementation\n\n### 1. Add check categories (cmd/bd/doctor/categories.go)\n\n```go\ntype Category string\n\nconst (\n CatDatabase Category = \"Database\"\n CatHooks Category = \"Git Hooks\"\n CatSync Category = \"Sync\"\n CatDaemon Category = \"Daemon\"\n CatConfig Category = \"Configuration\"\n CatIntegrity Category = \"Data Integrity\"\n)\n\n// Assign categories to checks\nvar checkCategories = map[string]Category{\n \"database-exists\": CatDatabase,\n \"database-readable\": CatDatabase,\n \"schema-version\": CatDatabase,\n \"pre-commit-hook\": CatHooks,\n \"post-merge-hook\": CatHooks,\n \"hooks-version\": CatHooks,\n \"sync-branch\": CatSync,\n \"remote-access\": CatSync,\n // ... etc\n}\n```\n\n### 2. Add --verbose flag\n\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().BoolP(\"verbose\", \"v\", false, \"Show all checks including passed\")\n```\n\n### 3. Create formatter (cmd/bd/doctor/format.go)\n\n```go\ntype Formatter struct {\n verbose bool\n noColor bool\n}\n\nfunc (f *Formatter) Format(results []CheckResult) string {\n var buf strings.Builder\n \n // Count by status\n passed, warnings, errors := countByStatus(results)\n \n // Header\n buf.WriteString(fmt.Sprintf(\"bd doctor v%s\\n\\n\", version.Version))\n buf.WriteString(fmt.Sprintf(\"Summary: %d passed, %d warnings, %d errors\\n\\n\", \n passed, warnings, errors))\n \n // Errors section (always show)\n if errors \u003e 0 {\n f.writeSection(\u0026buf, \"✗ Errors\", filterByStatus(results, StatusError))\n }\n \n // Warnings section (always show)\n if warnings \u003e 0 {\n f.writeSection(\u0026buf, \"⚠ Warnings\", filterByStatus(results, StatusWarning))\n }\n \n // Passed section (only with --verbose)\n if f.verbose \u0026\u0026 passed \u003e 0 {\n f.writePassedSection(\u0026buf, filterByStatus(results, StatusPassed))\n } else if passed \u003e 0 {\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d) [use --verbose to show details]\\n\", passed))\n }\n \n return buf.String()\n}\n\nfunc (f *Formatter) writeSection(buf *strings.Builder, title string, results []CheckResult) {\n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(title + \"\\n\")\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, r := range results {\n buf.WriteString(fmt.Sprintf(\"[%s] %s\\n\", r.CheckName, r.Message))\n if r.Details != \"\" {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", r.Details))\n }\n if r.Fix != \"\" {\n buf.WriteString(fmt.Sprintf(\" Fix: %s\\n\", r.Fix))\n }\n buf.WriteString(\"\\n\")\n }\n}\n\nfunc (f *Formatter) writePassedSection(buf *strings.Builder, results []CheckResult) {\n // Group by category\n byCategory := groupByCategory(results)\n \n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d)\\n\", len(results)))\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, cat := range categoryOrder {\n if checks, ok := byCategory[cat]; ok {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", cat))\n for _, r := range checks {\n buf.WriteString(fmt.Sprintf(\" ✓ %s\\n\", r.Message))\n }\n buf.WriteString(\"\\n\")\n }\n }\n}\n```\n\n### 4. Update run function\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n verbose, _ := cmd.Flags().GetBool(\"verbose\")\n noColor, _ := cmd.Flags().GetBool(\"no-color\")\n \n results := runAllChecks()\n \n formatter := \u0026Formatter{verbose: verbose, noColor: noColor}\n fmt.Print(formatter.Format(results))\n \n // Exit code based on results\n if hasErrors(results) {\n os.Exit(1)\n }\n}\n```\n\n## Files to Modify\n\n1. **cmd/bd/doctor.go** - Add --verbose flag, update run function\n2. **cmd/bd/doctor/format.go** - New file for formatting logic\n3. **cmd/bd/doctor/categories.go** - New file for check categorization\n4. **cmd/bd/doctor/common.go** - Add Status field to CheckResult if missing\n\n## Testing\n\n```bash\n# Default output (concise)\nbd doctor\n\n# Verbose output\nbd doctor --verbose\n\n# JSON output (should still work)\nbd doctor --json\n```\n\n## Success Criteria\n- Summary line at top with counts\n- Only failures/warnings shown by default\n- --verbose shows grouped passed checks\n- Visual separators between sections\n- Exit code 1 if errors, 0 otherwise","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T09:29:27.557578+11:00","updated_at":"2025-12-23T13:37:18.48781-08:00","closed_at":"2025-12-23T13:37:18.48781-08:00","dependencies":[{"issue_id":"bd-4qfb","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.972517-08:00","created_by":"daemon"}]} +{"id":"bd-4rf0e","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:30:40.045105-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-12T19:30:40.108665-08:00","closed_at":"2026-01-12T19:30:40.108665-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4rf3u","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T06:56:46.643072-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T06:56:46.703168-08:00","closed_at":"2026-01-11T06:56:46.703168-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4ri","title":"Fix TestFallbackToDirectModeEnablesFlush deadlock causing 10min test timeout","description":"## Problem\n\nTestFallbackToDirectModeEnablesFlush in direct_mode_test.go deadlocks for 9m59s before timing out, causing the entire test suite to take 10+ minutes instead of \u003c10 seconds.\n\n## Root Cause\n\nDatabase lock contention between test cleanup and flushToJSONL():\n- Test cleanup (line 36) tries to close DB via defer\n- flushToJSONL() (line 132) is still accessing DB\n- Results in deadlock: database/sql.(*DB).Close() waits for mutex while GetJSONLFileHash() holds it\n\n## Stack Trace Evidence\n\n```\ngoroutine 512 [sync.Mutex.Lock, 9 minutes]:\ndatabase/sql.(*DB).Close(0x14000643790)\n .../database/sql/sql.go:927 +0x84\ngithub.com/steveyegge/beads/cmd/bd.TestFallbackToDirectModeEnablesFlush.func1()\n .../direct_mode_test.go:36 +0xf4\n\nWhile goroutine running flushToJSONL() holds DB connection via GetJSONLFileHash()\n```\n\n## Impact\n\n- Test suite: 10+ minutes → should be \u003c10 seconds\n- ALL other tests pass in ~4 seconds\n- This ONE test accounts for 99.9% of test runtime\n\n## Related\n\nThis is the EXACT same issue documented in MAIN_TEST_REFACTOR_NOTES.md for why main_test.go refactoring was deferred - global state manipulation + DB cleanup = deadlock.\n\n## Fix Approaches\n\n1. **Add proper cleanup sequencing** - stop flush goroutines BEFORE closing DB\n2. **Use test-specific DB lifecycle** - ensure flush completes before cleanup\n3. **Mock the flush mechanism** - avoid real DB for testing this code path \n4. **Add explicit timeout handling** - fail fast with clear error instead of hanging\n\n## Files\n\n- cmd/bd/direct_mode_test.go:36-132\n- cmd/bd/autoflush.go:353 (validateJSONLIntegrity)\n- cmd/bd/autoflush.go:508 (flushToJSONLWithState)\n\n## Acceptance\n\n- Test passes without timeout\n- Test suite completes in \u003c10 seconds\n- No deadlock between cleanup and flush operations","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-11-21T20:09:00.794372-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-4rvek","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T20:52:49.375644-08:00","updated_at":"2026-01-10T20:52:49.375644-08:00","closed_at":"2026-01-10T20:52:49.375605-08:00","close_reason":"Squashed from 11 wisps"} @@ -376,6 +383,7 @@ {"id":"bd-4sfl","title":"Merge: bd-14ie","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-14ie\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:23:37.360782-08:00","updated_at":"2025-12-20T23:17:26.997276-08:00","closed_at":"2025-12-20T23:17:26.997276-08:00"} {"id":"bd-4sxh","title":"Code smell: Issue struct still has ~100 fields - consider composition","description":"internal/types/types.go Issue struct (lines 14-100) still has approximately 100 fields across many categories despite prior cleanup:\n\n- Core identification (ID, ContentHash)\n- Content (Title, Description, Design)\n- Status \u0026 Workflow\n- Assignment, Timestamps\n- External integration\n- Compaction metadata\n- Relational data (Labels, Dependencies, Comments)\n- Tombstone, Messaging, Context markers\n- Bonding, HOP, Gate, Source tracing, Agent identity fields\n\n**Problem:**\n- Very large struct is difficult to understand\n- Hard to identify required vs optional fields\n- High change risk\n\n**Acceptance Criteria:**\n- [ ] Group related fields into embedded structs (IssueMetadata, IssueCompaction, IssueAgent, etc.)\n- [ ] Use composition instead of single flat struct\n- [ ] Maintain backward compatibility for serialization\n- [ ] Tests pass","status":"hooked","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:00.560267-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T15:44:43.353922-08:00","close_reason":"Refactored Issue struct using composition: created 4 embedded structs (IssueCompaction, IssueTombstone, IssueGate, IssueAgent) to group ~19 specialized fields while keeping core fields flat for ergonomic struct literals. JSON serialization unchanged.","dependencies":[{"issue_id":"bd-4sxh","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.780801-08:00","created_by":"daemon"}]} {"id":"bd-4t7","title":"Auto-import runs during --no-auto-import operations via stats/ready commands","description":"Even when using --no-auto-import flag, certain commands like 'bd stats' and 'bd ready' still trigger auto-import internally, which can cause the git history backfill bug to corrupt data.\n\nExample:\n bd stats --no-auto-import\n # Still prints 'Purged bd-xxx (recovered from git history...)'\n\nThe flag should completely disable auto-import for the command, but it appears some code paths still trigger it.\n\nWorkaround: Use --allow-stale instead, or --sandbox mode.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-26T22:28:59.305898-08:00","updated_at":"2025-11-27T00:54:20.335013-08:00","closed_at":"2025-11-27T00:54:12.561872-08:00"} +{"id":"bd-4tz82","title":"Review and merge PR #1039: Preserve comments in autoflush","description":"dispatched_by: beads/crew/emma","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/fang","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:32.604907-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:39:13.931242-08:00","closed_at":"2026-01-12T16:39:13.931242-08:00","close_reason":"PR #1039 merged - fixes comment preservation during autoflush re-export"} {"id":"bd-4u2b","title":"Make MCP compaction settings configurable (COMPACTION_THRESHOLD, PREVIEW_COUNT)","description":"Currently COMPACTION_THRESHOLD (20) and PREVIEW_COUNT (5) are hardcoded constants at the module level. This prevents users from tuning context engineering behavior.\n\n## Current State\n```python\nCOMPACTION_THRESHOLD = 20 # Compact results with more than 20 issues\nPREVIEW_COUNT = 5 # Show first 5 issues in preview\n```\n\n## Problems\n1. No way for MCP clients to request different preview sizes\n2. No way to disable compaction for debugging\n3. No way to adapt to different context window sizes\n4. Values are not documented in tool schema\n\n## Recommended Solution\nAdd environment variables or MCP tool parameters:\n- `BEADS_MCP_COMPACTION_THRESHOLD` env var (default: 20)\n- `BEADS_MCP_PREVIEW_COUNT` env var (default: 5)\n- Optional `compact_threshold` and `preview_size` parameters to list/ready tools\n\n## Implementation Notes\n- Keep current defaults for backward compatibility\n- Read from environment at server initialization\n- Document in CONTEXT_ENGINEERING.md\n- Add tests verifying env var behavior","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-14T14:24:34.037997-08:00","updated_at":"2025-12-14T14:40:48.79752-08:00","closed_at":"2025-12-14T14:40:48.79752-08:00","dependencies":[{"issue_id":"bd-4u2b","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:34.039165-08:00","created_by":"stevey"}]} {"id":"bd-4uoc","title":"Code Review Followup Summary: PR #481 + PR #551","description":"## Merged PRs Summary\n\n### PR #551: Persist close_reason to issues table\n- ✅ Merged successfully\n- ✅ Bug fix: close_reason now persisted in database column (not just events table)\n- ✅ Comprehensive test coverage added\n- ✅ Handles reopen case (clearing close_reason)\n\n**Followup Issues Filed:**\n- bd-lxzx: Document close_reason in JSONL export format\n- bd-077e: Update CLI documentation for close_reason field\n\n---\n\n### PR #481: Context Engineering Optimizations (80-90% context reduction)\n- ✅ Merged successfully \n- ✅ Lazy tool discovery: discover_tools() + get_tool_info()\n- ✅ Minimal issue models: IssueMinimal (~80% smaller than full Issue)\n- ✅ Result compaction: Auto-compacts results \u003e20 items\n- ✅ All 28 tests passing\n- ⚠️ Breaking change: ready() and list() return type changed\n\n**Followup Issues Filed:**\n- bd-b318: Add integration tests for CompactedResult\n- bd-4u2b: Make compaction settings configurable (THRESHOLD, PREVIEW_COUNT)\n- bd-2kf8: Document CompactedResult response format in CONTEXT_ENGINEERING.md\n- bd-pdr2: Document backwards compatibility considerations\n\n---\n\n## Overall Assessment\n\nBoth PRs are production-ready with solid implementations. All critical functionality works and tests pass. Followup issues focus on:\n1. Documentation improvements (5 issues)\n2. Integration test coverage (1 issue)\n3. Configuration flexibility (1 issue)\n4. Backwards compatibility guidance (1 issue)\n\nNo critical bugs or design issues found.\n\n## Review Completed By\nCode review process completed. Issues auto-created for tracking improvements.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-29T13:40:29.723233-08:00","closed_at":"2025-12-29T13:40:29.723233-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-4uoc","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:25:59.216884-08:00","created_by":"stevey"},{"issue_id":"bd-4uoc","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:59.217296-08:00","created_by":"stevey"}]} {"id":"bd-4x9zq","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:44:15.270356-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T01:44:15.333514-08:00","closed_at":"2026-01-12T01:44:15.333514-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -415,6 +423,7 @@ {"id":"bd-5c4","title":"VCS-agnostic sync support","description":"Make bd sync work with multiple VCS types (git, jujutsu, mercurial, sapling) by detecting VCS per repo and using appropriate sync commands, supporting mixed-VCS multi-repo configs.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T11:22:00.837527-08:00","updated_at":"2025-11-05T14:30:10.417479-08:00","closed_at":"2025-11-05T14:26:17.942832-08:00","dependencies":[{"issue_id":"bd-5c4","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.817849-08:00","created_by":"daemon"}]} {"id":"bd-5ce8","title":"Document protected branch workflow","description":"Create comprehensive documentation for protected branch workflow.\n\nTasks:\n- Add \"Protected Branch Workflow\" section to AGENTS.md\n- Create docs/PROTECTED_BRANCHES.md guide\n- Update README.md quick start\n- Add examples to examples/protected-branch/\n- Update bd init --help documentation\n- Add troubleshooting guide\n- Add migration guide for existing users\n- Record demo video (optional)\n\nEstimated effort: 2-3 days","notes":"Completed protected branch workflow documentation. Created comprehensive guide (docs/PROTECTED_BRANCHES.md), updated AGENTS.md with workflow section, added feature to README.md, and created working example (examples/protected-branch/). All commands verified working (bd init --branch, bd sync --status, bd sync --merge, bd config get/set sync.branch).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.59013-08:00","updated_at":"2025-12-14T12:12:46.530569-08:00","closed_at":"2025-11-04T11:10:23.530621-08:00","dependencies":[{"issue_id":"bd-5ce8","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.379767-08:00","created_by":"stevey"}]} {"id":"bd-5cnq","title":"Add build-from-source option to local-install step","description":"dispatched_by: mayor\n\nThe local-install step currently only offers Homebrew and curl install script options.\n\nAdd Option 3 for developers releasing from this clone:\n\n```bash\n# Build from source\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n\n# macOS ONLY: Codesign to prevent SIGKILL (Killed: 9)\n# Without this, macOS kills unsigned binaries from unknown developers\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n## Why codesigning matters\nOn macOS, unsigned binaries built locally can be killed by Gatekeeper with \"Killed: 9\" (SIGKILL). The ad-hoc codesign (`-s -`) marks the binary as locally trusted.\n\n## Acceptance Criteria\n- [ ] local-install step has Option 3 with build commands\n- [ ] macOS codesigning is documented with explanation\n- [ ] Commands can be copy-pasted and work","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-07T00:45:30.577889-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T20:57:59.131312-08:00","dependencies":[{"issue_id":"bd-5cnq","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.493442-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-5cwip","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:52:14.257037-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T17:52:14.324651-08:00","closed_at":"2026-01-12T17:52:14.324651-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-5dae5504","title":"Export deduplication breaks when JSONL and export_hashes table diverge","description":"## Problem\n\nThe export deduplication feature (timestamp-only skipping) breaks when the JSONL file and export_hashes table get out of sync, causing exports to skip issues that aren't actually in the file.\n\n## Symptoms\n\n- `bd export` reports \"Skipped 128 issue(s) with timestamp-only changes\"\n- JSONL file only has 38 lines but DB has 149 issues\n- export_hashes table has 149 entries\n- Auto-import doesn't trigger (hash matches despite missing data)\n- Two repos on same commit show different issue counts\n\n## Root Cause\n\nshouldSkipExport() in autoflush.go compares current issue hash with stored export_hashes entry. If they match, it skips export assuming the issue is already in the JSONL.\n\nThis assumption fails when:\n1. Git operations (pull, reset, checkout) change JSONL without clearing export_hashes\n2. Manual JSONL edits or corruption\n3. Import operations that modify DB but don't update export_hashes\n4. Partial exports that update export_hashes but don't complete\n\n## Impact\n\n- **Critical data loss risk**: Issues appear to be tracked but aren't persisted to git\n- Breaks multi-repo sync (root cause of today's debugging session)\n- Auto-import fails to detect staleness (hash matches despite missing data)\n- Silent data corruption (no error messages, just missing issues)\n\n## Reproduction\n\n1. Have DB with 149 issues, all in export_hashes table\n2. Truncate JSONL to 38 lines (simulate git reset or corruption)\n3. Run `bd export` - it skips 128 issues\n4. JSONL still has only 38 lines but export thinks it succeeded\n\n## Current Workaround\n\n```bash\nsqlite3 .beads/beads.db \"DELETE FROM export_hashes\"\nbd export -o .beads/beads.jsonl\n```\n\n## Proposed Solutions\n\n**Option 1: Verify JSONL integrity before skipping**\n- Count lines in JSONL, compare with export_hashes count\n- If mismatch, clear export_hashes and force full export\n- Safe but adds I/O overhead\n\n**Option 2: Hash-based JSONL validation**\n- Store hash of entire JSONL file in metadata\n- Before export, check if JSONL hash matches\n- If mismatch, clear export_hashes\n- More efficient, detects any JSONL corruption\n\n**Option 3: Disable timestamp-only deduplication**\n- Remove the feature entirely\n- Always export all issues\n- Simplest and safest, but creates larger git commits\n\n**Option 4: Clear export_hashes on git operations**\n- Add post-merge hook to clear export_hashes\n- Clear on any import operation\n- Defensive approach but may over-clear\n\n## Recommended Fix\n\nCombination of Options 2 + 4:\n1. Store JSONL file hash in metadata after export\n2. Check hash before export, clear export_hashes if mismatch \n3. Clear export_hashes on import operations\n4. Add `bd validate` check for JSONL/export_hashes sync\n\n## Files Involved\n\n- cmd/bd/autoflush.go (shouldSkipExport)\n- cmd/bd/export.go (export with deduplication)\n- internal/storage/sqlite/metadata.go (export_hashes table)","notes":"## Recovery Session (2025-10-29 21:30)\n\n### What Happened\n- Created 14 new hash ID issues (bd-f8b764c9 through bd-f8b764c9.1) \n- bd sync appeared to succeed\n- Canonical repo (~/src/beads): 162 issues in DB + JSONL ✓\n- Secondary repo (fred/beads): Only 145 issues vs 162 in canonical ✗\n- Both repos on same git commit but different issue counts!\n\n### Bug Manifestation During Recovery\n\n1. **Initial state**: fred/beads had 145 issues, 145 lines in JSONL, 145 export_hashes entries\n\n2. **After git reset --hard origin/main**: \n - JSONL: 162 lines (from git)\n - DB: 150 issues (auto-import partially worked)\n - Auto-import failed with UNIQUE constraint error\n\n3. **After manual import --resolve-collisions**:\n - DB: 160 issues\n - JSONL: Still 162 lines\n - export_hashes: 159 entries\n\n4. **After bd export**: \n - **JSONL reduced to 17 lines!** ← The bug in action\n - export_hashes: 159 entries (skipped exporting 142 issues)\n - Silent data loss - no error message\n\n5. **After clearing export_hashes and re-export**:\n - JSONL: 159 lines (missing 3 issues still)\n - DB: 159 issues\n - Still diverged from canonical\n\n### The Bug Loop\nOnce export_hashes and JSONL diverge:\n- Export skips issues already in export_hashes\n- But those issues aren't actually in JSONL\n- This creates corrupt JSONL with missing issues\n- Auto-import can't detect the problem (file hash matches what was exported)\n- Data is lost with no error messages\n\n### Recovery Solution\nCouldn't break the loop with export alone. Had to:\n1. Copy .beads/beads.db from canonical repo\n2. Clear export_hashes\n3. Full re-export\n4. Finally converged to 162 issues\n\n### Key Learnings\n\n1. **The bug is worse than we thought**: It can create corrupt exports (17 lines instead of 162!)\n\n2. **Auto-import can't save you**: Once export is corrupt, auto-import just imports the corrupt data\n\n3. **Silent failure**: No warnings, no errors, just missing issues\n\n4. **Git operations trigger it**: git reset, git pull, etc. change JSONL without clearing export_hashes\n\n5. **Import operations populate export_hashes**: Even manual imports update export_hashes, setting up future export failures\n\n### Immediate Action Required\n\n**DISABLE EXPORT DEDUPLICATION NOW**\n\nThis feature is fundamentally broken and causes data loss. Should be disabled until properly fixed.\n\nQuick fix options:\n- Set environment variable to disable feature\n- Comment out shouldSkipExport check\n- Always clear export_hashes before export\n- Add validation that DB count == JSONL line count before allowing export\n\n### Long-term Fix\n\nNeed Option 2 + 4 from proposed solutions:\n1. Store JSONL file hash after every successful export\n2. Before export, verify JSONL hash matches expected\n3. If mismatch, log WARNING and clear export_hashes\n4. Clear export_hashes on every import operation\n5. Add git post-merge hook to clear export_hashes\n6. Add `bd validate` command to detect divergence\n","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-29T23:05:13.959435-07:00","updated_at":"2025-10-30T17:12:58.207148-07:00","closed_at":"2025-10-29T21:57:03.06641-07:00"} {"id":"bd-5dlz","title":"GHI #889: postinstall fails on Windows - zip being used by another process","description":"GitHub Issue #889: postinstall fails on Windows: zip 'being used by another process'\n\nhttps://github.com/steveyegge/beads/issues/889","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:22:13.880052-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:08.708256-08:00","closed_at":"2026-01-04T11:26:35.696283-08:00","close_reason":"Fixed: Added retry logic with exponential backoff for Windows zip extraction to handle file lock delays from antivirus/Node.js"} {"id":"bd-5dmb","title":"Test Agent","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T00:04:29.811433-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T00:11:48.074239-08:00","deleted_at":"2025-12-28T00:11:48.074239-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} @@ -458,6 +467,7 @@ {"id":"bd-62a0","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","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"}]} {"id":"bd-62g22","title":"Add bd doctor check for child repo custom types","description":"Add a diagnostic check to `bd doctor` that discovers custom types from child repos and reports any potential issues.\n\nThis is the \"discover\" part of \"trust + discover\". We don't track child types in parent config, but we can discover them on demand for diagnostics.\n\nImplementation:\n1. In `cmd/bd/doctor/`, add a new check\n2. For each configured child repo in `repos.additional`:\n - Try to read child's config.yaml or beads.db\n - Extract their `types.custom` setting\n - Report what types each child uses\n3. Optionally warn if hydrated issues use types not found in any config\n\nThis is informational/diagnostic only - not blocking.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-09T14:05:53.324297-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:26:42.17532-08:00","closed_at":"2026-01-09T14:26:42.17532-08:00","close_reason":"Added CheckMultiRepoTypes to bd doctor","dependencies":[{"issue_id":"bd-62g22","depends_on_id":"bd-9ji4z","type":"parent-child","created_at":"2026-01-09T14:06:00.869885-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-62ycw","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:23:05.336785-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:23:05.376983-08:00","closed_at":"2026-01-09T21:23:05.376983-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-6392j","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: inbox clean, MQ empty, no orphaned MRs. Clean handoff.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T17:20:18.384366-08:00","updated_at":"2026-01-12T17:20:18.384366-08:00","closed_at":"2026-01-12T17:20:18.384314-08:00","close_reason":"Squashed from 5 wisps","dependencies":[{"issue_id":"bd-6392j","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T17:20:18.385371-08:00","created_by":"beads/refinery"}]} {"id":"bd-63e9","title":"Fix Nix flake build test failures","description":"Nix build is failing during test phase with same test errors as Windows.\n\n**Error:**\n```\nerror: Cannot build '/nix/store/rgyi1j44dm6ylrzlg2h3z97axmfq9hzr-beads-0.9.9.drv'.\nReason: builder failed with exit code 1.\nFAIL github.com/steveyegge/beads/cmd/bd 16.141s\n```\n\nThis may be related to test environment setup or the same issues affecting Windows tests.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-02T09:29:37.2851-08:00","updated_at":"2025-11-04T11:10:23.531386-08:00","closed_at":"2025-11-04T11:10:23.531389-08:00","dependencies":[{"issue_id":"bd-63e9","depends_on_id":"bd-1231","type":"blocks","created_at":"2025-11-02T09:29:37.28618-08:00","created_by":"stevey"}]} {"id":"bd-63l","title":"bd hooks install fails in git worktrees","description":"When bd is used in a git worktree, bd hooks install fails with 'mkdir .git: not a directory' because .git is a file (gitdir pointer) not a directory. Beads should detect and follow the .git gitdir pointer to install hooks in the correct location. This blocks normal worktree workflows.\n\n## Symptoms of this bug:\n- Git hooks don't install automatically\n- Auto-sync doesn't run (5-second debounce)\n- Hash mismatch warnings in bd output\n- Daemon fails to start with 'auto_start_failed'\n\n## Workaround:\nUse `git rev-parse --git-dir` to find the actual hooks directory and copy hooks manually:\n```bash\nmkdir -p $(git rev-parse --git-dir)/hooks\ncp -r .beads-hooks/* $(git rev-parse --git-dir)/hooks/\n```","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-29T00:27:59.111163003-07:00","updated_at":"2025-11-29T23:20:04.196608-08:00","closed_at":"2025-11-29T23:20:01.394894-08:00"} {"id":"bd-649s","title":"Add custom type support to beads config","description":"Add types.custom config key mirroring status.custom pattern.\n\n## Work\n- Add CustomTypeConfigKey constant to config.go\n- Add GetCustomTypes() to storage interface \n- Add GetCustomTypes() implementation in sqlite/config.go and memory/memory.go\n- Add IssueType.IsValidWithCustom(customTypes []string) method\n- Update ValidateWithCustomStatuses to ValidateWithCustom (handle both)\n- Update all validation call sites to use GetCustomTypes()\n\n## Files\n- internal/storage/sqlite/config.go\n- internal/storage/storage.go\n- internal/storage/memory/memory.go\n- internal/types/types.go\n- internal/storage/sqlite/queries.go\n- internal/storage/sqlite/transaction.go\n- internal/storage/sqlite/batch_ops.go\n- internal/storage/sqlite/multirepo.go","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-06T20:40:04.168738-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T21:30:02.035131-08:00","closed_at":"2026-01-06T21:30:02.035131-08:00","close_reason":"Implemented custom type support mirroring custom status pattern","dependencies":[{"issue_id":"bd-649s","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.514971-08:00","created_by":"beads/crew/dave"}]} @@ -509,6 +519,7 @@ {"id":"bd-6ss","title":"Improve test coverage","description":"The test suite reports less than 45% code coverage. Identify the specific uncovered areas of the codebase, including modules, functions, or features. Rank them by potential impact on system reliability and business value, from most to least, and provide actionable recommendations for improving coverage in each area.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T06:54:23.036822442-07:00","updated_at":"2025-12-18T07:17:49.245940799-07:00","closed_at":"2025-12-18T07:17:49.245940799-07:00"} {"id":"bd-6uix","title":"Message System Improvements","description":"Consolidate improvements to the bd message command including core functionality (message reading), reliability (timeouts), validation, and code quality refactoring","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-08T12:55:47.907771-08:00","updated_at":"2025-11-08T12:59:05.802367-08:00","closed_at":"2025-11-08T12:59:05.802367-08:00"} {"id":"bd-6vnu","title":"Merge: opal-1767142018955","description":"branch: polecat/opal-1767142018955\ntarget: main\nsource_issue: opal-1767142018955\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T17:14:02.067823-08:00","created_by":"beads/polecats/opal","updated_at":"2025-12-30T18:12:30.973553-08:00","closed_at":"2025-12-30T18:11:07.776363-08:00"} +{"id":"bd-6vuci","title":"Review and merge PR #1036: Remove export from read-only commands","description":"dispatched_by: beads/crew/emma","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/giles","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:30.609535-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:40:17.756796-08:00","closed_at":"2026-01-12T16:40:17.756796-08:00","close_reason":"PR #1036 merged. Fix removes export from readOnlyCommands since it actually writes to clear dirty issues and update JSONL file hash."} {"id":"bd-6x6g","title":"Add multi-repo target repo switching in bd create","description":"In cmd/bd/create.go:164, there's a TODO to switch to the target repo for multi-repo support when creating issues. Currently the code may not properly handle creating issues in a different repo than the current one.\n\nFile: cmd/bd/create.go:164","status":"hooked","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:37.130679-08:00","created_by":"stevey","updated_at":"2025-12-30T15:44:43.361095-08:00"} {"id":"bd-6xfz","title":"GH#517: Fix Claude setting wrong priority syntax on new install","description":"Claude uses 'medium' instead of P2/2 for priority, causing infinite error loops. bd prime hook or docs not clear enough. See: https://github.com/steveyegge/beads/issues/517","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:55.740197-08:00","updated_at":"2025-12-16T14:39:19.051677-08:00","closed_at":"2025-12-16T01:08:05.911031-08:00"} {"id":"bd-6z7l","title":"Auto-detect scenarios and prompt users","description":"Detect when user is in fork/contributor scenario and prompt with helpful suggestions. Check: git remote relationships, existing .beads config, repo ownership. Suggest appropriate wizard.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:04:30.070695-08:00","updated_at":"2025-11-05T19:27:33.074733-08:00","closed_at":"2025-11-05T18:57:03.315476-08:00","dependencies":[{"issue_id":"bd-6z7l","depends_on_id":"bd-8rd","type":"parent-child","created_at":"2025-11-05T18:04:39.205478-08:00","created_by":"daemon"}]} @@ -591,6 +602,7 @@ {"id":"bd-7p5l","title":"Fix N+1 query pattern in swarm status blocked check","description":"In getSwarmStatus, when checking if an issue is blocked, we query each dependency individually with GetIssue. With 100 issues and 5 deps each, thats 500 extra queries. Fix: Build a status map upfront from the already-fetched childIssues slice. File: cmd/bd/swarm.go:706-710","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T21:31:07.586335-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T21:35:30.605065-08:00","closed_at":"2025-12-28T21:35:30.605065-08:00","dependencies":[{"issue_id":"bd-7p5l","depends_on_id":"bd-m6r3","type":"blocks","created_at":"2025-12-28T21:31:17.309538-08:00","created_by":"daemon"}]} {"id":"bd-7pwh","title":"HOP-compatible schema additions","description":"Add optional fields to Beads schema to enable future HOP integration.\nAll fields are backwards-compatible (optional, omitted if empty).\n\n## Reference\nSee ~/gt/docs/hop/BEADS-SCHEMA-CHANGES.md for full specification.\n\n## P1 Changes (Must Have Before Launch)\n\n### 1. EntityRef type\nStructured entity reference that can become HOP URI:\n```go\ntype EntityRef struct {\n Name string // \"polecat/Nux\"\n Platform string // \"gastown\"\n Org string // \"steveyegge\" \n ID string // \"polecat-nux\"\n}\n```\n\n### 2. creator field\nEvery issue tracks who created it (EntityRef).\n\n### 3. assignee_ref field\nStructured form alongside existing string assignee.\n\n### 4. validations array\nTrack who validated work completion:\n```go\ntype Validation struct {\n Validator *EntityRef\n Outcome string // accepted, rejected, revision_requested\n Timestamp time.Time\n Score *float32 // Future\n}\n```\n\n## P2 Changes (Should Have)\n\n### 5. work_type field\n\"mutex\" (default) or \"open_competition\"\n\n### 6. crystallizes field\nBoolean - does this work compound (true) or evaporate (false)?\n\n### 7. cross_refs field\nArray of URIs to beads in other repos:\n- \"beads://github/anthropics/claude-code/bd-xyz\"\n\n## P3 Changes (Nice to Have)\n\n### 8. skill_vector placeholder\nReserved for future embeddings: []float32\n\n## Implementation Notes\n- All fields optional in JSONL serialization\n- Empty/null fields omit from output\n- No migration needed for existing data\n- CLI additions: --creator, --validated-by filters","notes":"Scope reduced after review. P1 only: EntityRef type, creator field, validations array. Deferred: assignee_ref, work_type, crystallizes, cross_refs, skill_vector (YAGNI - semantics unclear, can add later when needed).","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T02:42:39.267984-08:00","updated_at":"2025-12-22T20:09:09.211821-08:00","closed_at":"2025-12-22T20:09:09.211821-08:00"} {"id":"bd-7r4l","title":"GH#488: Support claude.local.md for local-only config","description":"Allow CLAUDE.local.md for testing bd without committing to repo or overriding shared CLAUDE.md. Not every repo wants committed AI config. See: https://github.com/steveyegge/beads/issues/488","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-14T16:32:19.944847-08:00","updated_at":"2025-12-16T01:17:26.116311-08:00","closed_at":"2025-12-14T17:29:34.624157-08:00"} +{"id":"bd-7s5v5","title":"Document bd reset --hard or implement if missing (GH#922)","description":"## GitHub Issue\nhttps://github.com/steveyegge/beads/issues/922\n\n## Problem\nUser reports `bd admin reset --hard` and `bd admin reset --skip-init` commands are missing/undocumented. When doing `bd reset` followed by `bd init`, old data keeps coming back.\n\n## Investigation Needed\n1. Check if `--hard` flag exists in current codebase\n2. If exists: document it properly\n3. If not: determine if it should be added or if there's an alternative workflow\n\n## Files to check\n- `cmd/bd/reset.go` or similar\n- `cmd/bd/admin.go`\n- Documentation files","status":"closed","priority":2,"issue_type":"bug","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:46:53.43966-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:47:44.59529-08:00","closed_at":"2026-01-12T02:47:44.59529-08:00","close_reason":"GH#922 resolved - documentation already added to CLI_REFERENCE.md and TROUBLESHOOTING.md. Closed the GitHub issue."} {"id":"bd-7t9a","title":"MCP plugin: _find_beads_db_in_tree() should follow .beads/redirect files","description":"## Problem\nThe `_find_beads_db_in_tree()` function in `integrations/beads-mcp/src/beads_mcp/tools.py` does not follow `.beads/redirect` files.\n\n## Impact\nMCP beads tools fail from polecat/crew directories that use redirect files to share a beads database.\n\n## Root Cause\nWhen auto-detecting workspace, the MCP plugin looks for `.beads/*.db` files directly but doesn't check for or follow `redirect` files:\n\n```python\nbeads_dir = os.path.join(current, '.beads')\nif os.path.isdir(beads_dir):\n db_files = glob.glob(os.path.join(beads_dir, '*.db')) # Only looks for .db files\n valid_dbs = [f for f in db_files if '.backup' not in os.path.basename(f)]\n if valid_dbs:\n return current\n```\n\nPolecat directories have `.beads/redirect` files (e.g., containing `../../mayor/rig/.beads`) but no `.db` files, so `_find_beads_db_in_tree()` doesn't find them.\n\n## Expected Behavior\nThe function should:\n1. Check for `.beads/redirect` file first\n2. If found, follow the redirect to the actual beads location\n3. Verify the redirected location has a valid database\n\n## Reference\nThe Go implementation handles this correctly in `ResolveBeadsDir()` - see gastown `internal/beads/beads.go:23-60`.\n\n## Related\n- gt-tnw: MCP beads tools fail from polecat directories","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T23:57:21.710278-08:00","created_by":"gastown/polecats/capable","updated_at":"2025-12-30T00:05:38.307967-08:00","closed_at":"2025-12-30T00:05:38.307967-08:00","close_reason":"Fixed: added _resolve_beads_redirect() to follow .beads/redirect files in MCP plugin auto-detection"} {"id":"bd-7tuu","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:02.053382-08:00","updated_at":"2025-12-20T01:23:52.484043-08:00","closed_at":"2025-12-20T01:23:52.484043-08:00","dependencies":[{"issue_id":"bd-7tuu","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.021087-08:00","created_by":"daemon"},{"issue_id":"bd-7tuu","depends_on_id":"bd-hw3w","type":"blocks","created_at":"2025-12-19T22:56:23.291591-08:00","created_by":"daemon"}]} {"id":"bd-7u877","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:32:13.066915-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T18:32:13.10513-08:00","closed_at":"2026-01-09T18:32:13.10513-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -643,9 +655,11 @@ {"id":"bd-8ayj","title":"bd-hv01: Race condition with concurrent snapshot operations","description":"## Problem\nSnapshot files have no locking. Multiple processes can call captureLeftSnapshot simultaneously:\n\n1. Process A: export → begins snapshot\n2. Process B: export → begins snapshot\n3. Process A: writes partial left.jsonl\n4. Process B: overwrites with its left.jsonl\n5. Process A: completes merge with wrong snapshot\n\n## Impact\n- Data corruption in multi-process scenarios\n- Daemon + manual sync race\n- Multiple git clones on same filesystem\n\n## Fix\nUse atomic file operations with process-specific temp files:\n```go\nfunc captureLeftSnapshot(jsonlPath string) error {\n _, leftPath := getSnapshotPaths(jsonlPath)\n tempPath := fmt.Sprintf(\"%s.%d.tmp\", leftPath, os.Getpid())\n if err := copyFileSnapshot(jsonlPath, tempPath); err != nil {\n return err\n }\n return os.Rename(tempPath, leftPath) // Atomic on POSIX\n}\n```\n\n## Files Affected\n- cmd/bd/deletion_tracking.go:24-29 (captureLeftSnapshot)\n- cmd/bd/deletion_tracking.go:31-36 (updateBaseSnapshot)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T18:15:38.177367-08:00","updated_at":"2025-11-06T18:46:55.91344-08:00","closed_at":"2025-11-06T18:46:55.91344-08:00","dependencies":[{"issue_id":"bd-8ayj","depends_on_id":"bd-rbxi","type":"parent-child","created_at":"2025-11-06T18:19:14.875543-08:00","created_by":"daemon"}]} {"id":"bd-8b0x","title":"Remove molecule.go (simple instantiation)","description":"molecule.go uses is_template field for simple single-issue cloning. This is too simple for what molecules should be - full DAG orchestration. The use case is covered by bd mol bond with a single-issue molecule. Delete molecule.go and its commands.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T23:52:15.041776-08:00","updated_at":"2025-12-21T00:04:32.335849-08:00","closed_at":"2025-12-21T00:04:32.335849-08:00","dependencies":[{"issue_id":"bd-8b0x","depends_on_id":"bd-ffjt","type":"blocks","created_at":"2025-12-20T23:52:25.807967-08:00","created_by":"daemon"}]} {"id":"bd-8b65","title":"Add depth-based batch creation in upsertIssues","description":"Replace single batch creation with depth-level batching (max depth 3). Create issues at depth 0, then 1, then 2, then 3. Prevents parent validation errors when importing hierarchical issues in same batch. File: internal/importer/importer.go:534-546","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-04T12:31:42.267746-08:00","updated_at":"2025-11-05T00:08:42.813239-08:00","closed_at":"2025-11-05T00:08:42.813246-08:00"} +{"id":"bd-8c02s","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:43:56.478174-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T18:43:56.543549-08:00","closed_at":"2026-01-12T18:43:56.543549-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-8ca7","title":"Merge: bd-au0.6","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: bd-au0.6\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:42:30.870178-08:00","updated_at":"2025-12-23T21:21:57.695179-08:00","closed_at":"2025-12-23T21:21:57.695179-08:00"} {"id":"bd-8cns","title":"gt sling --create fails to create polecat before resolving pane","description":"gt sling --create tries to resolve pane BEFORE creating the polecat, causing failure.\n\nExpected: gt sling gt-xyz gastown/newcat --create should:\n1. Create polecat if not exists\n2. Start session\n3. Hook work\n4. GUPP triggers autonomous execution\n\nActual: Fails with 'getting pane for gt-gastown-newcat: exit status 1'\n\nLocation: internal/cmd/sling.go - need to reorder operations","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-30T21:20:59.58382-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:07.76718-08:00","closed_at":"2025-12-30T22:19:27.682372-08:00","close_reason":"Fixed in PR #4: https://github.com/steveyegge/gastown/pull/4"} {"id":"bd-8e0q","title":"Merge: beads-ocs","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: beads-ocs\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:24:45.281478-08:00","updated_at":"2025-12-20T23:17:26.995706-08:00","closed_at":"2025-12-20T23:17:26.995706-08:00"} +{"id":"bd-8f22r","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:32:12.327197-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:32:12.393976-08:00","closed_at":"2026-01-12T02:32:12.393976-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-8f8b","title":"Test update","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T12:59:13.608216-08:00","updated_at":"2025-11-05T12:59:20.120052-08:00","closed_at":"2025-11-05T12:59:20.120052-08:00"} {"id":"bd-8fgn","title":"test hash length","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T13:49:32.113843-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-8fqd","title":"Test role bead","status":"closed","priority":2,"issue_type":"role","created_at":"2025-12-27T23:37:10.275712-08:00","created_by":"mayor","updated_at":"2025-12-27T23:37:15.585821-08:00","closed_at":"2025-12-27T23:37:15.585821-08:00"} @@ -729,6 +743,7 @@ {"id":"bd-9nw","title":"Document sandbox workarounds for GH #353","description":"Add documentation for sandbox troubleshooting and new flags.\n\n**Tasks:**\n1. Create or update TROUBLESHOOTING.md with sandbox section\n2. Document new flags in CLI reference\n3. Add comment to GH #353 with immediate workarounds\n\n**Content needed:**\n- Symptoms of daemon lock issues in sandboxed environments\n- Usage guide for --sandbox, --force, and --allow-stale flags\n- Step-by-step troubleshooting for Codex users\n- Examples of each escape hatch\n\n**Files to update:**\n- docs/TROUBLESHOOTING.md (create if needed)\n- docs/CLI_REFERENCE.md or README.md\n- GitHub issue #353\n\n**References:**\n- docs/GH353_INVESTIGATION.md (lines 240-276)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-21T18:52:30.794526-05:00","updated_at":"2025-11-22T14:57:44.495978927-05:00","closed_at":"2025-11-21T19:25:19.216834-05:00"} {"id":"bd-9ockw","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:35:32.061019-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T13:35:32.121347-08:00","closed_at":"2026-01-10T13:35:32.121347-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9p7dt","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:55.017921-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T20:42:55.084089-08:00","closed_at":"2026-01-11T20:42:55.084089-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-9psbe","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:31:06.904637-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T17:31:06.969423-08:00","closed_at":"2026-01-12T17:31:06.969423-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9qajq","title":"gt sling crew auto-picks random crew worker (violates crew model)","description":"## Problem\n\n`gt sling bd-xxx crew` auto-dispatches to a random crew worker. This violates the crew model:\n\n- **Crew** = persistent, human-managed workspaces. Human decides who gets what work.\n- **Polecats** = transient worker pool. Auto-dispatch makes sense.\n\nCurrent behavior interrupts crew workers unexpectedly, which is the antithesis of what crew are for.\n\n## Expected Behavior\n\nEither:\n1. Require explicit crew worker name: `gt sling bd-xxx crew/fang` (no auto-pick)\n2. Or reject `gt sling ... crew` entirely - crew assignment should be manual\n\n## Workaround\n\nAssign beads manually with `bd update --assignee` and send mail.","status":"open","priority":2,"issue_type":"bug","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:36:45.62829-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T01:36:45.62829-08:00"} {"id":"bd-9qj5","title":"Merge: bd-c7y5","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-c7y5\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:02.626929-08:00","updated_at":"2025-12-23T21:21:57.699742-08:00","closed_at":"2025-12-23T21:21:57.699742-08:00"} {"id":"bd-9rw1","title":"Support P-prefix priority format (P0-P4) in create and update commands","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-05T13:56:04.796826-08:00","updated_at":"2025-11-05T13:56:08.157061-08:00","closed_at":"2025-11-05T13:56:08.157061-08:00"} @@ -736,8 +751,10 @@ {"id":"bd-9szg","title":"Test prefix bd","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.470665-08:00","created_by":"stevey","updated_at":"2025-12-27T14:24:50.420887-08:00","deleted_at":"2025-12-27T14:24:50.420887-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-9usz","title":"Test suite hangs/never finishes","description":"Running 'go test ./... -count=1' hangs indefinitely. The full test suite never completes, making it difficult to verify changes. Need to investigate which tests are hanging and fix or add timeouts.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-16T21:56:27.80191-08:00","updated_at":"2025-12-23T23:48:57.837606-08:00","closed_at":"2025-12-23T23:48:57.837606-08:00"} {"id":"bd-9v7l","title":"bd status \"Recent Activity\" is misleading - should use git history","description":"## Problem\n\n`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.\n\n## Issues\n\n1. Only queries database timestamps, not git history\n2. 7 days is too long a window\n3. Numbers don't reflect actual activity in JSONL git history\n\n## Proposed Fix\n\nEither:\n- Query git history of `.beads/beads.jsonl` to get actual activity (last 24-48 hours)\n- Remove \"Recent Activity\" section entirely if not useful\n- Make time window configurable and default to 24h\n\n## Example Output (Current)\n```\nRecent Activity (last 7 days):\nIssues Created: 174\nIssues Closed: 141\nIssues Updated: 37\n```\nThis is misleading when thousands of issues have actually cycled through.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-05T01:03:00.234813-08:00","updated_at":"2025-11-06T18:47:42.682987-08:00","closed_at":"2025-11-06T18:47:42.682987-08:00"} +{"id":"bd-9vn11","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:29:02.744642-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T17:29:02.794105-08:00","closed_at":"2026-01-12T17:29:02.794105-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-9w27m","title":"Digest: mol-refinery-patrol","description":"Patrol: MQ empty, no branches processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T20:03:47.544242-08:00","updated_at":"2026-01-10T20:03:47.544242-08:00","closed_at":"2026-01-10T20:03:47.544205-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-9w3s","title":"Improve test coverage for internal/lockfile (42.0% → 60%)","description":"The lockfile package has only 42.0% test coverage. Lock file handling is critical for preventing data corruption in concurrent scenarios.\n\nCurrent coverage: 42.0%\nTarget coverage: 60%","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:08.47488-08:00","updated_at":"2025-12-15T16:12:59.163093-08:00","closed_at":"2025-12-14T15:20:51.463282-08:00"} +{"id":"bd-9wg8g","title":"Review PR #1033: Fix jj/jujutsu detached HEAD compatibility","description":"dispatched_by: beads/crew/emma\n\nEasy-win bug fix with tests. PR: https://github.com/steveyegge/beads/pull/1033. Fixes --auto-push for jj users in detached HEAD. Run tests, verify logic, approve and merge.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:26:07.478805-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T17:30:38.329599-08:00","closed_at":"2026-01-12T17:30:38.329599-08:00","close_reason":"PR #1033 reviewed, approved, and merged. Tests pass. Fix allows --auto-push with jj/jujutsu detached HEAD mode."} {"id":"bd-9yvw","title":"Merge: flint-mjtmdf12","description":"branch: polecat/flint-mjtmdf12\ntarget: main\nsource_issue: flint-mjtmdf12\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:20:42.246333-08:00","created_by":"beads/polecats/flint","updated_at":"2026-01-01T10:43:18.620902-08:00","closed_at":"2026-01-01T10:43:18.620902-08:00","close_reason":"Stale MR - branch no longer exists on remote"} {"id":"bd-a02wr","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:54:42.032755-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T18:54:42.100213-08:00","closed_at":"2026-01-11T18:54:42.100213-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-a03d5e36","title":"Improve integration test coverage for stateful features","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-29T21:53:15.397137-07:00","updated_at":"2025-12-14T12:12:46.508474-08:00","closed_at":"2025-11-08T00:36:59.02371-08:00"} @@ -851,13 +868,13 @@ {"id":"bd-bdhn","title":"bd message: Add input validation for --importance flag","description":"The --importance flag accepts any string without validation, leading to confusing server errors.\n\n**Location:** cmd/bd/message.go:256-258\n\n**Fix:**\n- Add flag validation for: low, normal, high, urgent\n- Add shell completion support\n- Validate in runMessageSend before sending\n\n**Impact:** Better UX, prevents confusing errors","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T12:54:26.43027-08:00","updated_at":"2025-11-08T12:57:59.65367-08:00","closed_at":"2025-11-08T12:57:59.65367-08:00","dependencies":[{"issue_id":"bd-bdhn","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:54.910841-08:00","created_by":"daemon"}]} {"id":"bd-bdmwf","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-11T00:21:01.891501-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T00:21:01.932445-08:00","closed_at":"2026-01-11T00:21:01.932445-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-be7a","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","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-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-12T01:21:44.537322-08:00"} +{"id":"bd-beads-crew-dave","title":"Crew worker dave in beads - human-managed persistent workspace.","description":"Crew worker dave in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.538389-08:00","created_by":"deacon","updated_at":"2026-01-12T19:30:26.908704-08:00"} {"id":"bd-beads-crew-emma","title":"Crew worker emma in beads - human-managed persistent workspace.","description":"Crew worker emma in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.604042-08:00","created_by":"deacon","updated_at":"2026-01-12T01:39:30.40061-08:00"} -{"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","created_by":"deacon","updated_at":"2026-01-11T20:42:53.287787-08:00"} -{"id":"bd-beads-crew-giles","title":"Crew worker giles in beads - human-managed persistent workspace.","description":"Crew worker giles in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:22:11.009942-08:00","created_by":"mayor","updated_at":"2026-01-11T20:42:37.225394-08:00"} -{"id":"bd-beads-crew-grip","title":"Crew worker grip in beads - human-managed persistent workspace.","description":"Crew worker grip in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.739788-08:00","created_by":"deacon","updated_at":"2026-01-11T18:18:14.58107-08:00"} +{"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","created_by":"deacon","updated_at":"2026-01-12T19:30:22.792464-08:00"} +{"id":"bd-beads-crew-giles","title":"Crew worker giles in beads - human-managed persistent workspace.","description":"Crew worker giles in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:22:11.009942-08:00","created_by":"mayor","updated_at":"2026-01-12T19:31:34.944562-08:00"} +{"id":"bd-beads-crew-grip","title":"Crew worker grip in beads - human-managed persistent workspace.","description":"Crew worker grip in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.739788-08:00","created_by":"deacon","updated_at":"2026-01-12T19:35:30.83873-08:00"} {"id":"bd-beads-crew-testcrew456","title":"Crew worker testcrew456 in beads - human-managed persistent workspace.","description":"Crew worker testcrew456 in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: hq-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-09T22:03:44.377795-08:00","created_by":"deacon","updated_at":"2026-01-09T22:03:44.639847-08:00"} -{"id":"bd-beads-crew-wolf","title":"Crew worker wolf in beads - human-managed persistent workspace.","description":"Crew worker wolf in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.805884-08:00","created_by":"deacon","updated_at":"2026-01-11T21:34:04.189723-08:00"} +{"id":"bd-beads-crew-wolf","title":"Crew worker wolf in beads - human-managed persistent workspace.","description":"Crew worker wolf in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.805884-08:00","created_by":"deacon","updated_at":"2026-01-12T19:30:32.12863-08:00"} {"id":"bd-beads-polecat-amber","title":"bd-beads-polecat-amber","description":"bd-beads-polecat-amber\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-uuo9\nrole_bead: hq-polecat-role\ncleanup_status: has_stash\nactive_mr: bd-3mky\nnotification_level: null","status":"closed","priority":2,"issue_type":"agent","created_at":"2026-01-04T16:17:26.278115-08:00","created_by":"mayor","updated_at":"2026-01-10T16:38:00.102831-08:00","closed_at":"2026-01-05T19:45:45.481449-08:00","close_reason":"Polecat cleaned up","labels":["gt:agent"]} {"id":"bd-beads-polecat-garnet","title":"bd-beads-polecat-garnet","description":"bd-beads-polecat-garnet\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-hmeb\nrole_bead: hq-polecat-role\ncleanup_status: null\nactive_mr: bd-o64zq\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-04T15:12:49.812132-08:00","created_by":"mayor","updated_at":"2026-01-10T21:13:27.005496-08:00","close_reason":"Polecat cleaned up","labels":["gt:agent"],"deleted_at":"2026-01-10T21:13:27.005496-08:00","deleted_by":"beads/witness","delete_reason":"delete","original_type":"agent"} {"id":"bd-beads-polecat-jasper","title":"bd-beads-polecat-jasper","description":"bd-beads-polecat-jasper\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-oos3\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-srhu\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-02T12:41:56.3782-08:00","created_by":"mayor","updated_at":"2026-01-10T21:12:27.803897-08:00","deleted_at":"2026-01-02T16:57:50.038825-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} @@ -891,7 +908,7 @@ {"id":"bd-bpc4f","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:25:01.003771-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:25:01.040024-08:00","closed_at":"2026-01-08T20:25:01.040024-08:00","close_reason":"auto-closed session event"} {"id":"bd-bqcc","title":"Consolidate maintenance commands into bd doctor --fix","description":"Per rsnodgrass in GH#692:\n\u003e \"The biggest improvement to beads from an ergonomics perspective would be to prune down commands. We have a lot of 'maintenance' commands that probably should just be folded into 'bd doctor --fix' automatically.\"\n\nCurrent maintenance commands that could be consolidated:\n- clean - Clean up temporary git merge artifacts\n- cleanup - Delete closed issues and prune expired tombstones\n- compact - Compact old closed issues\n- detect-pollution - Detect and clean test issues\n- migrate-* (5 commands) - Various migration utilities\n- repair-deps - Fix orphaned dependency references\n- validate - Database health checks\n\nProposal:\n1. Make `bd doctor` the single entry point for health checks\n2. Add `bd doctor --fix` to auto-fix common issues\n3. Deprecate (but keep working) individual commands\n4. Add `bd doctor --all` for comprehensive maintenance\n\nThis would reduce cognitive load for users - they just need to remember 'bd doctor'.\n\nNote: This is higher impact but also higher risk - needs careful design to avoid breaking existing workflows.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:27:31.466556-08:00","updated_at":"2025-12-23T01:33:25.732363-08:00","closed_at":"2025-12-23T01:33:25.732363-08:00"} {"id":"bd-bqidi","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:38:36.045742-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T13:38:36.08369-08:00","closed_at":"2026-01-10T13:38:36.08369-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} -{"id":"bd-br7hj","title":"Updated title","status":"in_progress","priority":0,"issue_type":"feature","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:15:59.645378-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:15:59.707608-08:00"} +{"id":"bd-br7hj","title":"Updated title","status":"closed","priority":0,"issue_type":"feature","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:15:59.645378-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-12T16:41:37.64937-08:00","closed_at":"2026-01-12T16:41:37.64937-08:00","close_reason":"Stale orphaned wisp"} {"id":"bd-br8","title":"Implement `bd setup claude` command for Claude Code integration","description":"Create a `bd setup claude` command that installs Claude Code integration files (slash commands and hooks). This is idempotent and safe to run multiple times.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-11T23:28:59.374019-08:00","updated_at":"2025-11-12T08:51:23.281292-08:00","closed_at":"2025-11-12T08:51:23.281292-08:00","dependencies":[{"issue_id":"bd-br8","depends_on_id":"bd-rpn","type":"blocks","created_at":"2025-11-11T23:28:59.375616-08:00","created_by":"daemon"},{"issue_id":"bd-br8","depends_on_id":"bd-90v","type":"parent-child","created_at":"2025-11-11T23:31:23.762685-08:00","created_by":"daemon"}]} {"id":"bd-bs5j","title":"Release v0.33.2","description":"Version bump workflow for beads release 0.33.2.\n\n## Variables\n- `0.33.2` - The new version number (e.g., 0.31.0)\n- `2025-12-21` - Release date (YYYY-MM-DD format)\n\n## Workflow Steps\n1. Kill running daemons\n2. Run tests and linting\n3. Bump version in all files (10 files total)\n4. Update cmd/bd/info.go with release notes\n5. Commit and push version bump\n6. Create and push git tag\n7. Update Homebrew formula\n8. Upgrade local Homebrew installation\n9. Verify installation\n\n## Files Updated by bump-version.sh\n- cmd/bd/version.go\n- .claude-plugin/plugin.json\n- .claude-plugin/marketplace.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- README.md\n- npm-package/package.json\n- cmd/bd/templates/hooks/* (4 files)\n- CHANGELOG.md\n\n## Manual Step Required\n- cmd/bd/info.go - Add versionChanges entry with release notes","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-21T16:10:13.759062-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"bd-bscs","title":"GH#518: Document bd setup command","description":"bd setup (e.g. bd setup cursor) is undocumented. Users only find it by grepping source. Need proper docs. See: https://github.com/steveyegge/beads/issues/518","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T16:31:35.881408-08:00","updated_at":"2025-12-16T14:39:19.052118-08:00","closed_at":"2025-12-16T01:09:09.420428-08:00"} @@ -905,6 +922,7 @@ {"id":"bd-bw6","title":"Fix G104 errors unhandled in internal/storage/sqlite/queries.go:1181","description":"Linting issue: G104: Errors unhandled (gosec) at internal/storage/sqlite/queries.go:1181:4. Error: rows.Close()","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:09.008444133-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-bwdd","title":"GH#497: bd onboard copilot-instructions.md is beads-specific, not generic","description":"bd onboard outputs beads repo specific content (Go/SQLite/Cobra) for copilot-instructions.md instead of a generic template. AGENTS.md output is correct. See: https://github.com/steveyegge/beads/issues/497","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-14T16:32:18.599655-08:00","updated_at":"2025-12-16T01:27:29.015259-08:00","closed_at":"2025-12-16T01:27:29.015259-08:00"} {"id":"bd-bwk2","title":"Centralize error handling patterns in storage layer","description":"80+ instances of inconsistent error handling across sqlite.go with mix of %w, %v, and no wrapping.\n\nLocation: internal/storage/sqlite/sqlite.go (throughout)\n\nProblem:\n- Some use fmt.Errorf(\"op failed: %w\", err) - correct wrapping\n- Some use fmt.Errorf(\"op failed: %v\", err) - loses error chain\n- Some return err directly - no context\n- Hard to debug production issues\n- Can't distinguish error types\n\nSolution: Create internal/storage/sqlite/errors.go:\n- Define sentinel errors (ErrNotFound, ErrInvalidID, etc.)\n- Create wrapDBError(op string, err error) helper\n- Convert sql.ErrNoRows to ErrNotFound\n- Always wrap with operation context\n\nImpact: Lost error context; inconsistent messages; hard to debug\n\nEffort: 5-7 hours","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-16T14:51:54.974909-08:00","updated_at":"2025-12-21T21:44:37.237175-08:00","closed_at":"2025-12-21T21:44:37.237175-08:00"} +{"id":"bd-bx5ko","title":"Review PR #1052: Add jira-beads-sync to COMMUNITY_TOOLS.md","description":"dispatched_by: beads/crew/emma\n\nEasy-win docs addition. PR: https://github.com/steveyegge/beads/pull/1052. Review link, format, approve and merge.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/grip","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:26:05.021994-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T17:28:17.035338-08:00","closed_at":"2026-01-12T17:28:17.035338-08:00","close_reason":"PR #1052 merged"} {"id":"bd-bxha","title":"Default to YES for git hooks and merge driver installation","description":"Currently bd init prompts user to install git hooks and merge driver, but setup is incomplete if user declines. Change to install by default unless --skip-hooks or --skip-merge-driver flags are passed. Better safe defaults. If installation fails, warn user and suggest bd doctor --fix.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-21T23:16:10.172238-08:00","updated_at":"2025-12-23T04:20:51.885765-08:00","closed_at":"2025-12-23T04:20:51.885765-08:00","dependencies":[{"issue_id":"bd-bxha","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:10.173034-08:00","created_by":"daemon"}]} {"id":"bd-bxqv","title":"Update documentation for CLI consolidation","description":"## Task\nUpdate all documentation to reflect CLI consolidation changes.\n\n## Files requiring updates\n\n### Primary docs\n- docs/CLI_REFERENCE.md - Major updates\n - Add admin section (cleanup, compact, reset)\n - Update migrate section (subcommands)\n - Update formula section (add cook)\n - Remove/update standalone command references\n\n### Secondary docs \n- docs/DELETIONS.md - migrate-tombstones → migrate tombstones, compact → admin compact\n- docs/FAQ.md - compact → admin compact\n- docs/QUICKSTART.md - compact, cleanup → admin compact, admin cleanup\n- docs/TROUBLESHOOTING.md - compact → admin compact\n- docs/CONFIG.md - compact → admin compact\n- docs/INSTALLING.md - quickstart reference\n- docs/EXTENDING.md - quickstart reference\n\n### Skills docs\n- skills/beads/SKILL.md - compact, quickstart references\n- skills/beads/references/CLI_REFERENCE.md - mirror main CLI_REFERENCE.md\n\n### Other docs\n- commands/quickstart.md - update or remove\n- commands/compact.md - update to admin compact\n- examples/compaction/README.md - update examples\n- README.md - quickstart reference\n- CHANGELOG.md - add consolidation changes section\n\n## Implementation notes\n- Keep backwards compatibility notices where aliases exist\n- Update command examples to use new paths\n- Consider adding deprecation warnings section\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:11:33.307408-08:00","created_by":"mayor","updated_at":"2025-12-27T16:19:36.155138-08:00","closed_at":"2025-12-27T16:19:36.155138-08:00","dependencies":[{"issue_id":"bd-bxqv","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:52.445529-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:52.475688-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:52.504528-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:52.533506-08:00","created_by":"daemon"}]} {"id":"bd-by0d","title":"Work on beads-ldv: Fix bd graph crashes with nil pointer ...","description":"Work on beads-ldv: Fix bd graph crashes with nil pointer dereference (GH#657). Fix nil pointer in computeDependencyCounts at graph.go:428. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:55:27.829359-08:00","updated_at":"2025-12-19T23:28:32.428314-08:00","closed_at":"2025-12-19T23:20:49.038441-08:00"} @@ -960,6 +978,7 @@ {"id":"bd-cdf7","title":"Add tests for DetectCycles to improve coverage from 29.6%","description":"DetectCycles currently has 29.6% coverage. Need comprehensive tests for:\n- Simple cycles (A-\u003eB-\u003eA)\n- Complex multi-node cycles\n- Acyclic graphs (should not detect cycles)\n- Self-loops\n- Multiple independent cycles\n- Edge cases (empty graph, single node)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-01T22:40:58.977156-07:00","updated_at":"2025-11-01T22:52:02.243223-07:00","closed_at":"2025-11-01T22:52:02.243223-07:00"} {"id":"bd-ce37850f","title":"Add embedding generation for duplicate detection","description":"Use embeddings for scalable duplicate detection.\n\nModel: text-embedding-3-small (OpenAI) or all-MiniLM-L6-v2 (local)\nStorage: SQLite vector extension or in-memory\nCost: ~/bin/bash.0002 per 100 issues\n\nMuch cheaper than LLM comparisons for large databases.\n\nFiles: internal/embeddings/ (new package)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T14:48:29.072913-07:00","updated_at":"2025-12-14T12:12:46.532701-08:00","closed_at":"2025-11-06T19:27:25.234801-08:00"} {"id":"bd-ce70","title":"Review: Polecats should not delete tracked beads files","description":"During gt-3w685 implementation, nux accidentally included .beads/issues.jsonl deletion in commit. Review polecat sandboxing to ensure .beads/ files are protected from accidental deletion. Consider adding .beads/ to a protected paths list or gitignore in polecat worktrees.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:10:43.645481-08:00","created_by":"mayor","updated_at":"2026-01-06T20:14:25.968848-08:00","closed_at":"2026-01-06T20:14:25.968848-08:00","close_reason":"Refiling as gt- issue"} +{"id":"bd-ceo1c","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:31:39.359946-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T17:31:39.42748-08:00","closed_at":"2026-01-12T17:31:39.42748-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-cf349eb3","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T23:20:10.39272-07:00","updated_at":"2025-10-30T17:12:58.215471-07:00","closed_at":"2025-10-27T23:05:31.945614-07:00"} {"id":"bd-cfxq","title":"Merge: topaz-1767106269860","description":"branch: polecat/topaz-1767106269860\ntarget: main\nsource_issue: topaz-1767106269860\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:18:49.114417-08:00","created_by":"beads/polecats/topaz","updated_at":"2025-12-30T18:12:30.985385-08:00","closed_at":"2025-12-30T18:11:08.052794-08:00"} {"id":"bd-chsc","title":"Test lowercase p0","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-05T12:58:41.457875-08:00","updated_at":"2025-11-05T12:58:44.721486-08:00","closed_at":"2025-11-05T12:58:44.721486-08:00"} @@ -969,6 +988,7 @@ {"id":"bd-ckvw","title":"Add schema compatibility probe to prevent silent migration failures","description":"Issue #262 revealed a serious bug: migrations may fail silently, causing UNIQUE constraint errors later.\n\nRoot cause:\n- sqlite.New() runs migrations once on open\n- checkVersionMismatch() prints 'database will be upgraded automatically' but only updates metadata\n- If migrations fail or daemon runs older version, queries expecting new columns fail with 'no such column'\n- Import logic misinterprets this as 'not found' and tries INSERT on existing ID\n- Result: UNIQUE constraint failed: issues.id\n\nFix strategy (minimal):\n1. Add schema probe in sqlite.New() after RunMigrations\n - SELECT all expected columns from all tables with LIMIT 0\n - If fails, retry RunMigrations and probe again\n - If still fails, return fatal error with clear message\n2. Fix checkVersionMismatch to not claim 'will upgrade' unless probe passes\n3. Only update bd_version after successful migration probe\n4. Add schema verification before import operations\n5. Map 'no such column' errors to clear actionable message\n\nRelated: #262","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-08T13:23:26.934246-08:00","updated_at":"2025-11-08T13:53:29.219542-08:00","closed_at":"2025-11-08T13:53:29.219542-08:00"} {"id":"bd-cl1o","title":"Merge: obsidian-mjw4b7ph","description":"branch: polecat/obsidian-mjw4b7ph\ntarget: main\nsource_issue: obsidian-mjw4b7ph\nrig: beads\nagent_bead: gt-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T16:17:26.585696-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-01T16:19:26.187-08:00","closed_at":"2026-01-01T16:19:26.187-08:00","close_reason":"Branch dropped during rebase - changes already in main"} {"id":"bd-clryf","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T19:18:02.054712-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T19:18:02.121754-08:00","closed_at":"2026-01-11T19:18:02.121754-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-clvv8","title":"Review and merge PR #1055: bump upload-pages-artifact v3→v4","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1055\nType: Dependabot dependency bump (GitHub Actions)\nChange: actions/upload-pages-artifact v3 → v4\n\n## Task\n1. Review the PR diff: `gh pr diff 1055 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1055 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1055 --repo steveyegge/beads --approve`\n `gh pr merge 1055 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Major version bump: dotfiles will NOT be included in artifacts (breaking change)\n- Likely OK for beads since we probably don't rely on dotfiles in page artifacts","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/crew/fang","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:32.929163-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:28:52.942707-08:00","external_ref":"gh-1055"} {"id":"bd-cm5g","title":"Merge: basalt-mjtme50i","description":"branch: polecat/basalt-mjtme50i\ntarget: main\nsource_issue: basalt-mjtme50i\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:20:38.32952-08:00","created_by":"beads/polecats/basalt","updated_at":"2026-01-01T10:43:18.622647-08:00","closed_at":"2026-01-01T10:43:18.622647-08:00","close_reason":"Stale MR - branch no longer exists on remote"} {"id":"bd-cmdfo","title":"Assigned issue","status":"open","priority":1,"issue_type":"task","assignee":"testuser","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:02.343011-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:02.343011-08:00"} {"id":"bd-cmqzz","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T19:14:19.936945-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T19:14:20.002371-08:00","closed_at":"2026-01-11T19:14:20.002371-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -980,6 +1000,7 @@ {"id":"bd-crncp","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:06:30.524914-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:06:30.558713-08:00","closed_at":"2026-01-09T14:06:30.558713-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-crv06","title":"Issue 1","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:14.494763-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:14.494763-08:00","dependencies":[{"issue_id":"bd-crv06","depends_on_id":"bd-r53nt","type":"related","created_at":"2026-01-11T18:16:14.690959-08:00","created_by":"beads/crew/wolf"}]} {"id":"bd-cs2l","title":"Test Agent","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T01:55:35.621013-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T02:21:06.391783-08:00","deleted_at":"2025-12-28T02:21:06.391783-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"agent"} +{"id":"bd-cslfj","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:42:36.889361-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:42:36.954085-08:00","closed_at":"2026-01-12T16:42:36.954085-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-csnep","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:27:05.392572-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T16:27:05.428055-08:00","closed_at":"2026-01-10T16:27:05.428055-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-csnr","title":"activity --follow: Silent error handling","description":"In activity.go:175-179, when the daemon is down or errors occur during polling in --follow mode, errors are silently ignored:\n\n```go\nnewEvents, err := fetchMutations(lastPoll)\nif err != nil {\n // Daemon might be down, continue trying\n continue\n}\n```\n\nThis means:\n- Users won't know if the daemon is unreachable\n- Could appear frozen when actually failing\n- No indication of lost events\n\nShould at least show a warning after N consecutive failures, or show '...' indicator to show polling status.\n\nDiscovered during code review of bd-xo1o implementation.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T04:06:18.590743-08:00","updated_at":"2025-12-23T04:16:04.64978-08:00","closed_at":"2025-12-23T04:16:04.64978-08:00"} {"id":"bd-csvy","title":"Add tests for merge driver auto-config in bd init","description":"Add comprehensive tests for the merge driver auto-configuration functionality in `bd init`.\n\n**Test cases needed:**\n- Auto-install in quiet mode\n- Skip with --skip-merge-driver flag\n- Detect already-installed merge driver\n- Append to existing .gitattributes\n- Interactive prompt behavior (if feasible)\n\n**File:** `cmd/bd/init_test.go`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T19:27:04.133078-08:00","updated_at":"2025-11-06T18:19:16.233673-08:00","closed_at":"2025-11-06T15:56:36.014814-08:00","dependencies":[{"issue_id":"bd-csvy","depends_on_id":"bd-32nm","type":"discovered-from","created_at":"2025-11-05T19:27:04.134299-08:00","created_by":"daemon"}]} @@ -992,6 +1013,7 @@ {"id":"bd-d148","title":"GH#483: Pre-commit hook fails unnecessarily when .beads removed","description":"Pre-commit hook fails on bd sync when .beads directory exists but user is on branch without beads. Should exit gracefully. See GitHub issue #483.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:40.049785-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-d19a","title":"Fix import failure on missing parent issues","description":"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.","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-11-04T12:31:30.994759-08:00","updated_at":"2025-11-05T00:08:42.814239-08:00","closed_at":"2025-11-05T00:08:42.814243-08:00"} {"id":"bd-d1n1","title":"Epic: Gate-Aware Release Workflow","description":"Reimagine beads-release.formula using gates for async waits.\n\n## Background\nCurrent release workflow has polecat sitting idle during CI (5-10 min wait).\nGates allow clean handoff: polecat completes phase, gate blocks next step,\nRefinery polls external condition, gate closes, new polecat resumes.\n\n## Phases\n1. Formula gate syntax (Step.Gate field)\n2. Gate bead creation during cook\n3. Polecat phase handoff protocol\n4. Refinery gh:run auto-discovery\n5. Full gate-aware release formula\n\n## Related\n- bd-mcva: Gate Evaluation (phases 2-4) - infrastructure\n- beads-release.formula.json: Current workflow","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-02T13:26:59.278771-08:00","created_by":"mayor","updated_at":"2026-01-02T16:54:51.00089-08:00","closed_at":"2026-01-02T16:54:51.00089-08:00","close_reason":"All 5 tasks complete: schema, cook gates, phase handoff, refinery discovery, formula v2"} +{"id":"bd-d1rda","title":"Review and merge PR #1059: bump golang.org/x/term v0.38→v0.39","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1059\nType: Dependabot dependency bump (Go modules)\nChange: golang.org/x/term 0.38.0 → 0.39.0\n\n## Task\n1. Review the PR diff: `gh pr diff 1059 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1059 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1059 --repo steveyegge/beads --approve`\n `gh pr merge 1059 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Minor version bump, adds transpose and delete key handling","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:36.554339-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:30:14.221185-08:00","closed_at":"2026-01-12T19:30:14.221185-08:00","close_reason":"Merged PR #1059 - golang.org/x/term 0.38→0.39","external_ref":"gh-1059"} {"id":"bd-d28c","title":"Test createTombstone and deleteIssue wrappers","description":"Add tests for the createTombstone and deleteIssue wrapper functions in cmd/bd/delete.go.\n\n## Functions under test\n- createTombstone (cmd/bd/delete.go:335) - Wrapper around SQLite CreateTombstone\n- deleteIssue (cmd/bd/delete.go:349) - Wrapper around SQLite DeleteIssue\n\n## Test scenarios for createTombstone\n1. Successful tombstone creation\n2. Tombstone with reason and actor tracking\n3. Error when issue doesn't exist\n4. Verify tombstone status set correctly\n5. Verify audit trail recorded\n6. Rollback/error handling\n\n## Test scenarios for deleteIssue\n1. Successful issue deletion\n2. Error on non-existent issue\n3. Verify issue removed from database\n4. Error handling when storage backend doesn't support delete\n\n## Coverage target\nCurrent: 0%\nTarget: \u003e85%\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:37.669214532-07:00","updated_at":"2025-12-23T21:44:33.169062-08:00","closed_at":"2025-12-23T21:44:33.169062-08:00","dependencies":[{"issue_id":"bd-d28c","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:37.70588226-07:00","created_by":"mhwilkie"}]} {"id":"bd-d2n74","title":"Add 'work_type' field for mutex vs open_competition","description":"dispatched_by: beads/crew/emma\n\nAdd string field for work type. Values: 'mutex' (one worker, exclusive - default) or 'open_competition' (many submit, buyer picks). Per Decision 006. Default: mutex.","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/giles","created_at":"2026-01-10T16:34:06.735553-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:35:04.574402-08:00","closed_at":"2026-01-10T19:35:04.574402-08:00","close_reason":"Implementation complete - work_type field added","dependencies":[{"issue_id":"bd-d2n74","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.538272-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-d33c","title":"Separate process/lock/PID concerns into process.go","description":"Create internal/daemonrunner/process.go with: acquireDaemonLock, PID file read/write, stopDaemon, isDaemonRunning, getPIDFilePath, socket path helpers, version check.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.871122-07:00","updated_at":"2025-11-01T23:43:55.66159-07:00","closed_at":"2025-11-01T23:43:55.66159-07:00"} @@ -1011,6 +1033,7 @@ {"id":"bd-d73u","title":"Re: Thread Test 2","description":"Great! Thread is working well.","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:46.655093-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-d73u","depends_on_id":"bd-vpan","type":"replies-to","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-d76d","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-05T00:08:42.814463-08:00","closed_at":"2025-11-05T00:08:42.814466-08:00"} {"id":"bd-d7e88238","title":"Rapid 3","status":"closed","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.459655-07:00","updated_at":"2025-12-14T12:12:46.510484-08:00","closed_at":"2025-11-07T23:18:52.333825-08:00"} +{"id":"bd-d7kdn","title":"Review and merge PR #1043: Pass hookArgs to pre-push (fixes #1041)","description":"dispatched_by: beads/crew/emma","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/grip","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:29.766439-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:41:58.888397-08:00","closed_at":"2026-01-12T16:41:58.888397-08:00","close_reason":"PR #1043 merged, issue #1041 auto-closed"} {"id":"bd-d84j","title":"Fix PR #319: Performance Improvements - CI failures and lint errors","description":"PR #319 (Performance Improvements) has excellent performance optimizations but is blocked by CI failures.\n\n## The PR\n- URL: https://github.com/steveyegge/beads/pull/319\n- Author: @rsnodgrass (Ryan)\n- Claimed improvements: bd ready 20.5x faster (752ms → 36.6ms), startup 10.5x faster\n\n## CI Failures\n\n### Lint Errors (8 total)\n1. cmd/bd/deletion_tracking.go:57 - unchecked os.Remove\n2. cmd/bd/import.go:548 - unchecked os.RemoveAll\n3. cmd/bd/message.go:205 - unchecked resp.Body.Close\n4. cmd/bd/migrate_issues.go:633 - unchecked fmt.Scanln\n5. cmd/bd/migrate_issues.go:701 - unchecked MarkFlagRequired\n6. cmd/bd/migrate_issues.go:702 - unchecked MarkFlagRequired\n7. cmd/bd/show.go:610 - gosec G104 unhandled error\n8. cmd/bd/show.go:614 - gosec G104 unhandled error\n\n### Test Failures\nAll syncbranch_test.go tests failing with:\n\"migration external_ref_column failed: failed to create index on external_ref: sqlite3: SQL logic error: no such table: main.issues\"\n\nThis suggests the PR branch needs rebasing on current main.\n\n## Required Work\n\n### 1. Fix Lint Errors\nAdd proper error handling for all 8 flagged locations. Most can use _ = or log warnings.\n\n### 2. Rebase on Current Main\nThe migration test failures indicate the branch is out of sync. Need to:\n- git fetch upstream\n- git rebase upstream/main\n- Resolve any conflicts\n- Verify tests pass locally\n\n### 3. Verify CI Passes\n- All lint checks green\n- All tests pass (Linux, Windows, Nix)\n\n## Optional Improvements\n- Consider splitting into smaller PRs (core index, WASM cache, testing infra)\n- Add documentation for benchmark usage\n- Extract helper functions in doctor/perf.go for better testability\n\n## Value\nThis PR delivers real performance improvements. The index optimization alone is worth merging quickly once CI is fixed.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-15T12:24:34.50322-08:00","updated_at":"2025-11-15T12:43:11.49933-08:00","closed_at":"2025-11-15T12:43:11.49933-08:00"} {"id":"bd-d9e0","title":"Extract validation functions to validators.go","description":"Move validatePriority, validateStatus, validateIssueType, validateTitle, validateEstimatedMinutes, validateFieldUpdate to validators.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T19:28:54.915909-07:00","updated_at":"2025-11-02T12:32:00.159298-08:00","closed_at":"2025-11-02T12:32:00.1593-08:00"} {"id":"bd-d9mu","title":"Cross-rig external dependency support","description":"Support dependencies on issues in other rigs/repos.\n\n## Use Case\n\nGas Town issues often depend on Beads issues (and vice versa). Currently we use labels like `external:beads/bd-xxx` as documentation, but:\n- `bd blocked` doesn't recognize external deps\n- `bd ready` doesn't filter them out\n- No way to query cross-rig status\n\n## Proposed UX\n\n### Adding external deps\n```bash\n# New syntax for bd dep add\nbd dep add gt-a07f external:beads:bd-kwjh\n\n# Or maybe cleaner\nbd dep add gt-a07f --external beads:bd-kwjh\n```\n\n### Showing blocked status\n```bash\nbd blocked\n# → gt-a07f blocked by external:beads:bd-kwjh (unverified)\n\n# With optional cross-rig query\nbd blocked --resolve-external\n# → gt-a07f blocked by external:beads:bd-kwjh (closed) ← unblocked!\n```\n\n### Storage\nCould use:\n- Special dependency type: `type: external`\n- Label convention: `external:rig:id`\n- New field: `external_deps: [\"beads:bd-kwjh\"]`\n\n## Implementation Notes\n\nCross-rig queries would need:\n- Known rig locations (config or discovery)\n- Read-only beads access to external rigs\n- Caching to avoid repeated queries\n\nFor MVP, just recognizing external deps and marking them as 'unverified' blockers would be valuable.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T02:27:23.892706-08:00","updated_at":"2025-12-22T22:32:49.261551-08:00","closed_at":"2025-12-22T22:32:49.261551-08:00"} @@ -1031,6 +1054,7 @@ {"id":"bd-djhk","title":"Test agent with fields","status":"closed","priority":2,"issue_type":"agent","created_at":"2025-12-27T23:44:08.97791-08:00","created_by":"mayor","updated_at":"2025-12-27T23:44:15.275899-08:00","closed_at":"2025-12-27T23:44:15.275899-08:00"} {"id":"bd-dju6","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.065863-08:00","updated_at":"2025-12-21T13:53:49.957804-08:00","deleted_at":"2025-12-21T13:53:49.957804-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-dkf1g","title":"Add 'owner' field for human attribution (HOP CV chains)","description":"dispatched_by: beads/crew/emma\n\nProblem: created_by tracks executor (agent), but HOP CV needs owner (human email).\n\nSolution: Add owner field to Issue struct.\n\nDesign: Decision 008 says human identity = git author email. This is the foundation of CV accumulation.\n\nMigration: Add column, populate from GIT_AUTHOR_EMAIL.\n\nAcceptance Criteria:\n- owner field added to types.go\n- Migration adds column\n- bd create populates from git author\n- Owner included in content hash","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-10T16:33:31.010936-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:28:26.126028-08:00","closed_at":"2026-01-10T19:28:26.126028-08:00","close_reason":"Implemented: owner field added for human attribution (commit ceb5769c)","dependencies":[{"issue_id":"bd-dkf1g","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:33:44.786109-08:00","created_by":"gastown/crew/max"}]} +{"id":"bd-dkhuu","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:30:48.695176-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T18:30:48.755717-08:00","closed_at":"2026-01-12T18:30:48.755717-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-dl8pb","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T00:35:17.86501-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T00:35:17.899663-08:00","closed_at":"2026-01-09T00:35:17.899663-08:00","close_reason":"auto-closed session event"} {"id":"bd-dlk31","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:31:34.382228-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:31:34.417966-08:00","closed_at":"2026-01-09T14:31:34.417966-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-dmb","title":"Fresh clone: bd should suggest 'bd init' when no database exists","description":"On a fresh clone of a repo using beads, running `bd stats` or `bd list` gives a cryptic error:\n\n```\nError: failed to open database: post-migration validation failed: migration invariants failed:\n - required_config_present: required config key missing: issue_prefix (database has 2 issues)\n```\n\n**Expected**: A helpful message like:\n```\nNo database found. This appears to be a fresh clone.\nRun 'bd init --prefix \u003cprefix\u003e' to hydrate from the committed JSONL file.\nFound: .beads/beads.jsonl (38 issues)\n```\n\n**Why this matters**: The current UX is confusing for new contributors or fresh clones. The happy path should be obvious.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-27T20:21:04.947959-08:00","updated_at":"2025-11-27T22:40:11.654051-08:00","closed_at":"2025-11-27T22:40:11.654051-08:00"} @@ -1039,6 +1063,7 @@ {"id":"bd-dow9","title":"Improve CheckStaleness error handling","description":"## Problem\n\nCheckStaleness returns 'false' (not stale) for multiple error conditions instead of returning errors. This masks problems.\n\n**Location:** internal/autoimport/autoimport.go:253-285\n\n## Edge Cases That Return False\n\n1. **Invalid last_import_time format** (line 259-262)\n - Corrupted metadata returns 'not stale'\n - Could show stale data\n\n2. **No JSONL file found** (line 267-277)\n - If glob fails, falls back to 'issues.jsonl'\n - If that's empty, returns 'not stale'\n\n3. **JSONL stat fails** (line 279-282)\n - Permission denied, file missing\n - Returns 'not stale' even though can't verify\n\n## Current Code\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err \\!= nil {\n return false, nil // ← Should return error\n}\n\n// ...\n\nif jsonlPath == \"\" {\n return false, nil // ← Should return error\n}\n\nstat, err := os.Stat(jsonlPath)\nif err \\!= nil {\n return false, nil // ← Should return error\n}\n```\n\n## Fix\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err \\!= nil {\n return false, fmt.Errorf(\"corrupted last_import_time: %w\", err)\n}\n\n// ...\n\nif jsonlPath == \"\" {\n return false, fmt.Errorf(\"no JSONL file found\")\n}\n\nstat, err := os.Stat(jsonlPath)\nif err \\!= nil {\n return false, fmt.Errorf(\"cannot stat JSONL: %w\", err)\n}\n```\n\n## Impact\nMedium - edge cases are rare but should be handled\n\n## Effort \n30 minutes - requires updating callers in RPC server\n\n## Dependencies\nRequires: bd-n4td (warning on errors)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:16:45.658965-05:00","updated_at":"2025-12-14T00:32:11.049429-08:00","closed_at":"2025-12-13T23:32:56.573608-08:00"} {"id":"bd-dp4w","title":"Test message","description":"This is a test message body","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:11:58.467876-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-dpbm","title":"Test no validate","description":"Quick capture","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T19:24:58.637574-08:00","created_by":"beads/polecats/opal","updated_at":"2026-01-01T19:25:09.044121-08:00","closed_at":"2026-01-01T19:25:09.044121-08:00","close_reason":"Test issue cleanup"} +{"id":"bd-dpij0","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:43:41.92036-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:43:41.980821-08:00","closed_at":"2026-01-12T02:43:41.980821-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-dpkdm","title":"Add AllowStale option to beads List API for resilient GUPP detection","description":"## Problem\n\nWhen the beads database is out of sync with the JSONL file (common after another agent syncs), `bd list` fails with \"Database out of sync with JSONL\". This causes `checkSlungWork()` in gastown's `gt prime` to silently fail, which means:\n\n1. AUTONOMOUS WORK MODE is never shown\n2. Normal startup directive is displayed instead\n3. Agents follow that instead of GUPP\n4. **Hooked work sits idle - massive GUPP violation**\n\nRoot cause: Commit 1da3e18 made staleness checks stricter, and `checkSlungWork()` silently returns false on error.\n\n## Solution\n\nImplement a resilient three-layer approach:\n\n### Step 1: Add AllowStale to ListOptions (beads)\n- Add `AllowStale bool` field to `ListOptions` struct\n- Update `List()` to pass `--allow-stale` flag when set\n\n### Step 2: Update checkSlungWork in gastown\n- Try quick `bd sync --import-only` first (best effort)\n- Try normal list\n- If error, log warning and retry with `AllowStale: true`\n- Only return false if both attempts fail\n\n### Step 3: Never fail silently\n- Always log errors instead of silent `return false`\n\n## Concurrency Note\n\nMultiple workers may spin up and try `bd sync` simultaneously. SQLite's own locking serializes writes, so this is safe but potentially slow. No additional mutex needed for correctness.\n\n## Files to Change\n\n**In beads:**\n- `internal/beads/beads.go` - Add AllowStale to ListOptions, update List()\n\n**In gastown (separate PR):**\n- `internal/cmd/prime.go` - Update checkSlungWork() with resilient logic\n\n## Testing\n- Simulate stale DB by modifying JSONL without importing\n- Verify AUTONOMOUS MODE shows with AllowStale fallback\n- Test concurrent worker startup","status":"closed","priority":1,"issue_type":"epic","assignee":"beads/crew/dave","created_at":"2026-01-09T00:36:54.636297-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-09T00:42:33.462367-08:00","closed_at":"2026-01-09T00:42:33.462367-08:00","close_reason":"Implemented AllowStale option in List API - added to ListArgs struct and CLI passthrough. Daemon already handles staleness gracefully. Gastown step 2 pending separately."} {"id":"bd-dq74","title":"bd repair: Handle .beads/redirect files","description":"The bd repair command hardcodes .beads/beads.db path but doesn't follow .beads/redirect files like other commands do. This means repair won't work on clones that use redirected beads directories.\n\nFix: Check for .beads/redirect file and follow it to find the actual database location.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T12:47:53.089729-08:00","created_by":"stevey","updated_at":"2025-12-29T12:59:05.121303-08:00","closed_at":"2025-12-29T12:59:05.121303-08:00","close_reason":"Fixed in commit d7a67ad6"} {"id":"bd-dq8pu","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:58:53.861683-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:58:53.906534-08:00","closed_at":"2026-01-11T22:58:53.906534-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1058,7 +1083,9 @@ {"id":"bd-dvd","title":"GetNextChildID doesn't attempt parent resurrection from JSONL history","description":"When creating a child issue with --parent flag, GetNextChildID fails immediately if parent doesn't exist in DB, without attempting to resurrect it from JSONL history. This breaks the intended resurrection workflow and causes 'parent issue X does not exist' errors even when the parent exists in JSONL.\n\nRelated to GH #334 and #278.\n\nCurrent behavior:\n- GetNextChildID checks if parent exists in DB\n- If not found, returns error immediately\n- No resurrection attempt\n\nExpected behavior:\n- GetNextChildID should call TryResurrectParent before failing\n- Parent should be restored as tombstone if found in JSONL history\n- Child creation should succeed if resurrection succeeds\n\nImpact: Users cannot create child issues for parents that were deleted but exist in JSONL history.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T10:02:51.496365-05:00","updated_at":"2025-11-22T14:57:44.534796097-05:00","closed_at":"2025-11-21T15:09:02.731171-05:00"} {"id":"bd-dvw8","title":"GH#523: Fix closed issues missing closed_at timestamp during db upgrade","description":"Old beads databases may have closed issues without closed_at timestamps, causing 'closed issues must have closed_at timestamp' validation errors on upgrade to 0.29.0. Need defensive handling during import. See: https://github.com/steveyegge/beads/issues/523","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:31:30.421555-08:00","updated_at":"2025-12-16T14:39:19.052482-08:00","closed_at":"2025-12-14T17:29:34.746247-08:00"} {"id":"bd-dwh","title":"Implement or remove ExpectExit/ExpectStdout verification fields","description":"The Verification struct in internal/types/workflow.go has ExpectExit and ExpectStdout fields that are never used by workflowVerifyCmd. Either implement the functionality or remove the dead fields.","status":"tombstone","priority":3,"issue_type":"task","created_at":"2025-12-17T22:23:02.708627-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"bd-dx2dc","title":"Refactor merge queue to use wisps instead of .beads/mq/ JSON files","description":"## Simplified Scope\n\nAdd bd doctor check for stale .beads/mq/*.json files + auto-fix to delete them.\n\n**Files to modify:**\n- cmd/bd/doctor/maintenance.go - Add CheckStaleMQFiles()\n- cmd/bd/doctor.go - Wire up the check\n- cmd/bd/doctor_fix.go - Add fix handler\n\n**Why this is simple:**\n- The .beads/mq/ files are LOCAL ONLY (not committed to git)\n- They're stale because their branches no longer exist\n- gt done already creates merge-request wisps correctly\n- No migration needed - just delete the orphaned files\n\n**Full design:** See plan file at ~/.claude-accounts/ghosttrack/plans/reflective-splashing-canyon.md\n\n**Follow-up:** After this merges, create gastown convoy for full mrqueue removal.","status":"in_progress","priority":2,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:17:00.242528-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T18:46:10.714435-08:00"} {"id":"bd-dx6e","title":"bd activity --town: Aggregated town feed","description":"Add --town flag to bd activity for aggregated cross-rig feed.\n\nBehavior:\n- Uses routes.jsonl to discover all rigs\n- Aggregates activity from all rig beads\n- Essential for Deacon's convoy tracking and cross-rig dep resolution\n\nUsage:\n bd activity --follow --town # Stream all rig activity\n\nRelated: hq-7h8jx (Convoy System epic in town beads)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T18:47:03.057447-08:00","created_by":"mayor","updated_at":"2025-12-29T21:10:00.71961-08:00","closed_at":"2025-12-29T21:10:00.71961-08:00","close_reason":"Implemented --town flag for bd activity. Aggregates mutations from all rig daemons discovered via routes.jsonl."} +{"id":"bd-dx7m3","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:29:21.865951-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:29:21.931598-08:00","closed_at":"2026-01-12T02:29:21.931598-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-dxdn","title":"bd ready taking 5 seconds with 132 issues (89 closed)","description":"User reports bd ready is annoyingly slow on M2 Mac - 5 seconds for 132 issues (89 closed). Started noticing after hash-based IDs update. Need to investigate performance regression. Reported in GH #243.","notes":"Root cause identified: Not a query performance issue, but stale daemon locks causing 5s timeout delays.\n\nFixed in bd-ndyz (closed) via 5 sub-issues:\n- bd-expt: Fast-fail socket checks (200ms timeout)\n- bd-wgu4: Lock probe before RPC attempts\n- bd-1mzt: Self-heal stale artifacts\n- bd-vcg5: Panic recovery + socket cleanup\n- bd-j7e2: RPC diagnostics (BD_RPC_DEBUG)\n\nAll fixes merged. Ready for v0.22.2 release.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T00:26:30.359512-08:00","updated_at":"2025-11-08T13:17:08.766029-08:00","closed_at":"2025-11-08T02:35:47.956638-08:00"} {"id":"bd-dxtc","title":"Test daemon RPC delete handler","description":"Add tests for the daemon-side RPC delete handler that processes delete requests from clients.\n\n## What needs testing\n- Daemon's Delete RPC handler implementation\n- Processing delete requests from RPC clients\n- Cascade deletion at daemon level\n- Force deletion at daemon level\n- Dry-run mode validation\n- Error responses to clients\n- Dependency validation before deletion\n- Tombstone creation via daemon\n\n## Test scenarios\n1. Delete single issue via RPC\n2. Delete multiple issues via RPC\n3. Cascade deletion of dependents\n4. Force delete with orphaned dependents\n5. Dry-run returns what would be deleted without actual deletion\n6. Error: invalid issue IDs\n7. Error: insufficient permissions\n8. Error: dependency blocks deletion (without force/cascade)\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:33.532111042-07:00","updated_at":"2025-12-23T23:48:47.399582-08:00","closed_at":"2025-12-23T23:48:47.399582-08:00","dependencies":[{"issue_id":"bd-dxtc","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:33.534367367-07:00","created_by":"mhwilkie"}]} {"id":"bd-dywj3","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:34:59.667155-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:34:59.733536-08:00","closed_at":"2026-01-11T22:34:59.733536-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1139,6 +1166,7 @@ {"id":"bd-f302v","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:41:28.181989-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:41:28.24842-08:00","closed_at":"2026-01-11T22:41:28.24842-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-f3j75","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:24:44.259503-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:24:44.325027-08:00","closed_at":"2026-01-11T22:24:44.325027-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-f3ll","title":"Merge: bd-ot0w","description":"branch: polecat/dementus\ntarget: main\nsource_issue: bd-ot0w\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:20:33.495772-08:00","updated_at":"2025-12-20T23:17:27.000252-08:00","closed_at":"2025-12-20T23:17:27.000252-08:00"} +{"id":"bd-f3luc","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no work to process","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T17:23:17.423701-08:00","updated_at":"2026-01-12T17:23:17.423701-08:00","closed_at":"2026-01-12T17:23:17.423652-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-f3luc","depends_on_id":"bd-wisp-qoy","type":"parent-child","created_at":"2026-01-12T17:23:17.42467-08:00","created_by":"beads/refinery"}]} {"id":"bd-f526","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:20.809207-08:00","created_by":"deacon","updated_at":"2026-01-09T21:15:43.013905-08:00","closed_at":"2026-01-09T21:15:43.013905-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-f5cc","title":"Thread Test","description":"Testing the thread feature","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:01.244501-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-f5cc","depends_on_id":"bd-x36g","type":"supersedes","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-f616","title":"Digest: Version Bump: test-squash","description":"## Molecule Execution Summary\n\n**Molecule**: Version Bump: test-squash\n**Steps**: 8\n\n**Completed**: 0/8\n\n---\n\n### Steps\n\n1. **[open]** Verify release artifacts\n Check GitHub releases page - binaries for darwin/linux/windows should be available\n\n2. **[open]** Commit and push release\n git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI\n\n3. **[open]** Update CHANGELOG.md with release notes\n Add meaningful release notes to CHANGELOG.md describing what changed in test-squash\n\n4. **[open]** Wait for CI to pass\n Monitor GitHub Actions - all checks must pass before release artifacts are built\n\n5. **[open]** Restart running daemons\n Kill and restart any running bd daemons to pick up new version: pkill -f 'bd daemon' \u0026\u0026 bd daemon --start\n\n6. **[open]** Update local installation\n Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash\n\n7. **[open]** Run bump-version.sh test-squash\n Run ./scripts/bump-version.sh test-squash to update version in all files\n\n8. **[open]** Update info.go versionChanges\n Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for test-squash\n\n","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:53:18.471919-08:00","updated_at":"2025-12-21T13:53:35.256043-08:00","deleted_at":"2025-12-21T13:53:35.256043-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} @@ -1189,6 +1217,7 @@ {"id":"bd-ffjt","title":"Unify template.go and mol.go under bd mol","description":"Consolidate the two DAG-template systems into one under the mol command. mol.go (on rictus branch) has the right UX (catalog/show/bond), template.go has the mechanics. Merge them, deprecate bd template commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T23:52:13.208972-08:00","updated_at":"2025-12-21T00:01:59.283765-08:00","closed_at":"2025-12-21T00:01:59.283765-08:00"} {"id":"bd-ffp5","title":"Review PR #908: feat(doctor) external hook managers","description":"dispatched_by: beads/crew/emma\n\nReview and merge PR #908 from roelofb.\n\nPR: https://github.com/anthropics/beads/pull/908\nChanges: +1364/-5, 4 files (doctor/fix/hooks.go, hooks_test.go, git.go, CHANGELOG.md)\n\nFeature: detect external hook managers and check bd integration\n\nReview checklist:\n- [ ] Code quality and style\n- [ ] Tests pass\n- [ ] Feature works as intended\n- [ ] Approve or request changes","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/giles","created_at":"2026-01-05T19:09:22.112242-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-05T19:12:29.744463-08:00","closed_at":"2026-01-05T19:12:29.744463-08:00","close_reason":"PR #908 reviewed, approved, and merged"} {"id":"bd-ffr9","title":"deletions.jsonl recreated locally after tombstone migration","description":"After running bd migrate-tombstones and removing deletions.jsonl from git, the file gets recreated locally on subsequent bd commands.\n\n**Steps to reproduce:**\n1. Run bd migrate-tombstones (converts to inline tombstones)\n2. Remove deletions.jsonl from git and filesystem\n3. Run bd sync or bd stats\n4. deletions.jsonl reappears\n\n**Expected behavior:**\nAfter migration, deletions.jsonl should not be recreated. All tombstone data should come from inline tombstones in issues.jsonl.\n\n**Workaround:** Add deletions.jsonl to .gitignore to prevent re-tracking. File still gets created but won't pollute the repo.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-15T17:28:50.949625-08:00","updated_at":"2025-12-16T00:54:56.459227-08:00","closed_at":"2025-12-16T00:54:56.459227-08:00"} +{"id":"bd-fghuk","title":"Review and merge PR #1058: bump golang.org/x/mod v0.31→v0.32","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1058\nType: Dependabot dependency bump (Go modules)\nChange: golang.org/x/mod 0.31.0 → 0.32.0\n\n## Task\n1. Review the PR diff: `gh pr diff 1058 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1058 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1058 --repo steveyegge/beads --approve`\n `gh pr merge 1058 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Minor version bump, routine Go dependency update","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:35.652289-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:30:26.963389-08:00","closed_at":"2026-01-12T19:30:26.963389-08:00","close_reason":"Reviewed PR #1058. Diff is safe (routine Go dependency bump). Cannot merge due to pre-existing CI failures: 1) plugin.json version mismatch, 2) Nix vendorHash needs update. Added review comment. PR ready to merge once infra issues fixed.","external_ref":"gh-1058"} {"id":"bd-fgqpg","title":"bd mol ready --gated: hardcoded query limits","description":"Hardcoded Limit:100 for closed gates and Limit:500 for ready work (mol_ready_gated.go:122,134). Could miss molecules in large deployments. Consider making configurable or at least documenting the limitation.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-08T21:32:18.566735-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T21:32:18.566735-08:00","dependencies":[{"issue_id":"bd-fgqpg","depends_on_id":"bd-ka761","type":"discovered-from","created_at":"2026-01-08T21:32:27.973688-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-fgw3","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:05.052016-08:00","updated_at":"2025-12-20T00:49:51.928221-08:00","closed_at":"2025-12-20T00:25:52.805029-08:00","dependencies":[{"issue_id":"bd-fgw3","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.248427-08:00","created_by":"daemon"},{"issue_id":"bd-fgw3","depends_on_id":"bd-si4g","type":"blocks","created_at":"2025-12-19T22:56:23.497325-08:00","created_by":"daemon"}]} {"id":"bd-fh5gq","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T19:01:14.863446-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T19:01:14.926676-08:00","closed_at":"2026-01-11T19:01:14.926676-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1203,6 +1232,7 @@ {"id":"bd-fmdy","title":"Merge: bd-kzda","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-kzda\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T00:27:28.952413-08:00","updated_at":"2025-12-23T01:33:25.731326-08:00","closed_at":"2025-12-23T01:33:25.731326-08:00"} {"id":"bd-fmyez","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T23:04:16.116235-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T23:04:16.188262-08:00","closed_at":"2026-01-11T23:04:16.188262-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-fom","title":"Remove all deletions.jsonl code except migration","description":"There's deletions manifest code spread across the entire codebase that should have been removed after tombstone migration:\n\nFiles with deletions code (non-migration):\n- internal/deletions/ - entire package\n- cmd/bd/sync.go - 25+ references, auto-compact, sanitize\n- cmd/bd/delete.go - dual-writes to deletions.jsonl\n- internal/importer/importer.go - checks deletions manifest\n- internal/syncbranch/worktree.go - merges deletions.jsonl\n- cmd/bd/doctor/fix/sync.go - cleanupDeletionsManifest\n- cmd/bd/doctor/fix/deletions.go - HydrateDeletionsManifest\n- cmd/bd/integrity.go - checks deletions for data loss\n- cmd/bd/deleted.go - entire command\n- cmd/bd/compact.go - pruneDeletionsManifest\n- cmd/bd/doctor.go - checkDeletionsManifest\n- Plus many more\n\nAction: Aggressively remove all non-migration deletions code. Tombstones are the only deletion mechanism now.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T13:29:04.960863-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"bd-foqmt","title":"Fix periodic auto-pull never executing git pull (GH#1015)","description":"dispatched_by: beads/crew/emma\n\n## GitHub Issue\nhttps://github.com/steveyegge/beads/issues/1015\n\n## Problem\nThe `remoteSyncTicker` periodic sync never actually pulls from remote because `performAutoImport()` has a `hasJSONLChanged()` check that returns early BEFORE the git pull can execute.\n\n## Root Cause\nIn `cmd/bd/daemon_sync.go`, `performAutoImport()` checks the hash BEFORE pulling:\n- Check compares local JSONL to database hash\n- Since no git pull happened, local file hasn't changed\n- Returns early, never reaches `syncBranchPull()`\n\n## Fix\nMove `hasJSONLChanged()` check to AFTER `syncBranchPull()`:\n1. Pull from git first\n2. Then check if pulled JSONL differs from DB\n3. If changed, proceed with import\n\n## Files\n- `cmd/bd/daemon_sync.go` - `performAutoImport()` function","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:45:38.706946-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:48:55.333534-08:00","closed_at":"2026-01-12T02:48:55.333536-08:00"} {"id":"bd-fqze8","title":"Add 'crystallizes' field for work economics","description":"dispatched_by: beads/crew/emma\n\nAdd boolean field to track whether work compounds (crystallizes=true: code, features) or evaporates (crystallizes=false: ops, support). Per Decision 006, this affects CV weighting. Default: false (conservative).","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-10T16:34:06.487466-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T23:21:17.458797-08:00","closed_at":"2026-01-10T23:21:17.458797-08:00","close_reason":"Crystallizes field implemented","dependencies":[{"issue_id":"bd-fqze8","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.496543-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-frkzo","title":"Session ended: gt-gastown-crew-george","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:51:17.681136-08:00","created_by":"beads/witness","updated_at":"2026-01-09T21:15:40.68839-08:00","closed_at":"2026-01-09T21:15:40.68839-08:00","close_reason":"Stale session ended events"} {"id":"bd-fsb1","title":"Test issue","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T11:21:51.383077-08:00","updated_at":"2025-11-05T11:21:56.888913-08:00","closed_at":"2025-11-05T11:21:56.888913-08:00"} @@ -1282,8 +1312,10 @@ {"id":"bd-h8ym","title":"Wait for CI to pass","description":"Monitor GitHub Actions - all checks must pass before release artifacts are built","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066792-08:00","updated_at":"2025-12-21T13:53:49.454536-08:00","deleted_at":"2025-12-21T13:53:49.454536-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-haxi","title":"Restart running daemons","description":"Kill and restart any running bd daemons to pick up new version: pkill -f 'bd daemon' \u0026\u0026 bd daemon --start","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066262-08:00","updated_at":"2025-12-21T13:53:49.757078-08:00","deleted_at":"2025-12-21T13:53:49.757078-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-haze","title":"Fix beads-9yc: pinned column missing from schema. gt mail...","description":"Fix beads-9yc: pinned column missing from schema. gt mail send fails because some beads DBs lack the pinned column. Add migration to ensure it exists.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T15:05:33.394801-08:00","updated_at":"2025-12-21T15:26:35.171757-08:00","closed_at":"2025-12-21T15:26:35.171757-08:00"} +{"id":"bd-hbz8e","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:13:35.29649-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T18:13:35.363606-08:00","closed_at":"2026-01-12T18:13:35.363606-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hcppl","title":"Merge: ruby-mk905whv","description":"branch: polecat/ruby-mk905whv\ntarget: main\nsource_issue: ruby-mk905whv\nrig: beads\nagent_bead: bd-beads-polecat-ruby\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:03:04.892148-08:00","created_by":"beads/polecats/ruby","updated_at":"2026-01-10T22:05:21.848032-08:00","closed_at":"2026-01-10T22:05:21.848032-08:00","close_reason":"Changes already on main (patch dropped during rebase)","labels":["gt:merge-request"]} {"id":"bd-hdt","title":"Implement auto-merge functionality in duplicates command","description":"The duplicates.go file has a TODO at line 95 to implement the performMerge function for automatic duplicate merging. Currently it just prints a warning message. This would automate the merge process instead of just suggesting commands.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-21T18:55:02.828619-05:00","updated_at":"2025-12-09T18:38:37.693818772-05:00","closed_at":"2025-11-27T22:36:11.517878-08:00"} +{"id":"bd-hfs0i","title":"Digest: mol-refinery-patrol","description":"Empty queue patrol: no branches to merge, all checks clean","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T02:45:56.792904-08:00","updated_at":"2026-01-12T02:45:56.792904-08:00","closed_at":"2026-01-12T02:45:56.792858-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-hfs0i","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:45:56.793879-08:00","created_by":"beads/refinery"}]} {"id":"bd-hfyz","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T01:09:26.199301-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:09:26.233806-08:00","closed_at":"2026-01-07T01:09:26.233806-08:00","close_reason":"auto-closed session event"} {"id":"bd-hgswd","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T21:16:20.67497-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:16:20.709134-08:00","closed_at":"2026-01-09T21:16:20.709134-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hhjqr","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T14:04:31.381615-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T14:04:31.420548-08:00","closed_at":"2026-01-09T14:04:31.420548-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1308,6 +1340,7 @@ {"id":"bd-hp2gf","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:22:50.612675-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T18:22:50.678625-08:00","closed_at":"2026-01-11T18:22:50.678625-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hp8g","title":"gt sling should look up formulas from .beads/formulas/ registry","description":"## Problem\n\ngt sling \u003cformula-name\u003e doesn't find formulas from the registry that bd formula list shows.\n\n## What I tried\n\n1. gt sling beads/crew/emma --formula beads-release --var version=0.42.0\n - Problem: --formula flag doesn't exist\n\n2. gt sling beads-release beads/crew/emma --var version=0.42.0\n - Error: open .../beads-release: no such file or directory\n - Problem: Looks for file in cwd, not formula registry\n\n## What worked\n\nbd mol wisp beads-release --var version=0.42.0 - correctly finds formula from .beads/formulas/\n\n## Expected\n\ngt sling should use the same formula lookup as bd mol wisp - checking .beads/formulas/*.formula.json\n\n## Documentation gap\n\nThe help shows examples like 'gt sling mol-release mayor/' suggesting formula slinging works, but it doesn't find registry formulas.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-30T21:18:17.251292-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T15:22:07.76793-08:00","closed_at":"2025-12-30T22:06:27.153176-08:00","close_reason":"Fixed in both repos: bd cook now looks up formulas from registry, and gt sling uses bd mol wisp"} {"id":"bd-hpt5","title":"show commit hash in 'bd version' when built from source'\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T13:26:14.662089379-07:00","updated_at":"2025-11-14T09:18:09.721428859-07:00","closed_at":"2025-11-14T09:18:09.721428859-07:00"} +{"id":"bd-hpxvi","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: queue empty, inherited handoff from previous session, no work to process","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T17:21:48.950982-08:00","updated_at":"2026-01-12T17:21:48.950982-08:00","closed_at":"2026-01-12T17:21:48.950928-08:00","close_reason":"Squashed from 5 wisps","dependencies":[{"issue_id":"bd-hpxvi","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T17:21:48.95197-08:00","created_by":"beads/refinery"}]} {"id":"bd-hr39","title":"bd cook: needs field not converted to step dependencies","description":"When cooking a formula with `needs` fields on steps, the dependencies are not created between sibling steps.\n\n## Expected\n\nFormula:\n```yaml\nsteps:\n - id: inbox-check\n title: Check inbox\n - id: trigger-spawns\n title: Nudge polecats\n needs: [inbox-check]\n```\n\nShould create:\n- mol-foo.inbox-check (no deps)\n- mol-foo.trigger-spawns → depends on → mol-foo.inbox-check\n\n## Actual\n\nBoth steps only depend on the parent proto:\n- mol-foo.inbox-check → depends on → mol-foo\n- mol-foo.trigger-spawns → depends on → mol-foo\n\nThe `needs` field is ignored.\n\n## Impact\n\nThis breaks the step execution order. Steps that should wait for predecessors will run in parallel or out of order.\n\n## Reproduction\n\n```bash\nbd cook mol-deacon-patrol.formula.yaml\nbd show mol-deacon-patrol.trigger-pending-spawns\n# Shows: Depends on mol-deacon-patrol (parent only)\n# Should show: Depends on mol-deacon-patrol.inbox-check\n```","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T13:49:59.023514-08:00","updated_at":"2025-12-24T13:59:09.929298-08:00","closed_at":"2025-12-24T13:59:09.929298-08:00"} {"id":"bd-hsebc","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T09:34:40.429935-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T09:34:40.492171-08:00","closed_at":"2026-01-11T09:34:40.492171-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hserm","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:26:44.881082-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T21:26:44.948955-08:00","closed_at":"2026-01-11T21:26:44.948955-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1318,6 +1351,7 @@ {"id":"bd-hulf","title":"Molecule execution state management","description":"Implement molecule execution state tracking.\n\n## State Location\n\n```\n.beads/molecules/\u003cmol-id\u003e.state.yaml\n```\n\n## State Schema\n\n```yaml\nid: mol-deacon-patrol\nformula: mol-deacon-patrol # Source formula\nbonded_at: ISO timestamp\nbonded_by: entity who created it\n\n# Execution state\nstatus: running | paused | completed | failed\ncurrent_step: step-id\nstarted_at: ISO timestamp\ncompleted_at: ISO timestamp (if done)\n\n# Loop tracking\nreset_count: 0\nlast_reset_at: null\n\n# Per-step state\nsteps:\n inbox-check:\n status: completed | in_progress | pending\n started_at: ...\n completed_at: ...\n spawn-work:\n status: pending\n self-inspect:\n status: pending\n\n# Variables (from formula instantiation)\nvariables:\n rig: gastown\n issue_id: gt-xxx\n```\n\n## Operations\n\n- CreateState(molID, formula, variables) - Initialize state\n- LoadState(molID) - Read current state \n- SaveState(molID, state) - Write state\n- AdvanceStep(molID) - Mark current complete, find next\n- ResetState(molID) - Reset all steps to pending\n\n## Files\n\n- internal/mol/state.go\n- internal/mol/types.go","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-24T15:53:43.381634-08:00","updated_at":"2025-12-24T16:53:11.807645-08:00","closed_at":"2025-12-24T16:53:11.807645-08:00"} {"id":"bd-hv01","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-06T18:19:16.233949-08:00","closed_at":"2025-11-06T17:52:24.860716-08:00","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-hv0zl","title":"Session ended: gt-gastown-crew-george","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T23:35:29.446162-08:00","created_by":"beads/refinery","updated_at":"2026-01-09T21:15:40.684842-08:00","closed_at":"2026-01-09T21:15:40.684842-08:00","close_reason":"Stale session ended events"} +{"id":"bd-hvim5","title":"Review PR #1040: Add prek support as pre-commit alternative","description":"dispatched_by: beads/crew/emma\n\nEasy-win feature with tests. PR: https://github.com/steveyegge/beads/pull/1040. prek is Rust-based pre-commit alternative. Run tests, verify detection patterns, approve and merge.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:26:06.302165-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T17:30:20.424363-08:00","closed_at":"2026-01-12T17:30:20.424363-08:00","close_reason":"PR #1040 merged. Added prek support as pre-commit alternative with proper detection ordering and tests."} {"id":"bd-hvng","title":"Merge: bd-w193","description":"branch: polecat/nux\ntarget: main\nsource_issue: bd-w193\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:23:47.496139-08:00","updated_at":"2025-12-20T23:17:26.996479-08:00","closed_at":"2025-12-20T23:17:26.996479-08:00"} {"id":"bd-hvwnb","title":"gt prime: detectSessionState duplicates checkSlungWork logic","description":"detectSessionState() (lines 1775-1799) duplicates the hooked bead detection logic from checkSlungWork() (lines 1035-1066). This could lead to drift if one is updated without the other.\n\nOptions:\n1. Extract shared helper function for hooked bead detection\n2. Have detectSessionState call into checkSlungWork (would need refactoring)\n3. Accept duplication with comment noting the relationship\n\nLocation: gastown/mayor/rig/internal/cmd/prime.go","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T00:45:57.553336-08:00","created_by":"mayor","updated_at":"2026-01-11T20:41:19.75541-08:00","closed_at":"2026-01-11T20:41:19.75541-08:00","close_reason":"Won't fix - minor duplication between checkSlungWork and detectSessionState. Low drift risk since both in same package. Not worth the churn."} {"id":"bd-hw1g","title":"Merge: quartz-mjxey2w1","description":"branch: polecat/quartz-mjxey2w1\ntarget: main\nsource_issue: quartz-mjxey2w1\nrig: beads\nagent_bead: bd-beads-polecat-quartz","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T14:00:55.648449-08:00","created_by":"beads/polecats/quartz","updated_at":"2026-01-02T17:14:49.305672-08:00","closed_at":"2026-01-02T17:14:49.305672-08:00","close_reason":"Orphaned MR - quartz stopped (design doc), branch never pushed"} @@ -1326,6 +1360,8 @@ {"id":"bd-hxcf","title":"Add tests for sync redirect handling in git status checks","description":"Commit a61cbde6 added redirect detection for .beads/redirect but lacks tests.\n\nWhen beadsDir is redirected to another repo (crew worktree scenario), git\ncommands now detect this and use git -C \u003ctargetRepoDir\u003e.\n\nTest cases needed:\n- gitHasBeadsChanges() with redirected beads dir runs git from target repo\n- gitHasUncommittedBeadsChanges() handles redirect correctly\n- Redirect detection works with symlinks vs redirect file\n- Non-redirected case still works normally\n\nLocation: cmd/bd/sync_git.go:93-108 and 472-485\nSuggested test file: cmd/bd/sync_git_test.go","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T01:18:10.759059-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T21:30:52.419179-08:00","closed_at":"2026-01-10T21:30:52.419179-08:00","close_reason":"Added 8 test cases for redirect handling in sync_git_test.go covering gitHasBeadsChanges and gitHasUncommittedBeadsChanges with and without redirects."} {"id":"bd-hxou","title":"Daemon performAutoImport should update jsonl_content_hash after import","description":"The daemon's performAutoImport function was not updating jsonl_content_hash after successful import, unlike the CLI import path. This could cause repeated imports if the file hash and DB hash diverge.\n\nFix: Added hash update after validatePostImport succeeds, using repoKey for multi-repo support.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:44:04.442976-08:00","updated_at":"2025-12-13T06:44:09.546976-08:00","closed_at":"2025-12-13T06:44:09.546976-08:00"} {"id":"bd-hy9p","title":"Add --body-file flag to bd create for reading descriptions from files","description":"## Problem\n\nCreating issues with long/complex descriptions via CLI requires shell escaping gymnastics:\n\n```bash\n# Current workaround - awkward heredoc quoting\nbd create --title=\"...\" --description=\"$(cat \u003c\u003c'EOF'\n...markdown...\nEOF\n)\"\n\n# Often fails with quote escaping errors in eval context\n# Agents resort to writing temp files then reading them\n```\n\n## Proposed Solution\n\nAdd `--body-file` and `--description-file` flags to read description from a file, matching `gh` CLI pattern.\n\n```bash\n# Natural pattern that aligns with training data\ncat \u003e /tmp/desc.md \u003c\u003c 'EOF'\n...markdown content...\nEOF\n\nbd create --title=\"...\" --body-file=/tmp/desc.md\n```\n\n## Implementation\n\n### 1. Add new flags to `bd create`\n\n```go\ncreateCmd.Flags().String(\"body-file\", \"\", \"Read description from file (use - for stdin)\")\ncreateCmd.Flags().String(\"description-file\", \"\", \"Alias for --body-file\")\n```\n\n### 2. Flag precedence\n\n- If `--body-file` or `--description-file` is provided, read from file\n- If value is `-`, read from stdin\n- Otherwise fall back to `--body` or `--description` flag\n- If neither provided, description is empty (current behavior)\n\n### 3. Error handling\n\n- File doesn't exist → clear error message\n- File not readable → clear error message\n- stdin specified but not available → clear error message\n\n## Benefits\n\n✅ **Matches training data**: `gh issue create --body-file file.txt` is a common pattern\n✅ **No shell escaping issues**: File content is read directly\n✅ **Works with any content**: Markdown, special characters, quotes, etc.\n✅ **Agent-friendly**: Agents already write complex content to temp files\n✅ **User-friendly**: Easier for humans too when pasting long descriptions\n\n## Related Commands\n\nConsider adding similar support to:\n- `bd update --body-file` (for updating descriptions)\n- `bd comment --body-file` (if/when we add comments)\n\n## Examples\n\n```bash\n# From file\nbd create --title=\"Add new feature\" --body-file=feature.md\n\n# From stdin\necho \"Quick description\" | bd create --title=\"Bug fix\" --body-file=-\n\n# With other flags\nbd create \\\n --title=\"Security issue\" \\\n --type=bug \\\n --priority=0 \\\n --body-file=security-report.md \\\n --label=security\n```\n\n## Testing\n\n- Test with normal files\n- Test with stdin (`-`)\n- Test with non-existent files (error handling)\n- Test with binary files (should handle gracefully)\n- Test with empty files (valid - empty description)\n- Test that `--description-file` and `--body-file` are equivalent aliases","status":"tombstone","priority":1,"issue_type":"feature","created_at":"2025-11-22T00:02:08.762684-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} +{"id":"bd-hyiy3","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:16:47.839706-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-12T18:16:47.885521-08:00","closed_at":"2026-01-12T18:16:47.885521-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-hyxhe","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:03:29.065315-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T18:03:29.132129-08:00","closed_at":"2026-01-12T18:03:29.132129-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-hz46s","title":"Ensure last-touched is never tracked in git","description":"The `.beads/last-touched` file is local runtime state that should never be in git.\n\n**Current issue:**\n- `~/gt/wyvern/.beads/last-touched` is tracked in git\n- Missing `.beads/.gitignore` in some repos allows this\n\n**Required changes:**\n\n1. **Remove from git** (one-time fix for wyvern):\n ```bash\n cd ~/gt \u0026\u0026 git rm --cached wyvern/.beads/last-touched\n ```\n\n2. **bd doctor check** - add to `cmd/bd/doctor/gitignore.go`:\n - Verify `last-touched` is NOT tracked in git (`git ls-files --error-unmatch`)\n - Verify `last-touched` IS in `.beads/.gitignore`\n - Provide auto-fix if missing\n\n3. **bd init** - ensure `.beads/.gitignore` is created with full template including `last-touched`\n\n4. **Town .gitignore safety net** - add `**/.beads/last-touched` to town's `.gitignore`\n\n**Files to modify:**\n- `cmd/bd/doctor/gitignore.go` - add tracked-in-git check\n- `cmd/bd/init.go` - ensure .gitignore creation\n- `~/gt/.gitignore` - add safety net pattern","status":"open","priority":2,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:49:57.540324-08:00","created_by":"mayor","updated_at":"2026-01-12T01:49:57.540324-08:00"} {"id":"bd-hzvz","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649359-08:00","updated_at":"2025-12-19T22:57:31.604229-08:00","closed_at":"2025-12-19T22:57:31.604229-08:00","dependencies":[{"issue_id":"bd-hzvz","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.652068-08:00","created_by":"stevey"},{"issue_id":"bd-hzvz","depends_on_id":"bd-2ep8","type":"blocks","created_at":"2025-12-19T22:56:48.652376-08:00","created_by":"stevey"}]} {"id":"bd-i00","title":"Convert magic numbers to named constants in FlushManager","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-20T21:22:17.845269-05:00","updated_at":"2025-11-20T21:35:53.11654-05:00","closed_at":"2025-11-20T21:35:53.11654-05:00"} @@ -1351,7 +1387,7 @@ {"id":"bd-ifa0","title":"Merge: amber-1767146829144","description":"branch: polecat/amber-1767146829144\ntarget: main\nsource_issue: amber-1767146829144\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T18:11:33.875918-08:00","created_by":"beads/polecats/amber","updated_at":"2025-12-30T19:35:50.452577-08:00","closed_at":"2025-12-30T18:16:13.605293-08:00"} {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:43:15.598698-08:00","updated_at":"2025-12-23T04:51:29.438139-08:00","deleted_at":"2025-12-23T04:51:29.438139-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-ihp9","title":"Fix FOREIGN KEY constraint failures in AddComment and ApplyCompaction","description":"The 'CloseIssue', 'UpdateIssueID', and 'RemoveLabel' methods were fixed in PR #348 to prevent foreign key constraint failures when operating on non-existent issues.\n\nHowever, the Oracle identified two other methods that follow the same problematic pattern:\n1. `AddComment` (in `internal/storage/sqlite/events.go`)\n2. `ApplyCompaction` (in `internal/storage/sqlite/compact.go`)\n\nThese methods attempt to insert an event record after updating the issue, without verifying that the issue update actually affected any rows. This leads to a foreign key constraint failure if the issue does not exist.\n\nWe need to:\n1. Create reproduction tests for these failure cases\n2. Apply the same fix pattern: check `RowsAffected()` after the update, and return a proper \"issue not found\" error if it is 0, before attempting to insert the event.\n3. Standardize the error message format to \"issue %s not found\" or \"issue not found: %s\" for consistency.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T09:49:55.090644-08:00","updated_at":"2025-11-20T09:53:54.466769-08:00","closed_at":"2025-11-20T09:53:54.466769-08:00"} -{"id":"bd-ihu31","title":"Add --ready flag to bd list to show only available work","description":"## Problem\n`bd list` by default shows all non-closed issues including hooked ones. Hooked work is actively being worked on and shouldn't appear in the pool of available work.\n\n## Solution\nAdd a `--ready` flag to `bd list` that filters to show only work that can actually be picked up:\n- Status is `open` (not hooked, not in_progress, not blocked, not deferred)\n- Could potentially also exclude assigned issues (optional consideration)\n\n## Current Workaround\n`bd list --status open` works but isn't as intuitive as `--ready`\n\n## Implementation\n- Add `--ready` boolean flag to list command\n- When set, filter to status=open only\n- Consider if it should also filter out assigned issues (probably not by default)","status":"hooked","priority":1,"issue_type":"feature","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:59:57.131925-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T02:00:08.686385-08:00"} +{"id":"bd-ihu31","title":"Add --ready flag to bd list to show only available work","description":"## Problem\n`bd list` by default shows all non-closed issues including hooked ones. Hooked work is actively being worked on and shouldn't appear in the pool of available work.\n\n## Solution\nAdd a `--ready` flag to `bd list` that filters to show only work that can actually be picked up:\n- Status is `open` (not hooked, not in_progress, not blocked, not deferred)\n- Could potentially also exclude assigned issues (optional consideration)\n\n## Current Workaround\n`bd list --status open` works but isn't as intuitive as `--ready`\n\n## Implementation\n- Add `--ready` boolean flag to list command\n- When set, filter to status=open only\n- Consider if it should also filter out assigned issues (probably not by default)","status":"closed","priority":1,"issue_type":"feature","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:59:57.131925-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T02:05:30.421139-08:00","closed_at":"2026-01-12T02:05:30.421139-08:00","close_reason":"Implemented --ready flag for bd list"} {"id":"bd-ii8ug","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T05:08:11.390419-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T05:08:11.459049-08:00","closed_at":"2026-01-11T05:08:11.459049-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-iic1","title":"Phase 2.2: Switch bdt storage to TOON format","description":"Currently bdt stores issues in JSONL format in issues.toon file. Phase 2.2 must implement actual TOON format storage - this is the fundamental goal of the bdtoon project.\n\n## Current State (Phase 2.1)\n- issues.toon stores JSONL (intermediate format)\n- --toon flag allows output in TOON format for LLM consumption\n- Problem: We're not actually using TOON as the fundamental storage format\n\n## Required Work (Phase 2.2)\n1. Switch issue file I/O to write TOON format instead of JSONL\n - Update cmd/bdt/storage.go to use EncodeTOON for writing\n - Update cmd/bdt/storage.go to decode TOON (currently decodes JSON)\n - Ensure round-trip: write TOON → read TOON → write TOON is byte-identical\n\n2. Update command implementations\n - cmd/bdt/create.go: Write newly created issues to TOON format\n - cmd/bdt/list.go: Read issues from TOON format\n - cmd/bdt/show.go: Read from TOON format\n - cmd/bdt/import.go: Convert imported JSONL to TOON\n - cmd/bdt/export.go: Export TOON to JSONL (for bd compatibility)\n\n3. Implement TOON parser that handles gotoon's encoder-only limitation\n - Since gotoon doesn't decode TOON, need custom TOON→JSON decoder\n - OR continue storing TOON but decoding via intermediate JSON conversion\n\n4. Git merge driver optimization\n - TOON is line-oriented, better for 3-way merges than binary formats\n - Configure git merge driver for .toon files\n\n5. Comprehensive testing\n - Round-trip tests: Issue → TOON → storage → read → Issue\n - Merge conflict resolution tests with TOON format\n - Large issue set performance tests\n\n## Success Criteria\n- issues.toon stores actual TOON format (not JSONL)\n- bdt list reads from TOON file\n- bdt create writes to TOON file\n- Round-trip: create issue → list → show returns identical data\n- All 65+ tests still passing\n- Performance comparable to JSONL storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:05:41.394964404-07:00","updated_at":"2025-12-19T14:37:17.879612634-07:00","closed_at":"2025-12-19T14:37:17.879612634-07:00"} {"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-04T15:22:08.701283-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} @@ -1368,10 +1404,12 @@ {"id":"bd-iov0","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-06T20:06:49.220061-08:00","closed_at":"2025-11-06T19:41:08.643188-08:00"} {"id":"bd-ipj7","title":"enhance 'bd status' to show recent activity","description":"It would be nice to be able to quickly view the last N changes in the database, to see wha's recently been worked on. I'm imagining something like 'bd status activity'.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T11:08:50.996541974-07:00","updated_at":"2025-12-21T17:54:00.279039-08:00","closed_at":"2025-12-21T17:54:00.279039-08:00"} {"id":"bd-ipva","title":"Update go install bd to 0.33.2","description":"Rebuild and install bd to ~/go/bin:\n\n```bash\ngo install ./cmd/bd\n~/go/bin/bd version # Verify shows 0.33.2\n```\n\nNote: If ~/go/bin is in PATH before /opt/homebrew/bin, this is the version that runs by default.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760715-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"bd-iq128","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:40:27.672733-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:40:27.7398-08:00","closed_at":"2026-01-12T02:40:27.7398-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-iq19","title":"Distill: promote ad-hoc epic to proto","description":"Extract a reusable proto from an existing ad-hoc epic.\n\nCOMMAND: bd mol distill \u003cepic-id\u003e [--as \u003cproto-name\u003e]\n\nBEHAVIOR:\n- Clone the epic and all children as a new proto\n- Set is_template=true on all cloned issues\n- Replace concrete values with {{variable}} placeholders (interactive or --var flags)\n- Add to proto catalog\n\nFLAGS:\n- --as NAME: Custom proto ID (default: proto-\u003cepic-id\u003e)\n- --var field=placeholder: Replace value with variable placeholder\n- --interactive: Prompt for each field that looks parameterizable\n- --dry-run: Preview the proto structure\n\nEXAMPLE:\n bd mol distill bd-o5xe --as proto-feature-workflow \\\n --var title=feature_name \\\n --var assignee=worker\n\nUSE CASES:\n- Team develops good workflow organically, wants to reuse it\n- Capture tribal knowledge as executable templates\n- Create starting point for similar future work\n\nThe reverse of spawn: instead of proto → molecule, it's molecule → proto.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T01:05:07.953538-08:00","updated_at":"2025-12-21T10:31:56.814246-08:00","closed_at":"2025-12-21T10:31:56.814246-08:00","dependencies":[{"issue_id":"bd-iq19","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T01:05:16.495774-08:00","created_by":"daemon"},{"issue_id":"bd-iq19","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T01:05:16.560404-08:00","created_by":"daemon"}]} {"id":"bd-iq7n","title":"Audit and fix JSONL filename mismatches across all repo clones","description":"## Problem\n\nMultiple clones of repos are configured with different JSONL filenames (issues.jsonl vs beads.jsonl), causing:\n1. JSONL files to be resurrected after deletion (one clone pushes issues.jsonl, another pushes beads.jsonl)\n2. Agents unable to see issues filed by other agents after sync\n3. Merge conflicts and data inconsistencies\n\n## Root Cause\n\nWhen repos were \"bd doctored\" or initialized at different times, some got issues.jsonl (old default) and others got beads.jsonl (Beads repo specific). These clones push their respective files, creating duplicates.\n\n## Task\n\nScan all repo clones under ~/src/ (1-2 levels deep) and standardize their JSONL configuration.\n\n### Step 1: Find all beads-enabled repos\n\n```bash\n# Find all directories named 'beads' at levels 1-2 under ~/src/\nfind ~/src -maxdepth 2 -type d -name beads\n```\n\n### Step 2: For each repo found, check configuration\n\nFor each directory from Step 1, check:\n- Does `.beads/metadata.json` exist?\n- What is the `jsonl_export` value?\n- What JSONL files actually exist in `.beads/`?\n- Are there multiple JSONL files (problem!)?\n\n### Step 3: Create audit report\n\nGenerate a report showing:\n```\nRepo Path | Config | Actual Files | Status\n----------------------------------- | ------------- | ---------------------- | --------\n~/src/beads | beads.jsonl | beads.jsonl | OK\n~/src/dave/beads | issues.jsonl | issues.jsonl | MISMATCH\n~/src/emma/beads | issues.jsonl | issues.jsonl, beads.jsonl | DUPLICATE!\n```\n\n### Step 4: Determine canonical name for each repo\n\nFor repos that are the SAME git repository (check `git remote -v`):\n- Group them together\n- Determine which JSONL filename should be canonical (majority wins, or beads.jsonl for the beads repo itself)\n- List which clones need to be updated\n\n### Step 5: Generate fix script\n\nCreate a script that for each mismatched clone:\n1. Updates `.beads/metadata.json` to use the canonical name\n2. If JSONL file needs renaming: `git mv .beads/old.jsonl .beads/new.jsonl`\n3. Removes any duplicate JSONL files: `git rm .beads/duplicate.jsonl`\n4. Commits the change\n5. Syncs: `bd sync`\n\n### Expected Output\n\n1. Audit report showing all repos and their config status\n2. List of repos grouped by git remote (same repository)\n3. Fix script or manual instructions for standardizing each repo\n4. Verification that after fixes, all clones of the same repo use the same JSONL filename\n\n### Edge Cases\n\n- Handle repos without metadata.json (use default discovery)\n- Handle repos with no git remote (standalone/local)\n- Handle repos that are not git repositories\n- Don't modify repos with uncommitted changes (warn instead)\n\n### Success Criteria\n\n- All clones of the same git repository use the same JSONL filename\n- No duplicate JSONL files in any repo\n- All configurations documented in metadata.json\n- bd doctor passes on all repos","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-11-21T23:58:35.044762-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-ir5t","title":"Merge: quartz-1767106247671","description":"branch: polecat/quartz-1767106247671\ntarget: main\nsource_issue: quartz-1767106247671\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:02:08.919103-08:00","created_by":"beads/polecats/quartz","updated_at":"2025-12-30T15:44:43.349476-08:00","closed_at":"2025-12-30T10:27:23.069509-08:00"} {"id":"bd-irah","title":"Add refs field for cross-references with relationship type","description":"The refs field enables rich relationships beyond parent/child and depends-on.\n\nStructure:\n refs: [{id: string, rel: string}]\n\nRelationship types:\n- until: active until target closes\n- caused_by: triggered by target\n- relates_to: general association\n- supersedes: replaces target\n- validates: approval relationship\n\nExample:\n refs:\n - id: gt-abc1\n rel: until\n - id: hq-xyz9\n rel: caused_by\n\nEnables:\n- bd show gt-abc1 --refs (what references this?)\n- Conditional state (muted UNTIL issue closes)\n- Audit trails (this event CAUSED_BY that issue)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-30T15:15:34.948913-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-30T18:12:30.975264-08:00","closed_at":"2025-12-30T15:51:38.291217-08:00","close_reason":"Implemented refs feature: added until/caused-by/validates dependency types and --refs flag to bd show"} +{"id":"bd-irmpv","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:17:46.952262-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:17:47.014718-08:00","closed_at":"2026-01-12T02:17:47.014718-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-irq6","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"} {"id":"bd-is6m","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Note\nThis task is in Gas Town (gt), not beads. May need to be moved there.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:36.839709-08:00","updated_at":"2025-12-23T12:19:44.204647-08:00","closed_at":"2025-12-23T12:19:44.204647-08:00","dependencies":[{"issue_id":"bd-is6m","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.909253-08:00","created_by":"daemon"},{"issue_id":"bd-is6m","depends_on_id":"bd-u66e","type":"blocks","created_at":"2025-12-23T11:44:56.428084-08:00","created_by":"daemon"}]} {"id":"bd-isi6q","title":"Fix daemon socket path exceeds macOS 104-char limit (GH#1001)","description":"dispatched_by: mayor\n\nDaemon socket path can exceed macOS 104-char limit in deep directories. See https://github.com/steveyegge/beads/issues/1001","status":"closed","priority":2,"issue_type":"task","assignee":"beads/polecats/quartz","created_at":"2026-01-10T12:18:32.427353-08:00","created_by":"mayor","updated_at":"2026-01-10T16:43:58.362672-08:00","closed_at":"2026-01-10T16:43:58.362672-08:00","close_reason":"Fixed: Daemon now automatically uses /tmp/beads-{hash}/daemon.sock for deep directory paths that would exceed macOS 104-char sun_path limit. Added SocketPathForWorkspace() and SocketPathForDatabase() functions to internal/daemon/socketpath.go. Updated all callers to use the new functions. Backward compatible - short paths still use traditional .beads/bd.sock location.","labels":["bug"]} @@ -1398,7 +1436,8 @@ {"id":"bd-j7e2","title":"RPC diagnostics: BD_RPC_DEBUG timing logs","description":"Add lightweight diagnostic logging for RPC connection attempts:\n- BD_RPC_DEBUG=1 prints to stderr:\n - Socket path being dialed\n - Socket exists check result \n - Dial start/stop time\n - Connection outcome\n- Improve bd daemon --status messaging when lock not held\n\nThis helps field triage of connection issues without verbose daemon logs.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T16:42:12.772364-08:00","updated_at":"2025-11-07T22:07:17.346817-08:00","closed_at":"2025-11-07T21:29:32.243458-08:00","dependencies":[{"issue_id":"bd-j7e2","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.773714-08:00","created_by":"daemon"}]} {"id":"bd-j7v7","title":"Merge: ruby-mk0ev0fb","description":"branch: polecat/ruby-mk0ev0fb\ntarget: main\nsource_issue: ruby-mk0ev0fb\nrig: beads\nagent_bead: bd-beads-polecat-ruby\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-04T16:21:31.460826-08:00","created_by":"beads/polecats/ruby","updated_at":"2026-01-05T19:45:43.982501-08:00","closed_at":"2026-01-05T19:45:43.982501-08:00","close_reason":"Branch deleted, already merged"} {"id":"bd-j8tz0","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:15:20.491772-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T18:15:20.546549-08:00","closed_at":"2026-01-11T18:15:20.546549-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} -{"id":"bd-j9ac9","title":"Update GIT_INTEGRATION.md for Jujutsu (GH#906)","description":"dispatched_by: beads/crew/dave\n\nUpdate the Jujutsu integration section to use 'bd merge' instead of standalone beads-merge binary. Fix provided in issue.","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/crew/fang","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:19.464115-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T20:42:53.402452-08:00","external_ref":"gh-906"} +{"id":"bd-j9ac9","title":"Update GIT_INTEGRATION.md for Jujutsu (GH#906)","description":"dispatched_by: beads/crew/dave\n\nUpdate the Jujutsu integration section to use 'bd merge' instead of standalone beads-merge binary. Fix provided in issue.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/fang","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:19.464115-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T16:34:51.195142-08:00","closed_at":"2026-01-12T16:34:51.195142-08:00","close_reason":"Updated Jujutsu integration section to use bd merge instead of standalone beads-merge binary per GH#906","external_ref":"gh-906"} +{"id":"bd-jaz8u","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:34:08.111351-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T17:34:08.180238-08:00","closed_at":"2026-01-12T17:34:08.180238-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jbgfb","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:34:55.131085-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T18:34:55.199477-08:00","closed_at":"2026-01-11T18:34:55.199477-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jbqx","title":"Code smell: Repeated validation patterns could be centralized","description":"Similar validation patterns appear in multiple commands (create.go, show.go, update.go, etc.):\n- Check if resource exists\n- Check if resource is in valid state\n- Validate user input\n- Check permissions\n\n**Problem:**\n- Duplicated validation logic\n- Inconsistent validation between commands\n- Hard to add new validation rules consistently\n\n**Acceptance Criteria:**\n- [ ] Create internal/validation package\n- [ ] Centralize common validation logic\n- [ ] Use composition for validation chains\n- [ ] Update commands to use shared validators\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:03.171186-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T18:12:30.979965-08:00","closed_at":"2025-12-30T15:58:50.871474-08:00","close_reason":"Implemented composable validators in internal/validation/issue.go with Chain() composition, migrated show_unit_helpers.go to use centralized validators","dependencies":[{"issue_id":"bd-jbqx","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.84458-08:00","created_by":"daemon"}]} {"id":"bd-jcdrt","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T09:41:07.26351-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T09:41:07.328097-08:00","closed_at":"2026-01-11T09:41:07.328097-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1500,6 +1539,7 @@ {"id":"bd-l13p","title":"Add GetWorkerStatus RPC endpoint","description":"New RPC endpoint to get all workers and their current molecule/step in one call. Returns: assignee, moleculeID, moleculeTitle, currentStep, totalSteps, stepTitle, lastActivity, status. Enables activity feed TUI to show worker state without multiple round trips.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:36.248654-08:00","updated_at":"2025-12-23T16:40:59.772138-08:00","closed_at":"2025-12-23T16:40:59.772138-08:00"} {"id":"bd-l1s0v","title":"Session ended: gt-beads-crew-dave","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T19:20:04.553542-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-07T19:20:04.592896-08:00","closed_at":"2026-01-07T19:20:04.592896-08:00","close_reason":"auto-closed session event"} {"id":"bd-l4b6","title":"Add tests for bd init --team wizard","description":"Write integration tests for the team wizard:\n- Test branch detection\n- Test sync branch creation\n- Test protected branch workflow\n- Test auto-sync configuration","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-05T18:58:18.192425-08:00","updated_at":"2025-11-06T20:06:49.22056-08:00","closed_at":"2025-11-06T19:55:39.687439-08:00"} +{"id":"bd-l5esz","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:49:41.269396-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:49:41.335288-08:00","closed_at":"2026-01-12T02:49:41.335288-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-l5gq","title":"Optimize test suite performance - cut runtime by 50%+","description":"## Problem\nTest suite takes ~20.8 seconds, with 95% of time spent in just 2 tests:\n- TestHashIDs_MultiCloneConverge: 11.08s (53%)\n- TestHashIDs_IdenticalContentDedup: 8.78s (42%)\n\nBoth tests in beads_hash_multiclone_test.go perform extensive Git operations (bare repos, multiple clones, sync rounds).\n\n## Goal\nCut total test time by at least 50% (to ~10 seconds or less).\n\n## Analysis\nTests already have some optimizations:\n- --shared --depth=1 --no-tags for fast cloning\n- Disabled hooks, gc, fsync\n- Support -short flag\n\n## Impact\n- Faster development feedback loop\n- Reduced CI costs and time\n- Better developer experience","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T01:23:14.410648-08:00","updated_at":"2025-11-04T11:23:13.683213-08:00","closed_at":"2025-11-04T11:23:13.683213-08:00"} {"id":"bd-l5jpu","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:38:11.508998-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-10T00:38:11.545391-08:00","closed_at":"2026-01-10T00:38:11.545391-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-l6veq","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T13:37:03.899972-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T13:37:03.942079-08:00","closed_at":"2026-01-10T13:37:03.942079-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1672,6 +1712,8 @@ {"id":"bd-mol-yxv","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.39.0\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T19:34:09.557636-08:00","updated_at":"2026-01-04T23:49:29.777567-08:00","dependencies":[{"issue_id":"bd-mol-yxv","depends_on_id":"bd-mol-937","type":"blocks","created_at":"2025-12-27T19:34:09.594033-08:00","created_by":"beads/crew/dave"}],"deleted_at":"2026-01-04T23:49:29.777567-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-mol-z5v","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.41.0\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-29T16:29:32.299762-08:00","updated_at":"2026-01-04T23:49:29.777567-08:00","close_reason":"Added v0.41.0 to versionChanges","deleted_at":"2026-01-04T23:49:29.777567-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-mql4","title":"getLocalSyncBranch silently ignores YAML parse errors","description":"In autoimport.go:170-172, YAML parsing errors are silently ignored. If a user has malformed YAML in config.yaml, sync-branch will just silently be empty with no feedback.\n\nRecommendation: Add debug logging since this function is only called during auto-import, and debugging silent failures is painful.\n\nAdd: debug.Logf(\"Warning: failed to parse config.yaml: %v\", err)","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:44.217728-08:00","updated_at":"2025-12-30T18:12:30.967491-08:00","closed_at":"2025-12-30T16:50:13.838626-08:00","close_reason":"Added debug.Logf calls in getLocalSyncBranch and isNoDbModeConfigured to log YAML parse errors instead of silently ignoring them"} +{"id":"bd-msp88","title":"Review and merge PR #1047: Skip macOS read-only tests","description":"dispatched_by: beads/crew/emma","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:27.943568-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:43:36.202064-08:00","closed_at":"2026-01-12T16:43:36.202064-08:00","close_reason":"PR #1047 merged. Skips macOS read-only file tests since macOS allows owners to write to 0444 files."} +{"id":"bd-msx8f","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:46:41.312589-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:46:41.383053-08:00","closed_at":"2026-01-12T02:46:41.383053-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-muhs7","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:02:17.295904-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T23:02:17.333687-08:00","closed_at":"2026-01-09T23:02:17.333687-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-muls","title":"Install and test MCP Agent Mail locally","description":"Install MCP Agent Mail on a single development machine and verify basic functionality.\n\nAcceptance Criteria:\n- Server installed via one-line installer\n- Server running on port 8765\n- Can register a project via HTTP\n- Can register an agent identity\n- Web UI accessible at /mail","notes":"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.","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.896735-08:00","updated_at":"2025-11-07T23:14:59.1182-08:00","closed_at":"2025-11-07T23:14:59.1182-08:00"} {"id":"bd-muw","title":"Add empty tasks validation in workflow create","description":"workflow.go:321 will panic if wf.Tasks is empty. Add validation that len(wf.Tasks) \u003e 0 before accessing wf.Tasks[0].","status":"tombstone","priority":3,"issue_type":"bug","created_at":"2025-12-17T22:23:00.75707-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -1685,6 +1727,7 @@ {"id":"bd-n0l8j","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T21:42:10.708451-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-07T21:42:15.897669-08:00","closed_at":"2026-01-07T21:42:15.897669-08:00","close_reason":"auto-closed session event"} {"id":"bd-n0md6","title":"Review and merge PR #975: fix sync --import-only store nil","description":"dispatched_by: beads/crew/emma\n\n## Task\nReview and merge PR #975 from juanre.\n\n**PR**: https://github.com/steveyegge/beads/pull/975\n\n## What it does\n- Adds ensureStoreActive() call after daemon disconnect in sync.go\n- Fixes 'no database store available for inline import' error\n- Includes comprehensive test documenting the bug and fix\n\n## Easy-win criteria met\n- Bug fix with clear reproduction and solution\n- Has comprehensive test\n- Small diff (143 additions, 0 deletions)\n- Low risk\n\n## Instructions\n1. Clone/fetch the PR: gh pr checkout 975 --repo steveyegge/beads\n2. Run tests: go test ./cmd/bd/...\n3. Review the diff: gh pr diff 975 --repo steveyegge/beads\n4. If tests pass and code looks good, approve and merge\n5. Close this bead when done","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-09T10:59:58.832796-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:44:59.1482-08:00","closed_at":"2026-01-09T13:44:59.1482-08:00","close_reason":"PR #975 reviewed, approved, and merged. Fix adds ensureStoreActive() call after daemon disconnect in sync.go to fix 'no database store available for inline import' error."} {"id":"bd-n14te","title":"Test integration issue","description":"This is a real integration test","status":"open","priority":1,"issue_type":"bug","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:10.443519-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:10.443519-08:00"} +{"id":"bd-n1xj7","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:08:04.628998-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:08:04.673308-08:00","closed_at":"2026-01-12T02:08:04.673308-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-n25","title":"Speed up main_test.go - tests hang indefinitely due to nil rootCtx","description":"## Problem\n\nmain_test.go tests are hanging indefinitely, making them unusable and blocking development.\n\n## Root Cause\n\nTests that call flushToJSONL() or autoImportIfNewer() hang forever because:\n- rootCtx is nil in test environment (defined in cmd/bd/main.go:67)\n- flushToJSONL() uses rootCtx for DB operations (autoflush.go:503)\n- When rootCtx is nil, DB calls timeout/hang indefinitely\n\n## Affected Tests (10+)\n\n- TestAutoFlushOnExit\n- TestAutoFlushJSONLContent \n- TestAutoFlushErrorHandling\n- TestAutoImportIfNewer\n- TestAutoImportDisabled\n- TestAutoImportWithUpdate\n- TestAutoImportNoUpdate\n- TestAutoImportMergeConflict\n- TestAutoImportConflictMarkerFalsePositive\n- TestAutoImportClosedAtInvariant\n\n## Proof\n\n```bash\n# Before fix: TestAutoFlushJSONLContent HANGS (killed after 2+ min)\n# After adding rootCtx init: Completes in 0.04s\n# Speedup: ∞ → 0.04s\n```\n\n## Solution\n\nSee MAIN_TEST_OPTIMIZATION_PLAN.md for complete fix plan.\n\n**Quick Fix (5 min)**: Add to each hanging test:\n```go\nctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)\ndefer cancel()\noldRootCtx := rootCtx\nrootCtx = ctx\ndefer func() { rootCtx = oldRootCtx }()\n```\n\n**Full Optimization (40 min total)**:\n1. Fix rootCtx (5 min) - unblocks tests\n2. Reduce sleep durations 10x (2 min) - saves ~280ms\n3. Use in-memory DBs (10 min) - saves ~1s\n4. Share test fixtures (15 min) - saves ~1.2s\n5. Fix skipped debounce test (5 min)\n\n## Expected Results\n\n- Tests go from hanging → \u003c5s total runtime\n- Keep critical integration test coverage\n- Tests caught real bugs: bd-270, bd-206, bd-160\n\n## Files\n\n- Analysis: MAIN_TEST_REFACTOR_NOTES.md\n- Solution: MAIN_TEST_OPTIMIZATION_PLAN.md\n- Tests: cmd/bd/main_test.go (18 tests, 1322 LOC)\n\n## Priority\n\nP1 - Blocking development, tests unusable in current state","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T18:27:48.942814-05:00","updated_at":"2025-11-21T18:44:21.944901-05:00","closed_at":"2025-11-21T18:44:21.944901-05:00"} {"id":"bd-n2xsj","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:13:41.779573-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:13:41.820512-08:00","closed_at":"2026-01-10T16:13:41.820512-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-n386","title":"Improve test coverage for internal/daemon (27.3% → 60%)","description":"The daemon package has only 27.3% test coverage. The daemon is critical for background operations and reliability.\n\nKey areas needing tests:\n- Daemon autostart logic\n- Socket handling\n- PID file management\n- Health checks\n\nCurrent coverage: 27.3%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:00.895238-08:00","updated_at":"2025-12-23T22:36:08.583672-08:00","closed_at":"2025-12-23T22:36:08.583672-08:00"} @@ -1724,6 +1767,7 @@ {"id":"bd-nqr5l","title":"Review PR #16562: Portable shebang in ralph-wiggum","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #16562 (anthropics/claude-code)\n\nPR: https://github.com/anthropics/claude-code/pull/16562\nAuthor: mantrakp04\nFixes: #12880\n\nChanges #!/bin/bash to #!/usr/bin/env bash for NixOS/WSL2 compatibility.\n- gh pr view 16562 --repo anthropics/claude-code\n- gh pr diff 16562 --repo anthropics/claude-code\n- If good: gh pr merge 16562 --repo anthropics/claude-code --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-08T14:20:25.65767-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:29:35.602117-08:00","closed_at":"2026-01-08T14:29:35.602117-08:00","close_reason":"Wrong repo - these were for anthropics/claude-code, not steveyegge/beads"} {"id":"bd-nqyp","title":"mol-beads-release","description":"Release checklist for beads version {{version}}.\n\nThis molecule ensures all release steps are completed properly.\nVariable: {{version}} - target version (e.g., 0.35.0)\n\n## Step: update-release-notes\nUpdate cmd/bd/info.go with release notes for {{version}}.\n\nAdd a new VersionChange entry at the top of versionChanges slice:\n```go\n{\n Version: \"{{version}}\",\n Date: \"YYYY-MM-DD\",\n Changes: []string{\n \"NEW: Feature description\",\n \"FIX: Bug fix description\",\n \"IMPROVED: Enhancement description\",\n },\n},\n```\n\nRun `git log --oneline v\u003cprevious\u003e..HEAD` to see what changed.\n\n## Step: update-changelog\nUpdate CHANGELOG.md with detailed release notes.\n\nAdd a new section after [Unreleased]:\n```markdown\n## [{{version}}] - YYYY-MM-DD\n\n### Added\n- **Feature name** (issue-id) - Description\n\n### Changed\n- **Change description** (issue-id)\n\n### Fixed\n- **Bug fix** (issue-id) - Description\n```\n\nSort by importance, not chronologically.\nNeeds: update-release-notes\n\n## Step: bump-version\nRun the version bump script.\n\n```bash\n./scripts/bump-version.sh {{version}}\n```\n\nThis updates version in all files:\n- cmd/bd/version.go\n- .claude-plugin/*.json\n- integrations/beads-mcp/pyproject.toml\n- npm-package/package.json\n- Hook templates\n\nNeeds: update-changelog\n\n## Step: run-tests\nRun tests and verify lint passes.\n\n```bash\ngo test -short ./...\n```\n\nCI will run full lint, but fix any obvious issues first.\nNeeds: bump-version\n\n## Step: commit-release\nCommit the release changes.\n\n```bash\ngit add -A\ngit commit -m \"chore: bump version to v{{version}}\"\n```\n\nNeeds: run-tests\n\n## Step: push-and-tag\nPush commit and create release tag.\n\n```bash\ngit push origin main\ngit tag v{{version}}\ngit push origin v{{version}}\n```\n\nThis triggers GitHub Actions release workflow.\nNeeds: commit-release\n\n## Step: wait-for-ci\nWait for GitHub Actions to complete.\n\nMonitor: https://github.com/steveyegge/beads/actions\n\nCI will:\n- Build binaries via GoReleaser\n- Create GitHub Release with assets\n- Publish to npm (@beads/bd)\n- Publish to PyPI (beads-mcp)\n- Update Homebrew tap\n\nWait until all jobs succeed (~5-10 min).\nNeeds: push-and-tag\n\n## Step: verify-release\nVerify the release is complete.\n\n```bash\n# Check GitHub release\ngh release view v{{version}}\n\n# Check Homebrew\nbrew update \u0026\u0026 brew info steveyegge/beads/bd\n\n# Check npm\nnpm view @beads/bd version\n\n# Check PyPI\npip index versions beads-mcp\n```\n\nNeeds: wait-for-ci\n\n## Step: update-local\nUpdate local installations with proper codesigning (macOS).\n\n```bash\n# Build from source in mayor/rig (canonical build location)\ncd ~/gt/beads/mayor/rig\ngit pull\ngo build -o bd ./cmd/bd\n\n# Sign and install (macOS requires codesigning to avoid \"Killed: 9\")\n# Uses fix-gt script which handles both gt and bd binaries\nfix-gt\n\n# Or manually sign if fix-gt not available:\n# xattr -cr bd \u0026\u0026 codesign -f -s - bd\n# cp bd ~/go/bin/bd \u0026\u0026 codesign -f -s - ~/go/bin/bd\n# cp bd ~/.local/bin/bd \u0026\u0026 codesign -f -s - ~/.local/bin/bd\n\n# Install MCP locally\npip install -e integrations/beads-mcp\n\n# Restart daemons\npkill -f \"bd daemon\" || true\n```\n\nVerify: `bd --version` shows {{version}}\nNeeds: verify-release\n\n## Step: manual-publish\n(Optional) Manual publish if CI failed.\n\n```bash\n# npm (requires npm login)\n./scripts/bump-version.sh {{version}} --publish-npm\n\n# PyPI (requires TWINE credentials)\n./scripts/bump-version.sh {{version}} --publish-pypi\n\n# Or both\n./scripts/bump-version.sh {{version}} --publish-all\n```\n\nOnly needed if CI publishing failed.\nNeeds: wait-for-ci","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-23T11:29:39.087936-08:00","updated_at":"2025-12-28T01:26:51.06645-08:00","labels":["template"],"deleted_at":"2025-12-28T01:26:51.06645-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} {"id":"bd-nrwvr","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T04:46:24.078237-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T04:46:24.136806-08:00","closed_at":"2026-01-11T04:46:24.136806-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-nryae","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T03:11:00.530685-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T03:11:00.595691-08:00","closed_at":"2026-01-12T03:11:00.595691-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-nsb","title":"Doctor should exclude merge artifacts from 'multiple JSONL' warning","description":"Doctor command warns about 'multiple JSONL files' when .base.jsonl and .left.jsonl merge artifacts exist. These are expected during/after merge operations and should be excluded from the warning.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.988178-08:00","updated_at":"2025-11-28T18:36:52.087768-08:00","closed_at":"2025-11-28T17:41:50.700658-08:00"} {"id":"bd-nszi","title":"Post-merge hook silently fails on JSONL conflicts, poor UX","description":"When git pull results in merge conflicts in .beads/issues.jsonl, the post-merge hook runs 'bd sync --import-only' which fails, but stderr was redirected to /dev/null. User only saw generic warning.\n\nFixed by capturing and displaying the actual error output, so users see 'Git conflict markers detected' message immediately.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T02:31:04.909925-08:00","updated_at":"2025-11-08T02:31:45.237286-08:00","closed_at":"2025-11-08T02:31:45.237286-08:00"} {"id":"bd-ntl3b","title":"Deduplicate daemon_start.go validation logic","description":"daemon_start.go (lines 57-124) duplicates validation logic from daemon.go. Should extract shared validation to a helper function and call it from both places.\n\nDuplicated logic:\n- Version mismatch check and auto-stop\n- Local mode constraint validation\n- Git repo validation\n- Upstream check for auto-push\n- Worktree warning\n\nFix: Create validateDaemonStartPrereqs() or similar helper that both daemonCmd.Run and daemonStartCmd.Run can call.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-10T16:30:36.491775-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T16:30:36.491775-08:00"} @@ -1731,6 +1775,7 @@ {"id":"bd-nurq","title":"Implement bd mol current command","description":"Show what molecule the agent should currently be working on. Referenced by gt-um6q, gt-lz13. Needed for molecule navigation workflow in templates.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:17:54.069983-08:00","updated_at":"2025-12-23T01:23:59.523404-08:00","closed_at":"2025-12-23T01:23:59.523404-08:00"} {"id":"bd-nv1z","title":"Fix PR→MR terminology in internal workflow docs","description":"Polecats create MRs (merge requests), not PRs. Fix these references:\n\n- docs/reference.md:326 - 'review PRs' → 'review MRs'\n- docs/INSTALLING.md:187 - 'PR review' → 'MR review'\n\nPRs are external GitHub concept. MRs are internal Gas Town workflow.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T22:13:03.636757-08:00","created_by":"mayor","updated_at":"2026-01-04T22:13:13.932166-08:00","closed_at":"2026-01-04T22:13:13.932166-08:00","close_reason":"Wrong rig - recreating in gastown"} {"id":"bd-nv4g","title":"Add pre-sync validation hook","description":"Future: Hook integration to run bd lint before sync, respecting config settings.","status":"closed","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:11.00402-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-02T00:04:24.394347-08:00","closed_at":"2026-01-02T00:04:24.394347-08:00","close_reason":"Pre-sync validation hook already implemented; added comprehensive tests","dependencies":[{"issue_id":"bd-nv4g","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.791249-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-nv4g","depends_on_id":"bd-t7jq","type":"blocks","created_at":"2026-01-01T11:19:24.008812-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-nyeic","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:17:08.48375-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T18:17:08.530051-08:00","closed_at":"2026-01-12T18:17:08.530051-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-nyfs","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:36:53.212509-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T17:36:53.246778-08:00","closed_at":"2026-01-07T17:36:53.246778-08:00","close_reason":"auto-closed session event"} {"id":"bd-nzafo","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T17:53:00.803689-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T17:53:00.840604-08:00","closed_at":"2026-01-08T17:53:00.840604-08:00","close_reason":"auto-closed session event"} {"id":"bd-nztia","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T11:02:37.287883-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-09T11:02:37.327152-08:00","closed_at":"2026-01-09T11:02:37.327152-08:00","close_reason":"auto-closed session event"} @@ -1796,6 +1841,7 @@ {"id":"bd-p7i2","title":"Add unit test for gitHasUncommittedBeadsChanges()","description":"The new helper function from bd-vd8e needs unit tests in sync_git_test.go to verify:\n- Returns false when no changes\n- Returns true for M (modified)\n- Returns true for A (added)\n- Returns false for ?? (untracked)\n- Returns false for D (deleted)\n\nPart of GH#885 follow-up.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/polecats/ruby","created_at":"2026-01-04T16:15:53.96425-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T16:20:40.004117-08:00","closed_at":"2026-01-04T16:20:40.004117-08:00","close_reason":"Added parseGitStatusForBeadsChanges helper function and 14 unit tests covering: empty status, modified (staged/unstaged/both), added, untracked, deleted, renamed, copied, and edge cases"} {"id":"bd-p98lw","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:38:37.50559-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:38:37.571613-08:00","closed_at":"2026-01-11T22:38:37.571613-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-par1","title":"doctor: improve messaging for detection-only hook managers","description":"When bd doctor detects hook managers we can't fully check (pre-commit, overcommit, yorkie, simple-git-hooks), the current warning suggests they're broken. Change to informational: 'pre-commit detected, cannot verify bd integration' rather than implying misconfiguration.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T19:19:08.98544-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-05T21:06:05.953116-08:00","closed_at":"2026-01-05T21:06:05.953116-08:00","close_reason":"Implemented - detection-only managers now show informational message"} +{"id":"bd-pbcie","title":"Review and merge PR #1037: Ensure daemon lock dir exists (fixes crash)","description":"dispatched_by: beads/crew/emma","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:31.644672-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:38:47.39244-08:00","closed_at":"2026-01-12T16:38:47.39244-08:00","close_reason":"PR #1037 already merged. Fix ensures daemon lock directory exists before creating lock file, preventing stack overflow on deep workspace paths."} {"id":"bd-pbfib","title":"Session ended: gt-beads-crew-fang","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:57:42.09645-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-09T22:57:42.133588-08:00","closed_at":"2026-01-09T22:57:42.133588-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-pbh","title":"Release v0.30.4","description":"## Version Bump Workflow\n\nCoordinating release from 0.30.3 to 0.30.4.\n\n### Components Updated\n- Go CLI (cmd/bd/version.go)\n- Claude Plugin (.claude-plugin/*.json)\n- MCP Server (integrations/beads-mcp/)\n- npm Package (npm-package/package.json)\n- Git hooks (cmd/bd/templates/hooks/)\n\n### Release Channels\n- GitHub Releases (GoReleaser)\n- PyPI (beads-mcp)\n- npm (@beads/cli)\n- Homebrew (homebrew-beads tap)\n","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-17T21:19:10.926133-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["release","v0.30.4","workflow"],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"bd-pbh.1","title":"Update cmd/bd/version.go to 0.30.4","description":"Update the Version constant in cmd/bd/version.go:\n```go\nVersion = \"0.30.4\"\n```\n\n\n```verify\ngrep -q 'Version = \"0.30.4\"' cmd/bd/version.go\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:10.9462-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.1","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:10.946633-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -1824,6 +1870,7 @@ {"id":"bd-pdr2","title":"Consider backwards compatibility for ready() and list() return type change","description":"PR #481 changed the return types of `ready()` and `list()` from `list[Issue]` to `list[IssueMinimal] | CompactedResult`. This is a breaking change for MCP clients.\n\n## Impact Assessment\nBreaking change affects:\n- Any MCP client expecting `list[Issue]` from ready()\n- Any MCP client expecting `list[Issue]` from list()\n- Client code that accesses full Issue fields (description, design, acceptance_criteria, timestamps, dependencies, dependents)\n\n## Current Behavior\n- ready() returns `list[IssueMinimal] | CompactedResult`\n- list() returns `list[IssueMinimal] | CompactedResult`\n- show() still returns full `Issue` (good)\n\n## Considerations\n**Pros of current approach:**\n- Forces clients to use show() for full details (good for context efficiency)\n- Simple mental model (always use show for full data)\n- Documentation warns about this\n\n**Cons:**\n- Clients expecting list[Issue] will break\n- No graceful degradation option\n- No migration period\n\n## Potential Solutions\n1. Add optional parameter `full_details=false` to ready/list (would increase payload)\n2. Create separate tools: ready_minimal/list_minimal + ready_full/list_full\n3. Accept breaking change and document upgrade path (current approach)\n4. Version the MCP server and document migration guide\n\n## Recommendation\nCurrent approach (solution 3) is reasonable if:\n- Changelog clearly documents the breaking change\n- Migration guide provided to clients\n- Error handling is graceful for clients expecting specific fields","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:56.460465-08:00","updated_at":"2025-12-30T15:44:43.357467-08:00","closed_at":"2025-12-30T00:38:54.425634-08:00","close_reason":"Merged via refinery","dependencies":[{"issue_id":"bd-pdr2","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:56.461959-08:00","created_by":"stevey"}]} {"id":"bd-pdwz","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","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-pe4s","title":"JSON test issue","description":"Line 1\nLine 2\nLine 3","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T16:14:36.969074-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"bd-peitc","title":"Review and merge PR #1054: bump actions/setup-node v4→v6","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1054\nType: Dependabot dependency bump (GitHub Actions)\nChange: actions/setup-node v4 → v6\n\n## Task\n1. Review the PR diff: `gh pr diff 1054 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1054 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1054 --repo steveyegge/beads --approve`\n `gh pr merge 1054 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- This is a major version bump but setup-node is a well-maintained GitHub action\n- Breaking changes are documented in release notes (automatic caching behavior)","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/crew/dave","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:32.081248-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:28:50.341857-08:00","external_ref":"gh-1054"} {"id":"bd-pg1","title":"[CRITICAL] Sync validation false positive - legitimate deletions trigger 'data loss detected'","description":"Sync preflight validation incorrectly detects 'data loss' when legitimate deletions occur. This blocks all syncs and is the highest priority fix.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-28T17:27:42.179281-08:00","updated_at":"2025-11-28T18:36:52.088427-08:00","closed_at":"2025-11-28T17:42:49.92251-08:00"} {"id":"bd-pgcs","title":"Clean up orphaned child issues (bd-cb64c226.*, bd-cbed9619.*)","description":"## Problem\n\nEvery bd command shows warnings about 12 orphaned child issues:\n- bd-cb64c226.1, .6, .8, .9, .10, .12, .13\n- bd-cbed9619.1, .2, .3, .4, .5\n\nThese are hierarchical IDs (parent.child format) where the parent issues no longer exist.\n\n## Impact\n\n- Clutters output of every bd command\n- Confusing for users\n- Indicates incomplete cleanup of deleted parent issues\n\n## Proposed Solution\n\n1. Delete the orphaned issues since their parents no longer exist:\n ```bash\n bd delete bd-cb64c226.1 bd-cb64c226.6 bd-cb64c226.8 ...\n ```\n\n2. Or convert them to top-level issues if they contain useful content\n\n## Investigation Needed\n\n- What were the parent issues bd-cb64c226 and bd-cbed9619?\n- Why were they deleted without their children?\n- Should bd delete cascade to children automatically?","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T23:06:17.240571-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-pgh","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T21:20:47.62144-08:00","created_by":"deacon","updated_at":"2025-12-27T00:10:54.177166-08:00","deleted_at":"2025-12-27T00:10:54.177166-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} @@ -1866,9 +1913,12 @@ {"id":"bd-qhws","title":"Configure database connection pool limits for daemon mode","description":"Database connection pool not configured for file-based databases when running in daemon mode.\n\nLocation: internal/storage/sqlite/sqlite.go:108-116\n\nProblem:\n- Daemon is a long-running server handling concurrent RPC requests\n- Multiple CLI commands hit same daemon simultaneously \n- Go default: unlimited connections (MaxOpenConns=0)\n- SQLite IMMEDIATE transactions serialize on write lock\n- Can have 100+ goroutines blocked waiting, each holding connection\n- Results in connection exhaustion and 'database is locked' errors\n\nCurrent code only limits in-memory DBs:\nif isInMemory {\n db.SetMaxOpenConns(1)\n db.SetMaxIdleConns(1)\n}\n// File DBs: UNLIMITED connections!\n\nFix:\nif !isInMemory {\n maxConns := runtime.NumCPU() + 1 // 1 writer + N readers\n db.SetMaxOpenConns(maxConns)\n db.SetMaxIdleConns(2)\n db.SetConnMaxLifetime(0)\n}\n\nImpact: 'database is locked' errors under concurrent load in daemon mode\n\nNote: NOT an issue for direct CLI usage (each process isolated). Only affects daemon mode where multiple CLI commands share one database pool.\n\nEffort: 1 hour","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-16T14:51:24.579345-08:00","updated_at":"2025-11-16T15:04:00.450911-08:00","closed_at":"2025-11-16T15:04:00.450911-08:00"} {"id":"bd-qij92","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2026-01-07T21:42:08.757632-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-09T21:15:43.008747-08:00","closed_at":"2026-01-09T21:15:43.008747-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-qioh","title":"Standardize error handling: replace direct fmt.Fprintf+os.Exit with FatalError","description":"Standardize error handling in cmd/bd/ using FatalError pattern.\n\n## Current State\n~200+ instances of direct `fmt.Fprintf(os.Stderr, ...) + os.Exit(1)` pattern scattered across cmd/bd/*.go files.\n\n## Target Pattern\n\nUse existing FatalError helper (or create if missing):\n\n```go\n// In cmd/bd/helpers.go or similar\nfunc FatalError(format string, args ...interface{}) {\n fmt.Fprintf(os.Stderr, \"Error: \"+format+\"\\n\", args...)\n os.Exit(1)\n}\n\nfunc FatalErrorf(err error, context string) {\n fmt.Fprintf(os.Stderr, \"Error: %s: %v\\n\", context, err)\n os.Exit(1)\n}\n```\n\n## Transformation\n\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Error: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"%v\", err)\n\n// Before\nfmt.Fprintf(os.Stderr, \"Error: invalid --since duration: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"invalid --since duration: %v\", err)\n```\n\n## Files to Update (by occurrence count)\nRun: `grep -c \"os.Exit(1)\" cmd/bd/*.go | sort -t: -k2 -rn | head -20`\n\nPriority files (highest occurrence):\n- close.go\n- show.go\n- sync.go\n- init.go\n- list.go\n- create.go\n- update.go\n\n## Implementation Steps\n\n1. **Check if FatalError exists** in cmd/bd/helpers.go or create it\n2. **Create migration script** or use sed:\n ```bash\n # Find patterns to replace\n grep -rn \"fmt.Fprintf(os.Stderr.*Error.*\\n.*os.Exit(1)\" cmd/bd/\n ```\n3. **Replace systematically** file by file\n4. **Run tests** after each file to verify behavior unchanged\n5. **Run linter** to catch any missed patterns\n\n## Verification\n```bash\n# Count remaining direct exits (should be near zero)\ngrep -c \"os.Exit(1)\" cmd/bd/*.go | awk -F: \"{sum+=\\$2} END {print sum}\"\n\n# Run tests\ngo test -short ./cmd/bd/...\n```\n\n## Success Criteria\n- All error exits use FatalError/FatalErrorf\n- Consistent \"Error: \" prefix on all error messages\n- Tests pass\n- No behavior changes (exit codes remain 1)","notes":"## Progress (Dec 2025)\n\nStandardized error handling in 3 major files:\n- compact.go: All 48 os.Exit(1) calls converted to FatalError\n- sync.go: All error patterns converted (kept 1 valid summary exit)\n- migrate.go: 4 patterns converted\n\n## Remaining Work\n~326 fmt.Fprintf(os.Stderr, \"Error:\") patterns remain across ~30 files.\nHigh-count files remaining: show.go (16), dep.go (14), gate.go (28), init.go (11).\n\n## Verification\n- Build compiles successfully\n- Tests pass","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T18:17:19.309394-08:00","updated_at":"2025-12-23T14:14:37.939802-08:00","closed_at":"2025-12-23T14:14:37.939802-08:00","dependencies":[{"issue_id":"bd-qioh","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.43514-08:00","created_by":"daemon"}]} +{"id":"bd-qjb41","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T03:22:16.319636-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T03:22:16.359933-08:00","closed_at":"2026-01-12T03:22:16.359933-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qket","title":"Add computed .parent field to JSON output for convenience","description":"Currently parent is only in dependencies[]. Add a top-level .parent field to JSON/JSONL output that extracts the parent-child dependency for easier querying.\n\nExample:\n```bash\n# Current (works but verbose):\nbd show \u003cid\u003e --json | jq '.[0].dependencies[] | select(.dependency_type == \"parent-child\") | .id'\n\n# Desired:\nbd show \u003cid\u003e --json | jq '.[0].parent'\n```\n\nLow priority enhancement.","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-27T23:32:44.24217-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T02:24:31.453442-08:00","closed_at":"2025-12-28T02:24:31.453442-08:00"} {"id":"bd-qkw9","title":"Run bump-version.sh {{version}}","description":"Run ./scripts/bump-version.sh {{version}} to update version in all files","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:55:58.841424-08:00","updated_at":"2025-12-20T17:59:26.262877-08:00","closed_at":"2025-12-20T01:18:48.99813-08:00","dependencies":[{"issue_id":"bd-qkw9","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:14.786027-08:00","created_by":"daemon"}]} +{"id":"bd-ql330","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:35:36.995811-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-12T19:35:37.042386-08:00","closed_at":"2026-01-12T19:35:37.042386-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qn03h","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:08:38.214164-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:08:38.280112-08:00","closed_at":"2026-01-11T22:08:38.280112-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-qn5e2","title":"Review and merge PR #1060: bump fastmcp v2.14.1→v2.14.3","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1060\nType: Dependabot dependency bump (Python pip)\nChange: fastmcp 2.14.1 → 2.14.3\n\n## Task\n1. Review the PR diff: `gh pr diff 1060 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1060 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1060 --repo steveyegge/beads --approve`\n `gh pr merge 1060 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Patch version bump with bug fixes (HTTP timeout, OAuth token storage, Redis keys)","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/crew/fang","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:37.795201-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:29:06.401873-08:00","external_ref":"gh-1060"} {"id":"bd-qna0y","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:18:44.895555-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:18:44.941152-08:00","closed_at":"2026-01-10T21:18:44.941152-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qno8m","title":"Merge: obsidian-mk99aezw","description":"branch: polecat/obsidian-mk99aezw\ntarget: main\nsource_issue: obsidian-mk99aezw\nrig: beads\nagent_bead: bd-beads-polecat-obsidian\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T20:53:49.204101-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-10T20:54:57.846605-08:00","closed_at":"2026-01-10T20:54:57.846605-08:00","close_reason":"Branch never pushed - false completion from obsidian","labels":["gt:merge-request"]} {"id":"bd-qobn","title":"Code smell: 20+ global variables in main.go","description":"main.go lines 63-103 have over 20 global variables managing command-line state, daemon connection, auto-flush, auto-import, and error handling.\n\n**Globals include:**\ndbPath, actor, store, jsonOutput, daemonStatus, daemonClient, noDaemon, rootCtx, rootCancel, autoFlushEnabled, flushMutex, storeMutex, storeActive, flushFailureCount, lastFlushError, flushManager, hookRunner, skipFinalFlush, autoImportEnabled, versionUpgradeDetected, previousVersion, upgradeAcknowledged\n\n**Problem:**\n- Global state makes testing difficult\n- Race conditions possible between goroutines\n- Hard to track which functions modify which globals\n\n**Acceptance Criteria:**\n- [ ] Create CommandContext struct to hold runtime state\n- [ ] Pass context through command execution\n- [ ] Reduce global count to essential minimum\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T18:59:27.551044-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T18:12:30.978805-08:00","closed_at":"2025-12-30T16:17:18.258941-08:00","close_reason":"Implemented CommandContext struct to consolidate 20+ globals into 1. Added accessor functions for backward-compatible migration. Updated direct_mode.go as example.","dependencies":[{"issue_id":"bd-qobn","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.651276-08:00","created_by":"daemon"}]} @@ -1922,6 +1972,7 @@ {"id":"bd-r6tvq","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T06:47:07.13293-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T06:47:07.179471-08:00","closed_at":"2026-01-11T06:47:07.179471-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-r79z","title":"GH#245: Windows MCP subprocess timeout for git rev-parse","description":"User reports git detection timing out on Windows in MCP server, but CLI works fine.\n\nPath: C:\\Users\\chris\\Documents\\DEV_R\\quarto-cli\nError: Git repository detection timed out after 5s\nWorks fine in CLI: `git rev-parse --show-toplevel` succeeds\n\nHypothesis: subprocess.run() with asyncio.to_thread() may have Windows-specific issues or the MCP runtime environment may not have proper PATH/git access.\n\nPotential fixes:\n1. Add subprocess shell=True on Windows\n2. Increase timeout further for Windows\n3. Add better error logging to capture subprocess stderr\n4. Skip git resolution entirely on timeout and just use provided path","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-07T16:31:37.531223-08:00","updated_at":"2025-11-07T19:00:44.358543-08:00","closed_at":"2025-11-07T19:00:44.358543-08:00"} {"id":"bd-rb75","title":"Clean up merge conflict artifacts in .beads directory","description":"After resolving merge conflicts in .beads/beads.jsonl, leftover artifacts remain as untracked files:\n- .beads/beads.base.jsonl\n- .beads/beads.left.jsonl\n\nThese appear to be temporary files created during merge conflict resolution.\n\nOptions to fix:\n1. Add these patterns to .beads/.gitignore automatically\n2. Clean up these files after successful merge resolution\n3. Document that users should delete them manually\n4. Add a check in 'bd sync' or 'bd doctor' to detect and remove stale merge artifacts\n\nPreferred solution: Add *.base.jsonl and *.left.jsonl patterns to .beads/.gitignore during 'bd init', and optionally clean them up automatically after successful import.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-06T19:09:16.114274-08:00","updated_at":"2025-11-06T19:13:44.630402-08:00","closed_at":"2025-11-06T19:13:44.630402-08:00"} +{"id":"bd-rb7so","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T03:15:38.134079-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T03:15:38.196207-08:00","closed_at":"2026-01-12T03:15:38.196207-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rbxi","title":"bd-hv01: Deletion tracking production readiness","description":"Epic to track all improvements and fixes needed to make the deletion tracking implementation ([deleted:bd-hv01]) production-ready.\n\nThe core 3-way merge algorithm is sound, but there are critical issues around atomicity, error handling, and edge cases that need to be addressed before this can be safely used in production.\n\nCritical path (P1):\n- Non-atomic snapshot operations\n- Brittle JSON string comparison\n- Silent partial deletion failures\n- Race conditions in concurrent scenarios\n\nFollow-up work (P2-P3):\n- Test coverage for edge cases and multi-repo mode\n- Performance optimizations\n- Code refactoring and observability\n\nRelated commit: 708a81c","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-06T18:18:24.315646-08:00","updated_at":"2025-11-08T03:12:04.15385-08:00","closed_at":"2025-11-08T02:19:19.780741-08:00"} {"id":"bd-rc1ra","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:50:29.773129-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T01:50:29.839828-08:00","closed_at":"2026-01-12T01:50:29.839828-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rciw","title":"Support ephemeral protos: cook inline for pour/wisp/bond","description":"Gas Town moving to ephemeral protos (gt-4v1eo). Protos should be in-memory, not persisted beads. Changes: (1) bd cook outputs proto JSON to stdout by default, add --persist flag for old behavior. (2) bd pour/wisp cook inline from formula name. (3) bd mol bond accepts formula names, cooks inline. The low-level cookFormula() machinery stays for --persist use cases. See gt-4v1eo for full design. Related: bd-ia3g (rename ProtoID).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T14:30:40.782536-08:00","updated_at":"2025-12-25T17:03:47.18261-08:00","closed_at":"2025-12-25T17:03:47.18261-08:00"} @@ -1930,6 +1981,7 @@ {"id":"bd-rfj","title":"Add unit tests for hasJSONLChanged() function","description":"The hasJSONLChanged() function has no unit tests. Should test:\n- Normal case: hash matches\n- Normal case: hash differs\n- Edge case: empty file\n- Edge case: missing metadata (first run)\n- Edge case: corrupted metadata\n- Edge case: file read errors\n- Edge case: invalid hash format in metadata\n\nAlso add performance benchmarks for large JSONL files.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T21:31:10.389481-05:00","updated_at":"2025-11-20T21:40:02.664516-05:00","closed_at":"2025-11-20T21:40:02.664516-05:00","dependencies":[{"issue_id":"bd-rfj","depends_on_id":"bd-khnb","type":"blocks","created_at":"2025-11-20T21:31:10.39058-05:00","created_by":"daemon"}]} {"id":"bd-rgd7","title":"Update CHANGELOG.md with release notes","description":"Add release notes for 0.32.1: MCP output control params (#667), pin field fix","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:16.031879-08:00","updated_at":"2025-12-20T21:54:07.982164-08:00","closed_at":"2025-12-20T21:54:07.982164-08:00","dependencies":[{"issue_id":"bd-rgd7","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:16.034926-08:00","created_by":"daemon"}]} {"id":"bd-rglz","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:26:48.816361-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:26:48.852099-08:00","closed_at":"2026-01-07T00:26:48.852099-08:00","close_reason":"auto-closed session event"} +{"id":"bd-rgo42","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:57:29.7356-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:57:29.80215-08:00","closed_at":"2026-01-12T02:57:29.80215-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rgyd","title":"Split internal/storage/sqlite/queries.go (1586 lines)","description":"Split internal/storage/sqlite/queries.go (1704 lines) into logical modules.\n\n## Current State\nqueries.go is 1704 lines with mixed responsibilities:\n- Issue CRUD operations\n- Search/filter operations\n- Delete operations (complex cascade logic)\n- Helper functions (parsing, formatting)\n\n## Proposed Split\n\n### 1. queries.go (keep ~400 lines) - Core CRUD\n```go\n// Core issue operations\nfunc (s *SQLiteStorage) CreateIssue(...)\nfunc (s *SQLiteStorage) GetIssue(...)\nfunc (s *SQLiteStorage) UpdateIssue(...)\nfunc (s *SQLiteStorage) CloseIssue(...)\n```\n\n### 2. queries_search.go (~300 lines) - Search/Filter\n```go\n// Search and filtering\nfunc (s *SQLiteStorage) SearchIssues(...)\nfunc (s *SQLiteStorage) GetIssueByExternalRef(...)\nfunc (s *SQLiteStorage) GetCloseReason(...)\nfunc (s *SQLiteStorage) GetCloseReasonsForIssues(...)\n```\n\n### 3. queries_delete.go (~400 lines) - Delete Operations\n```go\n// Delete operations with cascade logic\nfunc (s *SQLiteStorage) CreateTombstone(...)\nfunc (s *SQLiteStorage) DeleteIssue(...)\nfunc (s *SQLiteStorage) DeleteIssues(...)\nfunc (s *SQLiteStorage) resolveDeleteSet(...)\nfunc (s *SQLiteStorage) expandWithDependents(...)\nfunc (s *SQLiteStorage) validateNoDependents(...)\nfunc (s *SQLiteStorage) checkSingleIssueValidation(...)\nfunc (s *SQLiteStorage) trackOrphanedIssues(...)\nfunc (s *SQLiteStorage) collectOrphansForID(...)\nfunc (s *SQLiteStorage) populateDeleteStats(...)\nfunc (s *SQLiteStorage) executeDelete(...)\nfunc (s *SQLiteStorage) findAllDependentsRecursive(...)\n```\n\n### 4. queries_helpers.go (~100 lines) - Utilities\n```go\n// Helper functions (already at top of file)\nfunc parseNullableTimeString(...)\nfunc parseJSONStringArray(...)\nfunc formatJSONStringArray(...)\n```\n\n### 5. queries_rename.go (~100 lines) - ID/Prefix Operations\n```go\n// ID and prefix management\nfunc (s *SQLiteStorage) UpdateIssueID(...)\nfunc (s *SQLiteStorage) RenameDependencyPrefix(...)\nfunc (s *SQLiteStorage) RenameCounterPrefix(...)\nfunc (s *SQLiteStorage) ResetCounter(...)\n```\n\n## Implementation Steps\n\n1. **Create new files** with package declaration:\n ```go\n // queries_delete.go\n package sqlite\n \n import (...)\n ```\n\n2. **Move functions** - cut/paste, maintaining order within each file\n\n3. **Update imports** - each file needs its own imports\n\n4. **Run tests** after each file split:\n ```bash\n go test ./internal/storage/sqlite/...\n ```\n\n5. **Run linter** to catch any issues:\n ```bash\n golangci-lint run ./internal/storage/sqlite/...\n ```\n\n## File Organization\n```\ninternal/storage/sqlite/\n├── queries.go # Core CRUD (~400 lines)\n├── queries_search.go # Search/filter (~300 lines)\n├── queries_delete.go # Delete cascade (~400 lines)\n├── queries_helpers.go # Utilities (~100 lines)\n└── queries_rename.go # ID operations (~100 lines)\n```\n\n## Success Criteria\n- No file \u003e 500 lines\n- All tests pass\n- No functionality changes\n- Clear separation of concerns","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T18:17:23.85869-08:00","updated_at":"2025-12-23T13:40:51.62551-08:00","closed_at":"2025-12-23T13:40:51.62551-08:00","dependencies":[{"issue_id":"bd-rgyd","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.50733-08:00","created_by":"daemon"}]} {"id":"bd-ri6d","title":"bd message: Fix inefficient client-side filtering for --unread-only","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-08T12:54:28.614867-08:00","updated_at":"2025-11-08T12:58:59.551512-08:00","closed_at":"2025-11-08T12:58:59.551512-08:00","dependencies":[{"issue_id":"bd-ri6d","depends_on_id":"bd-6uix","type":"parent-child","created_at":"2025-11-08T12:55:55.012455-08:00","created_by":"daemon"}]} {"id":"bd-rig-beads","title":"beads","description":"Rig identity bead for beads.\n\nrepo: https://github.com/steveyegge/beads\nprefix: bd\nstate: active","status":"open","priority":2,"issue_type":"rig","assignee":"beads/crew/wolf","created_at":"2026-01-08T12:19:32.120798-08:00","created_by":"gastown/polecats/furiosa","updated_at":"2026-01-09T23:02:02.733868-08:00"} @@ -1953,6 +2005,7 @@ {"id":"bd-rtp","title":"Implement signal-aware context in CLI commands","description":"Replace context.Background() with signal.NotifyContext() to enable graceful cancellation.\n\n## Context\nPart of context propagation work (bd-350). Phase 1 infrastructure is complete - sqlite.New() now accepts context parameter.\n\n## Implementation\nSet up signal-aware context at the CLI entry points:\n\n```go\nctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)\ndefer cancel()\n```\n\n## Key Locations\n- cmd/bd/main.go:438 (marked with TODO(bd-350))\n- cmd/bd/daemon.go:317 (marked with TODO(bd-350))\n- Other command entry points\n\n## Benefits\n- Ctrl+C cancels ongoing database operations\n- Graceful shutdown on SIGTERM\n- Better user experience during long operations\n\n## Acceptance Criteria\n- [ ] Ctrl+C during import cancels operation cleanly\n- [ ] Ctrl+C during export cancels operation cleanly\n- [ ] No database corruption on cancellation\n- [ ] Proper cleanup on signal (defers execute)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-20T21:26:34.621983-05:00","updated_at":"2025-11-20T21:32:26.288303-05:00","closed_at":"2025-11-20T21:32:26.288303-05:00"} {"id":"bd-ruio","title":"Polecat sessions terminate unexpectedly during work","description":"During swarm bd-784c, polecat sessions (Toast, Nux) terminated mid-task without completing their work.\n\n**Observed:**\n- Polecats were actively working (edits in progress, tests running)\n- Sessions suddenly showed 'not running' in gt polecat status\n- tmux sessions existed but were empty/reset\n- Work was partially complete (some commits made, issue still open)\n\n**Timeline example:**\n1. Toast working on bd-1tkd, making edits\n2. Check status 30s later - session empty, state shows 'idle'\n3. Had to re-sling to restart\n\n**Impact:**\n- Lost work progress\n- Required manual intervention to restart\n- Unclear if work was saved/committed\n\n**Possible causes:**\n- Session timeout?\n- Claude Code crash?\n- Resource limit?\n\n**Suggestion:**\n- Add session health monitoring\n- Auto-restart on unexpected termination\n- Log session exit reasons","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:18:09.014372-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:14:20.983555-08:00","closed_at":"2025-12-28T22:14:20.983555-08:00"} {"id":"bd-rupw","title":"Run bump-version.sh 0.30.7","description":"Run ./scripts/bump-version.sh 0.30.7 to update version in all files","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649647-08:00","updated_at":"2025-12-19T22:57:31.512956-08:00","closed_at":"2025-12-19T22:57:31.512956-08:00","dependencies":[{"issue_id":"bd-rupw","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.653475-08:00","created_by":"stevey"}]} +{"id":"bd-rx5fp","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:27:10.387404-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:27:10.433058-08:00","closed_at":"2026-01-12T02:27:10.433058-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-rx6o","title":"Test Child Task","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T22:15:23.27506-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-rxn5l","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:42:12.894211-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T21:42:12.959803-08:00","closed_at":"2026-01-11T21:42:12.959803-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-ry1u","title":"Publish official devcontainer configuration","notes":"Devcontainer configuration implemented. Manual testing required in actual devcontainer environment (Codespaces or VSCode Remote Containers). All code changes complete, tests pass, linting clean.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-05T15:02:21.783666-08:00","updated_at":"2025-11-05T17:46:42.70998-08:00","closed_at":"2025-11-05T17:46:42.70998-08:00"} @@ -2018,10 +2071,12 @@ {"id":"bd-t8ven","title":"gt prime: validate mutually exclusive flags","description":"The --state flag returns early, making --dry-run and --explain have no effect when combined with it. Similarly, --hook has specific behaviors that may conflict.\n\nOptions:\n1. Error on invalid combinations (--state + --explain, --state + --dry-run)\n2. Document that --state is standalone and ignores other flags \n3. Make flags compose (e.g., --state --explain shows state with explanations)\n\nCurrent behavior is silent - the extra flags are just ignored.\n\nLocation: gastown/mayor/rig/internal/cmd/prime.go:176-179","status":"closed","priority":4,"issue_type":"task","assignee":"gastown/polecats/dementus","created_at":"2026-01-10T00:46:05.489678-08:00","created_by":"mayor","updated_at":"2026-01-10T01:03:32.375432-08:00","closed_at":"2026-01-10T01:03:32.375432-08:00","close_reason":"Added --state, --dry-run, --explain flags with mutual exclusivity validation. --state errors when combined with other flags."} {"id":"bd-ta4r","title":"Wisp operations should auto-bypass daemon","description":"During the v0.39.1 release, every wisp operation required --no-daemon flag:\n\nbd --no-daemon mol wisp create beads-release --var version=0.39.1\nbd --no-daemon close bd-eph-xxx\nbd --no-daemon mol burn bd-eph-bv2\n\nSince wisps are ephemeral (Ephemeral=true) and never exported to JSONL, they are inherently local-only. The daemon cannot help with them anyway.\n\nProposal: When operating on bd-eph-* issues or wisp subcommands, auto-detect and bypass the daemon. This would:\n- Reduce friction in wisp workflows\n- Prevent accidental daemon use that would fail anyway\n- Make the ephemeral nature more obvious","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-27T22:51:24.409066-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T02:10:30.123755-08:00","closed_at":"2025-12-28T02:10:30.123755-08:00"} {"id":"bd-ta9dy","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:48:39.221633-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T18:48:39.288878-08:00","closed_at":"2026-01-11T18:48:39.288878-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-tbajb","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:33:14.031067-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T02:33:14.093851-08:00","closed_at":"2026-01-12T02:33:14.093851-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-tbwt6","title":"Test defer issue 3","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T21:30:59.012621-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:15:41.73122-08:00","closed_at":"2026-01-09T21:15:41.73122-08:00","close_reason":"Test beads - cleanup"} {"id":"bd-tbz3","title":"bd init UX Improvements","description":"bd init leaves users with incomplete setup, requiring manual bd doctor --fix. Issues found: (1) git hooks not installed if user declines prompt, (2) no auto-migration when CLI is upgraded, (3) stale merge driver configs from old versions. Fix by making bd init more robust with better defaults and auto-migration.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-21T23:16:00.333543-08:00","updated_at":"2025-12-23T04:20:51.88847-08:00","closed_at":"2025-12-23T04:20:51.88847-08:00"} {"id":"bd-tcvh","title":"Test prefix beads","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.707092-08:00","created_by":"stevey","updated_at":"2025-12-27T14:24:50.421598-08:00","deleted_at":"2025-12-27T14:24:50.421598-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-td72y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T01:40:31.1931-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T01:40:31.256858-08:00","closed_at":"2026-01-12T01:40:31.256858-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-tf108","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:42:51.959951-08:00","created_by":"beads/witness","updated_at":"2026-01-12T16:42:52.030675-08:00","closed_at":"2026-01-12T16:42:52.030675-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-tfczz","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T19:48:31.557461-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T19:48:31.624887-08:00","closed_at":"2026-01-11T19:48:31.624887-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-tggf","title":"Code Health Review Dec 2025: Technical Debt Cleanup","description":"Epic grouping technical debt identified in the Dec 16, 2025 code health review.\n\n## Overall Health Grade: B (Solid foundation, needs cleanup)\n\n### P1 (High Priority):\n- bd-74w1: Consolidate duplicate path-finding utilities\n- [deleted:bd-b6xo]: Remove/fix ClearDirtyIssues() race condition\n- [deleted:bd-b3og]: Fix TestImportBugIntegration deadlock\n\n### P2 (Medium Priority):\n- bd-05a8: Split large files (doctor.go, sync.go)\n- bd-qioh: Standardize error handling patterns\n- bd-rgyd: Split queries.go (1586 lines)\n- bd-9g1z: Fix/remove TestFindJSONLPathDefault\n\n### P3 (Low Priority):\n- bd-ork0: Add comments to 30+ ignored errors\n- bd-4nqq: Remove dead test code in info_test.go\n- bd-dhza: Reduce global state in main.go\n\n## Key Areas:\n1. Code duplication in path utilities\n2. Large monolithic files (5 files \u003e1000 lines)\n3. Global state (25+ variables, 3 deprecated)\n4. Silent error suppression (30+ instances)\n5. Test gaps and dead test code\n6. Atomicity risks in batch operations","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-16T18:18:58.115507-08:00","updated_at":"2025-12-30T18:12:30.962234-08:00","closed_at":"2025-12-30T16:59:51.322347-08:00","close_reason":"All technical debt cleanup tasks completed: path utilities consolidated, large files split, error handling standardized, dead test code removed, global state reduced, ignored errors documented","dependencies":[{"issue_id":"bd-tggf","depends_on_id":"bd-74w1","type":"blocks","created_at":"2025-12-22T21:00:21.429274-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-05a8","type":"blocks","created_at":"2025-12-22T21:00:21.501589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-9g1z","type":"blocks","created_at":"2025-12-22T21:00:21.571116-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"}]} {"id":"bd-tglv","title":"Merge: onyx-1767142014545","description":"branch: polecat/onyx-1767142014545\ntarget: main\nsource_issue: onyx-1767142014545\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T17:05:30.189116-08:00","created_by":"beads/polecats/onyx","updated_at":"2025-12-30T18:12:30.983654-08:00","closed_at":"2025-12-30T18:11:07.809452-08:00"} @@ -2047,6 +2102,7 @@ {"id":"bd-tt56n","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:41:03.521347-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:41:03.599005-08:00","closed_at":"2026-01-12T00:41:03.599005-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-tt9d5","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: queue empty, 0 branches merged. Main synced with origin (3 commits ahead). No issues.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:58:50.912776-08:00","updated_at":"2026-01-12T01:58:50.912776-08:00","closed_at":"2026-01-12T01:58:50.91272-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-tt9d5","depends_on_id":"bd-wisp-h3l","type":"parent-child","created_at":"2026-01-12T01:58:50.913695-08:00","created_by":"beads/refinery"}]} {"id":"bd-ttbf","title":"bd mol reset: Reset molecule to initial state for looping","description":"Implement bd mol reset for patrol loop behavior.\n\n## Command\n\n```bash\nbd mol reset \u003cmol-id\u003e\n```\n\n## Behavior\n\n1. Load molecule state from .beads/molecules/\u003cmol-id\u003e.state.yaml\n2. Reset all step states to pending\n3. Clear current_step (or set to first step)\n4. Preserve: bonded_at, bonded_by, variables\n5. Update: reset_count++, last_reset_at\n\n## Use Case: Deacon Patrol Loop\n\n```\ninbox-check → spawn-work → self-inspect → mol-reset → (loop)\n```\n\nThe Deacon runs its patrol, then resets the molecule to start fresh.\nNo gt handoff needed unless context is high.\n\n## State After Reset\n\n```yaml\nid: mol-deacon-patrol\nstatus: running\ncurrent_step: inbox-check # Back to first\nreset_count: 5\nlast_reset_at: 2025-12-24T...\nsteps:\n inbox-check: pending # All reset\n spawn-work: pending\n self-inspect: pending\n```\n\n## Files\n\n- cmd/bd/mol_reset.go\n- internal/mol/state.go (add Reset method)","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-24T15:53:20.154106-08:00","updated_at":"2025-12-24T16:53:14.837362-08:00","closed_at":"2025-12-24T16:53:14.837362-08:00","dependencies":[{"issue_id":"bd-ttbf","depends_on_id":"bd-hulf","type":"blocks","created_at":"2025-12-24T15:53:49.159903-08:00","created_by":"daemon"}]} +{"id":"bd-ttmvj","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:29:17.193771-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:29:17.241523-08:00","closed_at":"2026-01-12T19:29:17.241523-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-tuqd","title":"bd init overwrites existing git hooks without detection or chaining","description":"GH #254: bd init silently overwrites existing git hooks (like pre-commit framework) without detecting them, backing them up, or offering to chain. This breaks workflows and can result in committed code with failing tests.\n\nFix: Detect existing hooks, prompt user with options to chain/overwrite/skip.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T15:51:17.582882-08:00","updated_at":"2025-11-07T15:55:01.330531-08:00","closed_at":"2025-11-07T15:55:01.330531-08:00"} {"id":"bd-tvu3","title":"Improve test coverage for internal/beads (48.1% → 70%)","description":"Improve test coverage for internal/beads package from 48% to 70%.\n\n## Current State\n- Coverage: 48.4%\n- Files: beads.go, fingerprint.go\n- Tests: beads_test.go (moderate coverage)\n\n## Functions Needing Tests\n\n### beads.go (database discovery)\n- [ ] followRedirect - needs redirect file tests\n- [ ] findDatabaseInBeadsDir - needs various dir structures\n- [x] NewSQLiteStorage - likely covered\n- [ ] FindDatabasePath - needs BEADS_DB env var tests\n- [ ] hasBeadsProjectFiles - needs file existence tests\n- [ ] FindBeadsDir - needs directory traversal tests\n- [ ] FindJSONLPath - needs path derivation tests\n- [ ] findGitRoot - needs git repo tests\n- [ ] findDatabaseInTree - needs nested directory tests\n- [ ] FindAllDatabases - needs multi-database tests\n- [ ] FindWispDir - needs wisp directory tests\n- [ ] FindWispDatabasePath - needs wisp path tests\n- [ ] NewWispStorage - needs wisp storage tests\n- [ ] EnsureWispGitignore - needs gitignore creation tests\n- [ ] IsWispDatabase - needs path classification tests\n\n### fingerprint.go (repo identification)\n- [ ] ComputeRepoID - needs various remote URL tests\n- [ ] canonicalizeGitURL - needs URL normalization tests\n- [ ] GetCloneID - needs clone identification tests\n\n## Implementation Guide\n\n1. **Use temp directories:**\n ```go\n func TestFindBeadsDir(t *testing.T) {\n tmpDir := t.TempDir()\n beadsDir := filepath.Join(tmpDir, \".beads\")\n os.MkdirAll(beadsDir, 0755)\n \n // Create test files\n os.WriteFile(filepath.Join(beadsDir, \"beads.db\"), []byte{}, 0644)\n \n // Change to tmpDir and test\n oldWd, _ := os.Getwd()\n os.Chdir(tmpDir)\n defer os.Chdir(oldWd)\n \n result := FindBeadsDir()\n assert.Equal(t, beadsDir, result)\n }\n ```\n\n2. **Test scenarios:**\n - BEADS_DB environment variable set\n - .beads/ in current directory\n - .beads/ in parent directory\n - Redirect file pointing elsewhere\n - No beads directory found\n - Wisp directory alongside main beads\n\n3. **Git remote URL tests:**\n ```go\n tests := []struct{\n input string\n expected string\n }{\n {\"git@github.com:user/repo.git\", \"github.com/user/repo\"},\n {\"https://github.com/user/repo\", \"github.com/user/repo\"},\n {\"ssh://git@github.com/user/repo.git\", \"github.com/user/repo\"},\n }\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- All FindXxx functions have tests\n- Environment variable handling tested\n- Edge cases (missing dirs, redirects) covered\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/beads\ngo test -race ./internal/beads\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:42:59.739142-08:00","updated_at":"2025-12-23T13:36:17.885237-08:00","closed_at":"2025-12-23T13:36:17.885237-08:00","dependencies":[{"issue_id":"bd-tvu3","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.362967-08:00","created_by":"daemon"}]} {"id":"bd-tvus","title":"bd import reports success but writes nothing to empty database","description":"## Problem\n\nIn a fresh crew clone with no database, `bd import` and `bd sync --import-only` report:\n```\nImport complete: 0 created, 0 updated, 416 unchanged, 203 skipped\n```\n\nBut the database remains empty:\n```\nsqlite3 .beads/beads.db 'SELECT COUNT(*) FROM issues'\n0\n```\n\n## Reproduction Steps\n\n1. Fresh clone (crew/dave) with .beads/issues.jsonl containing 619 issues\n2. `bd init --skip-hooks` creates empty database\n3. `bd import -i .beads/issues.jsonl` reports 416 unchanged\n4. Database still has 0 issues\n\n## Expected\n\nImport should create 416 issues in the database.\n\n## Root Cause Hypothesis\n\nThe 'unchanged' count suggests it's comparing against something (maybe in-memory state?) rather than the actual database. The daemon running from a different clone (mayor/rig) may be confusing the import logic.\n\n## Context\n\nDiscovered during v0.39.0 release. Worked around by doing the release manually instead of using the beads-release molecule.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-27T19:56:15.42338-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T20:56:24.023684-08:00","closed_at":"2025-12-27T20:56:24.023684-08:00"} @@ -2058,6 +2114,7 @@ {"id":"bd-u0fn","title":"Add validation for formula step completion","description":"Formula steps are prose instructions with no automatic validation. Consider:\n- Steps with ```bash``` blocks should capture exit codes\n- Verification steps should have machine-checkable assertions\n- Consider script gates that run validation commands\n\nRelated to bd-m8ew (gate discovery fix).","status":"open","priority":3,"issue_type":"feature","created_at":"2026-01-06T23:33:34.325057-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-06T23:33:34.325057-08:00","dependencies":[{"issue_id":"bd-u0fn","depends_on_id":"bd-m8ew","type":"related","created_at":"2026-01-06T23:33:40.041371-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-u0g9","title":"GH#405: Prefix parsing with hyphens treats first segment as prefix","description":"Prefix me-py-toolkit gets parsed as just me- when detecting mismatches. Fix prefix parsing to handle multi-hyphen prefixes. See GitHub issue #405.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:18.354066-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-u0sb","title":"Merge: bd-uqfn","description":"branch: polecat/cheedo\ntarget: main\nsource_issue: bd-uqfn\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:11:52.033964-08:00","updated_at":"2025-12-20T23:17:26.994875-08:00","closed_at":"2025-12-20T23:17:26.994875-08:00"} +{"id":"bd-u1mcn","title":"Review and merge PR #1045: Isolate git config in tests","description":"dispatched_by: beads/crew/emma","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T16:35:28.753379-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T16:42:52.444464-08:00","closed_at":"2026-01-12T16:42:52.444464-08:00","close_reason":"PR #1045 reviewed and merged. Test isolation fix using GIT_CONFIG_GLOBAL env var."} {"id":"bd-u2sc","title":"GH#692: Code quality and refactoring improvements","description":"Epic for implementing refactoring suggestions from GitHub issue #692 (rsnodgrass). These are code quality improvements that don't change functionality but improve maintainability, type safety, and performance.\n\nOriginal issue: https://github.com/steveyegge/beads/issues/692\n\nHigh priority items:\n1. Replace map[string]interface{} with typed structs for JSON output\n2. Adopt slices.SortFunc instead of sort.Slice (Go 1.21+)\n3. Split large files (sync.go, init.go, show.go)\n4. Introduce slog for structured logging in daemon\n\nLower priority:\n5. Further CLI helper extraction\n6. Preallocate slices in hot paths\n7. Polish items (error wrapping, table-driven parsing)","status":"closed","priority":3,"issue_type":"epic","created_at":"2025-12-22T14:26:31.630004-08:00","updated_at":"2025-12-23T22:07:32.477628-08:00","closed_at":"2025-12-23T22:07:32.477628-08:00"} {"id":"bd-u2sc.1","title":"Replace map[string]interface{} with typed JSON response structs","description":"Many CLI commands use map[string]interface{} for JSON output which loses type safety and compile-time error detection.\n\nFiles with map[string]interface{}:\n- cmd/bd/compact.go (10+ instances)\n- cmd/bd/cleanup.go\n- cmd/bd/daemons.go\n- cmd/bd/daemon_lifecycle.go\n\nExample fix:\n```go\n// Before\nresult := map[string]interface{}{\n \"status\": \"ok\",\n \"count\": 42,\n}\n\n// After\ntype CompactResponse struct {\n Status string `json:\"status\"`\n Count int `json:\"count\"`\n}\nresult := CompactResponse{Status: \"ok\", Count: 42}\n```\n\nBenefits:\n- Compile-time type checking\n- IDE autocompletion\n- Easier refactoring\n- Self-documenting API","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T14:26:44.088548-08:00","updated_at":"2025-12-22T15:48:22.88824-08:00","closed_at":"2025-12-22T15:48:22.88824-08:00","dependencies":[{"issue_id":"bd-u2sc.1","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:44.088931-08:00","created_by":"daemon"}]} {"id":"bd-u2sc.2","title":"Migrate sort.Slice to slices.SortFunc","description":"Go 1.21+ provides slices.SortFunc which is cleaner and slightly faster than sort.Slice.\n\nFound 15+ instances of sort.Slice in:\n- cmd/bd/autoflush.go\n- cmd/bd/count.go\n- cmd/bd/daemon_sync.go\n- cmd/bd/doctor.go\n- cmd/bd/export.go\n- cmd/bd/import.go\n- cmd/bd/integrity.go\n- cmd/bd/jira.go\n- cmd/bd/list.go\n- cmd/bd/migrate_hash_ids.go\n- cmd/bd/rename_prefix.go\n- cmd/bd/show.go\n\nExample migration:\n```go\n// Before\nsort.Slice(issues, func(i, j int) bool {\n return issues[i].Priority \u003c issues[j].Priority\n})\n\n// After\nslices.SortFunc(issues, func(a, b *types.Issue) int {\n return cmp.Compare(a.Priority, b.Priority)\n})\n```\n\nBenefits:\n- Cleaner 3-way comparison\n- Slightly better performance\n- Modern idiomatic Go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:26:55.573524-08:00","updated_at":"2025-12-22T15:10:12.639807-08:00","closed_at":"2025-12-22T15:10:12.639807-08:00","dependencies":[{"issue_id":"bd-u2sc.2","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:55.573978-08:00","created_by":"daemon"}]} @@ -2074,7 +2131,7 @@ {"id":"bd-u9a3n","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2026-01-07T21:42:14.261027-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-09T21:15:43.007118-08:00","closed_at":"2026-01-09T21:15:43.007118-08:00","close_reason":"Orphaned patrol molecules"} {"id":"bd-ua1jv","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"open","priority":2,"issue_type":"molecule","created_at":"2026-01-07T23:28:41.036097-08:00","created_by":"deacon","updated_at":"2026-01-07T23:28:41.036097-08:00"} {"id":"bd-uadj2","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:47:42.706519-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:47:42.742489-08:00","closed_at":"2026-01-10T15:47:42.742489-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} -{"id":"bd-uao3f","title":"Updated title","status":"in_progress","priority":0,"issue_type":"feature","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:11.046615-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:11.106698-08:00"} +{"id":"bd-uao3f","title":"Updated title","status":"closed","priority":0,"issue_type":"feature","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:11.046615-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-12T16:41:37.732694-08:00","closed_at":"2026-01-12T16:41:37.732694-08:00","close_reason":"Stale orphaned wisp"} {"id":"bd-ucgz","title":"Migration invariants should exclude external dependencies from orphan check","description":"## Summary\n\nThe `checkForeignKeys` function in `migration_invariants.go` flags external dependencies as orphaned because they dont exist in the local issues table.\n\n## Location\n\n`internal/storage/sqlite/migration_invariants.go` around line 150-162\n\n## Current Code (buggy)\n\n```go\n// Check for orphaned dependencies\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n\\`).Scan(\u0026orphanCount)\n```\n\n## Fix\n\nExclude external references (format: `external:\u003cproject\u003e:\u003ccapability\u003e`):\n\n```go\n// Check for orphaned dependencies (excluding external refs)\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n AND d.depends_on_id NOT LIKE 'external:%'\n\\`).Scan(\u0026orphanCount)\n```\n\n## Reproduction\n\n```bash\n# Add external dependency\nbd dep add bd-xxx external:other-project:some-capability\n\n# Try to sync - fails\nbd sync\n# Error: found 1 orphaned dependencies\n```\n\n## Files to Modify\n\n1. **internal/storage/sqlite/migration_invariants.go** - Add WHERE clause\n\n## Testing\n\n```bash\n# Create issue with external dep\nbd create \"Test external deps\" -t task\nbd dep add bd-xxx external:beads:release-workflow\n\n# Sync should succeed\nbd sync\n\n# Verify dep exists\nbd show bd-xxx --json | jq .dependencies\n```\n\n## Success Criteria\n- External dependencies dont trigger orphan check\n- `bd sync` succeeds with external deps\n- Regular orphan detection still works for internal deps","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T12:37:08.99387-08:00","updated_at":"2025-12-23T12:42:03.722691-08:00","closed_at":"2025-12-23T12:42:03.722691-08:00"} {"id":"bd-ucj8","title":"Rename wisp prefix from 'eph' to 'wisp'","description":"The wisp system uses 'eph' as the ID prefix segment (e.g., gt-eph-xxx) but should use 'wisp' (e.g., gt-wisp-xxx) for consistency with terminology.\n\n**Location:** cmd/bd/wisp.go:260-261\n```go\n// Use \"eph\" prefix for distinct visual recognition\nresult, err := spawnMolecule(ctx, store, subgraph, vars, \"\", actor, true, \"eph\")\n```\n\n**Fix:** Change \"eph\" to \"wisp\"\n\n**Also update:**\n- main_errors.go:100,107 - detection patterns for ephemeral IDs\n- Any tests expecting '-eph-' pattern\n- Documentation if it references the prefix\n\n**Migration:** Existing gt-eph-* wisps in databases will continue to work (they have ephemeral=true flag). New wisps will use gt-wisp-* prefix.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T20:10:54.323196-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T23:55:44.286924-08:00","closed_at":"2026-01-01T23:55:44.286924-08:00","close_reason":"Renamed wisp prefix from 'eph' to 'wisp'. Legacy eph-* pattern still supported for backwards compatibility."} {"id":"bd-uctql","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:51:05.590102-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:51:05.654139-08:00","closed_at":"2026-01-11T22:51:05.654139-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -2100,13 +2157,14 @@ {"id":"bd-uti26","title":"Test defer issue","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-07T21:30:33.858115-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T21:15:41.7331-08:00","closed_at":"2026-01-09T21:15:41.7331-08:00","close_reason":"Test beads - cleanup"} {"id":"bd-utqso","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:28:49.3643-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:28:49.416832-08:00","closed_at":"2026-01-11T22:28:49.416832-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uu8p","title":"Routing bypassed in daemon mode","description":"## Bug\n\nPrefix-based routing (routes.jsonl) only works in direct mode. When the daemon is running, it bypasses routing logic because:\n\n1. Daemon mode resolves IDs via RPC (`daemonClient.ResolveID`)\n2. Daemon uses its own store, which only knows about local beads\n3. The routing logic in `resolveAndGetIssueWithRouting` is only called in direct mode\n\n## Reproduction\n\n```bash\n# With daemon running:\ncd ~/gt\nbd show gt-1py3y # Fails - daemon can't find it\n\n# With daemon bypassed:\nbd --no-daemon show gt-1py3y # Works - uses routing\n```\n\n## Fix Options\n\n### Option A: Client-side routing detection (Recommended)\nBefore calling daemon RPC, check if the ID prefix matches a route to a different beads dir. If so, use direct mode with routing for that ID.\n\n```go\n// In show.go, before daemon mode:\nif daemonClient != nil \u0026\u0026 needsRouting(id) {\n // Fall back to direct mode for this ID\n result, err := resolveAndGetIssueWithRouting(ctx, store, id)\n ...\n}\n```\n\n### Option B: Daemon-side routing\nAdd routing support to the daemon RPC server. More complex - daemon would need to:\n- Load routes.jsonl on startup\n- Open connections to multiple databases\n- Route requests based on ID prefix\n\n### Option C: Hybrid\nDaemon returns \"not found + prefix hint\", client retries with routing.\n\n## Recommendation\n\nOption A is simplest. The client already has routing logic; just use it when we detect a routed prefix.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-26T14:52:00.452285-08:00","updated_at":"2025-12-26T14:54:51.572289-08:00","closed_at":"2025-12-26T14:54:51.572289-08:00"} +{"id":"bd-uufyv","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T02:33:44.395415-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T02:33:44.459565-08:00","closed_at":"2026-01-12T02:33:44.459565-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uunhh","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T23:02:11.859121-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T23:02:11.898113-08:00","closed_at":"2026-01-09T23:02:11.898113-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uuo9","title":"Avoid double export when uncommitted JSONL detected","description":"In sync.go, when gitHasUncommittedBeadsChanges() detects uncommitted changes, we export at line 175. But the normal flow exports again at line 296.\n\nAdd a skip flag to avoid redundant work:\n- Set alreadyExported=true after pre-flight export\n- Skip later export if flag is set\n\nMinor optimization, not urgent.\n\nPart of GH#885 follow-up (bd-vd8e).","status":"closed","priority":3,"issue_type":"task","assignee":"beads/polecats/amber","created_at":"2026-01-04T16:15:55.491155-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-04T16:20:46.91292-08:00","closed_at":"2026-01-04T16:20:46.91292-08:00","close_reason":"Added alreadyExported flag to skip redundant export when pre-flight check already exported"} {"id":"bd-uutv","title":"Work on beads-rs0: Namepool configuration for themed pole...","description":"Work on beads-rs0: Namepool configuration for themed polecat names. See bd show beads-rs0 for full details.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T21:49:48.129778-08:00","updated_at":"2025-12-19T21:59:25.565894-08:00","closed_at":"2025-12-19T21:59:25.565894-08:00"} {"id":"bd-uwkp","title":"Phase 2.4: Git merge driver optimization for TOON format","description":"Optimize git 3-way merge for TOON line-oriented format.\n\n## Overview\nTOON is line-oriented (unlike binary formats), enabling smarter git merge strategies. Implement custom merge driver to handle TOON-specific merge patterns.\n\n## Required Work\n\n### 2.4.1 TOON Merge Driver\n- [ ] Create .git/info/attributes entry for *.toon files\n- [ ] Implement custom merge driver script/command\n- [ ] Handle tabular format row merges (line-based 3-way)\n- [ ] Handle YAML-style format merges\n- [ ] Conflict markers for unsolvable conflicts\n\n### 2.4.2 Merge Patterns\n- [ ] Row addition: both branches add different rows → union\n- [ ] Row deletion: one branch deletes, other modifies → conflict (manual review)\n- [ ] Row modification: concurrent field changes → intelligent merge or conflict\n- [ ] Field ordering changes: ignore (TOON format resilient to order)\n\n### 2.4.3 Testing \u0026 Documentation\n- [ ] Unit tests for merge scenarios (3-way merge logic)\n- [ ] Integration tests with actual git merges\n- [ ] Conflict scenario testing\n- [ ] Documentation of merge strategy\n\n## Success Criteria\n- Git merge handles TOON conflicts intelligently\n- Fewer manual merge conflicts than JSONL\n- Round-trip preserved through merges\n- All 70+ tests still passing\n- Git history stays clean (minimal conflict markers)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:43:14.339238776-07:00","updated_at":"2025-12-21T14:42:26.434306-08:00","closed_at":"2025-12-21T14:42:26.434306-08:00","dependencies":[{"issue_id":"bd-uwkp","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:43:14.34427988-07:00","created_by":"daemon"}]} {"id":"bd-uxlb","title":"Add bd agent state command for ZFC-compliant state reporting","description":"Add command for agents to write their own state to agent beads.\n\n```bash\nbd agent state \u003cagent-id\u003e \u003cstate\u003e\n# Example: bd agent state gt-mayor running\n# States: idle | running | stuck | stopped | dead\n```\n\nImplementation:\n1. Lookup agent bead by ID (type=agent)\n2. Update agent_state field in description\n3. Update last_activity timestamp\n4. Trigger bd sync if configured\n\nAlso add:\n- bd agent heartbeat \u003cagent-id\u003e - just updates last_activity\n- bd agent show \u003cagent-id\u003e - show agent bead details\n\nThis is the ZFC-compliant way for agents to self-report state.\n\nCross-ref: gt-p2vyo in gastown","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T01:49:46.325964-08:00","created_by":"mayor","updated_at":"2025-12-28T01:57:05.839623-08:00","closed_at":"2025-12-28T01:57:05.839623-08:00"} {"id":"bd-uyf3","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-06T23:52:08.520371-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-06T23:52:08.556361-08:00","closed_at":"2026-01-06T23:52:08.556361-08:00","close_reason":"auto-closed session event"} -{"id":"bd-uyq10","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, main synced to 355ce734","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T18:45:37.150101-08:00","updated_at":"2026-01-11T18:45:37.150101-08:00","closed_at":"2026-01-11T18:45:37.149985-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-uyq10","depends_on_id":"bd-wisp-i97","type":"parent-child","created_at":"2026-01-11T18:45:37.151093-08:00","created_by":"beads/refinery"}]} +{"id":"bd-uyq10","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, main synced to 355ce734","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T18:45:37.150101-08:00","updated_at":"2026-01-11T18:45:37.150101-08:00","closed_at":"2026-01-11T18:45:37.149985-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-uyrt4","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T12:38:29.302861-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T12:38:29.336056-08:00","closed_at":"2026-01-09T12:38:29.336056-08:00","close_reason":"auto-closed session event"} {"id":"bd-uz6oq","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:08:16.910485-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:08:16.978274-08:00","closed_at":"2026-01-12T00:08:16.978274-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-uz8r","title":"Phase 2.3: TOON deletion tracking","description":"Implement deletion tracking in TOON format.\n\n## Overview\nPhase 2.2 switched storage to TOON format. Phase 2.3 adds deletion tracking in TOON format for propagating deletions across clones.\n\n## Required Work\n\n### 2.3.1 Deletion Tracking (TOON Format)\n- [ ] Implement deletions.toon file (tracking deleted issue records)\n- [ ] Add DeleteTracker struct to record deleted issue IDs and metadata\n- [ ] Update bdt delete command to record in deletions.toon\n- [ ] Design deletion record format (ID, timestamp, reason, hash)\n- [ ] Implement auto-prune of old deletion records (configurable TTL)\n\n### 2.3.2 Sync Propagation\n- [ ] Load deletions.toon during import\n- [ ] Remove deleted issues from local database when imported from remote\n- [ ] Handle edge cases (delete same issue in multiple clones)\n- [ ] Deletion ordering and conflict resolution\n\n### 2.3.3 Testing\n- [ ] Unit tests for deletion tracking\n- [ ] Integration tests for deletion propagation\n- [ ] Multi-clone deletion scenarios\n- [ ] TTL expiration tests\n\n## Success Criteria\n- deletions.toon stores deletion records in TOON format\n- Deletions propagate across clones via git sync\n- Old records auto-prune after TTL\n- All 70+ tests still passing\n- bdt delete command works seamlessly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:37:23.722066816-07:00","updated_at":"2025-12-21T14:42:27.491932-08:00","closed_at":"2025-12-21T14:42:27.491932-08:00","dependencies":[{"issue_id":"bd-uz8r","depends_on_id":"bd-iic1","type":"discovered-from","created_at":"2025-12-19T14:37:23.726825771-07:00","created_by":"daemon"}]} @@ -2131,6 +2189,7 @@ {"id":"bd-vd8e","title":"Detect uncommitted JSONL changes before sync operations","description":"Part of GH#885 fix: pre-flight safety check.\n\nAdd detection at sync start:\n1. Check if .beads/issues.jsonl has uncommitted changes in git\n2. If so, this indicates a previous sync failed after export but before commit\n3. Force a fresh export cycle to reconcile state\n\nImplementation:\n- Add gitHasUnstagedBeadsChanges() helper\n- Call in sync pre-flight checks (sync.go ~line 159)\n- If detected, warn user and force re-export\n\nThis catches the failure mode early before it compounds.","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-04T13:53:24.808788-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T15:10:56.883507-08:00","closed_at":"2026-01-04T15:10:56.883507-08:00","close_reason":"Implemented: gitHasUncommittedBeadsChanges() helper + pre-flight check in sync.go","dependencies":[{"issue_id":"bd-vd8e","depends_on_id":"bd-pnx2","type":"parent-child","created_at":"2026-01-04T13:53:55.823237-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vdw4","title":"Enhancement: bd swarm status accepts swarm molecule ID","description":"Currently `bd swarm status` only accepts an epic ID.\n\nWould be more intuitive to also accept the swarm molecule ID and follow the relates-to link to find the epic:\n\n```bash\nbd swarm status bd-swarm-xyz # Follow link to epic, show status\nbd swarm status bd-epic-123 # Direct epic lookup (current behavior)\n```\n\nDetect by checking if the issue has mol_type=swarm.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:38:20.692476-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:05:10.112717-08:00","closed_at":"2025-12-28T22:05:10.112717-08:00","dependencies":[{"issue_id":"bd-vdw4","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.809594-08:00","created_by":"daemon"}]} {"id":"bd-vf63g","title":"Fix: post-checkout hook inline import fails (GH#984)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #984. post-checkout hook fails with 'no database store available for inline import'.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-09T22:20:10.356282-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:57:09.382572-08:00","closed_at":"2026-01-10T16:52:59.64351-08:00","close_reason":"Fixed by using setter functions in PersistentPreRun to sync cmdCtx with globals"} +{"id":"bd-vfidp","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T17:30:48.304872-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-12T17:30:48.370399-08:00","closed_at":"2026-01-12T17:30:48.370399-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-vgi5","title":"Push version bump to GitHub","description":"git push origin main - triggers CI but no release yet.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:05.363604-08:00","updated_at":"2025-12-24T16:25:30.019895-08:00","dependencies":[{"issue_id":"bd-vgi5","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.87736-08:00","created_by":"daemon"},{"issue_id":"bd-vgi5","depends_on_id":"bd-3ggb","type":"blocks","created_at":"2025-12-18T22:43:21.078208-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.019895-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-vh2q0","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:42:00.417039-08:00","created_by":"beads/witness","updated_at":"2026-01-07T17:42:00.464622-08:00","closed_at":"2026-01-07T17:42:00.464622-08:00","close_reason":"auto-closed session event"} {"id":"bd-vhzfp","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T21:07:16.429229-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-08T21:07:16.462811-08:00","closed_at":"2026-01-08T21:07:16.462811-08:00","close_reason":"auto-closed session event"} @@ -2147,8 +2206,11 @@ {"id":"bd-vqm0","title":"Swarm: Code Review: Swarm commands consolidation","description":"Swarm molecule orchestrating epic bd-2ubv.\n\nEpic: bd-2ubv\nCoordinator: ","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-28T22:06:58.82489-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-29T13:40:29.709541-08:00","closed_at":"2025-12-29T13:40:29.709541-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-vqm0","depends_on_id":"bd-2ubv","type":"relates-to","created_at":"2025-12-28T22:06:58.825608-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-vs9","title":"Fix unparam unused parameter in cmd/bd/doctor.go:541","description":"Linting issue: checkHooksQuick - path is unused (unparam) at cmd/bd/doctor.go:541:22. Error: func checkHooksQuick(path string) string {","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:17.02177046-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-vtpd4","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:28:01.836025-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:28:01.905304-08:00","closed_at":"2026-01-12T00:28:01.905304-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-vtzp8","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:46:21.955493-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T18:46:22.01815-08:00","closed_at":"2026-01-12T18:46:22.01815-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-vuc2","title":"Test issue B","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-04T11:26:51.502286-08:00","created_by":"beads/polecats/onyx","updated_at":"2026-01-04T11:27:38.789774-08:00","closed_at":"2026-01-04T11:27:38.789774-08:00","close_reason":"test cleanup"} +{"id":"bd-vut6r","title":"Review and merge PR #1056: bump golang.org/x/sys v0.39→v0.40","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1056\nType: Dependabot dependency bump (Go modules)\nChange: golang.org/x/sys 0.39.0 → 0.40.0\n\n## Task\n1. Review the PR diff: `gh pr diff 1056 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1056 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1056 --repo steveyegge/beads --approve`\n `gh pr merge 1056 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Minor version bump, safe standard library extension\n- Adds symbolic constants for cpuid bits","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/crew/giles","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:33.889962-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:28:55.442567-08:00","external_ref":"gh-1056"} {"id":"bd-vwjl","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T19:24:01.894777-08:00","created_by":"deacon","updated_at":"2026-01-09T21:15:43.012063-08:00","closed_at":"2026-01-09T21:15:43.012063-08:00","close_reason":"Orphaned patrol molecules"} +{"id":"bd-vx7fp","title":"Race condition: GetLabels missing reconnectMu RLock protection","description":"## Summary\nThe `GetLabels` and `GetLabelsForIssues` functions in `internal/storage/sqlite/labels.go` are missing the `reconnectMu.RLock()` protection that was added to `GetIssue` for GH#607.\n\n## Symptoms\nDaemon logs show repeated errors:\n```\nExport failed: \"failed to get labels for hq-5gr9k: failed to get labels: sql: database is closed\"\n```\n\nThis causes:\n- High CPU (46%+) due to export retry loops\n- File watcher thrash as exports fail and trigger reimports\n\n## Root Cause\nWhen `FreshnessChecker` detects a file modification and calls `reconnect()`:\n1. Export goroutine calls `store.GetLabelsForIssues()`\n2. `reconnect()` acquires write lock and calls `s.db.Close()`\n3. Export goroutine tries to query the now-closed `s.db`\n4. Error: \"database is closed\"\n\n## Fix\nAdd the same RLock pattern used in `GetIssue` (queries.go:257-258):\n```go\ns.reconnectMu.RLock()\ndefer s.reconnectMu.RUnlock()\n```\n\n## Affected Methods (need audit)\n- `GetLabels` - labels.go:84\n- `GetLabelsForIssues` - labels.go:107\n- Likely other methods in labels.go, dependencies.go, transaction.go\n\n## See Also\n- GH#607 (original race condition fix for GetIssue)\n- PR #1034 (incorrectly diagnosed this as polling interval issue)","status":"closed","priority":2,"issue_type":"bug","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T18:02:54.047585-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-12T18:29:54.827061-08:00","closed_at":"2026-01-12T18:29:54.827061-08:00","close_reason":"Fixed in commit ec1a32b9 - added reconnectMu RLock protection to storage methods","comments":[{"id":16,"issue_id":"bd-vx7fp","author":"beads/crew/dave","text":"## Audit Results\n\nThe race condition affects **many more methods** than initially identified. Here's the full audit of files with unprotected `s.db` access:\n\n| File | Affected Methods |\n|------|-----------------|\n| labels.go | GetLabels, GetLabelsForIssues, GetAllLabels |\n| comments.go | AddComment, DeleteComment, GetIssueComments, GetCommentsForIssues |\n| dependencies.go | GetBlockers, GetDependents, GetAllDependencyRecords, GetAllBlockersCounts, GetAllDependentsCounts, GetBlockingChain |\n| config.go | SetConfig, GetConfig, GetAllConfigs, DeleteConfig, SetMetadata, GetMetadata |\n| dirty.go | MarkDirty, GetDirtyIssueIDs, IsDirty, ClearDirtyIssuesByID |\n| events.go | GetEventsForEntity, GetMoleculeStatusSummary |\n| hash.go | GetExportHash, SetExportHash, ClearExportHashes, GetImportHash, SetImportHash |\n| hash_ids.go | ResolveIDFromHash, EnsureChildPrefixMatches |\n| compact.go | GetCompactableIssues, GetCompactableComments, GetCompactedIssue |\n| batch_ops.go | batch operations |\n| blocked_cache.go | blocked cache operations |\n| epics.go | epic queries |\n| multirepo.go | multi-repo operations |\n\n**Recommended Fix Strategy:**\n1. Create a helper method `withRLock(fn func() error) error` that wraps all db operations\n2. Apply to all public methods that use `s.db`\n3. Or: Add RLock/RUnlock to each method individually (more boilerplate but simpler)\n\nThe high CPU (46%+) in the daemon is caused by export failing → file change → import triggers → export retries in a tight loop.","created_at":"2026-01-13T02:03:16Z"}]} {"id":"bd-vxdr","title":"Investigate database pollution - issue count anomalies","description":"Multiple repos showing inflated issue counts suggesting cross-repo pollution:\n- ~/src/dave/beads: 895 issues (675 open) - clearly polluted\n- ~/src/stevey/src/beads: 280 issues (expected ~209-220) - possibly polluted\n\nNeed to investigate:\n1. Source of pollution (multi-repo sync issues?)\n2. How many duplicate/foreign issues exist\n3. Whether recent sync operations caused cross-contamination\n4. How to clean up and prevent future pollution","notes":"Investigation findings:\n\n**Root cause identified:**\n- NOT cross-repo contamination\n- NOT automated test leakage (tests properly use t.TempDir())\n- Manual testing during template feature development (Nov 2-4)\n- Commit ba325a2: \"test issues were accidentally committed during template feature development\"\n\n**Database growth timeline:**\n- Nov 3: 19 issues (baseline)\n- Nov 2-5: +244 issues (massive development spike)\n- Nov 6-7: +40 issues (continued growth)\n- Current: 291 issues → 270 after cleanup\n\n**Test pollution breakdown:**\n- 21 issues matching \"Test \" prefix pattern\n- Most created Nov 2-5 during feature development\n- Pollution from manual `./bd create \"Test issue\"` commands in production workspace\n- All automated tests properly isolated with t.TempDir()\n\n**Cleanup completed:**\n- Ran scripts/cleanup-test-pollution.sh successfully\n- Removed 21 test issues\n- Database reduced from 291 → 270 issues (7.2% cleanup)\n- JSONL synced to git\n\n**Prevention strategy:**\n- Filed follow-up issue for prevention mechanisms\n- Script can be deleted once prevention is in place\n- Tests are already properly isolated - no code changes needed there","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:34:40.137483-08:00","updated_at":"2025-11-07T16:07:28.274136-08:00","closed_at":"2025-11-07T16:04:02.199807-08:00"} {"id":"bd-vxp1","title":"Test Parent Epic","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-27T22:15:17.894209-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} {"id":"bd-vzds","title":"Create git tag v0.33.2","description":"Create the release tag:\n\n```bash\ngit tag v0.33.2\n```\n\nVerify: `git tag | grep 0.33.2`","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.761888-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -2175,6 +2237,7 @@ {"id":"bd-wcfeu","title":"Review and test PR #975: sync --import-only fix","description":"dispatched_by: beads/crew/emma\n\nReview PR #975 from juanre that fixes sync --import-only failing with 'no database store available' when daemon was connected.\n\n## PR Details\n- URL: https://github.com/steveyegge/beads/pull/975\n- Author: juanre\n- Additions: 143 (mostly test code), Deletions: 0\n\n## Fix Summary\nWhen running bd sync --import-only while daemon is connected:\n1. PersistentPreRun connects to daemon, returns early without initializing store\n2. sync command closes daemon connection\n3. sync --import-only calls importFromJSONLInline which requires store != nil\n4. Fix: call ensureStoreActive() after closing daemon in sync.go\n\n## Your Task\n1. Fetch and checkout the PR branch locally\n2. Run tests: go test ./...\n3. Verify the specific test passes: go test -run TestImportFromJSONLInlineAfterDaemonDisconnect ./cmd/bd/\n4. Review the code change in cmd/bd/sync.go (6 lines)\n5. If everything looks good, approve and merge the PR\n\n## Commands\ngit fetch origin pull/975/head:pr-975\ngit checkout pr-975\ngo test ./...\ngh pr review 975 --repo steveyegge/beads --approve\ngh pr merge 975 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-09T13:44:11.403407-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T13:45:43.994469-08:00","closed_at":"2026-01-09T13:45:43.994469-08:00","close_reason":"PR #975 already merged by steveyegge. Verified fix adds ensureStoreActive() after daemon disconnect in sync.go, with comprehensive test."} {"id":"bd-wcgla","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches merged, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T01:23:15.769966-08:00","updated_at":"2026-01-11T01:23:15.769966-08:00","closed_at":"2026-01-11T01:23:15.769922-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-wcl","title":"Document CLI + hooks as recommended approach over MCP","description":"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).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-12T00:15:25.923025-08:00","updated_at":"2025-12-09T18:38:37.707666172-05:00","closed_at":"2025-11-26T18:06:51.020351-08:00"} +{"id":"bd-wd0g3","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, inbox clear, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T16:44:00.484253-08:00","updated_at":"2026-01-12T16:44:00.484253-08:00","closed_at":"2026-01-12T16:44:00.4842-08:00","close_reason":"Squashed from 5 wisps","dependencies":[{"issue_id":"bd-wd0g3","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T16:44:00.485214-08:00","created_by":"beads/refinery"}]} {"id":"bd-wdn03","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T21:32:30.54266-08:00","created_by":"beads/witness","updated_at":"2026-01-10T21:32:30.585178-08:00","closed_at":"2026-01-10T21:32:30.585178-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-wdp83","title":"Add 'quality_score' field for aggregate quality metric","description":"dispatched_by: beads/crew/emma\n\nAdd float32 field (0.0-1.0) for aggregate quality score on issues. Validators (Refineries) can populate on merge. Foundation for proof-of-stake reputation. Distinct from per-Validation.Score.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/wolf","created_at":"2026-01-10T16:34:07.238429-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:34:18.170174-08:00","closed_at":"2026-01-10T19:34:18.170174-08:00","close_reason":"Implementation complete","dependencies":[{"issue_id":"bd-wdp83","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.616554-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-we4p","title":"Cache getMultiRepoJSONLPaths() result during sync to avoid redundant calls","description":"From bd-xo6b code review: getMultiRepoJSONLPaths() is called 3x per sync cycle.\n\n**Current behavior:**\ndaemon_sync.go calls getMultiRepoJSONLPaths() three times per sync:\n- Line 505: Snapshot capture before pull\n- Line 575: Merge/prune after pull\n- Line 613: Base snapshot update after import\n\n**Cost per call:**\n- Config lookup (likely cached, but still overhead)\n- Path construction: O(N) where N = number of repos\n- String allocations: (N + 1) × filepath.Join() calls\n\n**Total per sync:** 3N path constructions + 3 config lookups + 3 slice allocations\n\n**Impact:**\n- For N=3 repos: Negligible (\u003c 1ms)\n- For N=10 repos: Still minimal\n- For N=100+ repos: Wasteful\n\n**Solution:**\nCall once at sync start, reuse result:\n\n```go\nfunc createSyncFunc(...) func() {\n return func() {\n // ... existing setup ...\n \n // Call once at start\n multiRepoPaths := getMultiRepoJSONLPaths()\n \n // Snapshot capture\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths {\n if err := captureLeftSnapshot(path); err != nil { ... }\n }\n }\n \n // ... later ...\n \n // Merge/prune - reuse same paths\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths { ... }\n }\n \n // ... later ...\n \n // Base snapshot update - reuse same paths\n if multiRepoPaths != nil {\n for _, path := range multiRepoPaths { ... }\n }\n }\n}\n```\n\n**Files:**\n- cmd/bd/daemon_sync.go:449-636 (createSyncFunc)\n\n**Note:** This is a performance optimization, not a correctness fix. Low priority unless multi-repo usage scales significantly.","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-06T19:31:32.128674-08:00","updated_at":"2025-11-06T19:40:50.871176-08:00","closed_at":"2025-11-06T19:40:50.871176-08:00","dependencies":[{"issue_id":"bd-we4p","depends_on_id":"bd-xo6b","type":"discovered-from","created_at":"2025-11-06T19:32:12.39754-08:00","created_by":"daemon"}]} @@ -2184,16 +2247,35 @@ {"id":"bd-whgv","title":"Merge: bd-401h","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-401h\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:20:37.854953-08:00","updated_at":"2025-12-20T23:17:26.999477-08:00","closed_at":"2025-12-20T23:17:26.999477-08:00"} {"id":"bd-whlsz","title":"Implement hop:// URI scheme for federation","description":"dispatched_by: beads/crew/emma\n\nImplement the Highway Operations Protocol (HOP) URI scheme for cross-repo and cross-town entity references.\n\nCurrent EntityRef.URI() returns entity://hop/platform/org/id - this is a draft format.\n\nRecommended scheme:\n hop://\u003centity\u003e/\u003cchain\u003e/\u003crig\u003e/\u003cid\u003e\n\nExamples:\n hop://steve@example.com/main-town/gastown/gt-xyz (full work unit)\n hop://steve@example.com/main-town (chain/workspace)\n hop://acme.com/engineering/backend/ac-123 (org work unit)\n\nImplementation:\n1. Update EntityRef to include Entity (email/domain) and Chain (workspace) fields\n2. Update EntityRef.URI() to return hop:// format\n3. Add ParseHopURI() for parsing\n4. Deprecate entity:// format\n\nThe hop:// scheme is the Highway Operations Protocol standard for Gas Town federation.","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/grip","created_at":"2026-01-10T16:34:06.986905-08:00","created_by":"gastown/crew/max","updated_at":"2026-01-10T19:26:53.671408-08:00","closed_at":"2026-01-10T19:26:53.671408-08:00","close_reason":"Implemented hop:// URI scheme for federation:\n\n1. Updated EntityRef struct with new fields:\n - Entity (email/domain owner identifier)\n - Chain (workspace/town identifier)\n - Rig (rig name within chain)\n - Kept Platform/Org as deprecated for backwards compatibility\n\n2. Updated EntityRef.URI() to return hop:// format:\n - Full ref: hop://\u003centity\u003e/\u003cchain\u003e/\u003crig\u003e/\u003cid\u003e\n - Chain-level ref: hop://\u003centity\u003e/\u003cchain\u003e\n - Fallback to legacy entity://hop/\u003cplatform\u003e/\u003corg\u003e/\u003cid\u003e\n\n3. Added new functions:\n - ParseHopURI() for parsing hop:// URIs\n - ParseURI() for parsing both hop:// and entity:// formats\n - LegacyURI() for generating legacy entity:// URIs\n\n4. Updated hash writer to include new EntityRef fields\n\n5. Added comprehensive tests for all new functionality\n\nAll types package tests pass.","dependencies":[{"issue_id":"bd-whlsz","depends_on_id":"bd-imi7w","type":"parent-child","created_at":"2026-01-10T16:34:21.577742-08:00","created_by":"gastown/crew/max"}]} {"id":"bd-wip1j","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T09:21:27.428249-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T09:21:27.492208-08:00","closed_at":"2026-01-11T09:21:27.492208-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-wisp-03g","title":"Push release tag","description":"Push the version tag to trigger CI release.\n\n```bash\ngit push origin v0.47.1\n```\n\nThis triggers GitHub Actions to build artifacts and publish.\n\n**Phase 1 Complete**: After this step, signal phase-complete:\n```bash\ngt done --phase-complete\n```\n\nThe gate will block until CI finishes. A new session will resume at Phase 2.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.711701-08:00","updated_at":"2026-01-12T03:21:47.152378-08:00","closed_at":"2026-01-12T03:21:47.152378-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-03g","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.734162-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-03g","depends_on_id":"bd-wisp-efo","type":"blocks","created_at":"2026-01-12T03:17:16.783926-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-04d","title":"Verify PyPI package","description":"Confirm PyPI package published.\n\n```bash\npip index versions beads-mcp 2\u003e/dev/null | head -3\n```\n\nOr check: https://pypi.org/project/beads-mcp/\n\nShould show 0.45.0.\n\nNote: PyPI may have a small propagation delay (1-2 min).\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259077-08:00","updated_at":"2026-01-06T20:17:52.239968-08:00","closed_at":"2026-01-06T20:17:52.239968-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-04d","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.285231-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-07c","title":"Detect half-done release","description":"Check if a previous release was started but not completed (version mismatch).\n\n**Compare versions across all sources:**\n```bash\n# Last git tag\nLAST_TAG=$(git describe --tags --abbrev=0 2\u003e/dev/null || echo \"none\")\necho \"Last tag: $LAST_TAG\"\n\n# Version in code\nCODE_VERSION=$(grep 'Version = ' cmd/bd/version.go | cut -d'\"' -f2)\necho \"Code version: $CODE_VERSION\"\n\n# Version in CHANGELOG (most recent versioned section)\nCHANGELOG_VERSION=$(grep -E '## \\[[0-9]+\\.[0-9]+\\.[0-9]+\\]' CHANGELOG.md | head -1 | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')\necho \"CHANGELOG version: $CHANGELOG_VERSION\"\n\n# Version in npm package\nNPM_VERSION=$(jq -r '.version' npm-package/package.json)\necho \"npm version: $NPM_VERSION\"\n```\n\n**Healthy state (ready for new release):**\n- All versions match (e.g., all show 0.46.0)\n- Last tag matches code version\n\n**Half-done release detected if:**\n- CHANGELOG shows 0.47.1 but code shows previous version\n- Code version doesn't match last tag\n- npm/PyPI versions are out of sync\n\n**Recovery from half-done release:**\n```bash\n# If CHANGELOG was updated but code wasn't bumped:\n# Either complete the release or revert CHANGELOG changes\n\n# Check what state we're in\ngit diff $LAST_TAG -- CHANGELOG.md | head -50\n```\n\nIf mismatch detected, either:\n1. Complete the partial release (bump remaining files)\n2. Revert partial changes and start fresh\n3. Carefully verify what's already pushed vs local-only\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.706709-08:00","updated_at":"2026-01-12T03:18:49.06794-08:00","closed_at":"2026-01-12T03:18:49.06794-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-07c","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.718119-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-07c","depends_on_id":"bd-wisp-2ln","type":"blocks","created_at":"2026-01-12T03:17:16.748456-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-08w","title":"Restart daemons","description":"Restart bd daemons to pick up new version.\n\n```bash\nbd daemons killall\n```\n\nDaemons will auto-restart with new version on next bd command.\n\nVerify:\n```bash\nbd daemons list\n```\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.713826-08:00","updated_at":"2026-01-12T03:17:16.713826-08:00","dependencies":[{"issue_id":"bd-wisp-08w","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.743379-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-08w","depends_on_id":"bd-wisp-msq","type":"blocks","created_at":"2026-01-12T03:17:16.809425-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-1um","title":"Commit release","description":"Stage and commit all version changes.\n\n```bash\ngit add -A\ngit commit -m \"chore: Bump version to 0.47.1\"\n```\n\nReview the commit to ensure all expected files are included.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.710788-08:00","updated_at":"2026-01-12T03:21:26.478039-08:00","closed_at":"2026-01-12T03:21:26.478039-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-1um","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.73118-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-1um","depends_on_id":"bd-wisp-3bt","type":"blocks","created_at":"2026-01-12T03:17:16.775506-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-2f0","title":"Generate handoff summary","description":"Summarize this patrol cycle.\n\n**VERIFICATION**: Before generating summary, confirm for each merged branch:\n- [ ] MERGED mail was sent to witness\n- [ ] MR bead was closed\n- [ ] MERGE_READY mail archived\n\nIf any notifications or archiving were missed, do them now!\n\nInclude in summary:\n- Branches merged (count, names)\n- MERGED mails sent (count - should match branches merged)\n- MR beads closed (count - should match branches merged)\n- MERGE_READY mails archived (count - should match branches merged)\n- Test results (pass/fail)\n- Branches with conflicts (count, names)\n- Conflict-resolution tasks created (IDs)\n- Issues filed (if any)\n- Any escalations sent\n\n**Conflict tracking is important** for monitoring MQ health. If many branches\nconflict, it may indicate main is moving too fast or branches are too stale.\n\nThis becomes the digest when the patrol is squashed.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T02:44:24.392291-08:00","updated_at":"2026-01-12T02:45:37.257872-08:00","closed_at":"2026-01-12T02:45:37.257872-08:00","close_reason":"Summary: Empty queue patrol, no branches processed","dependencies":[{"issue_id":"bd-wisp-2f0","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:44:24.400382-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-2f0","depends_on_id":"bd-wisp-9wz","type":"blocks","created_at":"2026-01-12T02:44:24.411553-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-2g2","title":"Verify GitHub release","description":"Check the GitHub releases page.\n\nhttps://github.com/steveyegge/beads/releases/tag/v0.47.1\n\nVerify:\n- Release created\n- Binaries attached (linux, darwin, windows)\n- Checksums present\n\n```bash\ngh release view v0.47.1 --json assets --jq '.assets[].name'\n```\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.712622-08:00","updated_at":"2026-01-12T03:17:16.712623-08:00","dependencies":[{"issue_id":"bd-wisp-2g2","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.73836-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-2g2","depends_on_id":"bd-wisp-4i8","type":"blocks","created_at":"2026-01-12T03:17:16.789825-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-2ln","title":"Preflight: Pull latest \u0026 verify sync","description":"Ensure we're up to date with origin and branch is properly synced.\n\n```bash\n# Fetch latest from origin\ngit fetch origin\n\n# Check branch status BEFORE pulling\ngit status -sb\n```\n\n**Branch sync verification:**\n- \"Your branch is behind\" → Pull needed, proceed with `git pull --rebase`\n- \"Your branch is ahead\" → You have unpushed commits - review before release!\n- \"Your branch has diverged\" → **STOP** - resolve divergence first\n\n```bash\n# If branch is behind or even, pull latest\ngit pull --rebase\n```\n\n**Recovering from divergence:**\nIf your branch has diverged from origin (e.g., after a botched commit):\n```bash\n# Option 1: Reset to origin (loses local commits)\ngit reset --hard origin/main\n\n# Option 2: Rebase local commits on top of origin\ngit rebase origin/main\n\n# Option 3: Create a backup branch first\ngit branch backup-before-release\ngit reset --hard origin/main\n```\n\n**After pulling, verify sync:**\n```bash\ngit status -sb\n# Should show: \"## main...origin/main\" (no ahead/behind)\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.706384-08:00","updated_at":"2026-01-12T03:18:19.288655-08:00","closed_at":"2026-01-12T03:18:19.288655-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-2ln","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.717101-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-2ln","depends_on_id":"bd-wisp-60x","type":"blocks","created_at":"2026-01-12T03:17:16.747074-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-31v","title":"Burn and respawn or loop","description":"End of patrol cycle decision.\n\n**Step 1: Estimate remaining context**\n\nAsk yourself:\n- Have I processed many branches this cycle?\n- Is the conversation getting long?\n- Am I starting to lose track of earlier context?\n\nRule of thumb: If you've done 3+ merges or processed significant cleanup work,\nit's time for a fresh session.\n\n**Step 2: Decision tree**\n\nIf queue non-empty AND context LOW:\n- Squash this wisp to digest\n- Spawn fresh patrol wisp\n- Return to inbox-check\n\nIf queue empty OR context HIGH OR good stopping point:\n- Squash wisp with summary digest\n- Use `gt handoff` for clean session transition:\n\n```bash\ngt handoff -s \"Patrol complete\" -m \"Merged X branches, Y tests passed.\nQueue: empty/N remaining\nNext: [any notes for successor]\"\n```\n\n**Why gt handoff?**\n- Sends handoff mail to yourself with context\n- Respawns with fresh Claude instance\n- SessionStart hook runs gt prime\n- Successor picks up from your hook\n\n**DO NOT just exit.** Always use `gt handoff` for proper lifecycle.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T02:44:24.393209-08:00","updated_at":"2026-01-12T02:44:24.393209-08:00","dependencies":[{"issue_id":"bd-wisp-31v","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:44:24.403062-08:00","created_by":"beads/refinery"},{"issue_id":"bd-wisp-31v","depends_on_id":"bd-wisp-66z","type":"blocks","created_at":"2026-01-12T02:44:24.416548-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-3bt","title":"Verify version consistency","description":"Confirm all versions match 0.47.1.\n\n```bash\ngrep 'Version = ' cmd/bd/version.go\njq -r '.version' .claude-plugin/plugin.json\njq -r '.version' npm-package/package.json\ngrep 'version = ' integrations/beads-mcp/pyproject.toml\n```\n\nAll should show 0.47.1.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.710475-08:00","updated_at":"2026-01-12T03:20:47.646144-08:00","closed_at":"2026-01-12T03:20:47.646144-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-3bt","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.730172-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-3bt","depends_on_id":"bd-wisp-7v8","type":"blocks","created_at":"2026-01-12T03:17:16.772943-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-3ii","title":"Preflight: Verify git context","description":"Ensure we're in the correct git directory, especially for worktree setups.\n\n```bash\n# Check current repo root and remote\ngit rev-parse --show-toplevel\ngit remote get-url origin\n\n# Verify this is the main worktree (not a linked worktree)\ngit worktree list\n```\n\nFor worktree setups, releases should be done from the **main worktree** to ensure:\n- Correct file paths in commits\n- Proper tag association\n- Clean branch history\n\nIf you're in a linked worktree:\n1. Note the path to the main worktree (first line of `git worktree list`)\n2. Switch to that directory before proceeding\n3. Or use: `cd $(git worktree list | head -1 | cut -d' ' -f1)`\n\n**Red flags:**\n- Remote URL doesn't match expected repository\n- You're in a linked worktree (not the main one)\n- `git status` shows different files than expected\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.705707-08:00","updated_at":"2026-01-12T03:18:19.280966-08:00","closed_at":"2026-01-12T03:18:19.280966-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-3ii","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.714563-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-3q2","title":"Bump version in README badge","description":"Update the Alpha version badge in README.md.\n\n```bash\n# macOS\nsed -i '' 's/Alpha (v[^)]*)/Alpha (v0.47.1)/' README.md\n\n# Linux\nsed -i 's/Alpha (v[^)]*)/Alpha (v0.47.1)/' README.md\n```\n\nVerify:\n```bash\ngrep 'Alpha (v' README.md\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.709865-08:00","updated_at":"2026-01-12T03:20:47.641709-08:00","closed_at":"2026-01-12T03:20:47.641709-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-3q2","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.728148-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-3q2","depends_on_id":"bd-wisp-iii","type":"blocks","created_at":"2026-01-12T03:17:16.768053-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-3th","title":"Mechanical rebase","description":"Pick next branch from queue. Attempt mechanical rebase on current main.\n\n**Step 1: Checkout and attempt rebase**\n```bash\ngit checkout -b temp origin/\u003cpolecat-branch\u003e\ngit rebase origin/main\n```\n\n**Step 2: Check rebase result**\n\nThe rebase exits with:\n- Exit code 0: Success - proceed to run-tests\n- Exit code 1 (conflicts): Conflict detected - proceed to Step 3\n\nTo detect conflict state after rebase fails:\n```bash\n# Check if we're in a conflicted rebase state\nls .git/rebase-merge 2\u003e/dev/null \u0026\u0026 echo \"CONFLICT_STATE\"\n```\n\n**Step 3: Handle conflicts (if any)**\n\nIf rebase SUCCEEDED (exit code 0):\n- Skip to run-tests step (continue normal merge flow)\n\nIf rebase FAILED with conflicts:\n\n1. **Abort the rebase** (DO NOT leave repo in conflicted state):\n```bash\ngit rebase --abort\n```\n\n2. **Record conflict metadata**:\n```bash\n# Capture main SHA for reference\nMAIN_SHA=$(git rev-parse origin/main)\nBRANCH_SHA=$(git rev-parse origin/\u003cpolecat-branch\u003e)\n```\n\n3. **Create conflict-resolution task**:\n```bash\nbd create --type=task --priority=1 --title=\"Resolve merge conflicts: \u003coriginal-issue-title\u003e\" --description=\"## Conflict Resolution Required\n\nOriginal MR: \u003cmr-bead-id\u003e\nBranch: \u003cpolecat-branch\u003e\nOriginal Issue: \u003cissue-id\u003e\nConflict with main at: ${MAIN_SHA}\nBranch SHA: ${BRANCH_SHA}\n\n## Instructions\n1. Clone/checkout the branch\n2. Rebase on current main: git rebase origin/main\n3. Resolve conflicts\n4. Force push: git push -f origin \u003cbranch\u003e\n5. Close this task when done\n\nThe MR will be re-queued for processing after conflicts are resolved.\"\n```\n\n4. **Skip this MR** (do NOT delete branch or close MR bead):\n- Leave branch intact for conflict resolution\n- Leave MR bead open (will be re-processed after resolution)\n- Continue to loop-check for next branch\n\n**CRITICAL**: Never delete a branch that has conflicts. The branch contains\nthe original work and must be preserved for conflict resolution.\n\nTrack: rebase result (success/conflict), conflict task ID if created.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.195849-08:00","updated_at":"2026-01-12T01:27:49.20498-08:00","closed_at":"2026-01-12T01:27:49.20498-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-3th","depends_on_id":"bd-wisp-9jv","type":"blocks","created_at":"2026-01-12T01:27:11.220471-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-4i8","title":"Await CI: release.yml completion","description":"Gate step: Wait for GitHub Actions release workflow to complete.\n\nThis gate blocks until the release.yml workflow run succeeds.\nThe Refinery auto-discovers the workflow run triggered by v0.47.1\nand closes this gate when it completes.\n\nExpected time: 5-10 minutes\n\nThe gate monitors:\n- Build artifacts (all platforms)\n- Test suite pass\n- npm publish\n- PyPI publish\n\nIf the workflow fails, this gate remains open and requires manual intervention.\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.712017-08:00","updated_at":"2026-01-12T03:17:16.712017-08:00","dependencies":[{"issue_id":"bd-wisp-4i8","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.735155-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-4i8","depends_on_id":"bd-wisp-82n","type":"blocks","created_at":"2026-01-12T03:17:16.737183-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-4i8","depends_on_id":"bd-wisp-03g","type":"blocks","created_at":"2026-01-12T03:17:16.786856-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-4qx","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T23:19:39.804733-08:00","updated_at":"2026-01-10T23:26:02.8044-08:00","closed_at":"2026-01-10T23:26:02.8044-08:00","close_reason":"Patrol complete: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-4tc","title":"End-of-cycle inbox hygiene","description":"Verify inbox hygiene before ending patrol cycle.\n\n**Step 1: Check inbox state**\n```bash\ngt mail inbox\n```\n\nInbox should contain ONLY:\n- Unprocessed MERGE_READY messages (will process next cycle)\n- Active work items\n\n**Step 2: Archive any stale messages**\n\nLook for messages that were processed but not archived:\n- PATROL: Wake up that was acknowledged → archive\n- HELP/Blocked that was handled → archive\n- MERGE_READY where merge completed but archive was missed → archive\n\n```bash\n# For each stale message found:\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Step 3: Check for orphaned MR beads**\n\nLook for open MR beads with no corresponding branch:\n```bash\nbd list --type=merge-request --status=open\n```\n\nFor each open MR bead:\n1. Check if branch exists: `git ls-remote origin refs/heads/\u003cbranch\u003e`\n2. If branch gone, verify work is on main: `git log origin/main --oneline | grep \"\u003csource_issue\u003e\"`\n3. If work on main → close MR with reason \"Merged (verified on main)\"\n4. If work NOT on main → investigate before closing:\n - Check source_issue validity (should be gt-xxxxx, not branch name)\n - Search reflog/dangling commits if possible\n - If unverifiable, close with reason \"Unverifiable - no audit trail\"\n - File bead if this indicates lost work\n\n**NEVER close an MR bead without verifying the work landed or is unrecoverable.**\n\n**Goal**: Inbox should have ≤3 active messages at end of cycle.\nKeep only: pending MRs in queue.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.19797-08:00","updated_at":"2026-01-12T01:28:23.081758-08:00","closed_at":"2026-01-12T01:28:23.081758-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-4tc","depends_on_id":"bd-wisp-i7d","type":"blocks","created_at":"2026-01-12T01:27:11.237508-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-4td","title":"Handle test failures","description":"**VERIFICATION GATE**: This step enforces the Beads Promise.\n\nIf tests PASSED: This step auto-completes. Proceed to merge.\n\nIf tests FAILED:\n1. Diagnose: Is this a branch regression or pre-existing on main?\n2. If branch caused it:\n - Abort merge\n - Notify polecat: \"Tests failing. Please fix and resubmit.\"\n - Skip to loop-check\n3. If pre-existing on main:\n - Option A: Fix it yourself (you're the Engineer!)\n - Option B: File a bead: bd create --type=bug --priority=1 --title=\"...\"\n\n**GATE REQUIREMENT**: You CANNOT proceed to merge-push without:\n- Tests passing, OR\n- Fix committed, OR\n- Bead filed for the failure\n\nThis is non-negotiable. Never disavow. Never \"note and proceed.\" ","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T02:44:24.391348-08:00","updated_at":"2026-01-12T02:45:28.199134-08:00","closed_at":"2026-01-12T02:45:28.199134-08:00","close_reason":"Queue empty - no failures to handle","dependencies":[{"issue_id":"bd-wisp-4td","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:44:24.397706-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-540","title":"Update CHANGELOG.md","description":"Write the [Unreleased] section with all changes for 0.45.0.\n\nFormat: Keep a Changelog (https://keepachangelog.com)\n\nSections:\n- ### Added\n- ### Changed\n- ### Fixed\n- ### Documentation\n\nThe bump script will stamp the date automatically.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256772-08:00","updated_at":"2026-01-06T20:09:49.901996-08:00","closed_at":"2026-01-06T20:09:49.901996-08:00","close_reason":"CHANGELOG.md updated with 0.45.0 changes","dependencies":[{"issue_id":"bd-wisp-540","depends_on_id":"bd-wisp-9jo","type":"blocks","created_at":"2026-01-06T20:07:32.273791-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-5j5","title":"beads-release","description":"Beads release workflow v2 - gate-aware async release.\n\nThis formula orchestrates a complete release cycle with async gates:\n\nPhase 1 (Polecat Work):\n 1. Preflight checks (clean git, up to date)\n 2. Documentation updates (CHANGELOG, info.go)\n 3. Version bump (all components)\n 4. Git operations (commit, tag, push)\n\nGate (Async Wait):\n 5. await-ci: Gate on GitHub Actions release.yml completion\n\nPhase 2 (Parallel Verification):\n 6. Verify GitHub release, npm package, PyPI package (concurrent)\n\nPhase 3 (Installation):\n 7. Local installation update\n 8. Daemon restart\n\n## Usage\n\n```bash\nbd mol wisp create beads-release --var version=0.44.0\n```\n\nOr assign to a polecat:\n```bash\ngt sling beads/polecats/p1 --formula beads-release --var version=0.44.0\n```\n\nThe polecat will complete Phase 1, then signal phase-complete. The gate blocks\nuntil release.yml finishes. A new polecat (or the same one) resumes for Phases 2-3.\n","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-12T03:17:16.705057-08:00","updated_at":"2026-01-12T03:17:16.705057-08:00","ephemeral":true} +{"id":"bd-wisp-60x","title":"Preflight: Check git status \u0026 auto-stash","description":"Ensure working tree is clean before starting release.\n\n```bash\ngit status --short\n```\n\n**Handling uncommitted changes:**\n\nIf changes are in release-related files (CHANGELOG, version files), you may want to:\n- Include them in the release commit\n- Or stash and apply after version bump\n\nIf changes are in **non-release files** (e.g., .beads/config.yaml, .claude/settings.json, local configs):\n```bash\n# Auto-stash non-release files\ngit stash push -m \"pre-release: non-release changes\" -- .beads/ .claude/ *.local* .env*\n\n# Verify working tree is now clean (or only has release files)\ngit status --short\n```\n\n**Important:** The bump script may fail if non-release files are modified. Always stash:\n- `.beads/` directory (local config)\n- `.claude/` directory (agent settings)\n- Any `.local`, `.env`, or personal config files\n\nAfter release completes, restore with:\n```bash\ngit stash pop\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.706064-08:00","updated_at":"2026-01-12T03:18:19.285076-08:00","closed_at":"2026-01-12T03:18:19.285076-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-60x","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.716027-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-60x","depends_on_id":"bd-wisp-3ii","type":"blocks","created_at":"2026-01-12T03:17:16.745775-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-66z","title":"End-of-cycle inbox hygiene","description":"Verify inbox hygiene before ending patrol cycle.\n\n**Step 1: Check inbox state**\n```bash\ngt mail inbox\n```\n\nInbox should contain ONLY:\n- Unprocessed MERGE_READY messages (will process next cycle)\n- Active work items\n\n**Step 2: Archive any stale messages**\n\nLook for messages that were processed but not archived:\n- PATROL: Wake up that was acknowledged → archive\n- HELP/Blocked that was handled → archive\n- MERGE_READY where merge completed but archive was missed → archive\n\n```bash\n# For each stale message found:\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Step 3: Check for orphaned MR beads**\n\nLook for open MR beads with no corresponding branch:\n```bash\nbd list --type=merge-request --status=open\n```\n\nFor each open MR bead:\n1. Check if branch exists: `git ls-remote origin refs/heads/\u003cbranch\u003e`\n2. If branch gone, verify work is on main: `git log origin/main --oneline | grep \"\u003csource_issue\u003e\"`\n3. If work on main → close MR with reason \"Merged (verified on main)\"\n4. If work NOT on main → investigate before closing:\n - Check source_issue validity (should be gt-xxxxx, not branch name)\n - Search reflog/dangling commits if possible\n - If unverifiable, close with reason \"Unverifiable - no audit trail\"\n - File bead if this indicates lost work\n\n**NEVER close an MR bead without verifying the work landed or is unrecoverable.**\n\n**Goal**: Inbox should have ≤3 active messages at end of cycle.\nKeep only: pending MRs in queue.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T02:44:24.392901-08:00","updated_at":"2026-01-12T02:44:24.392901-08:00","dependencies":[{"issue_id":"bd-wisp-66z","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:44:24.402169-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-6fb","title":"Check refinery mail","description":"Check mail for MERGE_READY submissions, escalations, and messages.\n\n```bash\ngt mail inbox\n```\n\nFor each message:\n\n**MERGE_READY**:\nA polecat's work is ready for merge. Extract details and track for processing.\n\n```bash\n# Parse MERGE_READY message body:\n# Branch: \u003cbranch\u003e\n# Issue: \u003cissue-id\u003e\n# Polecat: \u003cpolecat-name\u003e\n# MR: \u003cmr-bead-id\u003e\n# Verified: clean git state, issue closed\n\n# Track in your merge queue for this patrol cycle:\n# - Branch name\n# - Issue ID\n# - Polecat name (REQUIRED for MERGED notification)\n# - MR bead ID (REQUIRED for closing after merge)\n```\n\n**IMPORTANT**: You MUST track the polecat name, MR bead ID, AND message ID - you will need them\nin merge-push step to send MERGED notification, close the MR bead, and archive the mail.\n\nMark as read. The work will be processed in queue-scan/process-branch.\n**Do NOT archive yet** - archive after merge/reject decision in merge-push step.\n\n**PATROL: Wake up**:\nWitness detected MRs waiting but refinery idle. Acknowledge and archive:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HELP / Blocked**:\nAssess and respond. If you can't help, escalate to Mayor.\nArchive after handling:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HANDOFF**:\nRead predecessor context. Check for in-flight merges.\nArchive after absorbing context:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Hygiene principle**: Archive messages after they're fully processed.\nKeep only: pending MRs in queue. Inbox should be near-empty.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.778123-08:00","updated_at":"2026-01-12T00:34:59.807466-08:00","closed_at":"2026-01-12T00:34:59.807466-08:00","close_reason":"No messages in inbox","ephemeral":true} {"id":"bd-wisp-75s","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-12T01:30:34.393395-08:00","updated_at":"2026-01-12T01:30:34.393395-08:00","ephemeral":true} {"id":"bd-wisp-7qw","title":"Push to main","description":"Push the release commit to origin.\n\n```bash\ngit push origin main\n```\n\nIf rejected, someone else pushed. Pull, rebase, try again.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257955-08:00","updated_at":"2026-01-06T20:12:28.230572-08:00","closed_at":"2026-01-06T20:12:28.230572-08:00","close_reason":"Pushed to main","dependencies":[{"issue_id":"bd-wisp-7qw","depends_on_id":"bd-wisp-cf3","type":"blocks","created_at":"2026-01-06T20:07:32.279279-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-7v8","title":"Stamp changelog with release date","description":"Add the release date to the [Unreleased] section header.\n\n```bash\nDATE=$(date +%Y-%m-%d)\n\n# macOS\nsed -i '' \"s/## \\[Unreleased\\]/## [Unreleased]\\\n\\\n## [0.47.1] - $DATE/\" CHANGELOG.md\n\n# Linux\nsed -i \"s/## \\[Unreleased\\]/## [Unreleased]\\n\\n## [0.47.1] - $DATE/\" CHANGELOG.md\n```\n\nNote: The update-changelog step handles the content; this step just adds the date stamp.\n\nVerify:\n```bash\ngrep -A2 '\\[Unreleased\\]' CHANGELOG.md\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.710177-08:00","updated_at":"2026-01-12T03:20:47.643952-08:00","closed_at":"2026-01-12T03:20:47.643952-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-7v8","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.729153-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-7v8","depends_on_id":"bd-wisp-3q2","type":"blocks","created_at":"2026-01-12T03:17:16.770447-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-82n","title":"Gate: gh:run release.yml","description":"Async gate for step await-ci","status":"open","priority":2,"issue_type":"gate","created_at":"2026-01-12T03:17:16.712314-08:00","updated_at":"2026-01-12T03:17:16.712314-08:00","dependencies":[{"issue_id":"bd-wisp-82n","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.736166-08:00","created_by":"beads/crew/emma"}],"ephemeral":true,"await_type":"gh:run","await_id":"release.yml","timeout":1800000000000} {"id":"bd-wisp-84x","title":"Push release tag","description":"Push the version tag to trigger CI release.\n\n```bash\ngit push origin v0.45.0\n```\n\nThis triggers GitHub Actions to build artifacts and publish.\n\n**Phase 1 Complete**: After this step, signal phase-complete:\n```bash\ngt done --phase-complete\n```\n\nThe gate will block until CI finishes. A new session will resume at Phase 2.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258143-08:00","updated_at":"2026-01-06T20:12:35.736045-08:00","closed_at":"2026-01-06T20:12:35.736045-08:00","close_reason":"Tag v0.45.0 pushed - CI triggered","dependencies":[{"issue_id":"bd-wisp-84x","depends_on_id":"bd-wisp-7qw","type":"blocks","created_at":"2026-01-06T20:07:32.280347-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-8ke","title":"Run test suite","description":"Run the test suite.\n\n```bash\ngo test ./...\n```\n\nTrack results: pass count, fail count, specific failures.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.77926-08:00","updated_at":"2026-01-12T00:35:15.898241-08:00","closed_at":"2026-01-12T00:35:15.898241-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-8ke","depends_on_id":"bd-wisp-s9j","type":"blocks","created_at":"2026-01-12T00:34:44.806934-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-8m1","title":"Verify PyPI package","description":"Confirm PyPI package published.\n\n```bash\npip index versions beads-mcp 2\u003e/dev/null | head -3\n```\n\nOr check: https://pypi.org/project/beads-mcp/\n\nShould show 0.47.1.\n\nNote: PyPI may have a small propagation delay (1-2 min).\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.713223-08:00","updated_at":"2026-01-12T03:17:16.713223-08:00","dependencies":[{"issue_id":"bd-wisp-8m1","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.740912-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-8m1","depends_on_id":"bd-wisp-4i8","type":"blocks","created_at":"2026-01-12T03:17:16.796067-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-99t","title":"Gate: gh:run release.yml","description":"Async gate for step await-ci","status":"closed","priority":2,"issue_type":"gate","created_at":"2026-01-06T20:07:32.258514-08:00","updated_at":"2026-01-06T20:17:28.461889-08:00","closed_at":"2026-01-06T20:17:28.461889-08:00","close_reason":"Release workflow completed successfully"} {"id":"bd-wisp-9b0","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T18:35:46.606209-08:00","updated_at":"2026-01-10T18:41:19.369613-08:00","closed_at":"2026-01-10T18:41:19.369613-08:00","close_reason":"Closed","ephemeral":true} {"id":"bd-wisp-9ej","title":"Merge and push to main","description":"Merge to main and push. CRITICAL: Notifications come IMMEDIATELY after push.\n\n**Step 1: Merge and Push**\n```bash\ngit checkout main\ngit merge --ff-only temp\ngit push origin main\n```\n\n⚠️ **STOP HERE - DO NOT PROCEED UNTIL STEPS 2-3 COMPLETE**\n\n**Step 2: Send MERGED Notification (REQUIRED - DO THIS IMMEDIATELY)**\n\nRIGHT NOW, before any cleanup, send MERGED mail to Witness:\n\n```bash\ngt mail send \u003crig\u003e/witness -s \"MERGED \u003cpolecat-name\u003e\" -m \"Branch: \u003cbranch\u003e\nIssue: \u003cissue-id\u003e\nMerged-At: $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n```\n\nThis signals the Witness to nuke the polecat worktree. WITHOUT THIS NOTIFICATION,\nPOLECAT WORKTREES ACCUMULATE INDEFINITELY AND THE LIFECYCLE BREAKS.\n\n**Step 3: Close MR Bead (REQUIRED - DO THIS IMMEDIATELY)**\n\n⚠️ **VERIFICATION BEFORE CLOSING**: Confirm the work is actually on main:\n```bash\n# Get the commit message/issue from the branch\ngit log origin/main --oneline | grep \"\u003cissue-id\u003e\"\n# OR verify the commit SHA is on main:\ngit branch --contains \u003ccommit-sha\u003e | grep main\n```\n\nIf work is NOT on main, DO NOT close the MR bead. Investigate first.\n\n```bash\nbd close \u003cmr-bead-id\u003e --reason \"Merged to main at $(git rev-parse --short HEAD)\"\n```\n\nThe MR bead ID was in the MERGE_READY message or find via:\n```bash\nbd list --type=merge-request --status=open | grep \u003cpolecat-name\u003e\n```\n\n**VALIDATION**: The MR bead's source_issue should be a valid bead ID (gt-xxxxx),\nnot a branch name. If source_issue contains a branch name, flag for investigation.\n\n**Step 4: Archive the MERGE_READY mail (REQUIRED)**\n```bash\ngt mail archive \u003cmerge-ready-message-id\u003e\n```\nThe message ID was tracked when you processed inbox-check.\n\n**Step 5: Cleanup (only after Steps 2-4 confirmed)**\n```bash\ngit branch -d temp\ngit push origin --delete \u003cpolecat-branch\u003e\n```\n\n**VERIFICATION GATE**: You CANNOT proceed to loop-check without:\n- [x] MERGED mail sent to witness\n- [x] MR bead closed\n- [x] MERGE_READY mail archived\n\nIf you skipped notifications or archiving, GO BACK AND DO THEM NOW.\n\nMain has moved. Any remaining branches need rebasing on new baseline.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.779884-08:00","updated_at":"2026-01-12T00:35:17.476883-08:00","closed_at":"2026-01-12T00:35:17.476883-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-9ej","depends_on_id":"bd-wisp-tkf","type":"blocks","created_at":"2026-01-12T00:34:44.811787-08:00","created_by":"beads/refinery"}],"ephemeral":true} @@ -2201,29 +2283,41 @@ {"id":"bd-wisp-9jv","title":"Scan merge queue","description":"Check the beads merge queue - this is the SOURCE OF TRUTH for pending merges.\n\n```bash\ngit fetch --prune origin\ngt mq list \u003crig\u003e\n```\n\nThe beads MQ tracks all pending merge requests. Do NOT rely on `git branch -r | grep polecat`\nas branches may exist without MR beads, or MR beads may exist for already-merged work.\n\nIf queue empty, skip to context-check step.\n\nFor each MR in the queue, verify the branch still exists:\n```bash\ngit branch -r | grep \u003cbranch\u003e\n```\n\nIf branch doesn't exist for a queued MR:\n- Close the MR bead: `bd close \u003cmr-id\u003e --reason \"Branch no longer exists\"`\n- Remove from processing queue\n\nTrack verified MR list for this cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.195527-08:00","updated_at":"2026-01-12T01:27:42.447313-08:00","closed_at":"2026-01-12T01:27:42.447313-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-9jv","depends_on_id":"bd-wisp-q7n","type":"blocks","created_at":"2026-01-12T01:27:11.218511-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-9ka","title":"Commit release","description":"Stage and commit all version changes.\n\n```bash\ngit add -A\ngit commit -m \"chore: Bump version to 0.45.0\"\n```\n\nReview the commit to ensure all expected files are included.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257545-08:00","updated_at":"2026-01-06T20:11:53.72207-08:00","closed_at":"2026-01-06T20:11:53.72207-08:00","close_reason":"Release committed","dependencies":[{"issue_id":"bd-wisp-9ka","depends_on_id":"bd-wisp-v0n","type":"blocks","created_at":"2026-01-06T20:07:32.277252-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-9kb","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.45.0\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256963-08:00","updated_at":"2026-01-06T20:10:31.456687-08:00","closed_at":"2026-01-06T20:10:31.456687-08:00","close_reason":"info.go versionChanges updated for 0.45.0","dependencies":[{"issue_id":"bd-wisp-9kb","depends_on_id":"bd-wisp-540","type":"blocks","created_at":"2026-01-06T20:07:32.27459-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-9lg","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.47.1\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.707988-08:00","updated_at":"2026-01-12T03:19:48.160044-08:00","closed_at":"2026-01-12T03:19:48.160044-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-9lg","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.722132-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-9lg","depends_on_id":"bd-wisp-je0","type":"blocks","created_at":"2026-01-12T03:17:16.754969-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-9sq","title":"Release complete","description":"Release v0.45.0 is complete!\n\nSummary:\n- All version files updated\n- Git tag pushed\n- CI artifacts built (via gate)\n- npm and PyPI packages verified\n- Local installation updated\n- Daemons restarted\n\nOptional next steps:\n- Announce on social media\n- Update documentation site\n- Close related milestone\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259643-08:00","updated_at":"2026-01-06T20:18:20.109063-08:00","closed_at":"2026-01-06T20:18:20.109063-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-9sq","depends_on_id":"bd-wisp-bkf","type":"blocks","created_at":"2026-01-06T20:07:32.292316-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-9wz","title":"Check for more work","description":"More branches to process?\n\n**Entry paths:**\n- Normal: After successful merge-push\n- Conflict-skip: After process-branch created conflict-resolution task\n\nIf yes: Return to process-branch with next branch.\nIf no: Continue to generate-summary.\n\n**Track for this cycle:**\n- branches_merged: count and names of successfully merged branches\n- branches_conflict: count and names of branches skipped due to conflicts\n- conflict_tasks: IDs of conflict-resolution tasks created\n\nThis tracking feeds into generate-summary for the patrol digest.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T02:44:24.391989-08:00","updated_at":"2026-01-12T02:45:30.193539-08:00","closed_at":"2026-01-12T02:45:30.193539-08:00","close_reason":"Queue empty - no more work to check","dependencies":[{"issue_id":"bd-wisp-9wz","depends_on_id":"bd-wisp-ec4","type":"parent-child","created_at":"2026-01-12T02:44:24.399497-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-a2y","title":"Bump version in plugin JSON files","description":"Update Claude plugin manifest versions.\n\n```bash\n# macOS/Linux with jq\njq '.version = \"0.47.1\"' .claude-plugin/plugin.json \u003e tmp \u0026\u0026 mv tmp .claude-plugin/plugin.json\njq '.plugins[0].version = \"0.47.1\"' .claude-plugin/marketplace.json \u003e tmp \u0026\u0026 mv tmp .claude-plugin/marketplace.json\n```\n\nVerify:\n```bash\njq -r '.version' .claude-plugin/plugin.json\njq -r '.plugins[0].version' .claude-plugin/marketplace.json\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.708625-08:00","updated_at":"2026-01-12T03:20:47.631755-08:00","closed_at":"2026-01-12T03:20:47.631755-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-a2y","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.724124-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-a2y","depends_on_id":"bd-wisp-xwy","type":"blocks","created_at":"2026-01-12T03:17:16.758897-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-apf","title":"Check refinery mail","description":"Check mail for MERGE_READY submissions, escalations, and messages.\n\n```bash\ngt mail inbox\n```\n\nFor each message:\n\n**MERGE_READY**:\nA polecat's work is ready for merge. Extract details and track for processing.\n\n```bash\n# Parse MERGE_READY message body:\n# Branch: \u003cbranch\u003e\n# Issue: \u003cissue-id\u003e\n# Polecat: \u003cpolecat-name\u003e\n# MR: \u003cmr-bead-id\u003e\n# Verified: clean git state, issue closed\n\n# Track in your merge queue for this patrol cycle:\n# - Branch name\n# - Issue ID\n# - Polecat name (REQUIRED for MERGED notification)\n# - MR bead ID (REQUIRED for closing after merge)\n```\n\n**IMPORTANT**: You MUST track the polecat name, MR bead ID, AND message ID - you will need them\nin merge-push step to send MERGED notification, close the MR bead, and archive the mail.\n\nMark as read. The work will be processed in queue-scan/process-branch.\n**Do NOT archive yet** - archive after merge/reject decision in merge-push step.\n\n**PATROL: Wake up**:\nWitness detected MRs waiting but refinery idle. Acknowledge and archive:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HELP / Blocked**:\nAssess and respond. If you can't help, escalate to Mayor.\nArchive after handling:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HANDOFF**:\nRead predecessor context. Check for in-flight merges.\nArchive after absorbing context:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Hygiene principle**: Archive messages after they're fully processed.\nKeep only: pending MRs in queue. Inbox should be near-empty.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332033-08:00","updated_at":"2026-01-11T15:06:13.099965-08:00","closed_at":"2026-01-11T15:06:13.099965-08:00","close_reason":"Inbox empty, no messages","ephemeral":true} +{"id":"bd-wisp-az0","title":"Verify CHANGELOG completeness","description":"Ensure CHANGELOG captures ALL commits since the last release.\n\n**Step 1: Count commits since last tag**\n```bash\nLAST_TAG=$(git describe --tags --abbrev=0)\nCOMMIT_COUNT=$(git rev-list $LAST_TAG..HEAD --count)\necho \"Commits since $LAST_TAG: $COMMIT_COUNT\"\n```\n\n**Step 2: List all commits with their messages**\n```bash\ngit log $LAST_TAG..HEAD --oneline --no-merges\n```\n\n**Step 3: Cross-reference with CHANGELOG**\nOpen CHANGELOG.md and verify every significant commit is documented in [Unreleased].\n\n**Red flags for stale CHANGELOG:**\n- If CHANGELOG was last modified days ago but there are recent commits\n- If commit count seems high but [Unreleased] section is sparse\n- If PR titles in commits don't match CHANGELOG entries\n\n```bash\n# Check when CHANGELOG was last modified\ngit log -1 --format=\"%ar\" -- CHANGELOG.md\n\n# Compare to latest commit date\ngit log -1 --format=\"%ar\"\n```\n\n**If CHANGELOG is stale:**\n1. Review all commits since last tag\n2. Add missing entries to appropriate sections (Added/Changed/Fixed)\n3. Group related changes\n4. Focus on user-facing changes and breaking changes\n\nDon't proceed until CHANGELOG is complete - it's the release notes!\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.707361-08:00","updated_at":"2026-01-12T03:19:17.323602-08:00","closed_at":"2026-01-12T03:19:17.323602-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-az0","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.720147-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-az0","depends_on_id":"bd-wisp-nys","type":"blocks","created_at":"2026-01-12T03:17:16.751444-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-be1","title":"Release complete","description":"Release v0.47.1 is complete!\n\nSummary:\n- All version files updated\n- Git tag pushed\n- CI artifacts built (via gate)\n- npm and PyPI packages verified\n- Local installation updated\n- Daemons restarted\n\nOptional next steps:\n- Announce on social media\n- Update documentation site\n- Close related milestone\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.714128-08:00","updated_at":"2026-01-12T03:17:16.714128-08:00","dependencies":[{"issue_id":"bd-wisp-be1","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.744595-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-be1","depends_on_id":"bd-wisp-08w","type":"blocks","created_at":"2026-01-12T03:17:16.812973-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-bkf","title":"Restart daemons","description":"Restart bd daemons to pick up new version.\n\n```bash\nbd daemons killall\n```\n\nDaemons will auto-restart with new version on next bd command.\n\nVerify:\n```bash\nbd daemons list\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259461-08:00","updated_at":"2026-01-06T20:18:20.108169-08:00","closed_at":"2026-01-06T20:18:20.108169-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-bkf","depends_on_id":"bd-wisp-fm4","type":"blocks","created_at":"2026-01-06T20:07:32.290802-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-bmc","title":"Check for more work","description":"More branches to process?\n\n**Entry paths:**\n- Normal: After successful merge-push\n- Conflict-skip: After process-branch created conflict-resolution task\n\nIf yes: Return to process-branch with next branch.\nIf no: Continue to generate-summary.\n\n**Track for this cycle:**\n- branches_merged: count and names of successfully merged branches\n- branches_conflict: count and names of branches skipped due to conflicts\n- conflict_tasks: IDs of conflict-resolution tasks created\n\nThis tracking feeds into generate-summary for the patrol digest.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780188-08:00","updated_at":"2026-01-12T00:35:19.408028-08:00","closed_at":"2026-01-12T00:35:19.408028-08:00","close_reason":"Queue was empty - no loop needed","dependencies":[{"issue_id":"bd-wisp-bmc","depends_on_id":"bd-wisp-9ej","type":"blocks","created_at":"2026-01-12T00:34:44.814328-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-bye","title":"Run bump-version.sh","description":"Update all component versions atomically.\n\n```bash\n./scripts/bump-version.sh 0.45.0\n```\n\nThis updates:\n- cmd/bd/version.go\n- .claude-plugin/*.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- npm-package/package.json\n- Hook templates\n- README.md\n- CHANGELOG.md (adds date)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257161-08:00","updated_at":"2026-01-06T20:11:24.896526-08:00","closed_at":"2026-01-06T20:11:24.896526-08:00","close_reason":"Version bumped and verified: 0.45.0","dependencies":[{"issue_id":"bd-wisp-bye","depends_on_id":"bd-wisp-9kb","type":"blocks","created_at":"2026-01-06T20:07:32.275432-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-ce6","title":"Run test suite","description":"Run the test suite.\n\n```bash\ngo test ./...\n```\n\nTrack results: pass count, fail count, specific failures.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.196163-08:00","updated_at":"2026-01-12T01:27:49.323086-08:00","closed_at":"2026-01-12T01:27:49.323086-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-ce6","depends_on_id":"bd-wisp-3th","type":"blocks","created_at":"2026-01-12T01:27:11.222525-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-cf3","title":"Create release tag","description":"Create annotated git tag.\n\n```bash\ngit tag -a v0.45.0 -m \"Release v0.45.0\"\n```\n\nVerify: `git tag -l | tail -5`\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257743-08:00","updated_at":"2026-01-06T20:12:04.079541-08:00","closed_at":"2026-01-06T20:12:04.079541-08:00","close_reason":"Tag v0.45.0 created","dependencies":[{"issue_id":"bd-wisp-cf3","depends_on_id":"bd-wisp-9ka","type":"blocks","created_at":"2026-01-06T20:07:32.278265-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-cfr","title":"Bump version in MCP Python package","description":"Update the beads-mcp Python package version.\n\n```bash\n# macOS\nsed -i '' 's/version = \"[^\"]*\"/version = \"0.47.1\"/' integrations/beads-mcp/pyproject.toml\nsed -i '' 's/__version__ = \"[^\"]*\"/__version__ = \"0.47.1\"/' integrations/beads-mcp/src/beads_mcp/__init__.py\n\n# Linux\nsed -i 's/version = \"[^\"]*\"/version = \"0.47.1\"/' integrations/beads-mcp/pyproject.toml\nsed -i 's/__version__ = \"[^\"]*\"/__version__ = \"0.47.1\"/' integrations/beads-mcp/src/beads_mcp/__init__.py\n```\n\nVerify:\n```bash\ngrep 'version = ' integrations/beads-mcp/pyproject.toml | head -1\ngrep '__version__ = ' integrations/beads-mcp/src/beads_mcp/__init__.py\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.70893-08:00","updated_at":"2026-01-12T03:20:47.634391-08:00","closed_at":"2026-01-12T03:20:47.634391-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-cfr","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.725128-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-cfr","depends_on_id":"bd-wisp-a2y","type":"blocks","created_at":"2026-01-12T03:17:16.761173-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-d7b","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T20:13:17.442141-08:00","updated_at":"2026-01-10T20:24:29.145383-08:00","closed_at":"2026-01-10T20:24:29.145383-08:00","close_reason":"Patrol: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-dj0","title":"beads-release","description":"Beads release workflow v2 - gate-aware async release.\n\nThis formula orchestrates a complete release cycle with async gates:\n\nPhase 1 (Polecat Work):\n 1. Preflight checks (clean git, up to date)\n 2. Documentation updates (CHANGELOG, info.go)\n 3. Version bump (all components)\n 4. Git operations (commit, tag, push)\n\nGate (Async Wait):\n 5. await-ci: Gate on GitHub Actions release.yml completion\n\nPhase 2 (Parallel Verification):\n 6. Verify GitHub release, npm package, PyPI package (concurrent)\n\nPhase 3 (Installation):\n 7. Local installation update\n 8. Daemon restart\n\n## Usage\n\n```bash\nbd mol wisp create beads-release --var version=0.44.0\n```\n\nOr assign to a polecat:\n```bash\ngt sling beads/polecats/p1 --formula beads-release --var version=0.44.0\n```\n\nThe polecat will complete Phase 1, then signal phase-complete. The gate blocks\nuntil release.yml finishes. A new polecat (or the same one) resumes for Phases 2-3.\n","status":"closed","priority":2,"issue_type":"epic","created_at":"2026-01-07T00:02:11.335159-08:00","updated_at":"2026-01-07T00:11:26.667806-08:00","closed_at":"2026-01-07T00:11:26.667806-08:00","close_reason":"Release v0.46.0 published: GitHub, npm, PyPI all verified"} {"id":"bd-wisp-dz5","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T19:40:21.849288-08:00","updated_at":"2026-01-10T19:45:58.671508-08:00","closed_at":"2026-01-10T19:45:58.671508-08:00","close_reason":"Patrol complete: queue empty","ephemeral":true} +{"id":"bd-wisp-ec4","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-12T02:44:24.389343-08:00","updated_at":"2026-01-12T17:22:24.034782-08:00","ephemeral":true} +{"id":"bd-wisp-efo","title":"Push to main","description":"Push the release commit to origin.\n\n```bash\ngit push origin main\n```\n\nIf rejected, someone else pushed. Pull, rebase, try again.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.711396-08:00","updated_at":"2026-01-12T03:21:47.150051-08:00","closed_at":"2026-01-12T03:21:47.150051-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-efo","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.733165-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-efo","depends_on_id":"bd-wisp-yi6","type":"blocks","created_at":"2026-01-12T03:17:16.781037-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-eh4","title":"Verify npm package","description":"Confirm npm package published.\n\n```bash\nnpm show @beads/bd version\n```\n\nShould show 0.45.0.\n\nAlso check: https://www.npmjs.com/package/@beads/bd\n\nNote: npm registry may have a small propagation delay (1-2 min).\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258891-08:00","updated_at":"2026-01-06T20:17:52.238932-08:00","closed_at":"2026-01-06T20:17:52.238932-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-eh4","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.283957-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-fm4","title":"Update local installation","description":"Update local bd to the new version.\n\nOption 1 - Homebrew:\n```bash\nbrew upgrade bd\n```\n\nOption 2 - Install script:\n```bash\ncurl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash\n```\n\nVerify:\n```bash\nbd --version\n```\n\nShould show 0.45.0.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259261-08:00","updated_at":"2026-01-06T20:18:20.106709-08:00","closed_at":"2026-01-06T20:18:20.106709-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-gnr","type":"blocks","created_at":"2026-01-06T20:07:32.286541-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-eh4","type":"blocks","created_at":"2026-01-06T20:07:32.287962-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-fm4","depends_on_id":"bd-wisp-04d","type":"blocks","created_at":"2026-01-06T20:07:32.289399-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-wisp-gb3","title":"Bump version in npm package","description":"Update the npm package version.\n\n```bash\n# macOS/Linux with jq\njq '.version = \"0.47.1\"' npm-package/package.json \u003e tmp \u0026\u0026 mv tmp npm-package/package.json\n```\n\nVerify:\n```bash\njq -r '.version' npm-package/package.json\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.709238-08:00","updated_at":"2026-01-12T03:20:47.636942-08:00","closed_at":"2026-01-12T03:20:47.636942-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-gb3","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.726136-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-gb3","depends_on_id":"bd-wisp-cfr","type":"blocks","created_at":"2026-01-12T03:17:16.763406-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-gby","title":"Check for more work","description":"More branches to process?\n\n**Entry paths:**\n- Normal: After successful merge-push\n- Conflict-skip: After process-branch created conflict-resolution task\n\nIf yes: Return to process-branch with next branch.\nIf no: Continue to generate-summary.\n\n**Track for this cycle:**\n- branches_merged: count and names of successfully merged branches\n- branches_conflict: count and names of branches skipped due to conflicts\n- conflict_tasks: IDs of conflict-resolution tasks created\n\nThis tracking feeds into generate-summary for the patrol digest.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.197065-08:00","updated_at":"2026-01-12T01:27:49.671718-08:00","closed_at":"2026-01-12T01:27:49.671718-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-gby","depends_on_id":"bd-wisp-mld","type":"blocks","created_at":"2026-01-12T01:27:11.229663-08:00","created_by":"beads/refinery"}],"ephemeral":true} -{"id":"bd-wisp-gco","title":"Check own context limit","description":"Check own context usage.\n\nIf context is HIGH (\u003e80%):\n- Write handoff summary\n- Prepare for burn/respawn\n\nIf context is LOW:\n- Can continue processing","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780785-08:00","updated_at":"2026-01-12T00:35:30.918931-08:00","closed_at":"2026-01-12T00:35:30.918931-08:00","close_reason":"Context low - fresh session","dependencies":[{"issue_id":"bd-wisp-gco","depends_on_id":"bd-wisp-ztj","type":"blocks","created_at":"2026-01-12T00:34:44.81984-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-gnr","title":"Verify GitHub release","description":"Check the GitHub releases page.\n\nhttps://github.com/steveyegge/beads/releases/tag/v0.45.0\n\nVerify:\n- Release created\n- Binaries attached (linux, darwin, windows)\n- Checksums present\n\n```bash\ngh release view v0.45.0 --json assets --jq '.assets[].name'\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258704-08:00","updated_at":"2026-01-06T20:17:52.237306-08:00","closed_at":"2026-01-06T20:17:52.237306-08:00","close_reason":"All release artifacts verified: GitHub (9 assets), npm 0.45.0, PyPI 0.45.0","dependencies":[{"issue_id":"bd-wisp-gnr","depends_on_id":"bd-wisp-u9o","type":"blocks","created_at":"2026-01-06T20:07:32.282733-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-h3l","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-12T01:56:52.397502-08:00","updated_at":"2026-01-12T01:56:52.397502-08:00","ephemeral":true} {"id":"bd-wisp-i7d","title":"Check own context limit","description":"Check own context usage.\n\nIf context is HIGH (\u003e80%):\n- Write handoff summary\n- Prepare for burn/respawn\n\nIf context is LOW:\n- Can continue processing","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.197674-08:00","updated_at":"2026-01-12T01:28:22.969704-08:00","closed_at":"2026-01-12T01:28:22.969704-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-i7d","depends_on_id":"bd-wisp-pyf","type":"blocks","created_at":"2026-01-12T01:27:11.2348-08:00","created_by":"beads/refinery"}],"ephemeral":true} -{"id":"bd-wisp-i97","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-11T18:41:41.403781-08:00","updated_at":"2026-01-11T18:48:24.943006-08:00","closed_at":"2026-01-11T18:48:24.943006-08:00","close_reason":"Patrol cycle: queue empty, no branches to merge, local main synced to 764f3747","ephemeral":true} +{"id":"bd-wisp-iii","title":"Bump version in hook templates","description":"Update version comment in git hook templates.\n\n```bash\n# macOS\nfor f in cmd/bd/templates/hooks/pre-commit cmd/bd/templates/hooks/post-merge cmd/bd/templates/hooks/pre-push cmd/bd/templates/hooks/post-checkout; do\n sed -i '' 's/# bd-hooks-version: .*/# bd-hooks-version: 0.47.1/' \"$f\"\ndone\n\n# Linux\nfor f in cmd/bd/templates/hooks/pre-commit cmd/bd/templates/hooks/post-merge cmd/bd/templates/hooks/pre-push cmd/bd/templates/hooks/post-checkout; do\n sed -i 's/# bd-hooks-version: .*/# bd-hooks-version: 0.47.1/' \"$f\"\ndone\n```\n\nVerify:\n```bash\ngrep '# bd-hooks-version:' cmd/bd/templates/hooks/pre-commit\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.709539-08:00","updated_at":"2026-01-12T03:20:47.639368-08:00","closed_at":"2026-01-12T03:20:47.639368-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-iii","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.727134-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-iii","depends_on_id":"bd-wisp-gb3","type":"blocks","created_at":"2026-01-12T03:17:16.765697-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-je0","title":"Update CHANGELOG.md","description":"Write the [Unreleased] section with all changes for 0.47.1.\n\nFormat: Keep a Changelog (https://keepachangelog.com)\n\nSections:\n- ### Added\n- ### Changed\n- ### Fixed\n- ### Documentation\n\nThe bump script will stamp the date automatically.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.707676-08:00","updated_at":"2026-01-12T03:19:17.32748-08:00","closed_at":"2026-01-12T03:19:17.32748-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-je0","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.721148-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-je0","depends_on_id":"bd-wisp-az0","type":"blocks","created_at":"2026-01-12T03:17:16.753125-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-mjq","title":"Handle test failures","description":"**VERIFICATION GATE**: This step enforces the Beads Promise.\n\nIf tests PASSED: This step auto-completes. Proceed to merge.\n\nIf tests FAILED:\n1. Diagnose: Is this a branch regression or pre-existing on main?\n2. If branch caused it:\n - Abort merge\n - Notify polecat: \"Tests failing. Please fix and resubmit.\"\n - Skip to loop-check\n3. If pre-existing on main:\n - Option A: Fix it yourself (you're the Engineer!)\n - Option B: File a bead: bd create --type=bug --priority=1 --title=\"...\"\n\n**GATE REQUIREMENT**: You CANNOT proceed to merge-push without:\n- Tests passing, OR\n- Fix committed, OR\n- Bead filed for the failure\n\nThis is non-negotiable. Never disavow. Never \"note and proceed.\" ","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.196466-08:00","updated_at":"2026-01-12T01:27:49.440026-08:00","closed_at":"2026-01-12T01:27:49.440026-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-mjq","depends_on_id":"bd-wisp-ce6","type":"blocks","created_at":"2026-01-12T01:27:11.224814-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-mld","title":"Merge and push to main","description":"Merge to main and push. CRITICAL: Notifications come IMMEDIATELY after push.\n\n**Step 1: Merge and Push**\n```bash\ngit checkout main\ngit merge --ff-only temp\ngit push origin main\n```\n\n⚠️ **STOP HERE - DO NOT PROCEED UNTIL STEPS 2-3 COMPLETE**\n\n**Step 2: Send MERGED Notification (REQUIRED - DO THIS IMMEDIATELY)**\n\nRIGHT NOW, before any cleanup, send MERGED mail to Witness:\n\n```bash\ngt mail send \u003crig\u003e/witness -s \"MERGED \u003cpolecat-name\u003e\" -m \"Branch: \u003cbranch\u003e\nIssue: \u003cissue-id\u003e\nMerged-At: $(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n```\n\nThis signals the Witness to nuke the polecat worktree. WITHOUT THIS NOTIFICATION,\nPOLECAT WORKTREES ACCUMULATE INDEFINITELY AND THE LIFECYCLE BREAKS.\n\n**Step 3: Close MR Bead (REQUIRED - DO THIS IMMEDIATELY)**\n\n⚠️ **VERIFICATION BEFORE CLOSING**: Confirm the work is actually on main:\n```bash\n# Get the commit message/issue from the branch\ngit log origin/main --oneline | grep \"\u003cissue-id\u003e\"\n# OR verify the commit SHA is on main:\ngit branch --contains \u003ccommit-sha\u003e | grep main\n```\n\nIf work is NOT on main, DO NOT close the MR bead. Investigate first.\n\n```bash\nbd close \u003cmr-bead-id\u003e --reason \"Merged to main at $(git rev-parse --short HEAD)\"\n```\n\nThe MR bead ID was in the MERGE_READY message or find via:\n```bash\nbd list --type=merge-request --status=open | grep \u003cpolecat-name\u003e\n```\n\n**VALIDATION**: The MR bead's source_issue should be a valid bead ID (gt-xxxxx),\nnot a branch name. If source_issue contains a branch name, flag for investigation.\n\n**Step 4: Archive the MERGE_READY mail (REQUIRED)**\n```bash\ngt mail archive \u003cmerge-ready-message-id\u003e\n```\nThe message ID was tracked when you processed inbox-check.\n\n**Step 5: Cleanup (only after Steps 2-4 confirmed)**\n```bash\ngit branch -d temp\ngit push origin --delete \u003cpolecat-branch\u003e\n```\n\n**VERIFICATION GATE**: You CANNOT proceed to loop-check without:\n- [x] MERGED mail sent to witness\n- [x] MR bead closed\n- [x] MERGE_READY mail archived\n\nIf you skipped notifications or archiving, GO BACK AND DO THEM NOW.\n\nMain has moved. Any remaining branches need rebasing on new baseline.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.196764-08:00","updated_at":"2026-01-12T01:27:49.55647-08:00","closed_at":"2026-01-12T01:27:49.55647-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-mld","depends_on_id":"bd-wisp-mjq","type":"blocks","created_at":"2026-01-12T01:27:11.227232-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-msq","title":"Update local installation","description":"Update local bd to the new version.\n\nOption 1 - Homebrew:\n```bash\nbrew upgrade bd\n```\n\nOption 2 - Install script:\n```bash\ncurl -fsSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash\n```\n\nVerify:\n```bash\nbd --version\n```\n\nShould show 0.47.1.\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.713524-08:00","updated_at":"2026-01-12T03:17:16.713525-08:00","dependencies":[{"issue_id":"bd-wisp-msq","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.742098-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-msq","depends_on_id":"bd-wisp-2g2","type":"blocks","created_at":"2026-01-12T03:17:16.799353-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-msq","depends_on_id":"bd-wisp-mtc","type":"blocks","created_at":"2026-01-12T03:17:16.802756-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-msq","depends_on_id":"bd-wisp-8m1","type":"blocks","created_at":"2026-01-12T03:17:16.806081-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-mtc","title":"Verify npm package","description":"Confirm npm package published.\n\n```bash\nnpm show @beads/bd version\n```\n\nShould show 0.47.1.\n\nAlso check: https://www.npmjs.com/package/@beads/bd\n\nNote: npm registry may have a small propagation delay (1-2 min).\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.712922-08:00","updated_at":"2026-01-12T03:17:16.712923-08:00","dependencies":[{"issue_id":"bd-wisp-mtc","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.739725-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-mtc","depends_on_id":"bd-wisp-4i8","type":"blocks","created_at":"2026-01-12T03:17:16.792889-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-nys","title":"Review changes since last release","description":"Understand what's being released.\n\n```bash\ngit log $(git describe --tags --abbrev=0)..HEAD --oneline\n```\n\nCategorize changes:\n- Features (feat:)\n- Fixes (fix:)\n- Breaking changes\n- Documentation\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.707033-08:00","updated_at":"2026-01-12T03:18:49.071964-08:00","closed_at":"2026-01-12T03:18:49.071964-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-nys","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.719145-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-nys","depends_on_id":"bd-wisp-07c","type":"blocks","created_at":"2026-01-12T03:17:16.749907-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-pyf","title":"Generate handoff summary","description":"Summarize this patrol cycle.\n\n**VERIFICATION**: Before generating summary, confirm for each merged branch:\n- [ ] MERGED mail was sent to witness\n- [ ] MR bead was closed\n- [ ] MERGE_READY mail archived\n\nIf any notifications or archiving were missed, do them now!\n\nInclude in summary:\n- Branches merged (count, names)\n- MERGED mails sent (count - should match branches merged)\n- MR beads closed (count - should match branches merged)\n- MERGE_READY mails archived (count - should match branches merged)\n- Test results (pass/fail)\n- Branches with conflicts (count, names)\n- Conflict-resolution tasks created (IDs)\n- Issues filed (if any)\n- Any escalations sent\n\n**Conflict tracking is important** for monitoring MQ health. If many branches\nconflict, it may indicate main is moving too fast or branches are too stale.\n\nThis becomes the digest when the patrol is squashed.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.197367-08:00","updated_at":"2026-01-12T01:28:17.663658-08:00","closed_at":"2026-01-12T01:28:17.663658-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-pyf","depends_on_id":"bd-wisp-gby","type":"blocks","created_at":"2026-01-12T01:27:11.232206-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-q7n","title":"Check refinery mail","description":"Check mail for MERGE_READY submissions, escalations, and messages.\n\n```bash\ngt mail inbox\n```\n\nFor each message:\n\n**MERGE_READY**:\nA polecat's work is ready for merge. Extract details and track for processing.\n\n```bash\n# Parse MERGE_READY message body:\n# Branch: \u003cbranch\u003e\n# Issue: \u003cissue-id\u003e\n# Polecat: \u003cpolecat-name\u003e\n# MR: \u003cmr-bead-id\u003e\n# Verified: clean git state, issue closed\n\n# Track in your merge queue for this patrol cycle:\n# - Branch name\n# - Issue ID\n# - Polecat name (REQUIRED for MERGED notification)\n# - MR bead ID (REQUIRED for closing after merge)\n```\n\n**IMPORTANT**: You MUST track the polecat name, MR bead ID, AND message ID - you will need them\nin merge-push step to send MERGED notification, close the MR bead, and archive the mail.\n\nMark as read. The work will be processed in queue-scan/process-branch.\n**Do NOT archive yet** - archive after merge/reject decision in merge-push step.\n\n**PATROL: Wake up**:\nWitness detected MRs waiting but refinery idle. Acknowledge and archive:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HELP / Blocked**:\nAssess and respond. If you can't help, escalate to Mayor.\nArchive after handling:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**HANDOFF**:\nRead predecessor context. Check for in-flight merges.\nArchive after absorbing context:\n```bash\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Hygiene principle**: Archive messages after they're fully processed.\nKeep only: pending MRs in queue. Inbox should be near-empty.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.195173-08:00","updated_at":"2026-01-12T01:27:25.54453-08:00","closed_at":"2026-01-12T01:27:25.54453-08:00","close_reason":"Closed","ephemeral":true} -{"id":"bd-wisp-qx6","title":"End-of-cycle inbox hygiene","description":"Verify inbox hygiene before ending patrol cycle.\n\n**Step 1: Check inbox state**\n```bash\ngt mail inbox\n```\n\nInbox should contain ONLY:\n- Unprocessed MERGE_READY messages (will process next cycle)\n- Active work items\n\n**Step 2: Archive any stale messages**\n\nLook for messages that were processed but not archived:\n- PATROL: Wake up that was acknowledged → archive\n- HELP/Blocked that was handled → archive\n- MERGE_READY where merge completed but archive was missed → archive\n\n```bash\n# For each stale message found:\ngt mail archive \u003cmessage-id\u003e\n```\n\n**Step 3: Check for orphaned MR beads**\n\nLook for open MR beads with no corresponding branch:\n```bash\nbd list --type=merge-request --status=open\n```\n\nFor each open MR bead:\n1. Check if branch exists: `git ls-remote origin refs/heads/\u003cbranch\u003e`\n2. If branch gone, verify work is on main: `git log origin/main --oneline | grep \"\u003csource_issue\u003e\"`\n3. If work on main → close MR with reason \"Merged (verified on main)\"\n4. If work NOT on main → investigate before closing:\n - Check source_issue validity (should be gt-xxxxx, not branch name)\n - Search reflog/dangling commits if possible\n - If unverifiable, close with reason \"Unverifiable - no audit trail\"\n - File bead if this indicates lost work\n\n**NEVER close an MR bead without verifying the work landed or is unrecoverable.**\n\n**Goal**: Inbox should have ≤3 active messages at end of cycle.\nKeep only: pending MRs in queue.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.781078-08:00","updated_at":"2026-01-12T00:35:31.731741-08:00","closed_at":"2026-01-12T00:35:31.731741-08:00","close_reason":"No mail to process","dependencies":[{"issue_id":"bd-wisp-qx6","depends_on_id":"bd-wisp-gco","type":"blocks","created_at":"2026-01-12T00:34:44.822838-08:00","created_by":"beads/refinery"}],"ephemeral":true} +{"id":"bd-wisp-qoy","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"hooked","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-12T17:22:15.148454-08:00","updated_at":"2026-01-12T17:22:24.380059-08:00","ephemeral":true} {"id":"bd-wisp-s9j","title":"Mechanical rebase","description":"Pick next branch from queue. Attempt mechanical rebase on current main.\n\n**Step 1: Checkout and attempt rebase**\n```bash\ngit checkout -b temp origin/\u003cpolecat-branch\u003e\ngit rebase origin/main\n```\n\n**Step 2: Check rebase result**\n\nThe rebase exits with:\n- Exit code 0: Success - proceed to run-tests\n- Exit code 1 (conflicts): Conflict detected - proceed to Step 3\n\nTo detect conflict state after rebase fails:\n```bash\n# Check if we're in a conflicted rebase state\nls .git/rebase-merge 2\u003e/dev/null \u0026\u0026 echo \"CONFLICT_STATE\"\n```\n\n**Step 3: Handle conflicts (if any)**\n\nIf rebase SUCCEEDED (exit code 0):\n- Skip to run-tests step (continue normal merge flow)\n\nIf rebase FAILED with conflicts:\n\n1. **Abort the rebase** (DO NOT leave repo in conflicted state):\n```bash\ngit rebase --abort\n```\n\n2. **Record conflict metadata**:\n```bash\n# Capture main SHA for reference\nMAIN_SHA=$(git rev-parse origin/main)\nBRANCH_SHA=$(git rev-parse origin/\u003cpolecat-branch\u003e)\n```\n\n3. **Create conflict-resolution task**:\n```bash\nbd create --type=task --priority=1 --title=\"Resolve merge conflicts: \u003coriginal-issue-title\u003e\" --description=\"## Conflict Resolution Required\n\nOriginal MR: \u003cmr-bead-id\u003e\nBranch: \u003cpolecat-branch\u003e\nOriginal Issue: \u003cissue-id\u003e\nConflict with main at: ${MAIN_SHA}\nBranch SHA: ${BRANCH_SHA}\n\n## Instructions\n1. Clone/checkout the branch\n2. Rebase on current main: git rebase origin/main\n3. Resolve conflicts\n4. Force push: git push -f origin \u003cbranch\u003e\n5. Close this task when done\n\nThe MR will be re-queued for processing after conflicts are resolved.\"\n```\n\n4. **Skip this MR** (do NOT delete branch or close MR bead):\n- Leave branch intact for conflict resolution\n- Leave MR bead open (will be re-processed after resolution)\n- Continue to loop-check for next branch\n\n**CRITICAL**: Never delete a branch that has conflicts. The branch contains\nthe original work and must be preserved for conflict resolution.\n\nTrack: rebase result (success/conflict), conflict task ID if created.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.7789-08:00","updated_at":"2026-01-12T00:35:15.077005-08:00","closed_at":"2026-01-12T00:35:15.077005-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-s9j","depends_on_id":"bd-wisp-vqe","type":"blocks","created_at":"2026-01-12T00:34:44.804577-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-tkf","title":"Handle test failures","description":"**VERIFICATION GATE**: This step enforces the Beads Promise.\n\nIf tests PASSED: This step auto-completes. Proceed to merge.\n\nIf tests FAILED:\n1. Diagnose: Is this a branch regression or pre-existing on main?\n2. If branch caused it:\n - Abort merge\n - Notify polecat: \"Tests failing. Please fix and resubmit.\"\n - Skip to loop-check\n3. If pre-existing on main:\n - Option A: Fix it yourself (you're the Engineer!)\n - Option B: File a bead: bd create --type=bug --priority=1 --title=\"...\"\n\n**GATE REQUIREMENT**: You CANNOT proceed to merge-push without:\n- Tests passing, OR\n- Fix committed, OR\n- Bead filed for the failure\n\nThis is non-negotiable. Never disavow. Never \"note and proceed.\" ","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.779587-08:00","updated_at":"2026-01-12T00:35:16.670629-08:00","closed_at":"2026-01-12T00:35:16.670629-08:00","close_reason":"Skipped - no branches in queue","dependencies":[{"issue_id":"bd-wisp-tkf","depends_on_id":"bd-wisp-8ke","type":"blocks","created_at":"2026-01-12T00:34:44.809281-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-tno","title":"Burn and respawn or loop","description":"End of patrol cycle decision.\n\n**Step 1: Estimate remaining context**\n\nAsk yourself:\n- Have I processed many branches this cycle?\n- Is the conversation getting long?\n- Am I starting to lose track of earlier context?\n\nRule of thumb: If you've done 3+ merges or processed significant cleanup work,\nit's time for a fresh session.\n\n**Step 2: Decision tree**\n\nIf queue non-empty AND context LOW:\n- Squash this wisp to digest\n- Spawn fresh patrol wisp\n- Return to inbox-check\n\nIf queue empty OR context HIGH OR good stopping point:\n- Squash wisp with summary digest\n- Use `gt handoff` for clean session transition:\n\n```bash\ngt handoff -s \"Patrol complete\" -m \"Merged X branches, Y tests passed.\nQueue: empty/N remaining\nNext: [any notes for successor]\"\n```\n\n**Why gt handoff?**\n- Sends handoff mail to yourself with context\n- Respawns with fresh Claude instance\n- SessionStart hook runs gt prime\n- Successor picks up from your hook\n\n**DO NOT just exit.** Always use `gt handoff` for proper lifecycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.198268-08:00","updated_at":"2026-01-12T01:28:31.935242-08:00","closed_at":"2026-01-12T01:28:31.935242-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-tno","depends_on_id":"bd-wisp-4tc","type":"blocks","created_at":"2026-01-12T01:27:11.240337-08:00","created_by":"beads/refinery"}],"ephemeral":true} @@ -2233,6 +2327,8 @@ {"id":"bd-wisp-vqe","title":"Scan merge queue","description":"Check the beads merge queue - this is the SOURCE OF TRUTH for pending merges.\n\n```bash\ngit fetch --prune origin\ngt mq list \u003crig\u003e\n```\n\nThe beads MQ tracks all pending merge requests. Do NOT rely on `git branch -r | grep polecat`\nas branches may exist without MR beads, or MR beads may exist for already-merged work.\n\nIf queue empty, skip to context-check step.\n\nFor each MR in the queue, verify the branch still exists:\n```bash\ngit branch -r | grep \u003cbranch\u003e\n```\n\nIf branch doesn't exist for a queued MR:\n- Close the MR bead: `bd close \u003cmr-id\u003e --reason \"Branch no longer exists\"`\n- Remove from processing queue\n\nTrack verified MR list for this cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.778524-08:00","updated_at":"2026-01-12T00:35:06.623602-08:00","closed_at":"2026-01-12T00:35:06.623602-08:00","close_reason":"Merge queue empty - no branches waiting","dependencies":[{"issue_id":"bd-wisp-vqe","depends_on_id":"bd-wisp-6fb","type":"blocks","created_at":"2026-01-12T00:34:44.802492-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-w75","title":"Preflight: Check git status","description":"Ensure working tree is clean before starting release.\n\n```bash\ngit status\n```\n\nIf there are uncommitted changes, either:\n- Commit them first\n- Stash them: `git stash`\n- Abort and resolve\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256152-08:00","updated_at":"2026-01-06T20:08:35.66615-08:00","closed_at":"2026-01-06T20:08:35.66615-08:00","close_reason":"Preflight checks passed"} {"id":"bd-wisp-xwx","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-10T18:23:27.131593-08:00","updated_at":"2026-01-10T18:29:19.904299-08:00","closed_at":"2026-01-10T18:29:19.904299-08:00","close_reason":"Patrol complete: queue empty, no branches to merge","ephemeral":true} +{"id":"bd-wisp-xwy","title":"Bump version in version.go","description":"Update the Go version constant.\n\n```bash\n# macOS\nsed -i '' 's/Version = \"[^\"]*\"/Version = \"0.47.1\"/' cmd/bd/version.go\n\n# Linux\nsed -i 's/Version = \"[^\"]*\"/Version = \"0.47.1\"/' cmd/bd/version.go\n```\n\nVerify:\n```bash\ngrep 'Version = ' cmd/bd/version.go\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.708309-08:00","updated_at":"2026-01-12T03:20:47.628495-08:00","closed_at":"2026-01-12T03:20:47.628495-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-xwy","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.723132-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-xwy","depends_on_id":"bd-wisp-9lg","type":"blocks","created_at":"2026-01-12T03:17:16.756833-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} +{"id":"bd-wisp-yi6","title":"Create release tag","description":"Create annotated git tag.\n\n```bash\ngit tag -a v0.47.1 -m \"Release v0.47.1\"\n```\n\nVerify: `git tag -l | tail -5`\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T03:17:16.711087-08:00","updated_at":"2026-01-12T03:21:26.4805-08:00","closed_at":"2026-01-12T03:21:26.4805-08:00","close_reason":"Closed","dependencies":[{"issue_id":"bd-wisp-yi6","depends_on_id":"bd-wisp-5j5","type":"parent-child","created_at":"2026-01-12T03:17:16.732169-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-wisp-yi6","depends_on_id":"bd-wisp-1um","type":"blocks","created_at":"2026-01-12T03:17:16.778215-08:00","created_by":"beads/crew/emma"}],"ephemeral":true} {"id":"bd-wisp-z85","title":"Preflight: Pull latest","description":"Ensure we're up to date with origin.\n\n```bash\ngit pull --rebase\n```\n\nResolve any conflicts before proceeding.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.25637-08:00","updated_at":"2026-01-06T20:08:35.668191-08:00","closed_at":"2026-01-06T20:08:35.668191-08:00","close_reason":"Preflight checks passed","dependencies":[{"issue_id":"bd-wisp-z85","depends_on_id":"bd-wisp-w75","type":"blocks","created_at":"2026-01-06T20:07:32.272193-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-ztj","title":"Generate handoff summary","description":"Summarize this patrol cycle.\n\n**VERIFICATION**: Before generating summary, confirm for each merged branch:\n- [ ] MERGED mail was sent to witness\n- [ ] MR bead was closed\n- [ ] MERGE_READY mail archived\n\nIf any notifications or archiving were missed, do them now!\n\nInclude in summary:\n- Branches merged (count, names)\n- MERGED mails sent (count - should match branches merged)\n- MR beads closed (count - should match branches merged)\n- MERGE_READY mails archived (count - should match branches merged)\n- Test results (pass/fail)\n- Branches with conflicts (count, names)\n- Conflict-resolution tasks created (IDs)\n- Issues filed (if any)\n- Any escalations sent\n\n**Conflict tracking is important** for monitoring MQ health. If many branches\nconflict, it may indicate main is moving too fast or branches are too stale.\n\nThis becomes the digest when the patrol is squashed.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-12T00:34:44.780484-08:00","updated_at":"2026-01-12T00:35:24.735684-08:00","closed_at":"2026-01-12T00:35:24.735684-08:00","close_reason":"Summary: Queue empty, no branches processed this cycle","dependencies":[{"issue_id":"bd-wisp-ztj","depends_on_id":"bd-wisp-bmc","type":"blocks","created_at":"2026-01-12T00:34:44.816888-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wlzsd","title":"Merge: obsidian-mk99kht7","description":"branch: polecat/obsidian-mk99kht7\ntarget: main\nsource_issue: obsidian-mk99kht7\nrig: beads\nagent_bead: bd-beads-polecat-obsidian\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T21:03:34.490385-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-10T21:53:11.57128-08:00","closed_at":"2026-01-10T21:53:11.57128-08:00","close_reason":"Branch no longer exists on remote","labels":["gt:merge-request"]} @@ -2324,11 +2420,13 @@ {"id":"bd-ybv5","title":"Refactor AGENTS.md to use external references","description":"Suggestion to use external references (e.g., \"ALWAYS REFER TO ./beads/prompt.md\") instead of including all instructions directly within AGENTS.md.\nReasons:\n1. Agents can follow external references.\n2. Prevents context pollution/stuffing in AGENTS.md as more tools append instructions.\n","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-20T18:55:53.259144-05:00","updated_at":"2025-12-09T18:38:37.708896372-05:00","closed_at":"2025-11-26T22:25:57.772875-08:00"} {"id":"bd-yck","title":"Fix checkExistingBeadsData to be worktree-aware","description":"The checkExistingBeadsData function in cmd/bd/init.go checks for .beads in the current working directory, but for worktrees it should check the main repository root instead. This prevents proper worktree compatibility.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-07T16:48:32.082776345-07:00","updated_at":"2025-12-23T22:33:32.412338-08:00","closed_at":"2025-12-23T22:33:32.412338-08:00"} {"id":"bd-ycrq","title":"Consolidate daemon/daemons commands","description":"Merge daemons functionality into daemon command with subcommands. Currently have both 'daemon' and 'daemons' at top level.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:11.393637-08:00","created_by":"stevey","updated_at":"2025-12-28T13:05:28.776344-08:00","closed_at":"2025-12-28T13:05:28.776344-08:00"} +{"id":"bd-ydrjd","title":"Review and merge PR #1057: bump actions/checkout v4→v6","description":"dispatched_by: beads/crew/emma\n\n## Easy-win PR Review\n\nPR: https://github.com/steveyegge/beads/pull/1057\nType: Dependabot dependency bump (GitHub Actions)\nChange: actions/checkout v4 → v6\n\n## Task\n1. Review the PR diff: `gh pr diff 1057 --repo steveyegge/beads`\n2. Check CI status: `gh pr checks 1057 --repo steveyegge/beads`\n3. If CI passes and diff looks safe, approve and merge:\n `gh pr review 1057 --repo steveyegge/beads --approve`\n `gh pr merge 1057 --repo steveyegge/beads --squash`\n4. Close this bead when done\n\n## Notes\n- Major version bump but checkout is heavily used and well-maintained\n- Changes credential persistence location (now under RUNNER_TEMP)\n- Requires runner v2.329.0+ for Docker container action scenarios","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/grip","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:28:34.806238-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:35:25.465081-08:00","closed_at":"2026-01-12T19:35:25.465081-08:00","close_reason":"PR #1057 reviewed and merged. Also fixed pre-existing plugin.json version mismatch (0.47.0 → 0.47.1) that was blocking CI.","external_ref":"gh-1057"} {"id":"bd-ye0d","title":"troubleshoot GH#278 daemon exits every few secs","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T06:27:23.39509215-07:00","updated_at":"2025-11-25T17:48:43.62418-08:00","closed_at":"2025-11-25T17:48:43.62418-08:00"} {"id":"bd-yek6","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"} {"id":"bd-yhs4x","title":"Session ended: gt-beads-crew-wolf","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T13:52:49.868877-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-09T13:52:49.906983-08:00","closed_at":"2026-01-09T13:52:49.906983-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yi824","title":"Digest: mol-refinery-patrol","description":"Patrol: Queue empty, no branches merged, inbox clear","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:21:14.477633-08:00","updated_at":"2026-01-10T22:21:14.477633-08:00","closed_at":"2026-01-10T22:21:14.477598-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-yiigv","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:34:22.921317-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:34:22.959566-08:00","closed_at":"2026-01-10T15:34:22.959566-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-yj7jv","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T19:31:59.087749-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-12T19:31:59.136339-08:00","closed_at":"2026-01-12T19:31:59.136339-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yjer4","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, updated main (3 commits), no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:00:07.77986-08:00","updated_at":"2026-01-11T00:00:07.77986-08:00","closed_at":"2026-01-11T00:00:07.779825-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-yk9iz","title":"Fix rename-prefix to update blocked_issues_cache (GH#1016)","description":"dispatched_by: beads/crew/dave\n\nbd rename-prefix doesn't update blocked_issues_cache table. Add rebuildBlockedCache() call after rename.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/crew/giles","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:20.668502-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T20:45:16.647304-08:00","closed_at":"2026-01-11T20:45:16.647304-08:00","close_reason":"Fixed by adding invalidateBlockedCache() call to RenameDependencyPrefix. Committed 02488952.","external_ref":"gh-1016"} {"id":"bd-ykavk","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:11:56.241135-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:11:56.305719-08:00","closed_at":"2026-01-12T00:11:56.305719-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -2346,6 +2444,7 @@ {"id":"bd-ysal","title":"bd sync --import-only silently fails when run from redirected .beads directory","description":"## Problem\n\nWhen running `bd sync --import-only` from a directory that has a `.beads/redirect` file pointing elsewhere, the command reports success but doesn't actually fix the staleness check.\n\n## Reproduction\n\n1. Have a clone with `.beads/redirect` pointing to another location (e.g., `../../mayor/rig/.beads`)\n2. Run `bd sync --import-only` from the clone directory\n3. Command reports: `Import complete: 0 created, 0 updated, N unchanged, M skipped`\n4. But subsequent `bd list` still fails with: `Error: Database out of sync with JSONL`\n\n## Expected Behavior\n\nEither:\n- The sync should follow the redirect and actually sync the target database\n- Or the command should error/warn that it can't sync a redirected beads location\n\n## Workaround\n\nRun `bd sync --import-only` from the actual beads directory (the redirect target), not the redirected clone.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-06T18:38:46.308049-08:00","created_by":"gastown/crew/george","updated_at":"2026-01-06T18:50:40.939761-08:00","closed_at":"2026-01-06T18:50:40.939761-08:00","close_reason":"Fixed by using inline import instead of subprocess for --import-only mode. This ensures path resolution is consistent when running from directories with .beads/redirect."} {"id":"bd-yuf7","title":"bd config set succeeds but doesn't persist to config.toml","description":"Commands like `bd config set daemon.auto_push true` return \"Set daemon.auto_push = true\" but the config file is never created and `bd info --json | jq '.config'` returns null.\n\n**Steps to reproduce:**\n1. Run `bd config set daemon.auto_push true`\n2. See success message: \"Set daemon.auto_push = true\"\n3. Check `cat .beads/config.toml` → file doesn't exist\n4. Check `bd info --json | jq '.config'` → returns null\n\n**Expected:**\n- .beads/config.toml should be created with the setting\n- bd info should show the config value\n\n**Impact:**\nUsers can't enable auto-push/auto-commit via CLI as documented in AGENTS.md","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-08T01:14:58.726198-08:00","updated_at":"2025-11-08T01:17:41.377912-08:00","closed_at":"2025-11-08T01:17:41.377912-08:00"} {"id":"bd-yuxq","title":"Code smell: 262 uses of interface{} reduce type safety","description":"Heavy use of interface{} across 92 files (262 occurrences) in:\n- RPC update arguments: updatesFromArgs() returns map[string]interface{}\n- JSON unmarshaling and formatting\n- Storage query helpers\n\n**Example in internal/rpc/server_issues_epics.go:45:**\n```go\nfunc updatesFromArgs(a UpdateArgs) map[string]interface{} {\n // Returns map with interface{} values - types must be asserted at use sites\n}\n```\n\n**Problem:**\n- Loss of type safety\n- Runtime type assertions required\n- Harder to catch errors at compile time\n\n**Acceptance Criteria:**\n- [ ] Define typed update structs for specific field groups\n- [ ] Use generics where possible (Go 1.18+)\n- [ ] Reduce interface{} count by at least 50%\n- [ ] Document expected types where interface{} remains necessary\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:01.896147-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T15:44:43.347739-08:00","closed_at":"2025-12-30T07:04:41.376731-08:00","close_reason":"Implemented type safety improvements:\n\n1. Created IssueUpdate struct with typed fields and ToMap() for backward compatibility\n2. Created 15+ typed response structs (StatusMessage, DeleteResult, CompactResult, etc.)\n3. Refactored updatesFromArgs to use typed IssueUpdate internally\n4. Updated RPC delete handler to use typed DeleteResult\n5. Updated migrate.go to use StatusMessage for errors\n\nThe typed structs provide compile-time checking and reduce runtime type assertions. This foundation enables further cleanup of interface{} usage over time.\n\nNote: Many remaining interface{} usages are inherent to Go's JSON handling and external APIs (GraphQL, SQL). The acceptance criteria of 50% reduction applies to the refactorable patterns, not the total count.","dependencies":[{"issue_id":"bd-yuxq","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.812412-08:00","created_by":"daemon"}]} +{"id":"bd-yvbly","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T03:04:16.868492-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T03:04:16.915612-08:00","closed_at":"2026-01-12T03:04:16.915612-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yvhxr","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T00:36:57.748089-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T00:36:57.786518-08:00","closed_at":"2026-01-10T00:36:57.786518-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yvlc","title":"URGENT: main branch has failing tests (syncbranch migration error)","description":"The main branch has failing tests that are blocking CI for all PRs.\n\n## Problem\nAll syncbranch_test.go tests failing with:\n\"migration external_ref_column failed: failed to create index on external_ref: sqlite3: SQL logic error: no such table: main.issues\"\n\n## Evidence\n- Last 5 CI runs on main: ALL FAILED\n- Tests fail locally on current main (bd6dca5)\n- Affects: TestGet, TestSet, TestUnset in internal/syncbranch\n\n## Impact\n- Blocking all PR merges\n- CI shows red for all branches\n- Can't trust test results\n\n## Root Cause\nMigration order issue - trying to create index on external_ref column before the issues table exists, or before the external_ref column is added to the issues table.\n\n## Quick Fix Needed\nNeed to investigate migration order in internal/storage/sqlite/migrations.go and ensure:\n1. issues table is created first\n2. external_ref column is added to issues table\n3. THEN index on external_ref is created\n\nThis is CRITICAL - main should never have breaking tests.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-15T12:25:31.51688-08:00","updated_at":"2025-11-15T12:43:11.489612-08:00","closed_at":"2025-11-15T12:43:11.489612-08:00"} {"id":"bd-yvmni","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:16:09.821155-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:16:09.856754-08:00","closed_at":"2026-01-08T20:16:09.856754-08:00","close_reason":"auto-closed session event"}