diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 9602d6a9..da6293c7 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -129,7 +129,7 @@ {"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"}]} {"id":"bd-1onmd","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:05:16.256633-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:05:16.321546-08:00","closed_at":"2026-01-12T00:05:16.321546-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} -{"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","dependencies":[{"issue_id":"bd-1p8jx","depends_on_id":"bd-wisp-da9","type":"parent-child","created_at":"2026-01-10T23:04:23.82686-08:00","created_by":"beads/refinery"}]} +{"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-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"}]} @@ -316,7 +316,6 @@ {"id":"bd-450ug","title":"Session ended: gt-beads-crew-grip","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T22:30:16.607791-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-09T22:30:16.645155-08:00","closed_at":"2026-01-09T22:30:16.645155-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-45td","title":"Refactor: Extract shared child-fetching logic in swarm.go","description":"Lines 162-181 (analyzeEpicForSwarm) and 630-649 (getSwarmStatus) have identical logic for fetching epic children via parent-child dependencies.\n\nExtract to a shared helper function like:\n\n```go\nfunc getEpicChildren(ctx context.Context, s StorageInterface, epicID string) ([]*types.Issue, error)\n```\n\nThis will reduce duplication and ensure consistent behavior between validate/status/create commands.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T21:37:54.16697-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T21:54:58.827802-08:00","closed_at":"2025-12-28T21:54:58.827802-08:00","dependencies":[{"issue_id":"bd-45td","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.705879-08:00","created_by":"daemon"}]} {"id":"bd-46381404","title":"Test database naming","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.309676-07:00","updated_at":"2025-10-31T12:00:43.185201-07:00","closed_at":"2025-10-31T12:00:43.185201-07:00"} -{"id":"bd-46my3","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:26:11.870345-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:26:11.870345-08:00","ephemeral":true} {"id":"bd-46t4p","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T07:17:27.930539-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T07:17:27.974094-08:00","closed_at":"2026-01-11T07:17:27.974094-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-4747z","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:27:51.534844-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T18:27:51.580883-08:00","closed_at":"2026-01-11T18:27:51.580883-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-47qx","title":"bd cook: Proto ID prefix should match project prefix","description":"When `bd cook` creates a proto, it uses the formula name as the proto ID:\n\n```yaml\nformula: mol-deacon-patrol\n```\n\nCreates proto with ID `mol-deacon-patrol`.\n\n## Problem\n\nIf the project uses a different prefix (e.g., `gt-`), the cooked protos have \na different prefix (`mol-`), causing:\n\n1. `bd sync` import warnings about prefix mismatch\n2. Mixed prefix lists in `bd mol list`\n3. Confusion about naming conventions\n\n## Options\n\n1. **Use project prefix**: Cook as `gt-mol-deacon-patrol`\n2. **Allow mol- as special prefix**: Recognize mol-* as valid for protos\n3. **Make prefix configurable**: `bd cook --prefix gt-`\n4. **Keep current behavior**: Document that formulas use their own namespace\n\n## Current Workaround\n\nThe prefix mismatch warning can be ignored, but `bd sync` fails the import step.\n\n## Related\n\ngt-i6k1: Duplicate proto cleanup","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T13:50:24.631336-08:00","updated_at":"2025-12-24T13:59:09.933374-08:00","closed_at":"2025-12-24T13:59:09.933374-08:00"} @@ -370,21 +369,20 @@ {"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-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","dependencies":[{"issue_id":"bd-4rvek","depends_on_id":"bd-wisp-qm8","type":"parent-child","created_at":"2026-01-10T20:52:49.376478-08:00","created_by":"beads/refinery"}]} +{"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"} {"id":"bd-4ry","title":"Clarify JSONL size bounds with multi-repo","description":"The contributor-workflow-analysis.md states (line 226): 'Keep beads.jsonl small enough for agents to read (\u003c25k)'\n\nWith multi-repo hydration, it's unclear whether this bound applies to:\n- Each individual JSONL file (likely intention)\n- The total hydrated size across all repos (unclear)\n- Both (most conservative)\n\nClarification needed because:\n- VC monitors .beads/issues.jsonl size to stay under limit\n- With multi-repo, VC needs to know if each additional repo also has 25k limit\n- Agents reading hydrated data need to know total size bounds\n- Performance characteristics depend on total vs per-repo limits\n\nExample scenario:\n- Primary repo: 20k JSONL\n- Planning repo: 15k JSONL\n- Total hydrated: 35k\nIs this acceptable or does it violate the \u003c25k principle?","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:50.042748-08:00","updated_at":"2025-11-05T14:18:00.550341-08:00","closed_at":"2025-11-05T14:18:00.550341-08:00"} {"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-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-4vsob","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:04:46.861935-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:04:46.861935-08:00","ephemeral":true} {"id":"bd-4xtku","title":"Test agent bead","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-10T23:25:03.058364-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T23:25:08.142927-08:00","labels":["role_type:polecat"],"deleted_at":"2026-01-10T23:25:08.142927-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} {"id":"bd-4y4g","title":"Bump version in all files","description":"Run ./scripts/bump-version.sh {{version}} to update 10 version files. Then run with --commit after info.go is updated.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:01.859728-08:00","updated_at":"2025-12-24T16:25:30.160776-08:00","dependencies":[{"issue_id":"bd-4y4g","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.623724-08:00","created_by":"daemon"},{"issue_id":"bd-4y4g","depends_on_id":"bd-8v2","type":"blocks","created_at":"2025-12-18T22:43:20.823329-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.160776-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-4yb9","title":"Add tests for IDPrefix filter optimization","description":"Commit 5dfb838d added IDPrefix field to IssueFilter for efficient prefix filtering but lacks tests.\n\nIDPrefix enables database-level filtering of issue IDs by prefix, improving\nshell completion performance by avoiding fetching all issues.\n\nTest cases needed:\n- ListIssues with IDPrefix returns only matching issues\n- IDPrefix filtering works in sqlite store\n- IDPrefix filtering works in transaction store\n- IDPrefix filtering works in memory store\n- Empty IDPrefix returns all issues\n- IDPrefix combined with other filters\n\nLocation: internal/types/types.go (IssueFilter), internal/storage/sqlite/queries.go\nSuggested test files: internal/storage/sqlite/sqlite_test.go, internal/storage/storage_test.go","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-07T01:18:14.705475-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T01:18:14.705475-08:00"} {"id":"bd-4zbuu","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T21:29:07.839103-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T21:29:07.90551-08:00","closed_at":"2026-01-11T21:29:07.90551-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-5012","title":"Merge: ux-1766978911613","description":"branch: polecat/Nux-1766978911613\ntarget: main\nsource_issue: ux-1766978911613\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-28T19:35:42.938017-08:00","created_by":"beads/polecats/Nux","updated_at":"2025-12-29T13:40:29.719953-08:00","closed_at":"2025-12-29T13:40:29.719953-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates"} {"id":"bd-502e","title":"Add comprehensive tests for sync branch daemon logic","description":"The daemon sync branch functionality (bd-6545) was implemented but needs proper end-to-end testing.\n\nCurrent implementation:\n- daemon_sync_branch.go has syncBranchCommitAndPush() and syncBranchPull()\n- daemon_sync.go has been updated to use these functions when sync.branch is configured\n- All daemon tests pass, but no specific tests for sync branch behavior\n\nTesting needed:\n- Test that daemon commits to sync branch when sync.branch is configured\n- Test that daemon commits to current branch when sync.branch is NOT configured (backward compatibility)\n- Test that daemon pulls from sync branch and syncs JSONL back to main repo\n- Test worktree creation and health checks during daemon operations\n- Test error handling (missing branch, worktree corruption, etc.)\n\nKey challenge: Tests need to run in the context of the git repo (getGitRoot() uses current working directory), so test setup needs to properly change directory or mock the git root detection.\n\nReference existing daemon tests in daemon_test.go and daemon_autoimport_test.go for patterns.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:59:13.341491-08:00","updated_at":"2025-11-02T16:39:53.278313-08:00","closed_at":"2025-11-02T16:39:53.278313-08:00","dependencies":[{"issue_id":"bd-502e","depends_on_id":"bd-6545","type":"parent-child","created_at":"2025-11-02T15:59:13.342331-08:00","created_by":"daemon"}]} -{"id":"bd-502gs","title":"Fix orphaned test references: TypeRig, IsBuiltIn, parseCommaSeparated","description":"Pre-existing build failures found during refinery patrol:\n\n**Files with errors:**\n- internal/types/types_test.go:553: undefined: TypeRig\n- internal/types/types_test.go:591: undefined: TypeRig \n- internal/types/types_test.go:603: tt.issueType.IsBuiltIn undefined\n- internal/storage/sqlite/validators_test.go:208: undefined: parseCommaSeparated\n\n**Root cause:**\nProduction code removed these symbols but tests weren't updated:\n- TypeRig constant removed from types.go\n- IsBuiltIn() method removed from IssueType\n- parseCommaSeparated() removed from validators.go\n\n**Impact:**\n- go test ./... fails to compile\n- Tests cannot run until fixed\n\n**Fix:**\nRemove orphaned test code that references deleted production symbols.","status":"open","priority":1,"issue_type":"bug","created_at":"2026-01-10T21:43:12.764001-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T21:43:12.764001-08:00"} +{"id":"bd-502gs","title":"Fix orphaned test references: TypeRig, IsBuiltIn, parseCommaSeparated","description":"dispatched_by: beads/crew/emma\n\nPre-existing build failures found during refinery patrol:\n\n**Files with errors:**\n- internal/types/types_test.go:553: undefined: TypeRig\n- internal/types/types_test.go:591: undefined: TypeRig \n- internal/types/types_test.go:603: tt.issueType.IsBuiltIn undefined\n- internal/storage/sqlite/validators_test.go:208: undefined: parseCommaSeparated\n\n**Root cause:**\nProduction code removed these symbols but tests weren't updated:\n- TypeRig constant removed from types.go\n- IsBuiltIn() method removed from IssueType\n- parseCommaSeparated() removed from validators.go\n\n**Impact:**\n- go test ./... fails to compile\n- Tests cannot run until fixed\n\n**Fix:**\nRemove orphaned test code that references deleted production symbols.","status":"hooked","priority":1,"issue_type":"bug","assignee":"beads/crew/emma","created_at":"2026-01-10T21:43:12.764001-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T01:29:14.76174-08:00"} {"id":"bd-512v","title":"Verify release artifacts","description":"Check GitHub releases page - binaries for darwin/linux/windows should be available","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.067124-08:00","updated_at":"2025-12-21T13:53:49.35495-08:00","deleted_at":"2025-12-21T13:53:49.35495-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-51521","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:24:53.957149-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T20:24:53.991009-08:00","closed_at":"2026-01-08T20:24:53.991009-08:00","close_reason":"auto-closed session event"} {"id":"bd-51jl","title":"Feature P1","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-07T19:04:24.852171-08:00","updated_at":"2025-11-07T22:07:17.343481-08:00","closed_at":"2025-11-07T21:55:09.426728-08:00"} @@ -434,7 +432,7 @@ {"id":"bd-5nu1","title":"Mega-molecule progress support for Hanoi demo","description":"Beads-side work for million-step molecule monitoring.\n\n## Context\nTowers of Hanoi with 20 disks = 1,048,575 steps.\nNeed efficient progress queries and display guards.\n\n## Requirements\n1. bd mol progress command (summary without listing all steps)\n2. Display guards in bd mol current (detect large molecules)\n3. Efficient child count queries (already indexed)","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-31T00:52:40.474932-08:00","created_by":"gastown/crew/max","updated_at":"2025-12-31T13:08:29.656523-08:00","closed_at":"2025-12-31T13:08:29.656523-08:00","close_reason":"All children complete: mol progress command and display guards implemented"} {"id":"bd-5o9k8","title":"Review and merge PR #980: gitignore sync state files","description":"dispatched_by: beads/crew/emma\n\n## Task\nReview and merge PR #980 from peterkc.\n\n**PR**: https://github.com/steveyegge/beads/pull/980\n\n## What it does\n- Adds .sync.lock and sync_base.jsonl to GitignoreTemplate\n- Adds both patterns to requiredPatterns for bd doctor validation\n- Fixes SYNC.md documentation\n\n## Easy-win criteria met\n- Bug fix with clear scope\n- Has tests\n- Documentation fix included\n- Low risk\n\n## Instructions\n1. Clone/fetch the PR: gh pr checkout 980 --repo steveyegge/beads\n2. Run tests: go test ./cmd/bd/doctor/...\n3. Review the diff: gh pr diff 980 --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/dave","created_at":"2026-01-09T10:59:57.727774-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T11:04:54.725911-08:00","closed_at":"2026-01-09T11:04:54.725911-08:00","close_reason":"PR #980 reviewed, approved, and merged. Adds .sync.lock and sync_base.jsonl to gitignore template and required patterns for bd doctor."} {"id":"bd-5ots","title":"SearchIssues N+1 query causes context timeout with GetLabels","description":"scanIssues() calls GetLabels in a loop for every issue, causing N+1 queries and context deadline exceeded errors when used with short timeouts or in-memory databases. This is especially problematic since SearchIssues already supports label filtering via SQL WHERE clauses.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-05T19:12:02.245879-08:00","updated_at":"2025-11-05T19:22:11.668682-08:00","closed_at":"2025-11-05T19:22:11.668682-08:00"} -{"id":"bd-5owhu","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: MQ empty, 0 branches merged, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:31:56.072035-08:00","updated_at":"2026-01-10T23:31:56.072035-08:00","closed_at":"2026-01-10T23:31:56.071991-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-5owhu","depends_on_id":"bd-wisp-2j5","type":"parent-child","created_at":"2026-01-10T23:31:56.073043-08:00","created_by":"beads/refinery"}]} +{"id":"bd-5owhu","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: MQ empty, 0 branches merged, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:31:56.072035-08:00","updated_at":"2026-01-10T23:31:56.072035-08:00","closed_at":"2026-01-10T23:31:56.071991-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-5qim","title":"Optimize GetReadyWork performance - 752ms on 10K database (target: \u003c50ms)","notes":"# Performance Analysis (10K Issue Database)\n\nAnalyzed using CPU profiles from benchmark suite on Apple M2 Pro.\n\n## Operation Performance\n\n| Operation | Time | Allocations | Memory |\n|----------------------------------|---------|-------------|--------|\n| bd ready (GetReadyWork) | ~752ms | 167,466 | 16MB |\n| bd list (SearchIssues no filter) | ~11.6ms | 89,214 | 5.8MB |\n| bd list (SearchIssues filtered) | ~9.2ms | 62,365 | 3.5MB |\n| bd create (CreateIssue) | ~2.6ms | 146 | 8.6KB |\n| bd update (UpdateIssue) | ~0.32ms | 364 | 15KB |\n| bd close (UpdateIssue) | ~0.32ms | 364 | 15KB |\n\n**Target: \u003c50ms for all operations on 10K database**\n\n**Current issue: GetReadyWork is 15x over target (752ms vs 50ms)**\n\n## Root Cause\n\nGetReadyWork (internal/storage/sqlite/ready.go:90-128) uses recursive CTE to propagate blocking:\n- 65x slower than SearchIssues\n- Recalculates entire blocked issue tree on every call\n- Algorithm:\n 1. Find directly blocked issues via 'blocks' dependencies\n 2. Recursively propagate blockage to descendants (max depth: 50)\n 3. Exclude all blocked issues from results\n\n## CPU Profile Analysis\n\n- Database syscalls (pthread_cond_signal, syscall6): ~75%\n- SQLite engine overhead: inherent to recursive CTE\n- Application code (query construction): \u003c1%\n\n**Bottleneck is the recursive CTE query execution, not application code.**\n\n## Optimization Recommendations\n\n### High Impact (Likely to achieve \u003c50ms target)\n\n1. **Cache blocked issue calculation**\n - Add `blocked_issues` table updated on dependency changes\n - Trade write complexity for read speed (ready called \u003e\u003e dependency changes)\n - Eliminates recursive CTE on every read\n\n2. **Add/verify database indexes**\n ```sql\n CREATE INDEX IF NOT EXISTS idx_dependencies_blocked \n ON dependencies(issue_id, type, depends_on_id);\n CREATE INDEX IF NOT EXISTS idx_issues_status \n ON issues(status);\n ```\n\n### Medium Impact\n\n3. **Reduce allocations** (167K allocations for GetReadyWork)\n - Profile `scanIssues()` for object pooling opportunities\n - Reuse slice capacity for repeated calls\n\n### Low Impact (Not recommended)\n- Query optimization for CRUD operations (already \u003c3ms)\n- Connection pooling tuning (not showing in profiles)\n\n## Verification\n\nRun benchmarks to validate optimization:\n```bash\nmake bench-quick\ngo tool pprof -http=:8080 internal/storage/sqlite/bench-cpu-*.prof\n```\n\nProfile files automatically generated in `internal/storage/sqlite/`.","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-11-14T09:02:46.507526-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"} {"id":"bd-5r5md","title":"test","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:26:53.245563-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T19:27:06.494897-08:00","closed_at":"2026-01-10T19:27:06.494897-08:00","close_reason":"Closed"} {"id":"bd-5rj1","title":"Merge: bd-gqxd","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: bd-gqxd\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T16:40:21.707706-08:00","updated_at":"2025-12-23T19:12:08.349245-08:00","closed_at":"2025-12-23T19:12:08.349245-08:00"} @@ -487,7 +485,6 @@ {"id":"bd-6ed8","title":"Fixture Generator for Realistic Test Data","description":"Create internal/testutil/fixtures/fixtures.go with functions to generate realistic test data at scale.\n\nFunctions:\n- LargeSQLite(storage) - 10K issues, native SQLite\n- XLargeSQLite(storage) - 20K issues, native SQLite \n- LargeFromJSONL(storage) - 10K issues imported from JSONL\n- XLargeFromJSONL(storage) - 20K issues imported from JSONL\n\nData characteristics:\n- Epic hierarchies (depth 4): Epic → Feature → Task → Subtask\n- Cross-linked dependencies (tasks blocking across epics)\n- Realistic status/priority/label distribution\n- Representative assignees and temporal data\n\nImplementation:\n- Single file: internal/testutil/fixtures/fixtures.go\n- No config structs, simple direct functions\n- Seeded RNG for reproducibility\n- Reusable by both benchmarks and tests","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-13T22:22:28.233977-08:00","updated_at":"2025-11-13T22:40:19.485552-08:00","closed_at":"2025-11-13T22:40:19.485552-08:00","dependencies":[{"issue_id":"bd-6ed8","depends_on_id":"bd-3tfh","type":"blocks","created_at":"2025-11-13T22:23:58.120794-08:00","created_by":"daemon"},{"issue_id":"bd-6ed8","depends_on_id":"bd-m62x","type":"blocks","created_at":"2025-11-13T22:24:02.598071-08:00","created_by":"daemon"}]} {"id":"bd-6fe4622f","title":"Remove unreachable utility functions","description":"Several small utility functions are unreachable:\n\nFiles to clean:\n1. `internal/storage/sqlite/hash.go` - `computeIssueContentHash` (line 17)\n - Check if entire file can be deleted if only contains this function\n\n2. `internal/config/config.go` - `FileUsed` (line 151)\n - Delete unused config helper\n\n3. `cmd/bd/git_sync_test.go` - `verifyIssueOpen` (line 300)\n - Delete dead test helper\n\n4. `internal/compact/haiku.go` - `HaikuClient.SummarizeTier2` (line 81)\n - Tier 2 summarization not implemented\n - Options: implement feature OR delete method\n\nImpact: Removes 50-100 LOC depending on decisions","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.434573-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":"task"} {"id":"bd-6ffj7","title":"Issue 2 to reopen","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:11.878829-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:12.098585-08:00"} -{"id":"bd-6gclq","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:04:11.793827-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:04:11.793827-08:00","ephemeral":true} {"id":"bd-6gd","title":"Remove legacy MCP Agent Mail integration","description":"## Summary\n\nRemove the legacy MCP Agent Mail system that requires an external HTTP server. Keep the native `bd mail` system which stores messages as git-synced issues.\n\n## Background\n\nTwo mail systems exist in the codebase:\n1. **Legacy Agent Mail** (`bd message`) - External server dependency, complex setup\n2. **Native bd mail** (`bd mail`) - Built-in, git-synced, no dependencies\n\nThe legacy system causes confusion and is no longer needed. Gas Town's Town Mail will use the native `bd mail` system.\n\n## Files to Delete\n\n### CLI Command\n- [ ] `cmd/bd/message.go` - The `bd message` command implementation\n\n### MCP Integration\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail.py` - HTTP wrapper for Agent Mail server\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail_tools.py` - MCP tool definitions\n- [ ] `integrations/beads-mcp/tests/test_mail.py` - Tests for legacy mail\n\n### Documentation\n- [ ] `docs/AGENT_MAIL.md`\n- [ ] `docs/AGENT_MAIL_QUICKSTART.md`\n- [ ] `docs/AGENT_MAIL_DEPLOYMENT.md`\n- [ ] `docs/AGENT_MAIL_MULTI_WORKSPACE_SETUP.md`\n- [ ] `docs/adr/002-agent-mail-integration.md`\n\n## Code to Update\n\n- [ ] Remove `message` command registration from `cmd/bd/main.go`\n- [ ] Remove mail tool imports/registration from MCP server `__init__.py` or `server.py`\n- [ ] Check for any other references to Agent Mail in the codebase\n\n## Verification\n\n- [ ] `bd message` command no longer exists\n- [ ] `bd mail` command still works\n- [ ] MCP server starts without errors\n- [ ] Tests pass\n","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T23:04:04.099935-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-6hji","title":"Test exclusive file reservations with two agents","description":"Simulate two agents racing to claim the same issue and verify that exclusive reservations prevent collision.\n\nAcceptance Criteria:\n- Agent A reserves bd-123 → succeeds\n- Agent B tries to reserve bd-123 → fails with clear error message\n- Agent B can see who has the reservation\n- Reservation expires after TTL\n- Agent B can claim after expiration","notes":"Successfully tested file reservations:\n- Agent BrownBear reserved bd-123 → granted\n- Agent ChartreuseHill tried same → conflicts returned\n- System correctly prevents collision","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-07T22:41:59.963468-08:00","updated_at":"2025-11-08T00:03:18.004972-08:00","closed_at":"2025-11-08T00:03:18.004972-08:00","dependencies":[{"issue_id":"bd-6hji","depends_on_id":"bd-muls","type":"blocks","created_at":"2025-11-07T23:03:52.897843-08:00","created_by":"daemon"},{"issue_id":"bd-6hji","depends_on_id":"bd-27xm","type":"blocks","created_at":"2025-11-07T23:20:21.911222-08:00","created_by":"daemon"},{"issue_id":"bd-6hji","depends_on_id":"bd-spmx","type":"parent-child","created_at":"2025-11-08T00:02:47.904652-08:00","created_by":"daemon"}]} {"id":"bd-6kpc4","title":"Session ended: gt-beads-crew-giles","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-08T20:08:51.798306-08:00","created_by":"beads/crew/giles","updated_at":"2026-01-08T20:08:51.834314-08:00","closed_at":"2026-01-08T20:08:51.834314-08:00","close_reason":"auto-closed session event"} @@ -732,7 +729,7 @@ {"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-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","dependencies":[{"issue_id":"bd-9w27m","depends_on_id":"bd-wisp-ddw","type":"parent-child","created_at":"2026-01-10T20:03:47.545186-08:00","created_by":"beads/refinery"}]} +{"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-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} @@ -764,7 +761,7 @@ {"id":"bd-ag4hc","title":"Issue 1 to reopen","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:16:11.807498-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-11T18:16:12.094895-08:00"} {"id":"bd-agye","title":"Merge: quartz-1767083470444","description":"branch: polecat/quartz-1767083470444\ntarget: main\nsource_issue: quartz-1767083470444\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:36:39.737365-08:00","created_by":"beads/polecats/quartz","updated_at":"2025-12-30T00:54:59.2694-08:00","closed_at":"2025-12-30T00:54:59.2694-08:00","close_reason":"Branch polecat/quartz-1767083470444 no longer exists on remote"} {"id":"bd-ahot","title":"HANDOFF: Molecule bonding - spawn done, bond next","description":"## Context\n\nContinuing work on bd-o5xe (Molecule bonding epic).\n\n## Completed This Session\n\n- bd-mh4w: Renamed bond to spawn in mol.go\n- bd-rnnr: Added BondRef data model to types.go\n\n## Now Unblocked\n\n1. bd-o91r: Polymorphic bond command [P1]\n2. bd-iw4z: Compound visualization [P2] \n3. bd-iq19: Distill command [P2]\n\n## Key Files\n\n- cmd/bd/mol.go\n- internal/types/types.go\n\n## Next Step\n\nStart with bd-o91r. Run bd show bd-o5xe for context.","status":"closed","priority":1,"issue_type":"message","created_at":"2025-12-21T01:32:13.940757-08:00","updated_at":"2025-12-21T11:24:30.171048-08:00","closed_at":"2025-12-21T11:24:30.171048-08:00"} -{"id":"bd-aim2r","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:20:40.702333-08:00","updated_at":"2026-01-11T00:20:40.702333-08:00","closed_at":"2026-01-11T00:20:40.702288-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-aim2r","depends_on_id":"bd-wisp-1k6","type":"parent-child","created_at":"2026-01-11T00:20:40.703245-08:00","created_by":"beads/refinery"}]} +{"id":"bd-aim2r","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no branches to merge","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:20:40.702333-08:00","updated_at":"2026-01-11T00:20:40.702333-08:00","closed_at":"2026-01-11T00:20:40.702288-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-air9","title":"bd create --parent allocates colliding child IDs when child_counters not backfilled","description":"GH#728: When explicit child IDs are created (--id bd-test.1) or imported from JSONL, child_counters table isn't updated. Then --parent auto-allocation starts at 1 and collides.\n\nFix approach: Update child_counters when creating issues with explicit hierarchical IDs that match \u003cparent\u003e.\u003cn\u003e pattern.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T14:27:11.990171-08:00","updated_at":"2025-12-24T14:28:40.154864-08:00","closed_at":"2025-12-24T14:28:40.154864-08:00"} {"id":"bd-ajdv","title":"Push release v0.33.2 to remote","description":"Push the commit and tag:\n\n```bash\ngit push \u0026\u0026 git push --tags\n```\n\nVerify on GitHub that the tag appears in releases.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.762058-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-ak82y","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T18:40:33.875901-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T18:40:33.916139-08:00","closed_at":"2026-01-09T18:40:33.916139-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -848,7 +845,7 @@ {"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-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-11T20:45:40.774936-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:29:14.651109-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"} @@ -1153,7 +1150,7 @@ {"id":"bd-f8b764c9.7","title":"CLI accepts both hash IDs and aliases","description":"Update all CLI commands to accept both hash IDs (bd-af78e9a2) and aliases (#42, or just 42).\n\n## Parsing Logic\n```go\n// internal/utils/id_parser.go\nfunc ParseIssueID(input string) (issueID string, err error) {\n // Hash ID: bd-af78e9a2\n if strings.HasPrefix(input, \"bd-\") {\n return input, nil\n }\n \n // Alias: #42 or 42\n aliasStr := strings.TrimPrefix(input, \"#\")\n alias, err := strconv.Atoi(aliasStr)\n if err != nil {\n return \"\", fmt.Errorf(\"invalid issue ID: %s\", input)\n }\n \n // Resolve alias to hash ID\n return storage.GetIssueIDByAlias(alias)\n}\n```\n\n## Commands to Update\nAll commands that accept issue IDs:\n\n### 1. bd show\n```bash\nbd show bd-af78e9a2 # Hash ID\nbd show #42 # Alias\nbd show 42 # Alias (shorthand)\nbd show bd-af78e9a2 #42 # Mixed (multiple IDs)\n```\n\n### 2. bd update\n```bash\nbd update #42 --status in_progress\nbd update bd-af78e9a2 --priority 1\n```\n\n### 3. bd close\n```bash\nbd close #42 --reason \"Done\"\n```\n\n### 4. bd dep add/tree\n```bash\nbd dep add #42 #1 --type blocks\nbd dep tree bd-af78e9a2\n```\n\n### 5. bd label add/remove\n```bash\nbd label add #42 critical\n```\n\n### 6. bd merge\n```bash\nbd merge #42 #43 --into #41\n```\n\n## Display Format\nDefault to showing aliases in output:\n```bash\n$ bd list\n#1 Fix authentication bug P1 open\n#2 Add logging to daemon P2 open \n#42 Investigate jujutsu integration P3 open\n```\n\nWith `--format=hash` flag:\n```bash\n$ bd list --format=hash\nbd-af78e9a2 Fix authentication bug P1 open\nbd-e5f6a7b8 Add logging to daemon P2 open\nbd-1a2b3c4d Investigate jujutsu integration P3 open\n```\n\n## Files to Modify\n- internal/utils/id_parser.go (new)\n- cmd/bd/show.go\n- cmd/bd/update.go\n- cmd/bd/close.go\n- cmd/bd/reopen.go\n- cmd/bd/dep.go\n- cmd/bd/label.go\n- cmd/bd/merge.go\n- cmd/bd/list.go (add --format flag)\n\n## Testing\n- Test hash ID parsing\n- Test alias parsing (#42, 42)\n- Test mixed IDs in single command\n- Test error on invalid ID\n- Test alias resolution failure","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:25:06.256317-07:00","updated_at":"2025-10-31T12:32:32.609634-07:00","closed_at":"2025-10-31T12:32:32.609634-07:00","dependencies":[{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:25:06.257796-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9.10","type":"blocks","created_at":"2025-10-29T21:25:06.258307-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.7","depends_on_id":"bd-f8b764c9.8","type":"blocks","created_at":"2025-10-29T21:29:45.993274-07:00","created_by":"stevey"}]} {"id":"bd-f8b764c9.8","title":"Update JSONL format to use hash IDs","description":"Update JSONL import/export to use hash IDs, store aliases separately.\n\n## Current JSONL Format\n```jsonl\n{\"id\":\"bd-1c63eb84\",\"title\":\"Fix bug\",\"status\":\"open\",...}\n{\"id\":\"bd-9063acda\",\"title\":\"Add test\",\"status\":\"open\",...}\n```\n\n## New JSONL Format (Option A: Include Alias)\n```jsonl\n{\"id\":\"bd-af78e9a2\",\"alias\":1,\"title\":\"Fix bug\",\"status\":\"open\",...}\n{\"id\":\"bd-e5f6a7b8\",\"alias\":2,\"title\":\"Add test\",\"status\":\"open\",...}\n```\n\n## New JSONL Format (Option B: Hash ID Only)\n```jsonl\n{\"id\":\"bd-af78e9a2\",\"title\":\"Fix bug\",\"status\":\"open\",...}\n{\"id\":\"bd-e5f6a7b8\",\"title\":\"Add test\",\"status\":\"open\",...}\n```\n\nStore aliases in separate .beads/aliases.jsonl (local only, git-ignored):\n```jsonl\n{\"hash\":\"bd-af78e9a2\",\"alias\":1}\n{\"hash\":\"bd-e5f6a7b8\",\"alias\":2}\n```\n\n**Recommendation**: Option B (hash only in main JSONL)\n- Cleaner git diffs (no alias conflicts)\n- Aliases are workspace-local preference\n- Main JSONL is canonical, portable\n\n## Export Changes\nFile: cmd/bd/export.go\n```go\n// Export issues with hash IDs\nfor _, issue := range issues {\n json := marshalIssue(issue) // Uses issue.ID (hash)\n // Don't include alias in JSONL\n}\n\n// Separately export aliases to .beads/aliases.jsonl\nexportAliases(issues)\n```\n\n## Import Changes \nFile: cmd/bd/import.go, internal/importer/importer.go\n```go\n// Import issues by hash ID\nissue := unmarshalIssue(line)\n// Assign new alias on import (don't use incoming alias)\nissue.Alias = getNextAlias()\n\n// No collision detection needed! Hash IDs are globally unique\n```\n\n## Dependency Reference Format\nNo change needed - already uses issue IDs:\n```json\n{\"depends_on_id\":\"bd-af78e9a2\",\"type\":\"blocks\"}\n```\n\n## Files to Modify\n- cmd/bd/export.go (use hash IDs)\n- cmd/bd/import.go (import hash IDs, assign aliases)\n- internal/importer/importer.go (remove collision detection!)\n- .gitignore (add .beads/aliases.jsonl)\n\n## Testing\n- Test export produces hash IDs\n- Test import assigns new aliases\n- Test dependencies preserved with hash IDs\n- Test no collision detection triggered","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:47.408106-07:00","updated_at":"2025-10-31T12:32:32.609925-07:00","closed_at":"2025-10-31T12:32:32.609925-07:00","dependencies":[{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:47.409489-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9.9","type":"blocks","created_at":"2025-10-29T21:24:47.409977-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.8","depends_on_id":"bd-f8b764c9.10","type":"blocks","created_at":"2025-10-29T21:29:45.975499-07:00","created_by":"stevey"}]} {"id":"bd-f8b764c9.9","title":"Implement hash ID generation in CreateIssue","description":"Replace sequential ID generation with hash-based IDs in CreateIssue function.\n\n## Current Behavior (internal/storage/sqlite/sqlite.go)\n```go\nfunc (s *SQLiteStorage) CreateIssue(ctx context.Context, issue *types.Issue) error {\n // ID comes from auto-increment counter\n // Collisions possible across clones\n}\n```\n\n## New Behavior\n```go\nfunc (s *SQLiteStorage) CreateIssue(ctx context.Context, issue *types.Issue) error {\n // Generate hash ID if not provided\n if issue.ID == \"\" {\n issue.ID = idgen.GenerateHashID(\n issue.Title,\n issue.Description,\n time.Now(),\n s.workspaceID,\n )\n }\n \n // Assign next alias\n issue.Alias = s.getNextAlias()\n \n // Insert with hash ID + alias\n // ...\n}\n```\n\n## Workspace ID Generation\nAdd to database initialization:\n```go\n// Generate stable workspace ID (persisted in .beads/workspace_id)\nworkspaceID := getOrCreateWorkspaceID()\n```\n\nOptions for workspace ID:\n1. Hostname + random suffix\n2. UUID (random)\n3. Git remote URL hash (deterministic per repo)\n\nRecommended: Option 3 (git remote hash) for reproducibility\n\n## Hash Collision Detection\n```go\n// On insert, check for collision (unlikely but possible)\nexisting, err := s.GetIssue(ctx, issue.ID)\nif err == nil {\n // Hash collision! Add random suffix and retry\n issue.ID = issue.ID + \"-\" + randomSuffix(4)\n}\n```\n\n## Files to Create/Modify\n- internal/types/id_generator.go (new)\n- internal/storage/sqlite/sqlite.go (CreateIssue)\n- internal/storage/sqlite/workspace.go (new - workspace ID management)\n- .beads/workspace_id (new file, git-ignored)\n\n## Testing\n- Test hash ID generation is deterministic\n- Test collision detection and retry\n- Test workspace ID persistence\n- Benchmark: hash generation performance (\u003c1μs)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T21:24:29.412237-07:00","updated_at":"2025-10-31T12:32:32.610403-07:00","closed_at":"2025-10-31T12:32:32.610403-07:00","dependencies":[{"issue_id":"bd-f8b764c9.9","depends_on_id":"bd-f8b764c9","type":"parent-child","created_at":"2025-10-29T21:24:29.413417-07:00","created_by":"stevey"},{"issue_id":"bd-f8b764c9.9","depends_on_id":"bd-f8b764c9.11","type":"blocks","created_at":"2025-10-29T21:24:29.413823-07:00","created_by":"stevey"}]} -{"id":"bd-f99o2","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: Queue empty, no merges needed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:58:04.397029-08:00","updated_at":"2026-01-10T19:58:04.397029-08:00","closed_at":"2026-01-10T19:58:04.396988-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-f99o2","depends_on_id":"bd-wisp-0i7","type":"parent-child","created_at":"2026-01-10T19:58:04.397919-08:00","created_by":"beads/refinery"}]} +{"id":"bd-f99o2","title":"Digest: mol-refinery-patrol","description":"Patrol cycle: Queue empty, no merges needed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T19:58:04.397029-08:00","updated_at":"2026-01-10T19:58:04.397029-08:00","closed_at":"2026-01-10T19:58:04.396988-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-f9a1","title":"Add index usage verification test for external_ref lookups","description":"Currently we test that idx_issues_external_ref index exists, but we don't verify that it's actually being used by the query planner.\n\nProposed solution:\n- Add test using EXPLAIN QUERY PLAN\n- Verify that 'SEARCH TABLE issues USING INDEX idx_issues_external_ref' appears in plan\n- Ensures O(1) lookup performance is maintained\n\nRelated: bd-1022\nFiles: internal/storage/sqlite/external_ref_test.go:260","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-02T15:32:09.85419-08:00","updated_at":"2025-11-02T16:40:01.033779-08:00","closed_at":"2025-11-02T16:40:01.033779-08:00"} {"id":"bd-fa1q","title":"bd swarm create command","description":"Add bd swarm create to create a swarm molecule from an epic.\n\n## Context\nSwarms ARE persistent molecules - not separate JSON state. This command creates\na swarm molecule that:\n- Links to the epic it orchestrates\n- Has mol_type=swarm\n- Specifies a coordinator\n- Can be discovered by any agent\n\n## Core Principle: Discovery Over Tracking\nThe swarm molecule doesn't track step-by-step state. Instead:\n- Query bd ready --parent=\u003cepic\u003e to find the ready front\n- Query bd list --parent=\u003cepic\u003e --status=closed to find completed\n- Derive progress from children's statuses\n\n## Implementation\n1. New command: bd swarm create \u003cepic-id\u003e [--coordinator=\u003caddr\u003e]\n2. Validate epic structure first (call bd swarm validate)\n3. Create molecule bead:\n - mol_type: swarm\n - epic: \u003cepic-id\u003e\n - coordinator: \u003caddr\u003e\n - status: open\n4. Return the swarm molecule ID\n\n## Single-Issue Wrapping\nIf given a single issue (not epic), auto-wrap:\n- Create an epic with that issue as child\n- Then create swarm molecule\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Swarm Structure' section\n\n## Acceptance\n- bd swarm create \u003cepic\u003e creates a swarm molecule\n- Molecule has mol_type=swarm\n- Links to epic via epic field\n- Validates structure before creation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:35.067432-08:00","created_by":"mayor","updated_at":"2025-12-28T21:34:32.026937-08:00","closed_at":"2025-12-28T21:34:32.026937-08:00","dependencies":[{"issue_id":"bd-fa1q","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.428038-08:00","created_by":"daemon"},{"issue_id":"bd-fa1q","depends_on_id":"bd-nkqx","type":"blocks","created_at":"2025-12-28T19:11:52.446532-08:00","created_by":"daemon"}]} {"id":"bd-fa2h","title":"🤝 HANDOFF: v0.31.0 released, molecules discussion","description":"Session completed 0.31.0 release and had important molecules discussion.\n\n## Completed\n- v0.31.0 released (deferred status, audit trail, directory labels, etc.)\n- Fixed lint issues, hook version markers, codesigning\n- All CI green, artifacts verified\n\n## Filed Issues\n- bd-usro: Rename template instantiate → bd mol bond\n- bd-y8bj: Auto-detect identity for bd mail (P1 bug)\n- gt-975: Molecule execution support for polecats/crew\n- gt-976: Crew lifecycle support in Deacon\n\n## Key Insight\nMolecules are the future - TodoWrite is ephemeral, molecules are persistent institutional memory on the world chain. I tried to use TodoWrite for version bump and missed steps (codesigning, MCP verification). Molecules would have caught this.\n\n## Next Steps\n- bd mol bond implementation is priority\n- Max has gt-976 for crew lifecycle (enables automated refresh mid-molecule)\n\nCheck bd ready and gt-975/976 status.","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:23:09.889562-08:00","updated_at":"2025-12-21T17:52:18.467069-08:00","closed_at":"2025-12-21T17:52:18.467069-08:00"} @@ -1194,7 +1191,7 @@ {"id":"bd-fjth5","title":"Refactor: Use types.MaxHierarchyDepth constant for fallback default","description":"The GH#995 fix added fallback defaults in two places:\n\n- internal/storage/sqlite/hash_ids.go:58: `maxDepth = 3 // fallback default`\n- internal/storage/memory/memory.go:1606: `maxDepth = 3 // fallback default`\n\nThese duplicate the value from types.MaxHierarchyDepth (internal/types/id_generator.go:92).\n\nShould reference the constant instead of hardcoding 3 to maintain single source of truth.\n\nLow priority - cosmetic improvement.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-10T13:36:08.122138-08:00","created_by":"beads/crew/fang","updated_at":"2026-01-10T13:36:08.122138-08:00","labels":["refactor"]} {"id":"bd-fjuf","title":"Work on gt-8tmz.10: Rename Engineer in Box to Shiny. Rena...","description":"Work on gt-8tmz.10: Rename Engineer in Box to Shiny. Rename mol-engineer-in-box references to mol-shiny or just 'shiny'. Update docs and code in internal/formula/ and .beads/formulas/. When done: 1) bd close gt-8tmz.10, 2) bd sync, 3) git push, 4) gt mq submit","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:26:18.426959-08:00","updated_at":"2025-12-25T19:30:19.947382-08:00","closed_at":"2025-12-25T19:30:19.947382-08:00"} {"id":"bd-fkdw","title":"Update bash-agent example with Agent Mail integration","description":"Add Agent Mail integration to examples/bash-agent/agent.sh using curl for HTTP calls.\n\nAcceptance Criteria:\n- Health check function using curl\n- Reserve issue before claiming\n- Send notifications on status change\n- Release on completion\n- Graceful degradation if curl fails\n- No bash errors when Agent Mail unavailable\n\nFile: examples/bash-agent/agent.sh","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-07T22:42:28.722048-08:00","updated_at":"2025-11-08T01:09:25.900138-08:00","closed_at":"2025-11-08T01:09:25.900138-08:00","dependencies":[{"issue_id":"bd-fkdw","depends_on_id":"bd-m9th","type":"blocks","created_at":"2025-11-07T23:04:01.398259-08:00","created_by":"daemon"}]} -{"id":"bd-fkp68","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:37:26.823421-08:00","updated_at":"2026-01-10T23:37:26.823421-08:00","closed_at":"2026-01-10T23:37:26.823378-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-fkp68","depends_on_id":"bd-wisp-7gd","type":"parent-child","created_at":"2026-01-10T23:37:26.824301-08:00","created_by":"beads/refinery"}]} +{"id":"bd-fkp68","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:37:26.823421-08:00","updated_at":"2026-01-10T23:37:26.823421-08:00","closed_at":"2026-01-10T23:37:26.823378-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-fl9xb","title":"Review PR #960: Fix filepath.Rel sync error","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #960 (steveyegge/beads)\n\nPR: https://github.com/steveyegge/beads/pull/960\nAuthor: peterkc\nFixes: #959\n\nFixes bd sync failing with filepath.Rel error when dbPath is relative.\n- gh pr view 960 --repo steveyegge/beads\n- gh pr diff 960 --repo steveyegge/beads\n- If good: gh pr merge 960 --repo steveyegge/beads --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/giles","created_at":"2026-01-08T14:30:23.843917-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:37:19.657459-08:00","closed_at":"2026-01-08T14:37:19.657459-08:00","close_reason":"PR #960 reviewed and merged. Fix ensures dbPath is always absolute via CanonicalizePath, preventing filepath.Rel errors in sync-branch mode."} {"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} @@ -1281,7 +1278,6 @@ {"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-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-hg867","title":"Session ended: gt-beads-crew-emma","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T12:16:52.908216-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-10T12:16:52.908216-08:00","ephemeral":true} {"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} {"id":"bd-hhls3","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T22:11:30.596263-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T22:11:30.663581-08:00","closed_at":"2026-01-11T22:11:30.663581-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -1852,7 +1848,7 @@ {"id":"bd-q652","title":"Database pollution in ~/src/dave/vc: 895 issues vs canonical 310","description":"~/src/dave/vc/.beads/beads.db has 895 total issues (675 open, 149 closed), but canonical ~/src/vc/.beads/vc.db has only 310 issues (230 open). This is 585 extra issues - likely pollution from other repositories.\n\nNeed to:\n1. Identify which issues are polluted (use detect-pollution)\n2. Compare issue IDs between dave/vc and canonical vc databases\n3. Determine pollution source (beads repo? other repos?)\n4. Clean up polluted database\n5. Root cause: why did pollution occur?","notes":"Investigation findings so far:\n- Polluted DB (~/src/dave/vc/.beads/beads.db): 241 issues (180 open, 43 closed)\n- Canonical DB (~/src/vc/.beads/vc.db): 310 issues (230 open, 62 closed)\n- Contradiction: Polluted has FEWER issues, not more (241 \u003c 310, diff of 69)\n- Only 1 unique ID in polluted: vc-55fi\n- All source_repo fields are set to \".\" in both databases\n- Issue description claims 895 issues in polluted vs 310 canonical - numbers don't match current state\n- Possible: Pollution was already partially cleaned, or issue description refers to different database?","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-07T00:07:37.999168-08:00","updated_at":"2025-11-07T00:13:32.179396-08:00","closed_at":"2025-11-07T00:13:32.179396-08:00"} {"id":"bd-q7sd","title":"Test issue A","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-04T11:26:43.935609-08:00","created_by":"beads/polecats/onyx","updated_at":"2026-01-04T11:27:38.747869-08:00","closed_at":"2026-01-04T11:27:38.747869-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"bd-q7sd","depends_on_id":"bd-vuc2","type":"blocks","created_at":"2026-01-04T11:27:28.425196-08:00","created_by":"beads/polecats/onyx"}]} {"id":"bd-qci3j","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches processed, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T22:06:24.386038-08:00","updated_at":"2026-01-11T22:06:24.386038-08:00","closed_at":"2026-01-11T22:06:24.385996-08:00","close_reason":"Squashed from 11 wisps"} -{"id":"bd-qcts0","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches merged","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:15:09.28425-08:00","updated_at":"2026-01-10T22:15:09.28425-08:00","closed_at":"2026-01-10T22:15:09.282072-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-qcts0","depends_on_id":"bd-wisp-3uv","type":"parent-child","created_at":"2026-01-10T22:15:09.285194-08:00","created_by":"beads/refinery"}]} +{"id":"bd-qcts0","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, 0 branches merged","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:15:09.28425-08:00","updated_at":"2026-01-10T22:15:09.28425-08:00","closed_at":"2026-01-10T22:15:09.282072-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-qcwsy","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-12T00:16:08.290726-08:00","created_by":"beads/refinery","updated_at":"2026-01-12T00:16:08.353902-08:00","closed_at":"2026-01-12T00:16:08.353902-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-qd5w","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:37:31.393703-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:37:31.426087-08:00","closed_at":"2026-01-07T00:37:31.426087-08:00","close_reason":"auto-closed session event"} {"id":"bd-qdsx","title":"Support daemon.auto_commit and daemon.auto_push in config.yaml (GH#871)","description":"Allow team-wide auto-sync settings via config.yaml instead of SQLite. This enables teams to share auto-commit/auto-push settings through version control.","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-04T10:38:09.815971-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-04T10:42:32.823135-08:00","closed_at":"2026-01-04T10:42:32.823135-08:00","close_reason":"Fixed in 9880eaf7 - daemon.auto_* settings now in config.yaml"} @@ -1890,7 +1886,6 @@ {"id":"bd-qs4p","title":"bd import fails on duplicate external_ref with no resolution options","description":"When JSONL contains duplicate external_ref values (e.g., two issues both have external_ref='BS-170'), bd import fails entirely with no resolution options.\n\nUser must manually edit JSONL to remove duplicates, which is error-prone.\n\nExample error:\n```\nbatch import contains duplicate external_ref values:\nexternal_ref 'BS-170' appears in issues: [opal-39 opal-43]\n```\n\nShould handle this similar to duplicate issue detection - offer to merge, pick one, or clear duplicates.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-06T10:53:41.906165-08:00","updated_at":"2025-11-06T11:03:16.975041-08:00","closed_at":"2025-11-06T11:03:16.975041-08:00"} {"id":"bd-qsbn","title":"swarm status: Handle external dependencies and error cases","description":"Three issues: (1) Silent error swallowing - GetDependencyRecords errors are silently continued, but analyzeEpicForSwarm returns errors. Inconsistent. (2) External dependencies ignored - if issue depends on something outside epic thats still open, we mark it Ready incorrectly. (3) Command usage string says [epic-id] (optional) but requires exactly 1 arg. File: cmd/bd/swarm.go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:31:08.574846-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T15:44:43.363959-08:00","closed_at":"2025-12-30T00:36:28.565331-08:00","close_reason":"Fixed all three issues: (1) Made error handling consistent - analyzeEpicForSwarm now adds warnings for GetDependencyRecords failures instead of returning errors. (2) External dependencies now checked in getSwarmStatus - open external deps block issues. (3) Usage strings fixed to use \u003cepic-id\u003e instead of [epic-id] for required arguments."} {"id":"bd-qsm","title":"Auto-compact deletions during bd sync","description":"Parent: bd-imj\n\n## Task\nOptionally prune deletions manifest during sync when threshold exceeded.\n\n**Note: Opt-in feature** - disabled by default to avoid sync latency.\n\n## Implementation\n\nIn `bd sync`:\n```go\nfunc (s *Syncer) Sync() error {\n // ... existing sync logic ...\n \n // Auto-compact only if enabled\n if s.config.GetBool(\"deletions.auto_compact\", false) {\n deletionCount := deletions.Count(\".beads/deletions.jsonl\")\n threshold := s.config.GetInt(\"deletions.auto_compact_threshold\", 1000)\n \n if deletionCount \u003e threshold {\n retentionDays := s.config.GetInt(\"deletions.retention_days\", 7)\n if err := s.compactor.PruneDeletions(retentionDays); err != nil {\n log.Warnf(\"Failed to auto-compact deletions: %v\", err)\n // Non-fatal, continue sync\n }\n }\n }\n \n // ... rest of sync ...\n}\n```\n\n## Configuration\n```yaml\ndeletions:\n retention_days: 7\n auto_compact: false # Opt-in, disabled by default\n auto_compact_threshold: 1000 # Trigger when \u003e N entries (if enabled)\n```\n\n## Acceptance Criteria\n- [ ] Auto-compact disabled by default\n- [ ] Enabled via config `deletions.auto_compact: true`\n- [ ] Sync checks deletion count only when enabled\n- [ ] Auto-prunes when threshold exceeded\n- [ ] Failure is non-fatal (logged warning)\n- [ ] Test: no compaction when disabled\n- [ ] Test: compaction triggers when enabled and threshold exceeded","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-25T09:57:04.522795-08:00","updated_at":"2025-11-25T15:03:01.469629-08:00","closed_at":"2025-11-25T15:03:01.469629-08:00"} -{"id":"bd-qspi5","title":"Session ended: gt-beads-witness","status":"open","priority":2,"issue_type":"event","created_at":"2026-01-10T11:57:03.211335-08:00","created_by":"beads/witness","updated_at":"2026-01-10T11:57:03.211335-08:00","ephemeral":true} {"id":"bd-qtcgm","title":"External ref test","status":"open","priority":1,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-10T20:36:04.333898-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-10T20:36:04.333898-08:00","external_ref":"https://example.com/spec.md"} {"id":"bd-quw1","title":"Polecat phase handoff: gt done --phase-complete","description":"Add phase handoff protocol for polecats hitting gate steps.\n\n## Current Behavior\nPolecat runs all steps, blocks on external waits, times out.\n\n## New Behavior\n1. Polecat completes work up to gate step\n2. Polecat runs: gt done --phase-complete\n3. This signals: 'phase done, molecule awaiting gate'\n4. Witness recycles polecat (context freed)\n5. When gate closes, Witness dispatches new polecat\n6. New polecat continues from step after gate\n\n## Implementation\n- Add --phase-complete flag to gt done\n- Witness tracks molecules in 'awaiting-gate' state\n- When gate closes (via bd gate resolve), molecule unblocks\n- Dispatch logic resumes molecule with new polecat\n\n## Acceptance Criteria\n- [ ] gt done --phase-complete implemented\n- [ ] Witness tracks awaiting-gate molecules\n- [ ] Gate closure triggers molecule resume\n- [ ] New polecat picks up from correct step","notes":"Beads changes committed (9269325e):\n- bd gate add-waiter \u003cgate-id\u003e \u003cwaiter\u003e\n- bd gate show \u003cgate-id\u003e --json\n- Waiters field in RPC protocol\n\nGastown changes written but need separate commit (bd-gxb4):\n- gt done --phase-complete --gate flag\n- Witness PHASE_COMPLETE handler\n- AddGateWaiter in beads wrapper\n\nBlocked on bd-gxb4 for gastown commit.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.298423-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:07.769837-08:00","closed_at":"2026-01-02T16:46:55.671506-08:00","close_reason":"Complete: beads part (jasper) + gastown part (bd-gxb4/furiosa) both merged","dependencies":[{"issue_id":"bd-quw1","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.599801-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-4k3c","type":"blocks","created_at":"2026-01-02T13:28:18.665709-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-gxb4","type":"blocks","created_at":"2026-01-02T16:36:55.38367-08:00","created_by":"beads/polecats/jasper"}]} {"id":"bd-qv8f9","title":"Add logging for silent failures in cost tracking","description":"dispatched_by: mayor\n\n## Problem\n\nSeveral error paths in cost tracking silently continue without logging:\n- Line 1014: bd show failure\n- Line 1019: JSON unmarshal failure \n- Line 1037: Payload unmarshal failure\n- Line 1147: bd show failure in deletion\n\nThis makes debugging difficult when costs are not being tracked correctly.\n\n## Location\n\ninternal/cmd/costs.go - multiple locations\n\n## Solution\n\nAdd debug logging (respecting --verbose flag) for these silent failures.","status":"closed","priority":3,"issue_type":"task","assignee":"gastown/polecats/furiosa","created_at":"2026-01-08T22:55:25.275755-08:00","created_by":"mayor","updated_at":"2026-01-09T00:40:59.509492-08:00","closed_at":"2026-01-09T00:40:59.509492-08:00","close_reason":"Merged via f19ddc54","comments":[{"id":12,"issue_id":"bd-qv8f9","author":"beads/polecats/jasper","text":"The file path in the description (internal/cmd/costs.go) doesn't exist in beads/polecats/jasper. The costs.go file is located in the gastown project at /Users/stevey/gt/gastown/crew/*/internal/cmd/costs.go. This task appears to be assigned to the wrong repo - should likely be assigned to gastown instead.","created_at":"2026-01-09T08:24:45Z"}]} @@ -1995,7 +1990,7 @@ {"id":"bd-svb5","title":"GH#505: Add bd reset/wipe command","description":"Add command to cleanly reset/wipe beads database. User reports painful manual process to start fresh. See GitHub issue #505.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:42.160966-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":"feature"} {"id":"bd-swsc","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:47:07.01162-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:47:07.045436-08:00","closed_at":"2026-01-07T00:47:07.045436-08:00","close_reason":"auto-closed session event"} {"id":"bd-sxlt","title":"GHI #885: Sync failure leaves local JSONL stale, causing inconsistent state","description":"GitHub Issue #885: Sync failure leaves local JSONL stale, causing inconsistent state across worktrees\n\nhttps://github.com/steveyegge/beads/issues/885","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T11:22:16.730476-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:07.771064-08:00","closed_at":"2026-01-04T11:30:32.561965-08:00","close_reason":"Added status mismatch detection to bd doctor. When counts match but statuses differ, the check now reports detailed mismatches and suggests 'bd export' to fix."} -{"id":"bd-syp0w","title":"Digest: mol-refinery-patrol","description":"Patrol cycle complete: MQ empty, 0 branches processed, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:43:02.570883-08:00","updated_at":"2026-01-10T23:43:02.570883-08:00","closed_at":"2026-01-10T23:43:02.570847-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-syp0w","depends_on_id":"bd-wisp-1so","type":"parent-child","created_at":"2026-01-10T23:43:02.571776-08:00","created_by":"beads/refinery"}]} +{"id":"bd-syp0w","title":"Digest: mol-refinery-patrol","description":"Patrol cycle complete: MQ empty, 0 branches processed, no issues","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T23:43:02.570883-08:00","updated_at":"2026-01-10T23:43:02.570883-08:00","closed_at":"2026-01-10T23:43:02.570847-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-t10fs","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-09T01:09:18.602816-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-09T01:09:18.636511-08:00","closed_at":"2026-01-09T01:09:18.636511-08:00","close_reason":"auto-closed session event"} {"id":"bd-t17wa","title":"Fix: v0.46.0 breaks Gas Town type extraction (GH#941)","description":"dispatched_by: beads/crew/dave\n\nGitHub issue #941. Type extraction removes agent/role/convoy types that Gas Town still uses.","status":"closed","priority":1,"issue_type":"bug","assignee":"beads/crew/giles","created_at":"2026-01-09T22:20:16.468385-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-09T22:29:18.336019-08:00","closed_at":"2026-01-09T22:29:18.336019-08:00","close_reason":"Fixed: restored Gas Town types (agent, role, rig, convoy, slot) as built-in types"} {"id":"bd-t2720","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T16:44:17.146675-08:00","created_by":"beads/witness","updated_at":"2026-01-10T16:44:17.222263-08:00","closed_at":"2026-01-10T16:44:17.222263-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -2178,74 +2173,50 @@ {"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-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-0i7","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-10T19:56:49.421558-08:00","updated_at":"2026-01-10T19:56:49.421558-08:00","ephemeral":true} -{"id":"bd-wisp-19q","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-10T23:58:23.389597-08:00","updated_at":"2026-01-10T23:58:23.389597-08:00","ephemeral":true} -{"id":"bd-wisp-1k6","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-11T00:20:20.808374-08:00","updated_at":"2026-01-11T00:20:20.808374-08:00","ephemeral":true} -{"id":"bd-wisp-1so","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-10T23:41:41.981364-08:00","updated_at":"2026-01-10T23:41:41.981364-08:00","ephemeral":true} -{"id":"bd-wisp-1vo","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-11T07:50:42.376093-08:00","updated_at":"2026-01-11T07:56:05.241516-08:00","ephemeral":true} -{"id":"bd-wisp-2j5","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-10T23:30:34.741075-08:00","updated_at":"2026-01-10T23:30:34.741075-08:00","ephemeral":true} -{"id":"bd-wisp-2wh","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.33438-08:00","updated_at":"2026-01-11T14:50:43.33438-08:00","dependencies":[{"issue_id":"bd-wisp-2wh","depends_on_id":"bd-wisp-aut","type":"blocks","created_at":"2026-01-11T14:50:43.353444-08:00","created_by":"beads/refinery"}],"ephemeral":true} -{"id":"bd-wisp-3mg","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-10T22:19:51.793921-08:00","updated_at":"2026-01-10T22:19:51.793921-08:00","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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.20248-08:00","created_by":"beads/refinery"},{"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-3uv","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-10T22:14:07.606645-08:00","updated_at":"2026-01-10T22:14:07.606646-08:00","ephemeral":true} -{"id":"bd-wisp-3xy","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.333808-08:00","updated_at":"2026-01-11T14:50:43.333808-08:00","dependencies":[{"issue_id":"bd-wisp-3xy","depends_on_id":"bd-wisp-fbz","type":"blocks","created_at":"2026-01-11T14:50:43.350297-08:00","created_by":"beads/refinery"}],"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-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":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.19797-08:00","updated_at":"2026-01-12T01:27:11.19797-08:00","dependencies":[{"issue_id":"bd-wisp-4tc","depends_on_id":"bd-wisp-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.214806-08:00","created_by":"beads/refinery"},{"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-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-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-5yc","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332356-08:00","updated_at":"2026-01-11T14:50:43.332356-08:00","dependencies":[{"issue_id":"bd-wisp-5yc","depends_on_id":"bd-wisp-apf","type":"blocks","created_at":"2026-01-11T14:50:43.344514-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-734","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332954-08:00","updated_at":"2026-01-11T14:50:43.332954-08:00","dependencies":[{"issue_id":"bd-wisp-734","depends_on_id":"bd-wisp-a9e","type":"blocks","created_at":"2026-01-11T14:50:43.346397-08:00","created_by":"beads/refinery"}],"ephemeral":true} -{"id":"bd-wisp-7gd","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-10T23:36:16.074525-08:00","updated_at":"2026-01-10T23:36:16.074525-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-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-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} -{"id":"bd-wisp-9go","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-12T00:34:44.781374-08:00","updated_at":"2026-01-12T00:35:38.423724-08:00","closed_at":"2026-01-12T00:35:38.423724-08:00","close_reason":"Burning wisp - queue empty, awaiting instructions","dependencies":[{"issue_id":"bd-wisp-9go","depends_on_id":"bd-wisp-qx6","type":"blocks","created_at":"2026-01-12T00:34:44.825728-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"id":"bd-wisp-9jo","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-06T20:07:32.256572-08:00","updated_at":"2026-01-06T20:08:55.146264-08:00","closed_at":"2026-01-06T20:08:55.146264-08:00","close_reason":"Reviewed 34 commits since v0.44.0","dependencies":[{"issue_id":"bd-wisp-9jo","depends_on_id":"bd-wisp-z85","type":"blocks","created_at":"2026-01-06T20:07:32.273034-08:00","created_by":"beads/crew/dave"}]} -{"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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.200757-08:00","created_by":"beads/refinery"},{"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-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-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-a9e","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.332659-08:00","updated_at":"2026-01-11T14:50:43.332659-08:00","dependencies":[{"issue_id":"bd-wisp-a9e","depends_on_id":"bd-wisp-5yc","type":"blocks","created_at":"2026-01-11T14:50:43.3454-08:00","created_by":"beads/refinery"}],"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-aut","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.334099-08:00","updated_at":"2026-01-11T14:50:43.334099-08:00","dependencies":[{"issue_id":"bd-wisp-aut","depends_on_id":"bd-wisp-3xy","type":"blocks","created_at":"2026-01-11T14:50:43.351822-08:00","created_by":"beads/refinery"}],"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-c3g","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-10T22:51:49.272262-08:00","updated_at":"2026-01-10T22:51:49.272262-08:00","ephemeral":true} -{"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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.204158-08:00","created_by":"beads/refinery"},{"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-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-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-da9","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-10T23:02:52.077365-08:00","updated_at":"2026-01-10T23:04:32.545374-08:00","ephemeral":true} -{"id":"bd-wisp-ddw","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-10T20:02:17.906528-08:00","updated_at":"2026-01-10T20:02:17.906528-08:00","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-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-fbz","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.33352-08:00","updated_at":"2026-01-11T14:50:43.33352-08:00","dependencies":[{"issue_id":"bd-wisp-fbz","depends_on_id":"bd-wisp-kkf","type":"blocks","created_at":"2026-01-11T14:50:43.348874-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"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-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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.209265-08:00","created_by":"beads/refinery"},{"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-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-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":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.197674-08:00","updated_at":"2026-01-12T01:27:11.197674-08:00","dependencies":[{"issue_id":"bd-wisp-i7d","depends_on_id":"bd-wisp-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.212933-08:00","created_by":"beads/refinery"},{"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-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-kkf","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":"open","priority":2,"issue_type":"task","created_at":"2026-01-11T14:50:43.333236-08:00","updated_at":"2026-01-11T14:50:43.333236-08:00","dependencies":[{"issue_id":"bd-wisp-kkf","depends_on_id":"bd-wisp-734","type":"blocks","created_at":"2026-01-11T14:50:43.347585-08:00","created_by":"beads/refinery"}],"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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.205811-08:00","created_by":"beads/refinery"},{"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-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.207456-08:00","created_by":"beads/refinery"},{"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-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":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.197367-08:00","updated_at":"2026-01-12T01:27:11.197367-08:00","dependencies":[{"issue_id":"bd-wisp-pyf","depends_on_id":"bd-wisp-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.211067-08:00","created_by":"beads/refinery"},{"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","dependencies":[{"issue_id":"bd-wisp-q7n","depends_on_id":"bd-wisp-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.198692-08:00","created_by":"beads/refinery"}],"ephemeral":true} -{"id":"bd-wisp-qm8","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-10T20:51:46.780686-08:00","updated_at":"2026-01-10T20:51:46.780686-08:00","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-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-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":"open","priority":2,"issue_type":"task","created_at":"2026-01-12T01:27:11.198268-08:00","updated_at":"2026-01-12T01:27:11.198268-08:00","dependencies":[{"issue_id":"bd-wisp-tno","depends_on_id":"bd-wisp-vxv","type":"parent-child","created_at":"2026-01-12T01:27:11.216657-08:00","created_by":"beads/refinery"},{"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} +{"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} {"id":"bd-wisp-u9o","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.45.0\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":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.258324-08:00","updated_at":"2026-01-06T20:17:28.463543-08:00","closed_at":"2026-01-06T20:17:28.463543-08:00","close_reason":"Release workflow completed successfully","dependencies":[{"issue_id":"bd-wisp-u9o","depends_on_id":"bd-wisp-99t","type":"blocks","created_at":"2026-01-06T20:07:32.268008-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-wisp-u9o","depends_on_id":"bd-wisp-84x","type":"blocks","created_at":"2026-01-06T20:07:32.281571-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-uvd","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-10T17:57:56.356923-08:00","updated_at":"2026-01-10T18:01:38.662587-08:00","closed_at":"2026-01-10T18:01:38.662587-08:00","close_reason":"Patrol: queue empty, no branches to merge","ephemeral":true} {"id":"bd-wisp-v0n","title":"Verify version consistency","description":"Confirm all versions match 0.45.0.\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.45.0.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257354-08:00","updated_at":"2026-01-06T20:11:24.898472-08:00","closed_at":"2026-01-06T20:11:24.898472-08:00","close_reason":"Version bumped and verified: 0.45.0","dependencies":[{"issue_id":"bd-wisp-v0n","depends_on_id":"bd-wisp-bye","type":"blocks","created_at":"2026-01-06T20:07:32.276314-08:00","created_by":"beads/crew/dave"}]} -{"id":"bd-wisp-vgq","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-11T14:50:43.334659-08:00","updated_at":"2026-01-11T14:50:43.334659-08:00","dependencies":[{"issue_id":"bd-wisp-vgq","depends_on_id":"bd-wisp-2wh","type":"blocks","created_at":"2026-01-11T14:50:43.355144-08:00","created_by":"beads/refinery"}],"ephemeral":true} {"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-vxv","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:27:11.194537-08:00","updated_at":"2026-01-12T01:27:11.194537-08:00","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-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"}]} @@ -2342,9 +2313,9 @@ {"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","dependencies":[{"issue_id":"bd-yi824","depends_on_id":"bd-wisp-3mg","type":"parent-child","created_at":"2026-01-10T22:21:14.47851-08:00","created_by":"beads/refinery"}]} +{"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-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","dependencies":[{"issue_id":"bd-yjer4","depends_on_id":"bd-wisp-19q","type":"parent-child","created_at":"2026-01-11T00:00:07.780798-08:00","created_by":"beads/refinery"}]} +{"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} {"id":"bd-ykd9","title":"Add bd doctor --fix flag to automatically repair issues","description":"Add bd doctor --fix flag to automatically repair detected issues.\n\n## Current State\n- Doctor checks return issues with \"Fix\" field containing fix instructions\n- No automatic fix execution\n- User must manually follow fix instructions\n\n## Implementation\n\n### 1. Add --fix flag to doctor.go\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().Bool(\"fix\", false, \"Automatically fix detected issues\")\ndoctorCmd.Flags().Bool(\"yes\", false, \"Skip confirmation prompts (use with --fix)\")\n```\n\n### 2. Create fix registry (cmd/bd/doctor/fix/registry.go)\n```go\npackage fix\n\n// Fixer can automatically repair an issue\ntype Fixer interface {\n // CanFix returns true if this fixer handles the given check name\n CanFix(checkName string) bool\n // Fix attempts to repair the issue, returns error if failed\n Fix(ctx context.Context, issue *CheckResult) error\n // Description returns human-readable description of what will be fixed\n Description() string\n}\n\nvar registry []Fixer\n\nfunc Register(f Fixer) {\n registry = append(registry, f)\n}\n\nfunc GetFixer(checkName string) Fixer {\n for _, f := range registry {\n if f.CanFix(checkName) {\n return f\n }\n }\n return nil\n}\n```\n\n### 3. Implement fixers (one per file)\n\n**cmd/bd/doctor/fix/hooks.go**\n```go\ntype HooksFixer struct{}\n\nfunc (f *HooksFixer) CanFix(name string) bool {\n return name == \"git-hooks\" || name == \"hooks-outdated\"\n}\n\nfunc (f *HooksFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return hooks.Install(\".\", true) // force reinstall\n}\n\nfunc (f *HooksFixer) Description() string {\n return \"Reinstall git hooks\"\n}\n\nfunc init() {\n Register(\u0026HooksFixer{})\n}\n```\n\n**cmd/bd/doctor/fix/sync_branch.go**\n```go\ntype SyncBranchFixer struct{}\n\nfunc (f *SyncBranchFixer) CanFix(name string) bool {\n return name == \"sync-branch-missing\" || name == \"sync-branch-diverged\"\n}\n\nfunc (f *SyncBranchFixer) Fix(ctx context.Context, issue *CheckResult) error {\n // Reset to remote or create branch\n return syncbranch.ResetToRemote(ctx, repoRoot, branch, jsonlPath)\n}\n```\n\n**cmd/bd/doctor/fix/merge_driver.go**\n```go\ntype MergeDriverFixer struct{}\n\nfunc (f *MergeDriverFixer) CanFix(name string) bool {\n return name == \"merge-driver-missing\" || name == \"merge-driver-outdated\"\n}\n\nfunc (f *MergeDriverFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return setupMergeDriver()\n}\n```\n\n### 4. Update doctor run logic\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n issues := runAllChecks()\n \n if \\!fixFlag {\n // Existing behavior - just display issues\n displayIssues(issues)\n return\n }\n \n // Collect fixable issues\n var fixable []FixableIssue\n for _, issue := range issues {\n if fixer := fix.GetFixer(issue.CheckName); fixer \\!= nil {\n fixable = append(fixable, FixableIssue{issue, fixer})\n }\n }\n \n if len(fixable) == 0 {\n fmt.Println(\"No automatically fixable issues found\")\n return\n }\n \n // Show what will be fixed\n fmt.Printf(\"Found %d fixable issues:\\n\", len(fixable))\n for i, f := range fixable {\n fmt.Printf(\" %d. [%s] %s\\n\", i+1, f.Issue.CheckName, f.Fixer.Description())\n }\n \n // Confirm unless --yes\n if \\!yesFlag {\n fmt.Print(\"\\nProceed with fixes? [Y/n] \")\n // ... read confirmation\n }\n \n // Apply fixes\n for _, f := range fixable {\n fmt.Printf(\"Fixing %s... \", f.Issue.CheckName)\n if err := f.Fixer.Fix(ctx, f.Issue); err \\!= nil {\n fmt.Printf(\"FAILED: %v\\n\", err)\n } else {\n fmt.Println(\"OK\")\n }\n }\n}\n```\n\n## Fixable Checks (Initial Set)\n\n| Check | Fixer | Action |\n|-------|-------|--------|\n| git-hooks | HooksFixer | Reinstall hooks |\n| hooks-outdated | HooksFixer | Update hooks |\n| merge-driver-missing | MergeDriverFixer | Configure merge driver |\n| sync-branch-diverged | SyncBranchFixer | Reset to remote |\n| daemon-version-mismatch | DaemonFixer | Restart daemon |\n\n## Testing\n```bash\n# Test with broken hooks\nrm .git/hooks/pre-commit\nbd doctor --fix --yes\n\n# Verify fix applied\nbd doctor # Should pass now\n```\n\n## Success Criteria\n- --fix flag triggers automatic repair\n- User prompted for confirmation (unless --yes)\n- Clear output showing what was fixed\n- Graceful handling of fix failures\n- At least 5 common issues auto-fixable","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-14T18:17:48.411264-08:00","updated_at":"2025-12-23T13:34:05.646445-08:00","closed_at":"2025-12-23T13:34:05.646445-08:00","dependencies":[{"issue_id":"bd-ykd9","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.732505-08:00","created_by":"daemon"}]} @@ -2400,7 +2371,7 @@ {"id":"bd-ziy5","title":"GH#409: bd init uses issues.jsonl but docs say beads.jsonl","description":"bd init creates config referencing issues.jsonl but README/docs reference beads.jsonl as canonical. Standardize naming. See GitHub issue #409.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:58.109954-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-zj8e","title":"Performance Testing Documentation","description":"Create docs/performance-testing.md documenting the performance testing framework.\n\nSections:\n1. Overview - What the framework does, goals\n2. Running Benchmarks\n - make bench command\n - Running specific benchmarks\n - Interpreting output (ns/op, allocs/op)\n3. Profiling and Analysis\n - Viewing CPU profiles with pprof\n - Reading flamegraphs\n - Memory profiling\n - Finding hotspots\n4. User Diagnostics\n - bd doctor --perf usage\n - Sharing profiles with bug reports\n - Understanding the report output\n5. Comparing Performance\n - Using benchstat for before/after comparisons\n - Detecting regressions\n6. Tips for Optimization\n - Common patterns\n - When to profile vs benchmark\n\nStyle:\n- Concise, practical examples\n- Screenshots/examples of pprof output\n- Clear command-line examples\n- Focus on workflow, not theory","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-13T22:23:38.99897-08:00","updated_at":"2025-12-09T18:38:37.709875872-05:00","closed_at":"2025-11-28T23:37:52.227831-08:00"} {"id":"bd-zkl","title":"Add tests for daemon vs non-daemon parity in list filters","description":"After bd-o43 RPC integration, we need tests to verify daemon mode behaves identically to direct mode for all new filter flags.\n\nTest coverage needed:\n- Pattern matching: --title-contains, --desc-contains, --notes-contains\n- Date ranges: all 6 date filter flags (created/updated/closed after/before)\n- Empty/null checks: --empty-description, --no-assignee, --no-labels\n- Priority ranges: --priority-min, --priority-max\n- Status normalization: --status all vs no status flag\n- Date parsing: YYYY-MM-DD, RFC3339, and error cases\n- Backward compat: deprecated --label flag still works\n\nOracle review findings (bd-o43):\n- Date parsing should support multiple formats\n- Status 'all' should be treated as unset\n- NoLabels field was missing from RPC protocol\n- Error messages should be clear and actionable\n\nTest approach:\n- Create RPC integration tests in internal/rpc/server_issues_epics_test.go\n- Compare daemon client.List() vs direct store.SearchIssues() for same filters\n- Verify error messages match between modes\n- Test with real daemon instance, not just unit tests","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T00:43:53.369457-08:00","updated_at":"2025-11-05T00:55:31.318526-08:00","closed_at":"2025-11-05T00:55:31.318526-08:00","dependencies":[{"issue_id":"bd-zkl","depends_on_id":"bd-o43","type":"discovered-from","created_at":"2025-11-05T00:43:53.371274-08:00","created_by":"daemon"}]} -{"id":"bd-zl8zr","title":"Digest: mol-refinery-patrol","description":"Patrol: MQ empty, synced main to a731f5a4 (5 commits), no merges","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:54:02.689607-08:00","updated_at":"2026-01-10T22:54:02.689607-08:00","closed_at":"2026-01-10T22:54:02.689567-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-zl8zr","depends_on_id":"bd-wisp-c3g","type":"parent-child","created_at":"2026-01-10T22:54:02.690431-08:00","created_by":"beads/refinery"}]} +{"id":"bd-zl8zr","title":"Digest: mol-refinery-patrol","description":"Patrol: MQ empty, synced main to a731f5a4 (5 commits), no merges","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:54:02.689607-08:00","updated_at":"2026-01-10T22:54:02.689607-08:00","closed_at":"2026-01-10T22:54:02.689567-08:00","close_reason":"Squashed from 11 wisps"} {"id":"bd-zlef","title":"bd repair command: fix orphaned foreign key refs","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-29T12:31:11.881702-08:00","created_by":"stevey","updated_at":"2025-12-29T12:33:47.159658-08:00","closed_at":"2025-12-29T12:33:47.159658-08:00"} {"id":"bd-zmmy","title":"bd ready resolves external dependencies","description":"Extend bd ready to check external blocked_by references:\n\n1. Parse external:\u003cproject\u003e:\u003ccapability\u003e from blocked_by\n2. Look up project path from external_projects config\n3. Check if target project has provides:\u003ccapability\u003e label on a closed issue\n4. If not satisfied, issue is blocked\n\nExample output:\n```bash\nbd ready\n# gt-xyz: blocked by external:beads:mol-run-assignee (not provided)\n# gt-abc: ready\n```\n\nDepends on: bd-om4a (external: prefix), bd-66w1 (config)\n\nPart of cross-project dependency system.\nSee: gastown/docs/cross-project-deps.md","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:37:50.03794-08:00","updated_at":"2025-12-21T23:42:25.042402-08:00","closed_at":"2025-12-21T23:42:25.042402-08:00","dependencies":[{"issue_id":"bd-zmmy","depends_on_id":"bd-om4a","type":"blocks","created_at":"2025-12-21T22:38:38.106657-08:00","created_by":"daemon"},{"issue_id":"bd-zmmy","depends_on_id":"bd-66w1","type":"blocks","created_at":"2025-12-21T22:38:38.175633-08:00","created_by":"daemon"}]} {"id":"bd-znyw","title":"Change default JSONL filename from beads.jsonl back to issues.jsonl throughout codebase","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-21T23:27:07.137649-08:00","updated_at":"2025-11-21T23:34:05.029974-08:00","closed_at":"2025-11-21T23:34:05.029974-08:00"}