bd sync: 2025-12-28 16:18:10

This commit is contained in:
Steve Yegge
2025-12-28 16:18:10 -08:00
parent 09876fff99
commit 5d540c4385

View File

@@ -27,7 +27,7 @@
{"id":"bd-1pr6","title":"Time-dependent worktree detection tests may be flaky","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-26T01:21:22.065353-08:00","updated_at":"2025-12-26T01:21:22.065353-08:00"}
{"id":"bd-1ri4","title":"Test prefix bd-","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.240483-08:00","created_by":"stevey","updated_at":"2025-12-27T14:24:50.419881-08:00","deleted_at":"2025-12-27T14:24:50.419881-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
{"id":"bd-1slh","title":"Investigate charmbracelet-based TUI for beads","description":"Now that we've merged the create-form command (PR #603) which uses charmbracelet/huh, investigate whether beads should have a more comprehensive TUI.\n\nConsiderations:\n- Should this be in core or a separate binary (bd-tui)?\n- What functionality would benefit from a TUI? (list view, issue details, search, bulk operations)\n- Plugin/extension architecture vs build tags vs separate binary\n- Dependency cost vs user experience tradeoff\n- Target audience: humans who want interactive workflows vs CLI/scripting users\n\nRelated: PR #603 added charmbracelet/huh dependency for create-form command.","notes":"Foundation is in place (lipgloss, huh), but not a priority right now","status":"deferred","priority":3,"issue_type":"feature","created_at":"2025-12-17T14:20:51.503563-08:00","updated_at":"2025-12-20T23:31:34.354023-08:00"}
{"id":"bd-1tkd","title":"Code smell: ComputeContentHash() is 100+ lines of repetitive code","description":"attached_args: Refactor ComputeContentHash repetitive code\n\nThe ComputeContentHash() method in internal/types/types.go (lines 87-190) is over 100 lines of repetitive code:\n\n```go\nh.Write([]byte(i.Title))\nh.Write([]byte{0}) // separator\nh.Write([]byte(i.Description))\nh.Write([]byte{0})\nh.Write([]byte(i.Design))\n// ... repeated 40+ times\n```\n\nConsider:\n1. Using reflection to iterate over struct fields tagged for hashing\n2. Creating a helper function that takes field name and value\n3. Using a slice of fields to hash and iterating over it\n4. At minimum, extracting the repetitive pattern into a helper\n\nLocation: internal/types/types.go:87-190","acceptance_criteria":"1. ComputeContentHash() refactored to reduce repetition\n2. Helper function or data-driven approach replaces repetitive h.Write() calls\n3. Hash output unchanged for same input (backwards compatible)\n4. All existing tests pass: go test ./internal/types/...\n5. Benchmark shows no significant performance regression","status":"pinned","priority":3,"issue_type":"chore","assignee":"gt-beads-toast","created_at":"2025-12-28T15:31:55.514941-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:02:15.871379-08:00","dependencies":[{"issue_id":"bd-1tkd","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.204723-08:00","created_by":"daemon"}]}
{"id":"bd-1tkd","title":"Code smell: ComputeContentHash() is 100+ lines of repetitive code","description":"attached_args: Refactor ComputeContentHash repetitive code\n\nThe ComputeContentHash() method in internal/types/types.go (lines 87-190) is over 100 lines of repetitive code:\n\n```go\nh.Write([]byte(i.Title))\nh.Write([]byte{0}) // separator\nh.Write([]byte(i.Description))\nh.Write([]byte{0})\nh.Write([]byte(i.Design))\n// ... repeated 40+ times\n```\n\nConsider:\n1. Using reflection to iterate over struct fields tagged for hashing\n2. Creating a helper function that takes field name and value\n3. Using a slice of fields to hash and iterating over it\n4. At minimum, extracting the repetitive pattern into a helper\n\nLocation: internal/types/types.go:87-190","acceptance_criteria":"1. ComputeContentHash() refactored to reduce repetition\n2. Helper function or data-driven approach replaces repetitive h.Write() calls\n3. Hash output unchanged for same input (backwards compatible)\n4. All existing tests pass: go test ./internal/types/...\n5. Benchmark shows no significant performance regression","status":"closed","priority":3,"issue_type":"chore","assignee":"gt-beads-toast","created_at":"2025-12-28T15:31:55.514941-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:10:21.307593-08:00","closed_at":"2025-12-28T16:10:21.307593-08:00","close_reason":"Refactoring complete. hashFieldWriter helper replaces 100+ lines of repetitive h.Write() with clean typed methods. All tests pass.","dependencies":[{"issue_id":"bd-1tkd","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.204723-08:00","created_by":"daemon"}]}
{"id":"bd-1tw","title":"Fix G104 errors unhandled in internal/storage/sqlite/queries.go:1186","description":"Linting issue: G104: Errors unhandled (gosec) at internal/storage/sqlite/queries.go:1186:2. Error: rows.Close()","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:13.051671889-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"}
{"id":"bd-20j","title":"sync branch not match config","description":"./bd sync\n→ Exporting pending changes to JSONL...\n→ No changes to commit\n→ Pulling from sync branch 'gh-386'...\nError pulling from sync branch: failed to create worktree: failed to create worktree parent directory: mkdir /var/home/matt/dev/beads/worktree-db-fail/.git: not a directory\nmatt@blufin-framation ~/d/b/worktree-db-fail (worktree-db-fail) [1]\u003e bd config list\n\nConfiguration:\n auto_compact_enabled = false\n compact_batch_size = 50\n compact_model = claude-3-5-haiku-20241022\n compact_parallel_workers = 5\n compact_tier1_days = 30\n compact_tier1_dep_levels = 2\n compact_tier2_commits = 100\n compact_tier2_days = 90\n compact_tier2_dep_levels = 5\n compaction_enabled = false\n issue_prefix = worktree-db-fail\n sync.branch = worktree-db-fail","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-08T06:49:04.449094018-07:00","updated_at":"2025-12-08T06:49:04.449094018-07:00"}
{"id":"bd-28db","title":"Add 'bd status' command for issue database overview","description":"Implement a bd status command that provides a quick snapshot of the issue database state, similar to how git status shows working tree state.\n\nExpected output: Show summary including counts by state (open, in-progress, blocked, closed), recent activity (last 7 days), and quick overview without needing multiple queries.\n\nExample output showing issue counts, recent activity stats, and pointer to bd list for details.\n\nProposed options: --all (show all issues), --assigned (show issues assigned to current user), --json (JSON format output)\n\nUse cases: Quick project health check, onboarding for new contributors, integration with shell prompts or CI/CD, daily standup reference","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-02T17:25:59.203549-08:00","updated_at":"2025-12-21T17:54:00.205191-08:00","closed_at":"2025-12-21T17:54:00.205191-08:00","close_reason":"Already implemented - bd status shows summary and activity"}
@@ -100,7 +100,7 @@
{"id":"bd-5e9q","title":"Add backwards-compatible aliases and deprecation warnings","description":"## Task\nEnsure backwards compatibility by adding hidden aliases for all moved commands.\n\n## Implementation\n\n### Create aliases.go\nNew file to centralize alias management:\n```go\npackage main\n\nimport (\n \"fmt\"\n \"os\"\n \n \"github.com/spf13/cobra\"\n)\n\n// Deprecated command aliases for backwards compatibility\n// These will be removed in v0.XX.0\n\nfunc init() {\n // migrate-* → migrate *\n addDeprecatedAlias(\"migrate-hash-ids\", \"migrate hash-ids\")\n addDeprecatedAlias(\"migrate-issues\", \"migrate issues\")\n addDeprecatedAlias(\"migrate-sync\", \"migrate sync\")\n addDeprecatedAlias(\"migrate-tombstones\", \"migrate tombstones\")\n \n // top-level → admin *\n addDeprecatedAlias(\"cleanup\", \"admin cleanup\")\n addDeprecatedAlias(\"compact\", \"admin compact\")\n addDeprecatedAlias(\"reset\", \"admin reset\")\n \n // top-level → formula *\n addDeprecatedAlias(\"cook\", \"formula cook\")\n}\n\nfunc addDeprecatedAlias(old, new string) {\n cmd := \u0026cobra.Command{\n Use: old,\n Hidden: true,\n Run: func(cmd *cobra.Command, args []string) {\n fmt.Fprintf(os.Stderr, \"⚠️ '%s' is deprecated, use '%s' instead\\n\", old, new)\n // Forward execution to new command\n },\n }\n rootCmd.AddCommand(cmd)\n}\n```\n\n### Deprecation behavior\n1. First release: Show warning, execute command\n2. One release later: Show warning, still execute\n3. Third release: Remove aliases entirely\n\n## Files to create\n- cmd/bd/aliases.go\n\n## Files to modify \n- cmd/bd/main.go (ensure aliases loaded)\n","status":"closed","priority":2,"issue_type":"task","assignee":"opal","created_at":"2025-12-27T15:11:33.54574-08:00","created_by":"mayor","updated_at":"2025-12-27T16:06:08.157887-08:00","closed_at":"2025-12-27T16:06:08.157887-08:00","close_reason":"Added aliases.go with infrastructure for backwards-compatible command aliases. Aliases only activate after commands are moved to their new locations.","pinned":true}
{"id":"bd-5exm","title":"Merge: bd-49kw","description":"branch: polecat/nux\ntarget: main\nsource_issue: bd-49kw\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:43:23.156375-08:00","updated_at":"2025-12-23T21:21:57.693169-08:00","closed_at":"2025-12-23T21:21:57.693169-08:00","close_reason":"stale - no code pushed"}
{"id":"bd-5hrq","title":"bd doctor: detect issues referenced in commits but still open","description":"Add a doctor check that finds 'orphaned' issues - ones referenced in git commit messages (e.g., 'fix bug (bd-xxx)') but still marked as open in beads.\n\n**Detection logic:**\n1. Get all open issue IDs from beads\n2. Parse git log for issue ID references matching pattern \\(prefix-[a-z0-9.]+\\)\n3. Report issues that appear in commits but are still open\n\n**Output:**\n⚠ Warning: N issues referenced in commits but still open\n bd-xxx: 'Issue title' (commit abc123)\n bd-yyy: 'Issue title' (commit def456)\n \n These may be implemented but not closed. Run 'bd show \u003cid\u003e' to check.\n\n**Implementation:**\n- Add check to doctor/checks.go\n- Use git log parsing (already have git utilities)\n- Match against configured issue_prefix","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-21T21:48:08.473165-08:00","updated_at":"2025-12-21T21:55:37.795109-08:00","closed_at":"2025-12-21T21:55:37.795109-08:00","close_reason":"Implemented CheckOrphanedIssues in git.go with 8 test cases. Detects issues referenced in commits (e.g., 'fix bug (bd-xxx)') that are still open. Shows warning with issue IDs and commit hashes."}
{"id":"bd-5l59","title":"Code smell: Issue struct is a God Object (50+ fields)","description":"attached_args: Refactor Issue struct God Object\n\nThe Issue struct in internal/types/types.go has 50+ fields covering many different concerns:\n\n- Basic issue tracking (ID, Title, Description, Status, Priority)\n- Messaging/communication (Sender, Ephemeral, etc.)\n- Agent identity (HookBead, RoleBead, AgentState, RoleType, Rig)\n- Gate/async coordination (AwaitType, AwaitID, Timeout, Waiters)\n- Source tracing (SourceFormula, SourceLocation)\n- HOP validation/entities (Creator, Validations)\n- Compaction (CompactionLevel, CompactedAt, OriginalSize)\n- Tombstones (DeletedAt, DeletedBy, DeleteReason)\n\nConsider:\n1. Extracting field groups into embedded structs (e.g., AgentFields, GateFields)\n2. Using composition pattern to make the struct more modular\n3. At minimum, grouping related fields together with section comments\n\nLocation: internal/types/types.go:12-82","acceptance_criteria":"1. Related fields grouped with clear section comments (e.g., // Agent identity fields)\n2. Consider extracting into embedded structs if grouping reveals clean boundaries\n3. All existing tests pass: go test ./internal/types/...\n4. ComputeContentHash() still works correctly after any struct changes\n5. JSON serialization unchanged (no breaking changes to JSONL format)","status":"pinned","priority":3,"issue_type":"chore","assignee":"gt-beads-furiosa","created_at":"2025-12-28T15:31:34.021236-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T15:57:07.884245-08:00","dependencies":[{"issue_id":"bd-5l59","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.187103-08:00","created_by":"daemon"}]}
{"id":"bd-5l59","title":"Code smell: Issue struct is a God Object (50+ fields)","description":"attached_args: Refactor Issue struct God Object\n\nThe Issue struct in internal/types/types.go has 50+ fields covering many different concerns:\n\n- Basic issue tracking (ID, Title, Description, Status, Priority)\n- Messaging/communication (Sender, Ephemeral, etc.)\n- Agent identity (HookBead, RoleBead, AgentState, RoleType, Rig)\n- Gate/async coordination (AwaitType, AwaitID, Timeout, Waiters)\n- Source tracing (SourceFormula, SourceLocation)\n- HOP validation/entities (Creator, Validations)\n- Compaction (CompactionLevel, CompactedAt, OriginalSize)\n- Tombstones (DeletedAt, DeletedBy, DeleteReason)\n\nConsider:\n1. Extracting field groups into embedded structs (e.g., AgentFields, GateFields)\n2. Using composition pattern to make the struct more modular\n3. At minimum, grouping related fields together with section comments\n\nLocation: internal/types/types.go:12-82","acceptance_criteria":"1. Related fields grouped with clear section comments (e.g., // Agent identity fields)\n2. Consider extracting into embedded structs if grouping reveals clean boundaries\n3. All existing tests pass: go test ./internal/types/...\n4. ComputeContentHash() still works correctly after any struct changes\n5. JSON serialization unchanged (no breaking changes to JSONL format)","status":"pinned","priority":3,"issue_type":"chore","assignee":"gt-beads-toast","created_at":"2025-12-28T15:31:34.021236-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:16:46.442736-08:00","dependencies":[{"issue_id":"bd-5l59","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.187103-08:00","created_by":"daemon"}]}
{"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-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","close_reason":"Stale merge-requests from orphaned polecat branches - refinery not processing"}
{"id":"bd-5s91","title":"CLI API Audit for OSS Launch","description":"Comprehensive CLI API audit before OSS launch.\n\n## Tasks\n1. Review gt command groupings - propose consolidation\n2. Review bd command groupings \n3. Document gt vs bd ownership boundaries\n4. Identify naming inconsistencies\n5. Document flag vs subcommand criteria\n\n## Context\n- Pre-OSS launch cleanup\n- Goal: clean, consistent, discoverable CLI surface","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-25T00:15:41.355013-08:00","updated_at":"2025-12-25T13:26:25.587476-08:00","closed_at":"2025-12-25T13:26:25.587476-08:00","close_reason":"Completed"}
@@ -170,17 +170,17 @@
{"id":"bd-8x3w","title":"Add composite index (issue_id, type) on dependencies table","description":"GetBlockedIssues uses EXISTS clauses that filter by issue_id AND type together.\n\n**Query pattern (ready.go:427-429):**\n```sql\nEXISTS (\n SELECT 1 FROM dependencies d2\n WHERE d2.issue_id = i.id AND d2.type = 'blocks'\n)\n```\n\n**Problem:** Only idx_dependencies_issue exists. SQLite must filter type after index lookup.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_dependencies_issue_type ON dependencies(issue_id, type);\n```\n\n**Note:** This complements the existing idx_dependencies_depends_on_type for the reverse direction.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T22:58:52.876846-08:00","updated_at":"2025-12-22T23:15:13.840789-08:00","closed_at":"2025-12-22T23:15:13.840789-08:00","close_reason":"Implemented in migration 026_additional_indexes.go","dependencies":[{"issue_id":"bd-8x3w","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:52.877536-08:00","created_by":"daemon"}]}
{"id":"bd-8x43","title":"Add 'bd where' command to show active beads location","description":"## Problem\n\nWhen using redirects, it's unclear which beads database is actually being used. This caused debugging confusion during the v0.39.0 release.\n\n## Proposed Solution\n\nAdd `bd where` command:\n\n```bash\nbd where\n# → /Users/stevey/gt/beads/mayor/rig/.beads (via redirect from crew/dave/.beads)\n\nbd where --json\n# → {\"path\": \"...\", \"redirected_from\": \"...\", \"prefix\": \"bd\"}\n```\n\n## Alternatives Considered\n\n- `bd info --beads-path` - but `bd where` is more discoverable\n- Just fix the UX so it's never confusing - defense in depth is better\n\n## Desire Paths\n\nThis supports the 'desire paths' design principle: make the system's behavior visible so agents can debug and understand it.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-27T21:15:52.666948-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T21:27:50.301295-08:00","closed_at":"2025-12-27T21:27:50.301295-08:00","close_reason":"Closed"}
{"id":"bd-8y9t","title":"Remove bd mol spawn - use pour/wisp only","description":"Remove the spawn command from bd mol. Replace with:\n\n- bd pour \u003cproto\u003e - Instantiate as mol (liquid, persistent)\n- bd wisp \u003cproto\u003e - Instantiate as wisp (vapor, ephemeral)\n\nRationale:\n- 'spawn' doesn't fit the chemistry metaphor\n- Two phase transitions (pour/wisp) are clearer than one command with flags\n- Avoids confusion about defaults\n\nImplementation:\n1. Add bd pour command (currently bd mol spawn --pour)\n2. Add bd wisp command (currently bd mol spawn without --pour)\n3. Remove bd mol spawn\n4. Update all docs/tests\n\nGas Town tracking: gt-ingm.6","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-24T12:40:51.698189-08:00","updated_at":"2025-12-24T12:52:55.307-08:00","closed_at":"2025-12-24T12:52:55.307-08:00","close_reason":"Removed bd mol spawn, use bd pour or bd wisp create instead"}
{"id":"bd-8zbo","title":"Code smell: runCook function is ~275 lines","description":"The runCook() function in cmd/bd/cook.go (lines 83-357) is ~275 lines handling:\n\n1. Flag parsing and validation\n2. Mode determination (compile vs runtime)\n3. Formula parsing and resolution\n4. Control flow, advice, and expansion application\n5. Dry-run output\n6. Ephemeral mode JSON output\n7. Persist mode database operations\n8. Result display\n\nConsider extracting:\n- parseAndValidateFlags() - flag handling\n- loadAndResolveFormula() - parse, resolve, apply transformations\n- outputDryRun() - dry run display logic\n- outputEphemeral() - ephemeral JSON output\n- persistFormula() - database persistence logic\n\nThe function has multiple exit points and nested conditionals that make it hard to follow.\n\nLocation: cmd/bd/cook.go:83-357","acceptance_criteria":"1. runCook() broken into smaller functions (\u003c100 lines each)\n2. Each phase (parse, resolve, dry-run, ephemeral, persist) in separate function\n3. All existing tests pass: go test ./cmd/bd/... -run Cook\n4. Cook command behavior unchanged\n5. Error messages and exit codes preserved","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:33:08.808191-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T15:37:19.860494-08:00","dependencies":[{"issue_id":"bd-8zbo","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.25998-08:00","created_by":"daemon"}]}
{"id":"bd-8zbo","title":"Code smell: runCook function is ~275 lines","description":"The runCook() function in cmd/bd/cook.go (lines 83-357) is ~275 lines handling:\n\n1. Flag parsing and validation\n2. Mode determination (compile vs runtime)\n3. Formula parsing and resolution\n4. Control flow, advice, and expansion application\n5. Dry-run output\n6. Ephemeral mode JSON output\n7. Persist mode database operations\n8. Result display\n\nConsider extracting:\n- parseAndValidateFlags() - flag handling\n- loadAndResolveFormula() - parse, resolve, apply transformations\n- outputDryRun() - dry run display logic\n- outputEphemeral() - ephemeral JSON output\n- persistFormula() - database persistence logic\n\nThe function has multiple exit points and nested conditionals that make it hard to follow.\n\nLocation: cmd/bd/cook.go:83-357","acceptance_criteria":"1. runCook() broken into smaller functions (\u003c100 lines each)\n2. Each phase (parse, resolve, dry-run, ephemeral, persist) in separate function\n3. All existing tests pass: go test ./cmd/bd/... -run Cook\n4. Cook command behavior unchanged\n5. Error messages and exit codes preserved","status":"closed","priority":3,"issue_type":"chore","assignee":"gt-beads-toast","created_at":"2025-12-28T15:33:08.808191-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:16:03.597667-08:00","closed_at":"2025-12-28T16:16:03.597667-08:00","close_reason":"Refactored runCook from 275 lines to 44 lines. Extracted 6 helper functions, all under 100 lines each. Build passes.","dependencies":[{"issue_id":"bd-8zbo","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.25998-08:00","created_by":"daemon"}]}
{"id":"bd-90v","title":"bd prime: AI context loading and Claude Code integration","description":"Implement `bd prime` command and Claude Code hooks for context recovery. Hooks work with BOTH MCP server and CLI approaches - they solve the context memory problem (keeping bd workflow fresh after compaction) not the tool access problem (MCP vs CLI).","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-11T23:31:12.119012-08:00","updated_at":"2025-12-25T22:26:54.442614-08:00","closed_at":"2025-12-25T22:26:54.442614-08:00","close_reason":"bd prime is implemented and working; bd setup cursor deferred - Cursor integration not a priority"}
{"id":"bd-9115","title":"CLI cleanup: Consolidate bd top-level commands","description":"## Problem\nbd has 76 top-level commands, making it hard to discover and remember.\n\n## Proposed Changes\n\n### Remove from top-level (nest instead):\n- `bd cook` → `bd formula cook` (cooking is a formula operation)\n- `bd pin` → already covered by `bd mol` commands\n- `bd thanks` → `bd info --thanks` or just README\n- `bd quickstart` → `bd help quickstart` or docs\n- `bd detect-pollution` → `bd doctor --check=pollution`\n\n### Consolidate migrations under `bd migrate`:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n### Consolidate admin under `bd admin`:\n- `bd cleanup` → `bd admin cleanup`\n- `bd compact` → `bd admin compact`\n- `bd reset` → `bd admin reset`\n\n## Backwards Compatibility\nKeep old commands as hidden aliases for one release cycle.","status":"closed","priority":2,"issue_type":"task","assignee":"mayor","created_at":"2025-12-27T14:28:03.299469-08:00","created_by":"mayor","updated_at":"2025-12-27T16:19:44.580326-08:00","closed_at":"2025-12-27T16:19:44.580326-08:00","close_reason":"CLI consolidation complete: cook→formula, migrate-*, admin command, detect-pollution→doctor, aliases, pin removal, thanks/quickstart relocation, docs updated","dependencies":[{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-5e9q","type":"blocks","created_at":"2025-12-27T15:11:45.07537-08:00","created_by":"daemon"}]}
{"id":"bd-95k8","title":"Pinned field available in beads v0.37.0","description":"Hey max,\n\nHeads up on your mail overhaul work:\n\n1. **Pinned field is available** - beads v0.37.0 (released by dave earlier) includes the pinned field on issues. You'll want to add this to BeadsMessage in types.go.\n\n2. **Database migration** - Check if existing .beads databases need migration to support the pinned field. Run `bd doctor` to see if it flags anything.\n\n3. **Sorting task** - Once you have the pinned field, gt-ngu1 (pinned beads first in mail inbox) needs implementing. Since messages now come from `bd list --type=message`, you'll need to either:\n - Sort in listBeads() after fetching, or\n - Ensure bd list returns pinned items first (may already do this?)\n\nCheck what version of bd you're building against.\n\n-- Mayor","status":"closed","priority":2,"issue_type":"message","assignee":"gastown/crew/max","created_at":"2025-12-20T17:51:57.315956-08:00","updated_at":"2025-12-21T17:52:18.542169-08:00","closed_at":"2025-12-21T17:52:18.542169-08:00","close_reason":"Stale message - pinned field already available","labels":["from:beads-crew-dave","thread:thread-71ac20c7e432"]}
{"id":"bd-987a","title":"bd mol run: panic slice bounds out of range in mol_run.go:130","description":"## Problem\nbd mol run panics after successfully creating the molecule:\n\n```\n✓ Molecule running: created 9 issues\n Root issue: gt-i4lo (pinned, in_progress)\n Assignee: stevey\n\nNext steps:\n bd ready # Find unblocked work in this molecule\npanic: runtime error: slice bounds out of range [:8] with length 7\n\ngoroutine 1 [running]:\nmain.runMolRun(0x1014fc0c0, {0x140001e0f80, 0x1, 0x10089daad?})\n /Users/stevey/gt/beads/crew/dave/cmd/bd/mol_run.go:130 +0xc38\n```\n\n## Reproduction\n```bash\nbd --no-daemon mol run gt-lwuu --var issue=gt-test123\n```\nWhere gt-lwuu is a mol-polecat-work proto with 8 child steps.\n\n## Impact\nThe molecule IS created successfully - the panic happens after creation when formatting the \"Next steps\" output.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T21:48:55.396018-08:00","updated_at":"2025-12-21T22:57:46.827469-08:00","closed_at":"2025-12-21T22:57:46.827469-08:00","close_reason":"Fixed: removed unsafe rootID[:8] slice - now uses full ID"}
{"id":"bd-9avq","title":"Fix wisp leak in nodb mode writeIssuesToJSONL","description":"writeIssuesToJSONL in nodb.go calls writeJSONLAtomic without filtering wisps. This means any wisps created during a nodb session would be written to issues.jsonl, leaking ephemeral data into the git-tracked file.\n\nFix: Add the same wisp filter pattern used in sync_export.go, autoflush.go, and export.go:\n\n```go\n// Filter out wisps before writing\nfiltered := make([]*types.Issue, 0, len(issues))\nfor _, issue := range issues {\n if !issue.Wisp {\n filtered = append(filtered, issue)\n }\n}\nissues = filtered\n```\n\nLocation: cmd/bd/nodb.go:writeIssuesToJSONL()","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-24T21:15:47.980048-08:00","updated_at":"2025-12-24T21:18:42.607711-08:00","closed_at":"2025-12-24T21:18:42.607711-08:00","close_reason":"Added wisp filter in writeIssuesToJSONL"}
{"id":"bd-9btu","title":"Code smell: Duplicated step collection functions in cook.go","description":"attached_args: Fix duplicated step collection functions in cook.go\n\nTwo pairs of nearly identical functions exist in cook.go:\n\n1. collectStepsRecursive() (line 754) vs collectStepsToSubgraph() (line 415)\n - Both iterate over steps and create issues\n - Main difference: one writes to DB, one builds in-memory subgraph\n \n2. collectDependencies() (line 833) vs collectDependenciesToSubgraph() (line 502)\n - Both collect dependencies from steps\n - Nearly identical logic\n\nConsider:\n1. Extract common step/dependency processing logic\n2. Use a strategy pattern or callback for the DB vs in-memory difference\n3. Create a single function that returns data, then have callers decide how to persist\n\nLocation: cmd/bd/cook.go:415-567 and cmd/bd/cook.go:754-898","acceptance_criteria":"1. Common step collection logic extracted to shared function(s)\n2. collectStepsRecursive and collectStepsToSubgraph unified or share core logic\n3. collectDependencies and collectDependenciesToSubgraph unified or share core logic\n4. All existing tests pass: go test ./cmd/bd/... -run Cook\n5. No functional change to cook command behavior","status":"pinned","priority":2,"issue_type":"chore","assignee":"gt-beads-nux","created_at":"2025-12-28T15:31:57.401447-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T15:57:04.650238-08:00","dependencies":[{"issue_id":"bd-9btu","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.168908-08:00","created_by":"daemon"}]}
{"id":"bd-9btu","title":"Code smell: Duplicated step collection functions in cook.go","description":"attached_args: Fix duplicated step collection functions in cook.go\n\nTwo pairs of nearly identical functions exist in cook.go:\n\n1. collectStepsRecursive() (line 754) vs collectStepsToSubgraph() (line 415)\n - Both iterate over steps and create issues\n - Main difference: one writes to DB, one builds in-memory subgraph\n \n2. collectDependencies() (line 833) vs collectDependenciesToSubgraph() (line 502)\n - Both collect dependencies from steps\n - Nearly identical logic\n\nConsider:\n1. Extract common step/dependency processing logic\n2. Use a strategy pattern or callback for the DB vs in-memory difference\n3. Create a single function that returns data, then have callers decide how to persist\n\nLocation: cmd/bd/cook.go:415-567 and cmd/bd/cook.go:754-898","acceptance_criteria":"1. Common step collection logic extracted to shared function(s)\n2. collectStepsRecursive and collectStepsToSubgraph unified or share core logic\n3. collectDependencies and collectDependenciesToSubgraph unified or share core logic\n4. All existing tests pass: go test ./cmd/bd/... -run Cook\n5. No functional change to cook command behavior","status":"closed","priority":2,"issue_type":"chore","assignee":"gt-beads-nux","created_at":"2025-12-28T15:31:57.401447-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:15:06.211995-08:00","closed_at":"2025-12-28T16:15:06.211995-08:00","close_reason":"Consolidated duplicated step collection functions into unified collectSteps() with callback strategy","dependencies":[{"issue_id":"bd-9btu","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.168908-08:00","created_by":"daemon"}]}
{"id":"bd-9cdc","title":"Update docs for import bug fix","description":"Update AGENTS.md, README.md, TROUBLESHOOTING.md with import.orphan_handling config documentation. Document resurrection behavior, tombstones, config modes. Add troubleshooting section for import failures with deleted parents.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-04T12:32:30.770415-08:00","updated_at":"2025-12-21T21:14:08.328627-08:00","closed_at":"2025-12-21T21:14:08.328627-08:00","close_reason":"Already completed - documentation in CONFIG.md, CLI_REFERENCE.md, and TROUBLESHOOTING.md"}
{"id":"bd-9g1z","title":"Fix or remove TestFindJSONLPathDefault (issue #356)","description":"Code health review found .test-skip permanently skips TestFindJSONLPathDefault.\n\nThe test references issue #356 about wrong JSONL filename expectations (issues.jsonl vs beads.jsonl).\n\nTest file: internal/beads/beads_test.go\n\nThe underlying migration from beads.jsonl to issues.jsonl may be complete, so either:\n1. Fix the test expectations\n2. Remove the test if no longer needed\n3. Document why it remains skipped","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-16T18:17:31.33975-08:00","updated_at":"2025-12-22T21:24:50.357688-08:00","closed_at":"2025-12-22T21:24:50.357688-08:00","close_reason":"Test now passes - removed from .test-skip. Code was fixed in utils.FindJSONLInDir to return issues.jsonl as default."}
{"id":"bd-9gvf","title":"Add prefix-based routing with routes.jsonl","description":"## Summary\n\nWhen running `bd show gt-xyz` from a location where that bead doesn't exist locally,\nbd should check a `routes.jsonl` file to find where beads with that prefix live.\n\n## Problem\n\nFrom ~/gt (town root):\n- `bd show hq-xxx` works (hq-* beads are local)\n- `bd show gt-xxx` fails (gt-* beads live in gastown/mayor/rig)\n\nThis breaks `gt hook`, `gt handoff`, and `gt prime` which need to verify beads exist.\n\n## Solution\n\nAdd `.beads/routes.jsonl` for prefix-based routing:\n\n\\`\\`\\`json\n{\"prefix\": \"gt-\", \"path\": \"gastown/mayor/rig\"}\n{\"prefix\": \"hq-\", \"path\": \".\"}\n{\"prefix\": \"bd-\", \"path\": \"beads/crew/dave\"}\n\\`\\`\\`\n\n### Lookup Algorithm\n\n1. Try local .beads/ first (current behavior)\n2. If not found, check for routes.jsonl in current .beads/\n3. Match ID prefix against routes\n4. If match found, resolve path relative to routes file location and retry\n5. If still not found, error as usual\n\n### Affected Commands\n\nRead operations that take a bead ID:\n- bd show \u003cid\u003e\n- bd update \u003cid\u003e\n- bd close \u003cid\u003e\n- bd dep add \u003cid\u003e \u003cdep\u003e (both IDs)\n\nWrite operations (bd create) still go to local .beads/ - no change needed.\n\n## Implementation Notes\n\n1. New file: routes.jsonl in .beads/ directory\n2. New function: resolveBeadsPath(id string) (string, error)\n3. Update: beads.Show(), beads.Update(), beads.Close(), etc. to use resolver\n4. Caching: Can cache routes in memory since file rarely changes\n\n## Context\n\nThis unblocks the gt handoff flow for Mayor. Currently gt handoff gt-xyz fails\nbecause it can't verify the bead exists when running from town root.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-26T14:18:19.399691-08:00","updated_at":"2025-12-26T14:36:43.551435-08:00","closed_at":"2025-12-26T14:36:43.551435-08:00","close_reason":"Implemented prefix-based routing with routes.jsonl. Tested with gt- and bd- prefixes from town root."}
{"id":"bd-9hc9","title":"Code smell: Long function flushToJSONLWithState (~280 lines)","description":"The flushToJSONLWithState() function in cmd/bd/autoflush.go (lines 490-772) is ~280 lines with:\n\n1. Multiple nested conditionals\n2. Inline helper function definitions (recordFailure, recordSuccess)\n3. Complex multi-repo filtering logic\n4. Mixed concerns (validation, export, error handling)\n\nConsider breaking into:\n- validateJSONLIntegrity() - already exists but could absorb more\n- getIssuesToExport(fullExport bool) - determines what to export\n- mergeWithExistingJSONL(issueMap, dirtyIDs) - handles incremental merge\n- filterByPrefix(issues) - multi-repo prefix filtering\n- performExport(issues, jsonlPath) - the actual write\n- updateMetadataAfterExport() - hash/timestamp updates\n\nLocation: cmd/bd/autoflush.go:490-772","acceptance_criteria":"1. flushToJSONLWithState() broken into smaller functions (\u003c100 lines each)\n2. Each extracted function has single responsibility\n3. All existing tests pass: go test ./cmd/bd/... -run Flush\n4. Auto-flush behavior unchanged\n5. Error handling and failure counting still works correctly","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:32:20.909843-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T15:37:17.962414-08:00","dependencies":[{"issue_id":"bd-9hc9","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.223682-08:00","created_by":"daemon"}]}
{"id":"bd-9hc9","title":"Code smell: Long function flushToJSONLWithState (~280 lines)","description":"The flushToJSONLWithState() function in cmd/bd/autoflush.go (lines 490-772) is ~280 lines with:\n\n1. Multiple nested conditionals\n2. Inline helper function definitions (recordFailure, recordSuccess)\n3. Complex multi-repo filtering logic\n4. Mixed concerns (validation, export, error handling)\n\nConsider breaking into:\n- validateJSONLIntegrity() - already exists but could absorb more\n- getIssuesToExport(fullExport bool) - determines what to export\n- mergeWithExistingJSONL(issueMap, dirtyIDs) - handles incremental merge\n- filterByPrefix(issues) - multi-repo prefix filtering\n- performExport(issues, jsonlPath) - the actual write\n- updateMetadataAfterExport() - hash/timestamp updates\n\nLocation: cmd/bd/autoflush.go:490-772","acceptance_criteria":"1. flushToJSONLWithState() broken into smaller functions (\u003c100 lines each)\n2. Each extracted function has single responsibility\n3. All existing tests pass: go test ./cmd/bd/... -run Flush\n4. Auto-flush behavior unchanged\n5. Error handling and failure counting still works correctly","status":"pinned","priority":3,"issue_type":"chore","assignee":"gt-beads-nux","created_at":"2025-12-28T15:32:20.909843-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:15:34.82732-08:00","dependencies":[{"issue_id":"bd-9hc9","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.223682-08:00","created_by":"daemon"}]}
{"id":"bd-9l0h","title":"Run tests and linting","description":"go test -short ./... \u0026\u0026 golangci-lint run ./...","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:19.527602-08:00","updated_at":"2025-12-20T21:55:29.660914-08:00","closed_at":"2025-12-20T21:55:29.660914-08:00","close_reason":"Tests passed, go vet clean","dependencies":[{"issue_id":"bd-9l0h","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:19.529203-08:00","created_by":"daemon"},{"issue_id":"bd-9l0h","depends_on_id":"bd-gocx","type":"blocks","created_at":"2025-12-20T21:53:29.753682-08:00","created_by":"daemon"}]}
{"id":"bd-9qj5","title":"Merge: bd-c7y5","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-c7y5\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:02.626929-08:00","updated_at":"2025-12-23T21:21:57.699742-08:00","closed_at":"2025-12-23T21:21:57.699742-08:00","close_reason":"stale - no code pushed"}
{"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"}
@@ -296,6 +296,7 @@
{"id":"bd-etyv","title":"Smart --var detection for mol distill","description":"Implemented bidirectional syntax support for mol distill --var flag.\n\n**Problem:**\n- spawn uses: --var variable=value (assignment style)\n- distill used: --var value=variable (substitution style)\n- Agents would naturally guess spawn-style for both\n\n**Solution:**\nSmart detection that accepts BOTH syntaxes by checking which side appears in the epic text:\n- --var branch=feature-auth → finds 'feature-auth' in text → works\n- --var feature-auth=branch → finds 'feature-auth' in text → also works\n\n**Changes:**\n- Added parseDistillVar() with smart detection\n- Added collectSubgraphText() helper\n- Restructured runMolDistill to load subgraph before parsing vars\n- Updated help text to document both syntaxes\n- Added comprehensive tests in mol_test.go\n\n**Edge cases handled:**\n- Both sides found: prefers spawn-style (more common guess)\n- Neither found: helpful error message\n- Empty sides: validation error\n- Values containing '=' (e.g., KEY=VALUE): works via SplitN\n\nEmbodies the Beads philosophy: watch what agents do, make their guess correct.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T11:08:50.83923-08:00","updated_at":"2025-12-21T11:08:56.432536-08:00","closed_at":"2025-12-21T11:08:56.432536-08:00","close_reason":"Implemented"}
{"id":"bd-exy3","title":"Ephemeral patrol molecules leaking into beads","description":"## Problem\n\nEphemeral patrol orchestration molecules (e.g., mol-deacon-patrol, wisp step issues) keep appearing in `bd ready` output in gastown beads.\n\nThese are ephemeral/wisp issues that should:\n1. Never be synced to the beads-sync branch\n2. Live only in .beads-wisp/ (ephemeral storage)\n3. Be squashed to digests, not persisted as regular beads\n\n## Examples found\n\n- gt-wisp-6ue: mol-deacon-patrol\n- gt-pacdm: mol-deacon-patrol \n- gt-wisp-mpm: Check own context limit\n- gt-wisp-lkc: Clean dead sessions\n\n## Investigation needed\n\n1. Where are these being created? (gt mol bond? manual bd create?)\n2. Why are they using the gt- prefix instead of staying ephemeral?\n3. Is the wisp storage (.beads-wisp/) being used correctly?\n4. Is bd sync accidentally picking up ephemeral issues?\n\n## Expected behavior\n\nPatrol molecules and their steps should be ephemeral and never appear in `bd ready` or `bd list`.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-27T17:04:16.51075-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-27T19:18:16.809273-08:00","closed_at":"2025-12-27T19:18:16.809273-08:00","close_reason":"Moved to gastown: gt-glisw"}
{"id":"bd-eyto","title":"Time-dependent tests may be flaky near TTL boundary","description":"Several tombstone merge tests use time.Now() to create test data: time.Now().Add(-24 * time.Hour), time.Now().Add(-60 * 24 * time.Hour), etc. While these work reliably in practice (24h vs 30d TTL has large margin), they could theoretically be flaky if: 1) Tests run slowly, 2) System clock changes during test, 3) TTL constants change. Recommendation: Consider using a fixed reference time or time injection for deterministic tests. Lower priority since current margin is large. Files: internal/merge/merge_test.go:1337-1338, 1352-1353, 1548-1549, 1590-1591","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-05T16:37:02.348143-08:00","updated_at":"2025-12-05T16:37:02.348143-08:00"}
{"id":"bd-f0wm","title":"Swarm status doesn't update after task completions","description":"During swarm bd-784c, the swarm status remained at '9% (1/11 tasks merged)' even after 5 tasks were completed and closed.\n\n**Observed:**\n```\ngt swarm status bd-784c\nProgress: 9% (1/11 tasks merged)\n```\n\nBut bd list showed 4+ issues closed:\n- bd-j3dj, bd-kkka, bd-1tkd, bd-9btu all closed\n\n**Expected:**\nSwarm status should reflect actual completion count, either by:\n1. Polling issue status from beads\n2. Updating when polecats close issues\n3. Updating when commits are pushed to integration branch\n\n**Impact:**\nCoordinator (me) had to manually check bd list to know actual progress.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:17:49.27816-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:17:49.27816-08:00"}
{"id":"bd-f3ll","title":"Merge: bd-ot0w","description":"branch: polecat/dementus\ntarget: main\nsource_issue: bd-ot0w\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:20:33.495772-08:00","updated_at":"2025-12-20T23:17:27.000252-08:00","closed_at":"2025-12-20T23:17:27.000252-08:00","close_reason":"Branches nuked, MRs obsolete"}
{"id":"bd-f526","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"open","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:20.809207-08:00","created_by":"deacon","updated_at":"2025-12-27T18:14:20.809207-08:00"}
{"id":"bd-f5cc","title":"Thread Test","description":"Testing the thread feature","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:01.244501-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-f5cc","depends_on_id":"bd-x36g","type":"supersedes","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"}
@@ -305,6 +306,7 @@
{"id":"bd-fbl9","title":"Test parent task","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T23:26:53.012747-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-27T23:27:40.44858-08:00","closed_at":"2025-12-27T23:27:40.44858-08:00","close_reason":"Test issues, cleanup"}
{"id":"bd-fcl1","title":"Merge: bd-au0.5","description":"branch: polecat/Searcher\ntarget: main\nsource_issue: bd-au0.5\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:39:11.946667-08:00","updated_at":"2025-12-23T19:12:08.346454-08:00","closed_at":"2025-12-23T19:12:08.346454-08:00","close_reason":"Stale merge-requests from orphaned polecat branches - refinery not processing"}
{"id":"bd-fd0w","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"open","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:26.008274-08:00","created_by":"deacon","updated_at":"2025-12-27T18:14:26.008274-08:00"}
{"id":"bd-fedb","title":"Polecats should spawn with auto-accept mode enabled","description":"During swarm bd-784c, polecats (Toast, Nux) were spawned without --dangerously-skip-permissions or equivalent auto-accept mode.\n\n**Problem:**\nEvery edit, bash command, and tool use required manual confirmation via tmux send-keys. This defeats the purpose of autonomous polecat operation.\n\n**Expected:**\nPolecats in a swarm should run with permissions bypassed so they can work autonomously.\n\n**Workaround used:**\n- Manually sent Enter keys via tmux to accept prompts\n- Eventually polecats entered 'bypass permissions on' mode after restart\n\n**Suggestion:**\n- gt sling should pass --dangerously-skip-permissions by default for polecats\n- Or polecats should have a .claude/settings.local.json pre-configured for auto-accept","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:17:47.061327-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:17:47.061327-08:00"}
{"id":"bd-fej5","title":"bd hook: detect agent from cwd instead of defaulting to $USER","description":"**Problem:**\n`bd hook` without `--agent` defaults to `$USER` (e.g., \"stevey\") instead of detecting the agent identity from the current working directory.\n\n**Expected behavior:**\nWhen running from `/Users/stevey/gt/beads/crew/dave`, the agent should be detected as `beads/crew/dave`.\n\n**Current behavior:**\n```bash\n$ pwd\n/Users/stevey/gt/beads/crew/dave\n$ bd hook\nHook: stevey\n (empty)\n\n$ bd hook --agent beads/crew/dave\nHook: beads/crew/dave\n 📌 bd-hobo (mol) - open\n```\n\n**Fix:**\nbd hook should use the same cwd-based agent detection that other commands use (similar to how `gt mail` determines identity from cwd).","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-24T20:01:27.613892-08:00","updated_at":"2025-12-25T12:41:10.65257-08:00","closed_at":"2025-12-25T12:41:10.65257-08:00","close_reason":"Obsolete: fix belongs in gastown - gt should set BD_ACTOR env var when spawning agents. bd already checks BD_ACTOR."}
{"id":"bd-ffjt","title":"Unify template.go and mol.go under bd mol","description":"Consolidate the two DAG-template systems into one under the mol command. mol.go (on rictus branch) has the right UX (catalog/show/bond), template.go has the mechanics. Merge them, deprecate bd template commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T23:52:13.208972-08:00","updated_at":"2025-12-21T00:01:59.283765-08:00","closed_at":"2025-12-21T00:01:59.283765-08:00","close_reason":"Implemented mol commands with deprecation for template commands"}
{"id":"bd-fgw3","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:05.052016-08:00","updated_at":"2025-12-20T00:49:51.928221-08:00","closed_at":"2025-12-20T00:25:52.805029-08:00","dependencies":[{"issue_id":"bd-fgw3","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.248427-08:00","created_by":"daemon"},{"issue_id":"bd-fgw3","depends_on_id":"bd-si4g","type":"blocks","created_at":"2025-12-19T22:56:23.497325-08:00","created_by":"daemon"}]}
@@ -377,6 +379,7 @@
{"id":"bd-kff0","title":"Integrate detect-pollution into bd doctor","description":"## Task\nMove `bd detect-pollution` → `bd doctor --check=pollution`\n\n## Current state\n- detect-pollution already shows deprecation hint pointing to doctor\n- Doctor command exists with multiple checks\n\n## Implementation\n\n### 1. Update doctor.go\n- Add pollution check to the doctor checks\n- Add `--check=pollution` flag option\n- Integrate detect-pollution logic\n\n### 2. Update detect_pollution.go\n- Mark as hidden (deprecated)\n- Forward to doctor --check=pollution\n- Keep for one release cycle\n\n### 3. Update docs\n- Remove detect-pollution from any command lists\n- Update doctor docs to include pollution check\n\n## Files to modify\n- cmd/bd/doctor.go\n- cmd/bd/detect_pollution.go\n","status":"closed","priority":2,"issue_type":"task","assignee":"onyx","created_at":"2025-12-27T15:11:10.46326-08:00","created_by":"mayor","updated_at":"2025-12-27T16:04:58.471341-08:00","closed_at":"2025-12-27T16:04:58.471341-08:00","close_reason":"Integrated detect-pollution into bd doctor --check=pollution","pinned":true}
{"id":"bd-kkka","title":"Dead code: fetchAndRebaseInWorktree() marked DEPRECATED but still exists","description":"attached_args: Remove dead code fetchAndRebaseInWorktree\n\nThe function fetchAndRebaseInWorktree() in internal/syncbranch/worktree.go (lines 811-830) is marked as DEPRECATED with a comment:\n\n```go\n// fetchAndRebaseInWorktree is DEPRECATED - kept for reference only.\n// Use contentMergeRecovery instead to avoid tombstone resurrection.\n```\n\nSince contentMergeRecovery() is the replacement and is being used, this dead code should be removed to reduce maintenance burden.\n\nLocation: internal/syncbranch/worktree.go:811-830","acceptance_criteria":"1. fetchAndRebaseInWorktree() function removed from worktree.go\n2. No remaining references to the function in codebase\n3. All existing tests pass: go test ./internal/syncbranch/...\n4. Sync functionality unchanged (contentMergeRecovery still used)","status":"closed","priority":3,"issue_type":"chore","assignee":"gt-beads-toast","created_at":"2025-12-28T15:32:21.97865-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:01:14.87213-08:00","closed_at":"2025-12-28T16:01:14.87213-08:00","close_reason":"Removed deprecated fetchAndRebaseInWorktree function and its test. No remaining references. Tests pass.","dependencies":[{"issue_id":"bd-kkka","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.241483-08:00","created_by":"daemon"}]}
{"id":"bd-knta","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T13:08:21.233771-08:00","updated_at":"2025-12-27T00:10:54.179341-08:00","deleted_at":"2025-12-27T00:10:54.179341-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"}
{"id":"bd-kp9y","title":"gt swarm dispatch command not working","description":"The 'gt swarm dispatch' command shown in help doesn't appear to work as expected.\n\n**Observed:**\n```\n$ gt swarm dispatch bd-784c\n[prints help text instead of dispatching]\n```\n\n**Expected:**\nShould dispatch the next ready task from the epic to an available worker.\n\n**Workaround:**\nHad to manually use 'gt sling \u003cissue\u003e \u003cpolecat\u003e' for each task dispatch.\n\n**Impact:**\n- Manual task dispatch defeats swarm automation\n- Coordinator has to track which tasks are ready and which polecats are free\n\n**Suggestion:**\nImplement or fix 'gt swarm dispatch' to:\n1. Find next unassigned task in epic\n2. Find idle polecat in swarm\n3. Sling task to polecat automatically","status":"open","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:18:10.320094-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:18:10.320094-08:00"}
{"id":"bd-kptp","title":"Merge: bd-qioh","description":"branch: polecat/Errata\ntarget: main\nsource_issue: bd-qioh\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:46:08.832073-08:00","updated_at":"2025-12-23T19:12:08.350136-08:00","closed_at":"2025-12-23T19:12:08.350136-08:00","close_reason":"Stale merge-requests from orphaned polecat branches - refinery not processing"}
{"id":"bd-kpy","title":"Sync race: rebase-based divergence recovery resurrects tombstones","description":"## Problem\nWhen two repos sync simultaneously, tombstones can be resurrected:\n\n1. Repo A deletes issue (creates tombstone), pushes to sync branch\n2. Repo B (with 'closed' status) exports and tries to push\n3. Push fails (non-fast-forward)\n4. fetchAndRebaseInWorktree does git rebase\n5. Git rebase applies B's 'closed' patch on top of A's 'tombstone'\n6. TEXT-level rebase doesn't invoke beads merge driver\n7. 'closed' overwrites 'tombstone' = resurrection\n\n## Root Cause\nCommitToSyncBranch uses git rebase for divergence recovery, but rebase is text-level, not content-level. The proper content-level merge in PullFromSyncBranch handles tombstones correctly, but it runs AFTER the problematic push.\n\n## Proposed Fix\nOption 1: Don't push in CommitToSyncBranch - let PullFromSyncBranch handle merge+push\nOption 2: Replace git rebase with content-level merge in fetchAndRebaseInWorktree\nOption 3: Reorder sync steps: Export → Pull/Merge → Commit → Push\n\n## Workaround Applied\nExcluded tombstones from orphan detection warnings (commit 1e97d9cc).\n\nSee also: bd-3852 (Add orphan detection migration)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-17T23:29:33.049272-08:00","updated_at":"2025-12-24T22:41:09.184574-08:00","closed_at":"2025-12-24T22:41:09.184574-08:00","close_reason":"Fixed by replacing git rebase with content-level merge in divergence recovery"}
{"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","close_reason":"Already implemented - 📌 emoji shown for pinned issues in bd list output","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"}]}
@@ -580,6 +583,7 @@
{"id":"bd-rnnr","title":"BondRef data model for compound lineage","description":"Add data model support for tracking compound molecule lineage.\n\nNEW FIELDS on Issue:\n bonded_from: []BondRef // For compounds: constituent protos\n\nNEW TYPE:\n type BondRef struct {\n ProtoID string // Source proto ID\n BondType string // sequential, parallel, conditional\n BondPoint string // Attachment site (issue ID or empty for root)\n }\n\nJSONL SERIALIZATION:\n {\n \"id\": \"proto-feature-tested\",\n \"title\": \"Feature with tests\",\n \"bonded_from\": [\n {\"proto_id\": \"proto-feature\", \"bond_type\": \"root\"},\n {\"proto_id\": \"proto-testing\", \"bond_type\": \"sequential\"}\n ],\n ...\n }\n\nQUERIES:\n- GetCompoundConstituents(id) → []BondRef\n- IsCompound(id) → bool\n- GetCompoundsUsing(protoID) → []Issue // Reverse lookup","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:59:38.582509-08:00","updated_at":"2025-12-21T01:19:43.922416-08:00","closed_at":"2025-12-21T01:19:43.922416-08:00","close_reason":"Added BondRef type to types.go with ProtoID, BondType, BondPoint fields; added BondedFrom field to Issue; added IsCompound() and GetConstituents() helpers; added BondType constants","dependencies":[{"issue_id":"bd-rnnr","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.234246-08:00","created_by":"daemon"}]}
{"id":"bd-rp4o","title":"Deleted issues resurrect during bd sync (tombstones not propagating)","description":"## Problem\n\nWhen issues are deleted with bd delete --force, they get deleted from the local DB but resurrect during the next bd sync.\n\n## Reproduction\n\n1. Observe orphan warnings (bd-cb64c226.*, bd-cbed9619.*)\n2. Delete them: bd delete bd-cb64c226.1 ... --force\n3. Run bd sync\n4. Orphan warnings reappear - issues were resurrected!\n\n## Root Cause Hypothesis\n\nThe sync branch workflow (beads-sync) has the old state before deletions. When bd sync pulls from beads-sync and copies JSONL to main, the deleted issues are re-imported.\n\nTombstones may not be properly:\n1. Written to beads-sync during export\n2. Propagated during pull/merge\n3. Honored during import\n\n## Related\n\n- bd-7b7h: chicken-and-egg sync.branch bug (same workflow)\n- bd-ncwo: ID-based fallback matching to prevent ghost resurrection\n\n## Files to Investigate\n\n- cmd/bd/sync.go (export/import flow)\n- internal/syncbranch/worktree.go (PullFromSyncBranch, copyJSONLToMainRepo)\n- internal/importer/ (tombstone handling)","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T23:09:43.072696-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-rs5a","title":"Test agent bead","description":"Testing new agent type","status":"closed","priority":2,"issue_type":"agent","created_at":"2025-12-27T23:36:57.594945-08:00","created_by":"mayor","updated_at":"2025-12-27T23:37:15.583616-08:00","closed_at":"2025-12-27T23:37:15.583616-08:00","close_reason":"Test beads for schema change"}
{"id":"bd-ruio","title":"Polecat sessions terminate unexpectedly during work","description":"During swarm bd-784c, polecat sessions (Toast, Nux) terminated mid-task without completing their work.\n\n**Observed:**\n- Polecats were actively working (edits in progress, tests running)\n- Sessions suddenly showed 'not running' in gt polecat status\n- tmux sessions existed but were empty/reset\n- Work was partially complete (some commits made, issue still open)\n\n**Timeline example:**\n1. Toast working on bd-1tkd, making edits\n2. Check status 30s later - session empty, state shows 'idle'\n3. Had to re-sling to restart\n\n**Impact:**\n- Lost work progress\n- Required manual intervention to restart\n- Unclear if work was saved/committed\n\n**Possible causes:**\n- Session timeout?\n- Claude Code crash?\n- Resource limit?\n\n**Suggestion:**\n- Add session health monitoring\n- Auto-restart on unexpected termination\n- Log session exit reasons","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:18:09.014372-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:18:09.014372-08:00"}
{"id":"bd-rupw","title":"Run bump-version.sh 0.30.7","description":"Run ./scripts/bump-version.sh 0.30.7 to update version in all files","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649647-08:00","updated_at":"2025-12-19T22:57:31.512956-08:00","closed_at":"2025-12-19T22:57:31.512956-08:00","dependencies":[{"issue_id":"bd-rupw","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.653475-08:00","created_by":"stevey"}]}
{"id":"bd-rx6o","title":"Test Child Task","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T22:15:23.27506-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-rze6","title":"Digest: Release v0.34.0 @ 2025-12-22 12:16","description":"Released v0.34.0: wisp commands, chemistry UX, cross-project deps","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T12:16:53.033119-08:00","updated_at":"2025-12-22T12:16:53.033119-08:00","closed_at":"2025-12-22T12:16:53.033025-08:00","close_reason":"Squashed from wisp bd-25c (20 issues)"}
@@ -591,6 +595,7 @@
{"id":"bd-si4g","title":"Verify release artifacts","description":"Check GitHub releases page - binaries for darwin/linux/windows should be available","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:04.183029-08:00","updated_at":"2025-12-20T00:49:51.92894-08:00","closed_at":"2025-12-20T00:25:52.720816-08:00","dependencies":[{"issue_id":"bd-si4g","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.173619-08:00","created_by":"daemon"},{"issue_id":"bd-si4g","depends_on_id":"bd-otli","type":"blocks","created_at":"2025-12-19T22:56:23.428507-08:00","created_by":"daemon"}]}
{"id":"bd-siz1","title":"GH#532: bd sync circular error (suggests running bd sync)","description":"bd sync error message recommends running bd sync to fix the bd sync error. Fix error handling to provide useful guidance. See GitHub issue #532.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:04:00.543573-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-sj5y","title":"Daemon should be singleton and aggressively kill stale instances","description":"Found 2 bd daemons running (PIDs 76868, 77515) during shutdown. The daemon should:\n\n1. Be a singleton - only one instance per rig allowed\n2. On startup, check for existing daemon and kill it before starting\n3. Use a PID file or lock file to enforce this\n\nCurrently stale daemons can accumulate, causing confusion and resource waste.","notes":"**Investigation 2025-12-21:**\n\nThe singleton mechanism is already implemented and working correctly:\n\n1. **daemon.lock** uses flock (exclusive non-blocking) to prevent duplicate daemons\n2. **bd.sock.startlock** coordinates concurrent auto-starts via O_CREATE|O_EXCL\n3. **Registry** tracks all daemons globally in ~/.beads/registry.json\n\nTesting shows:\n- Trying to start a second daemon gives: 'Error: daemon already running (PID X)'\n- Multiple daemons for *different* rigs is expected/correct behavior\n\nThe original report ('Found 2 bd daemons running PIDs 76868, 77515') was likely:\n1. Two daemons for different rigs (expected), OR\n2. An edge case that's since been fixed\n\nConsider closing as RESOLVED or clarifying the original scenario.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T01:29:14.778949-08:00","updated_at":"2025-12-21T11:27:34.302585-08:00","closed_at":"2025-12-21T11:27:34.302585-08:00","close_reason":"Singleton mechanism already implemented and verified working. Uses flock-based daemon.lock + O_CREATE|O_EXCL startlock. Testing confirms 'daemon already running' error on duplicate start attempts."}
{"id":"bd-soig","title":"Sling reports 'already pinned' but mol status shows empty hook","description":"During swarm operations, gt sling reported beads were 'already pinned' but gt mol status showed nothing on the hook.\n\n**Observed:**\n```\n$ gt sling bd-9btu beads/Nux\nError: bead bd-9btu is already pinned to gt-beads-nux\n\n$ gt mol status beads/Nux\nNothing on hook - no work slung\n```\n\n**Expected:**\nIf a bead is pinned, mol status should show it. If mol status shows empty, sling should work.\n\n**Workaround:**\nUsed --force flag to re-sling, which worked.\n\n**Root cause hypothesis:**\nAgent bead state may be stored in town beads but polecat's local view doesn't see it, or the pin record exists but session state is stale.","status":"open","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:17:50.561021-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:17:50.561021-08:00"}
{"id":"bd-srsk","title":"Gate eval: Add error visibility for gh CLI failures","description":"Currently evalGHRunGate and evalGHPRGate silently swallow errors when the gh CLI fails (lines 738-741, 780-783 in gate.go).\n\nThis makes debugging difficult - if gh isn't installed, auth fails, or network issues occur, gates silently stall forever with no indication of why.\n\nOptions:\n1. Add debug logging when gh fails\n2. Return error info in the skipped list for aggregate reporting\n3. Add a --verbose flag to gate eval that shows failures\n\nLow priority since the fail-safe behavior (don't close gate on error) is correct.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-25T23:13:11.718635-08:00","updated_at":"2025-12-25T23:13:11.718635-08:00"}
{"id":"bd-su45","title":"Protect pinned issues from bd cleanup/compact","description":"Update bd cleanup and bd compact to never delete pinned issues, even if they are closed. Pinned issues should persist indefinitely as reference material.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:46.204783-08:00","updated_at":"2025-12-19T17:43:35.712617-08:00","closed_at":"2025-12-19T00:43:04.06406-08:00","dependencies":[{"issue_id":"bd-su45","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.64582-08:00","created_by":"daemon"},{"issue_id":"bd-su45","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.857586-08:00","created_by":"daemon"}]}
{"id":"bd-sumr","title":"Merge: bd-t4sb","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-t4sb\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:22:21.343724-08:00","updated_at":"2025-12-20T23:17:26.997992-08:00","closed_at":"2025-12-20T23:17:26.997992-08:00","close_reason":"Branches nuked, MRs obsolete"}