bd sync: 2025-12-30 00:42:11

This commit is contained in:
Steve Yegge
2025-12-30 00:42:11 -08:00
parent 7216109284
commit 8f07b619ac
6 changed files with 73 additions and 13 deletions

View File

@@ -27,7 +27,7 @@
{"id":"bd-1dez.6","title":"bd mol publish: Push formula to GitHub repo","description":"Publish a formula to a GitHub repository for sharing.\n\n## Usage\n```bash\n# Create new repo and publish\nbd mol publish mol-my-workflow --repo github.com/myorg/mol-my-workflow\n\n# Update existing repo\nbd mol publish mol-my-workflow --repo github.com/myorg/mol-my-workflow --tag v1.1.0\n```\n\n## Implementation\n1. Export proto to formula.json (if not already a file)\n2. Validate formula structure\n3. Create GitHub repo if --create flag (uses `gh repo create`)\n4. Copy formula.json to repo\n5. Generate README.md from formula description\n6. Commit and push\n7. Create git tag if --tag specified\n8. Add mol-formula topic to repo\n\n## Flags\n- `--repo \u003curl\u003e` - Target GitHub repo (required)\n- `--tag \u003cversion\u003e` - Create version tag\n- `--create` - Create repo if doesn't exist\n- `--private` - Create as private repo\n\n## Workflow\n```bash\n# Full publish flow\nbd mol distill my-epic --name my-workflow\nbd mol promote bd-proto-xxx --as my-workflow\nbd mol publish mol-my-workflow --repo github.com/me/mol-my-workflow --create --tag v1.0.0\n```\n","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-25T12:06:41.419764-08:00","updated_at":"2025-12-25T21:53:13.421752-08:00","closed_at":"2025-12-25T21:53:13.421752-08:00","dependencies":[{"issue_id":"bd-1dez.6","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:06:41.420209-08:00","created_by":"daemon"}]}
{"id":"bd-1dez.7","title":"Formula versioning: Version field and git tag integration","description":"Add versioning support to formulas for tracking updates.\n\n## Formula Version Field\n```json\n{\n \"formula\": \"mol-code-review\",\n \"version\": \"1.2.0\",\n \"min_bd_version\": \"0.25.0\",\n ...\n}\n```\n\n## Version Semantics\n- Use semver: MAJOR.MINOR.PATCH\n- MAJOR: Breaking changes to step structure\n- MINOR: New optional steps or variables\n- PATCH: Documentation, bug fixes\n\n## Git Tag Integration\n- `bd mol install repo@v1.2.0` fetches that tag\n- `bd mol install repo` fetches latest tag (or main if no tags)\n- `bd mol publish --tag v1.2.0` creates tag\n\n## Proto Version Tracking\nLocal proto should store:\n```\nsource_repo: github.com/anthropics/mol-code-review\nsource_version: v1.2.0\ninstalled_at: 2025-12-25T12:00:00Z\n```\n\nThis enables `bd mol update` to check for newer versions.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:06:42.674849-08:00","updated_at":"2025-12-25T19:43:22.501926-08:00","closed_at":"2025-12-25T19:43:22.501926-08:00","dependencies":[{"issue_id":"bd-1dez.7","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:06:42.67694-08:00","created_by":"daemon"}]}
{"id":"bd-1dez.8","title":"Installation tracking: .beads/installed.json","description":"Track installed formulas for update checking and provenance.\n\n## File Format\n```json\n{\n \"mol-code-review\": {\n \"source\": \"github.com/anthropics/mol-code-review\",\n \"version\": \"v1.2.0\",\n \"installed_at\": \"2025-12-25T12:00:00Z\",\n \"formula_hash\": \"abc123...\"\n },\n \"mol-polecat-work\": {\n \"source\": \"local\",\n \"version\": \"1\",\n \"installed_at\": \"2025-12-24T10:00:00Z\"\n }\n}\n```\n\n## Commands That Update This\n- `bd mol install` - Adds entry\n- `bd mol update` - Updates version/timestamp\n- `bd cook` - Adds entry with source:local\n- `bd mol uninstall` - Removes entry (new command)\n\n## Usage\n```bash\nbd mol list --installed # Shows installed with source/version\nbd mol outdated # Shows formulas with available updates\n```\n\n## Sync Behavior\n- installed.json is gitignored (local state)\n- Only formulas/ directory is synced\n- Each clone tracks its own installations\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:06:43.934727-08:00","updated_at":"2025-12-25T19:38:04.14827-08:00","closed_at":"2025-12-25T19:38:04.14827-08:00","dependencies":[{"issue_id":"bd-1dez.8","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:06:43.937653-08:00","created_by":"daemon"}]}
{"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-1pr6","title":"Time-dependent worktree detection tests may be flaky","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/obsidian","created_at":"2025-12-26T01:21:22.065353-08:00","updated_at":"2025-12-30T00:31:08.413129-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","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:31:55.514941-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T16:41:13.031194-08:00","closed_at":"2025-12-28T16:41:13.031194-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"}]}
@@ -107,6 +107,7 @@
{"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-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-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-5482","title":"Merge: obsidian-1767083466920","description":"branch: polecat/obsidian-1767083466920\ntarget: main\nsource_issue: obsidian-1767083466920\nrig: beads","status":"open","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:36:06.073173-08:00","created_by":"beads/polecats/obsidian","updated_at":"2025-12-30T00:36:06.073173-08:00"}
{"id":"bd-56x","title":"Review PR #514: fix plugin install docs","description":"Review and merge PR #514 from aspiers. This PR fixes incorrect docs for installing Claude Code plugin from source in docs/PLUGIN.md. Clarifies shell vs Claude Code commands and fixes the . vs ./beads argument issue. URL: https://github.com/anthropics/beads/pull/514","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:16.865354+11: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-581b80b3","title":"bd find-duplicates - AI-powered duplicate detection","description":"Find semantically duplicate issues.\n\nApproaches:\n1. Mechanical: Exact title/description matching\n2. Embeddings: Cosine similarity (cheap, scalable)\n3. AI: LLM-based semantic comparison (expensive, accurate)\n\nUses embeddings by default for \u003e100 issues.\n\nFiles: cmd/bd/find_duplicates.go (new)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-10-29T20:49:49.126801-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-589x","title":"HANDOFF: Version 0.30.7 release in progress","description":"## Context\nDoing a 0.30.7 patch release with bug fixes.\n\n## What's done\n- Fixed #657: bd graph nil pointer crash (graph.go:102)\n- Fixed #652: Windows npm installer file lock (postinstall.js)\n- Updated CHANGELOG.md and info.go\n- Pushed to main, CI running (run 20390861825)\n- Created version-bump molecule template (bd-6s61) and instantiated for 0.30.7 (bd-8pyn)\n\n## In progress\nMolecule bd-8pyn has 3 remaining tasks:\n - bd-dxo7: Wait for CI to pass\n - bd-7l70: Verify release artifacts \n - bd-5c91: Update local installation\n\n## Check CI\n gh run list --repo steveyegge/beads --limit 1\n gh run view 20390861825 --repo steveyegge/beads\n\n## New feature filed\nbd-n777: Timer beads for scheduled agent callbacks\nDesign for Deacon-managed timers that can interrupt agents via tmux\n\n## Resume commands\n bd --no-daemon show bd-8pyn\n gh run list --repo steveyegge/beads --limit 1","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-19T23:06:14.902334-08:00","updated_at":"2025-12-20T00:49:51.927111-08:00","closed_at":"2025-12-20T00:25:59.596546-08:00"}
@@ -140,6 +141,7 @@
{"id":"bd-6x6g","title":"Add multi-repo target repo switching in bd create","description":"In cmd/bd/create.go:164, there's a TODO to switch to the target repo for multi-repo support when creating issues. Currently the code may not properly handle creating issues in a different repo than the current one.\n\nFile: cmd/bd/create.go:164","status":"hooked","priority":3,"issue_type":"feature","assignee":"beads/polecats/obsidian","created_at":"2025-12-28T16:32:37.130679-08:00","created_by":"stevey","updated_at":"2025-12-30T00:13:06.651004-08:00"}
{"id":"bd-70an","title":"test pin","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T11:19:16.760214-08:00","updated_at":"2025-12-21T11:19:46.500688-08:00","closed_at":"2025-12-21T11:19:46.500688-08:00"}
{"id":"bd-70c4","title":"Gate await fields cleared by --no-daemon CLI access (not multi-repo)","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-25T23:30:38.648182-08:00","updated_at":"2025-12-26T23:38:47.972075-08:00","closed_at":"2025-12-26T23:38:47.972075-08:00","comments":[{"id":3,"issue_id":"bd-70c4","author":"mayor","text":"## Summary\nGate await fields (await_type, await_id, timeout_ns, waiters) are cleared when a CLI command accesses the database directly (--no-daemon) while the daemon is running. This is separate from the multi-repo issue fixed in bd-gr4q.\n\n## Reproduction\n1. Start daemon: bd daemon --start\n2. Create gate: bd gate create --await timer:5s (fields stored correctly)\n3. Verify: sqlite3 .beads/beads.db shows timer|5s\n4. Run CLI with --no-daemon: bd show \u003cid\u003e --no-daemon --no-auto-import --no-auto-flush\n5. Check again: fields are now empty\n\n## Investigation Notes\n- NOT caused by autoImportIfNewer (verified with --no-auto-import flag)\n- NOT caused by HydrateFromMultiRepo (no multi-repo config, returns early)\n- NOT caused by molecule loader (only creates new issues)\n- NOT caused by migrations (gate_columns only adds columns)\n- No database triggers found\n\nThe clearing happens somewhere in sqlite.NewWithTimeout() initialization or command execution path.\n\n## Related\n- bd-gr4q fixed the multi-repo path but this is a different code path\n- The fix pattern (COALESCE/NULLIF) may need to be applied elsewhere","created_at":"2025-12-26T07:30:49Z"}]}
{"id":"bd-71v3","title":"Merge: topaz-1767083484329","description":"branch: polecat/topaz-1767083484329\ntarget: main\nsource_issue: topaz-1767083484329\nrig: beads","status":"open","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:39:43.095673-08:00","created_by":"beads/polecats/topaz","updated_at":"2025-12-30T00:39:43.095673-08:00"}
{"id":"bd-746","title":"Fix resolvePartialID stub in workflow.go","description":"The resolvePartialID function at workflow.go:921-925 is a stub that just returns the ID unchanged. Should use utils.ResolvePartialID for proper partial ID resolution in direct mode (non-daemon).","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-17T22:22:57.586917-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-74w1","title":"Consolidate duplicate path-finding utilities (findJSONLPath, findBeadsDir, findGitRoot)","description":"Code health review found these functions defined in multiple places:\n\n- findJSONLPath() in autoflush.go:45-73 and doctor/fix/migrate.go\n- findBeadsDir() in autoimport.go:197-239 (with git worktree handling)\n- findGitRoot() in autoimport.go:242-269 (Windows path conversion)\n\nThe beads package has public FindBeadsDir() and FindJSONLPath() APIs that should be used consistently.\n\nImpact: Bug fixes need to be applied in multiple places. Git worktree handling may not be replicated everywhere.\n\nFix: Consolidate all implementations to use the beads package APIs. Remove duplicates.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T18:17:16.694293-08:00","updated_at":"2025-12-22T21:13:46.83103-08:00","closed_at":"2025-12-22T21:13:46.83103-08:00"}
{"id":"bd-754r","title":"Merge: bd-thgk","description":"branch: polecat/Compactor\ntarget: main\nsource_issue: bd-thgk\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:41:43.965771-08:00","updated_at":"2025-12-23T19:12:08.345449-08:00","closed_at":"2025-12-23T19:12:08.345449-08:00"}
@@ -172,10 +174,11 @@
{"id":"bd-7pwh","title":"HOP-compatible schema additions","description":"Add optional fields to Beads schema to enable future HOP integration.\nAll fields are backwards-compatible (optional, omitted if empty).\n\n## Reference\nSee ~/gt/docs/hop/BEADS-SCHEMA-CHANGES.md for full specification.\n\n## P1 Changes (Must Have Before Launch)\n\n### 1. EntityRef type\nStructured entity reference that can become HOP URI:\n```go\ntype EntityRef struct {\n Name string // \"polecat/Nux\"\n Platform string // \"gastown\"\n Org string // \"steveyegge\" \n ID string // \"polecat-nux\"\n}\n```\n\n### 2. creator field\nEvery issue tracks who created it (EntityRef).\n\n### 3. assignee_ref field\nStructured form alongside existing string assignee.\n\n### 4. validations array\nTrack who validated work completion:\n```go\ntype Validation struct {\n Validator *EntityRef\n Outcome string // accepted, rejected, revision_requested\n Timestamp time.Time\n Score *float32 // Future\n}\n```\n\n## P2 Changes (Should Have)\n\n### 5. work_type field\n\"mutex\" (default) or \"open_competition\"\n\n### 6. crystallizes field\nBoolean - does this work compound (true) or evaporate (false)?\n\n### 7. cross_refs field\nArray of URIs to beads in other repos:\n- \"beads://github/anthropics/claude-code/bd-xyz\"\n\n## P3 Changes (Nice to Have)\n\n### 8. skill_vector placeholder\nReserved for future embeddings: []float32\n\n## Implementation Notes\n- All fields optional in JSONL serialization\n- Empty/null fields omit from output\n- No migration needed for existing data\n- CLI additions: --creator, --validated-by filters","notes":"Scope reduced after review. P1 only: EntityRef type, creator field, validations array. Deferred: assignee_ref, work_type, crystallizes, cross_refs, skill_vector (YAGNI - semantics unclear, can add later when needed).","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T02:42:39.267984-08:00","updated_at":"2025-12-22T20:09:09.211821-08:00","closed_at":"2025-12-22T20:09:09.211821-08:00"}
{"id":"bd-7t9a","title":"MCP plugin: _find_beads_db_in_tree() should follow .beads/redirect files","description":"## Problem\nThe `_find_beads_db_in_tree()` function in `integrations/beads-mcp/src/beads_mcp/tools.py` does not follow `.beads/redirect` files.\n\n## Impact\nMCP beads tools fail from polecat/crew directories that use redirect files to share a beads database.\n\n## Root Cause\nWhen auto-detecting workspace, the MCP plugin looks for `.beads/*.db` files directly but doesn't check for or follow `redirect` files:\n\n```python\nbeads_dir = os.path.join(current, '.beads')\nif os.path.isdir(beads_dir):\n db_files = glob.glob(os.path.join(beads_dir, '*.db')) # Only looks for .db files\n valid_dbs = [f for f in db_files if '.backup' not in os.path.basename(f)]\n if valid_dbs:\n return current\n```\n\nPolecat directories have `.beads/redirect` files (e.g., containing `../../mayor/rig/.beads`) but no `.db` files, so `_find_beads_db_in_tree()` doesn't find them.\n\n## Expected Behavior\nThe function should:\n1. Check for `.beads/redirect` file first\n2. If found, follow the redirect to the actual beads location\n3. Verify the redirected location has a valid database\n\n## Reference\nThe Go implementation handles this correctly in `ResolveBeadsDir()` - see gastown `internal/beads/beads.go:23-60`.\n\n## Related\n- gt-tnw: MCP beads tools fail from polecat directories","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T23:57:21.710278-08:00","created_by":"gastown/polecats/capable","updated_at":"2025-12-30T00:05:38.307967-08:00","closed_at":"2025-12-30T00:05:38.307967-08:00","close_reason":"Fixed: added _resolve_beads_redirect() to follow .beads/redirect files in MCP plugin auto-detection"}
{"id":"bd-7tuu","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:02.053382-08:00","updated_at":"2025-12-20T01:23:52.484043-08:00","closed_at":"2025-12-20T01:23:52.484043-08:00","dependencies":[{"issue_id":"bd-7tuu","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.021087-08:00","created_by":"daemon"},{"issue_id":"bd-7tuu","depends_on_id":"bd-hw3w","type":"blocks","created_at":"2025-12-19T22:56:23.291591-08:00","created_by":"daemon"}]}
{"id":"bd-7wrh","title":"Merge: jasper-1767083473604","description":"branch: polecat/jasper-1767083473604\ntarget: main\nsource_issue: jasper-1767083473604\nrig: beads","status":"open","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:39:04.84733-08:00","created_by":"beads/polecats/jasper","updated_at":"2025-12-30T00:39:04.84733-08:00"}
{"id":"bd-7xrg","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"open","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:31.190713-08:00","updated_at":"2025-12-27T18:14:31.190713-08:00"}
{"id":"bd-7yg","title":"Git merge driver uses invalid placeholders (%L, %R instead of %A, %B)","description":"## Problem\n\nThe beads git merge driver is configured with invalid Git placeholders:\n\n```\ngit config merge.beads.driver \"bd merge %A %O %L %R\"\n```\n\nGit doesn't recognize `%L` or `%R` as valid merge driver placeholders. The valid placeholders are:\n- `%O` = base (common ancestor)\n- `%A` = current version (ours)\n- `%B` = other version (theirs)\n\n## Impact\n\n- Affects ALL users when they have `.beads/beads.jsonl` merge conflicts\n- Automatic JSONL merge fails with error: \"error reading left file: failed to open file: open 7: no such file or directory\"\n- Users must manually resolve conflicts instead of getting automatic merge\n\n## Root Cause\n\nThe `bd init` command (or wherever the merge driver is configured) is using non-standard placeholders. When Git encounters `%L` and `%R`, it either passes them literally or interprets them incorrectly.\n\n## Fix\n\nUpdate the merge driver configuration to:\n```\ngit config merge.beads.driver \"bd merge %A %O %A %B\"\n```\n\nWhere:\n- 1st `%A` = output file (current file, will be overwritten)\n- `%O` = base (common ancestor)\n- 2nd `%A` = left/current version\n- `%B` = right/other version\n\n## Action Items\n\n1. Fix `bd init` (or equivalent setup command) to use correct placeholders\n2. Add migration/warning for existing users with misconfigured merge driver\n3. Update documentation with correct merge driver setup\n4. Consider adding validation when `bd init` is run","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-11-21T19:51:55.747608-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-7z4","title":"Add tests for delete operations","description":"Core delete functionality including deleteViaDaemon, createTombstone, and deleteIssue functions have 0% coverage. These are critical for data integrity and need comprehensive test coverage.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-23T23:48:50.087306-08:00","closed_at":"2025-12-23T23:48:50.087306-08:00","dependencies":[{"issue_id":"bd-7z4","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:34.870254935-07:00","created_by":"matt"}]}
{"id":"bd-7zka","title":"Implement formula features: repeat, for_each, branch, gate, compose.split","description":"Multiple formula features in internal/formula/types.go are marked as 'Not yet implemented':\n\n- Line 170: repeat field (run step multiple times)\n- Line 174: for_each field (iterate over collections)\n- Line 179: branch field (conditional step execution)\n- Line 186: gate field (waits_for dependency integration)\n- Line 210: compose.split field (split step into parallel sub-steps)\n\nThese are schema-defined for future use but not yet implemented in bd cook.\n\nFile: internal/formula/types.go:170,174,179,186,210","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2025-12-28T16:32:54.493002-08:00"}
{"id":"bd-7zka","title":"Implement formula features: repeat, for_each, branch, gate, compose.split","description":"Multiple formula features in internal/formula/types.go are marked as \"Not yet implemented\":\n\nIMPLEMENTED (TODOs removed):\n- Step.Expand: Inline expansion - implemented in ApplyInlineExpansions (expand.go)\n- Step.ExpandVars: Variable overrides for expansion - implemented alongside Expand\n\nSTILL NOT IMPLEMENTED (TODOs remain):\n- Step.Condition: Make step optional based on variable (types.go:177-180)\n- Step.Gate: Async wait condition for step (types.go:185-187)\n- Gate struct: Schema defined but not processed in bd cook (types.go:209-210)\n\nFile: internal/formula/types.go","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2025-12-30T00:35:12.769129-08:00"}
{"id":"bd-801b","title":"Merge: bd-bqcc","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-bqcc\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T00:26:04.306756-08:00","updated_at":"2025-12-23T01:33:25.728087-08:00","closed_at":"2025-12-23T01:33:25.728087-08:00"}
{"id":"bd-83f5","title":"Remove top-level comment alias","description":"Remove 'comment' as top-level command. Users should use 'comments add' instead. Reduces command surface area.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:12.33579-08:00","created_by":"stevey","updated_at":"2025-12-28T13:06:53.335122-08:00","closed_at":"2025-12-28T13:06:53.335122-08:00"}
{"id":"bd-89f89fc0","title":"Remove unreachable RPC methods","description":"Several RPC server and client methods are unreachable and should be removed:\n\nServer methods (internal/rpc/server.go):\n- `Server.GetLastImportTime` (line 2116)\n- `Server.SetLastImportTime` (line 2123)\n- `Server.findJSONLPath` (line 2255)\n\nClient methods (internal/rpc/client.go):\n- `Client.Import` (line 311) - RPC import not used (daemon uses autoimport)\n\nEvidence:\n```bash\ngo run golang.org/x/tools/cmd/deadcode@latest -test ./...\n```\n\nImpact: Removes ~80 LOC of unused RPC code","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-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"}
@@ -217,6 +220,7 @@
{"id":"bd-adoe","title":"Add --hard flag to bd cleanup to permanently cull tombstones before cutoff date","description":"Currently tombstones persist for 30 days before cleanup prunes them. Need an official way to force-cull tombstones earlier than the default TTL, for scenarios like cleaning house after extended absence where resurrection from old clones is not a concern. Proposed: bd cleanup --hard --older-than N to bypass the 30-day tombstone TTL.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:17:31.064914-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-aec5439f","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-27T18:53:10.38679-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-ag35","title":"Add daemon RPC endpoints for config and stale check","description":"Two TODOs request daemon RPC endpoints:\n\n1. cmd/bd/create.go:208 - Add RPC method to get config in daemon mode\n2. cmd/bd/mol_stale.go:67 - Add RPC endpoint for stale check\n\nThese would allow the CLI to query the daemon for configuration and staleness checks instead of reading directly.\n\nFiles:\n- cmd/bd/create.go:208\n- cmd/bd/mol_stale.go:67","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:38.113203-08:00","created_by":"stevey","updated_at":"2025-12-28T16:32:38.113203-08:00"}
{"id":"bd-agye","title":"Merge: quartz-1767083470444","description":"branch: polecat/quartz-1767083470444\ntarget: main\nsource_issue: quartz-1767083470444\nrig: beads","status":"open","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:36:39.737365-08:00"}
{"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-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"}
@@ -331,7 +335,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"}
{"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"}
{"id":"bd-eyrh","title":"🤝 HANDOFF: Review remaining beads PRs","description":"## Current State\nJust merged PR #653 (doctor refactor) and added tests to restore coverage.\n\n## Remaining Open PRs to Review\nRun `gh pr list --repo steveyegge/beads` to see current list. As of handoff:\n\n1. #655 - feat: Linear Integration (jblwilliams)\n2. #651 - feat(audit): agent audit trail (dchichkov)\n3. #648 - Stop init creating redundant @AGENTS.md (maphew)\n4. #646 - fix(unix): handle Statfs field types (jordanhubbard)\n5. #645 - feat: /plan-to-beads Claude Code command (petebytes)\n6. #642, #641, #640 - sync branch fixes (cpdata)\n\n## Review Checklist\n- Check CI status with `gh pr checks \u003cnum\u003e --repo steveyegge/beads`\n- Verify no .beads/ data leaking (we have a hook now)\n- Review code quality\n- Merge good ones, request changes on problematic ones\n\n## Notes\n- User wants us to be proactive about merging good PRs\n- Can add tests ourselves if coverage drops","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-19T17:44:34.149837-08:00","updated_at":"2025-12-21T13:53:33.613805-08:00","deleted_at":"2025-12-21T13:53:33.613805-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"}
{"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-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":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/topaz","created_at":"2025-12-05T16:37:02.348143-08:00","updated_at":"2025-12-30T00:31:25.816987-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":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:17:49.27816-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:14:20.098792-08:00","closed_at":"2025-12-28T22:14:20.098792-08:00"}
{"id":"bd-f2lb","title":"Update CHANGELOG.md with release notes","description":"Add meaningful release notes to CHANGELOG.md describing what changed in test-squash","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066065-08:00","updated_at":"2025-12-21T13:53:49.858742-08:00","deleted_at":"2025-12-21T13:53:49.858742-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"}
{"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"}
@@ -354,7 +358,7 @@
{"id":"bd-fom","title":"Remove all deletions.jsonl code except migration","description":"There's deletions manifest code spread across the entire codebase that should have been removed after tombstone migration:\n\nFiles with deletions code (non-migration):\n- internal/deletions/ - entire package\n- cmd/bd/sync.go - 25+ references, auto-compact, sanitize\n- cmd/bd/delete.go - dual-writes to deletions.jsonl\n- internal/importer/importer.go - checks deletions manifest\n- internal/syncbranch/worktree.go - merges deletions.jsonl\n- cmd/bd/doctor/fix/sync.go - cleanupDeletionsManifest\n- cmd/bd/doctor/fix/deletions.go - HydrateDeletionsManifest\n- cmd/bd/integrity.go - checks deletions for data loss\n- cmd/bd/deleted.go - entire command\n- cmd/bd/compact.go - pruneDeletionsManifest\n- cmd/bd/doctor.go - checkDeletionsManifest\n- Plus many more\n\nAction: Aggressively remove all non-migration deletions code. Tombstones are the only deletion mechanism now.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T13:29:04.960863-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-fu83","title":"Fix daemon/direct mode inconsistency in relate and duplicate commands","description":"The relate.go and duplicate.go commands have inconsistent daemon/direct mode handling:\n\nWhen daemonClient is connected, they resolve IDs via RPC but then perform updates directly via store.UpdateIssue(), bypassing the daemon.\n\nAffected locations:\n- relate.go:125-139 (runRelate update)\n- relate.go:235-246 (runUnrelate update) \n- duplicate.go:120 (runDuplicate update)\n- duplicate.go:207 (runSupersede update)\n\nShould either use RPC for updates when daemon is running, or document why direct access is intentional.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-16T20:52:54.164189-08:00","updated_at":"2025-12-21T21:47:14.10222-08:00","closed_at":"2025-12-21T21:47:14.10222-08:00"}
{"id":"bd-fx7v","title":"Improve test coverage for cmd/bd/doctor/fix (23.9% → 50%)","description":"The doctor/fix package has only 23.9% test coverage. The doctor fix functionality is important for troubleshooting.\n\nCurrent coverage: 23.9%\nTarget coverage: 50%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:05.67127-08:00","updated_at":"2025-12-23T22:32:34.337963-08:00","closed_at":"2025-12-23T22:32:34.337963-08:00"}
{"id":"bd-fy4q","title":"Phase 1.2 follow-up: Clarify format storage","description":"Phase 1.2 created the bdt executable structure but issues.toon is currently stored in JSONL format, not TOON format.\n\nThis is intentional for now:\n- Phase 1.2 (bd-jv4w): Just infrastructure - separate binary, separate directory\n- Phase 1.3 (bd-j0tr): Implement actual TOON encoding/writing\n\nFor now, keep as-is: filename '.toon' signals intent, content is JSONL (interim format). Phase 1.3 will switch to actual TOON.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-19T14:03:19.491040345-07:00","updated_at":"2025-12-19T14:03:19.491040345-07:00","dependencies":[{"issue_id":"bd-fy4q","depends_on_id":"bd-jv4w","type":"discovered-from","created_at":"2025-12-19T14:03:19.498933555-07:00","created_by":"daemon"}]}
{"id":"bd-fy4q","title":"Phase 1.2 follow-up: Clarify format storage","description":"Phase 1.2 created the bdt executable structure but issues.toon is currently stored in JSONL format, not TOON format.\n\nThis is intentional for now:\n- Phase 1.2 (bd-jv4w): Just infrastructure - separate binary, separate directory\n- Phase 1.3 (bd-j0tr): Implement actual TOON encoding/writing\n\nFor now, keep as-is: filename '.toon' signals intent, content is JSONL (interim format). Phase 1.3 will switch to actual TOON.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/jasper","created_at":"2025-12-19T14:03:19.491040345-07:00","updated_at":"2025-12-30T00:31:15.101091-08:00","dependencies":[{"issue_id":"bd-fy4q","depends_on_id":"bd-jv4w","type":"discovered-from","created_at":"2025-12-19T14:03:19.498933555-07:00","created_by":"daemon"}]}
{"id":"bd-g4b4","title":"bd close hooks: context check and notifications","description":"Add hook system to bd close for notifications and custom actions.\n\n## Scope (MVP)\n\nImplement **command hooks only** for bd close. Deferred: notify, webhook types.\n\n## Implementation\n\n### 1. Config Schema\n\nAdd to internal/configfile/config.go:\n\n```go\ntype HooksConfig struct {\n OnClose []HookEntry `yaml:\"on_close,omitempty\"`\n}\n\ntype HookEntry struct {\n Command string `yaml:\"command\"` // Shell command to run\n Name string `yaml:\"name,omitempty\"` // Optional display name\n}\n```\n\nAdd `Hooks HooksConfig` field to Config struct.\n\n### 2. Hook Execution\n\nCreate internal/hooks/close_hooks.go:\n\n```go\nfunc RunCloseHooks(ctx context.Context, cfg *configfile.Config, issue *types.Issue) error {\n for _, hook := range cfg.Hooks.OnClose {\n cmd := exec.CommandContext(ctx, \"sh\", \"-c\", hook.Command)\n cmd.Env = append(os.Environ(),\n \"BEAD_ID=\"+issue.ID,\n \"BEAD_TITLE=\"+issue.Title,\n \"BEAD_TYPE=\"+string(issue.IssueType),\n \"BEAD_PRIORITY=\"+strconv.Itoa(issue.Priority),\n \"BEAD_CLOSE_REASON=\"+issue.CloseReason,\n )\n cmd.Stdout = os.Stdout\n cmd.Stderr = os.Stderr\n if err := cmd.Run(); err \\!= nil {\n // Log warning but dont fail the close\n fmt.Fprintf(os.Stderr, \"Warning: close hook %q failed: %v\\n\", hook.Name, err)\n }\n }\n return nil\n}\n```\n\n### 3. Integration Point\n\nIn cmd/bd/close.go, after successful close:\n\n```go\n// Run close hooks\nif cfg := configfile.Load(); cfg \\!= nil {\n hooks.RunCloseHooks(ctx, cfg, closedIssue)\n}\n```\n\n### 4. Example Config\n\n```yaml\n# .beads/config.yaml\nhooks:\n on_close:\n - name: show-next\n command: bd ready --limit 1\n - name: context-check \n command: echo \"Issue $BEAD_ID closed. Check context if nearing limit.\"\n```\n\n## Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| BEAD_ID | Issue ID (e.g., bd-abc1) |\n| BEAD_TITLE | Issue title |\n| BEAD_TYPE | Issue type (task, bug, feature, etc.) |\n| BEAD_PRIORITY | Priority (0-4) |\n| BEAD_CLOSE_REASON | Close reason if provided |\n\n## Testing\n\nAdd test in internal/hooks/close_hooks_test.go:\n- Test hook execution with mock config\n- Test env vars are set correctly\n- Test hook failure doesnt block close\n\n## Files to Create/Modify\n\n1. **Create:** internal/hooks/close_hooks.go\n2. **Create:** internal/hooks/close_hooks_test.go \n3. **Modify:** internal/configfile/config.go (add HooksConfig)\n4. **Modify:** cmd/bd/close.go (call RunCloseHooks)\n5. **Modify:** docs/CONFIG.md (document hooks config)\n\n## Out of Scope (Future)\n\n- notify hook type (gt mail integration)\n- webhook type (HTTP POST)\n- on_create, on_update hooks\n- Hook timeout configuration\n- Parallel hook execution","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-22T17:03:56.183461-08:00","updated_at":"2025-12-23T13:38:15.898746-08:00","closed_at":"2025-12-23T13:38:15.898746-08:00","dependencies":[{"issue_id":"bd-g4b4","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.811793-08:00","created_by":"daemon"}]}
{"id":"bd-g6m5","title":"Code smell: Mixed daemon/direct mode logic throughout commands","description":"Most commands duplicate logic for both daemon and direct modes:\n\n```go\nif daemonClient != nil {\n // Daemon implementation\n} else {\n // Direct implementation\n}\n```\n\nThis pattern appears multiple times within the same function in show.go, list.go, and other commands.\n\n**Problem:**\n- Doubles the code paths to test\n- Changes to data retrieval require updates in two places\n- Difficult to reason about behavior\n\n**Acceptance Criteria:**\n- [ ] Create StorageAccessor interface for both modes\n- [ ] Use strategy pattern for daemon vs direct operations\n- [ ] Centralize dispatching logic\n- [ ] Reduce code duplication\n- [ ] Tests pass","status":"hooked","priority":3,"issue_type":"chore","assignee":"beads/polecats/jasper","created_at":"2025-12-28T18:59:31.571393-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T00:13:13.543569-08:00","dependencies":[{"issue_id":"bd-g6m5","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.716024-08:00","created_by":"daemon"}]}
{"id":"bd-g7eq","title":"Agent beads: structured labels for filtering","description":"## Agent Beads Need Queryable Labels\n\nCurrently agent beads have role_type/rig in description text, not as labels. This breaks @group resolution in gt mail.\n\n## Current State\n\n```json\n{\n \"id\": \"gt-gastown-witness\",\n \"issue_type\": \"agent\",\n \"description\": \"...\\\\nrole_type: witness\\\\nrig: gastown\\\\n...\"\n}\n```\n\nCannot query: `bd list --type=agent --label=role_type:witness` returns nothing.\n\n## Required\n\nAgent bead creation should add labels:\n- `role_type:\u003ctype\u003e` (witness, refinery, crew, polecat, dog, mayor, deacon)\n- `rig:\u003crig\u003e` (gastown, beads, or \"town\" for town-level)\n\n## Where to Fix\n\ngt polecat/crew/agent creation commands should add labels:\n```bash\nbd create --type=agent ... --labels=\"role_type:witness,rig:gastown\"\n```\n\n## Queries Enabled\n\n```bash\nbd list --type=agent --label=role_type:witness # All witnesses\nbd list --type=agent --label=rig:gastown # All gastown agents\nbd list --type=agent --label=role_type:dog # All dogs\n```\n\n## Acceptance\n- New agent beads created with role_type/rig labels\n- Existing agent beads backfilled (one-time script)\n- @group patterns work in gt mail router","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T20:47:33.950733-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-29T21:16:00.746383-08:00","closed_at":"2025-12-29T21:16:00.746383-08:00","close_reason":"Implemented: role_type/rig labels for agent beads, auto-labeling on create/update, backfill command"}
@@ -381,8 +385,8 @@
{"id":"bd-hj0s","title":"Add 'convoy' issue type with reactive completion","description":"Add convoy as a new issue type with reactive completion semantics.\n\nBehavior:\n- Convoy has list of tracked issues (via 'tracks' relation)\n- When all tracked issues close (including wontfix), convoy auto-closes\n- Supports cross-prefix tracking (convoy in hq-* tracks gt-*, bd-*)\n\nImplementation:\n- New type: convoy\n- Reactive completion trigger on tracked issue closure\n- Query support: 'bd list --type=convoy'\n\nRelated: hq-7h8jx (Convoy System epic in town beads)","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2025-12-29T18:47:02.011011-08:00","created_by":"mayor","updated_at":"2025-12-30T00:05:13.515078-08:00","closed_at":"2025-12-30T00:05:13.515078-08:00","close_reason":"Implemented convoy type with reactive completion","dependencies":[{"issue_id":"bd-hj0s","depends_on_id":"bd-3roq","type":"blocks","created_at":"2025-12-29T18:47:10.59211-08:00","created_by":"daemon"}]}
{"id":"bd-hkr6","title":"GH#518: Document bd setup command","description":"bd setup is undiscoverable. Add to README/docs. Currently only findable by grepping source. See GitHub issue #518.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:03:54.664668-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-hlsw","title":"Add sync resilience guardrails for forced pushes and prefix mismatches","description":"Beads can get into unrecoverable sync states when remote forces pushes occur (e.g., rebases) combined with prefix mismatches from multi-worker scenarios. Add detection, prevention, and auto-recovery features to handle this gracefully.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-14T10:40:14.872875259-07:00","updated_at":"2025-12-14T10:40:14.872875259-07:00"}
{"id":"bd-hlsw.3","title":"Auto-recovery mode (bd sync --auto-recover)","description":"Add bd sync --auto-recover flag that: detects problematic sync state, backs up .beads/issues.db with timestamp, rebuilds DB from JSONL atomically, verifies consistency, reports what was fixed. Provides safety valve when sync integrity fails.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T10:40:20.599836875-07:00","updated_at":"2025-12-14T10:40:20.599836875-07:00","dependencies":[{"issue_id":"bd-hlsw.3","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.600435888-07:00","created_by":"daemon"}]}
{"id":"bd-hlsw.4","title":"Sync branch integrity guards","description":"Track sync branch parent commit. If sync branch was force-pushed, warn user and require confirmation before proceeding. Add option to reset to remote if user accepts rebase. Prevents silent corruption from forced pushes.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T10:40:20.645402352-07:00","updated_at":"2025-12-14T10:40:20.645402352-07:00","dependencies":[{"issue_id":"bd-hlsw.4","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.646425761-07:00","created_by":"daemon"}]}
{"id":"bd-hlsw.3","title":"Auto-recovery mode (bd sync --auto-recover)","description":"Add bd sync --auto-recover flag that: detects problematic sync state, backs up .beads/issues.db with timestamp, rebuilds DB from JSONL atomically, verifies consistency, reports what was fixed. Provides safety valve when sync integrity fails.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/opal","created_at":"2025-12-14T10:40:20.599836875-07:00","updated_at":"2025-12-30T00:31:21.834061-08:00","dependencies":[{"issue_id":"bd-hlsw.3","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.600435888-07:00","created_by":"daemon"}]}
{"id":"bd-hlsw.4","title":"Sync branch integrity guards","description":"Track sync branch parent commit. If sync branch was force-pushed, warn user and require confirmation before proceeding. Add option to reset to remote if user accepts rebase. Prevents silent corruption from forced pushes.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/onyx","created_at":"2025-12-14T10:40:20.645402352-07:00","updated_at":"2025-12-30T00:31:18.505841-08:00","dependencies":[{"issue_id":"bd-hlsw.4","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.646425761-07:00","created_by":"daemon"}]}
{"id":"bd-hlyr","title":"Merge: bd-m8ro","description":"branch: polecat/max\ntarget: main\nsource_issue: bd-m8ro\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:40.218445-08:00","updated_at":"2025-12-23T21:21:57.69886-08:00","closed_at":"2025-12-23T21:21:57.69886-08:00"}
{"id":"bd-hnkg","title":"GH#540: Add silent quick-capture mode (bd q)","description":"Add bd q alias for quick capture that outputs only issue ID. Useful for piping/scripting. See GitHub issue #540.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:38.260135-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-hobo","title":"Distinct prefixes for protos, molecules, wisps","description":"Template/workflow entities should have visually distinct prefixes from regular issues.\n\n**Problem:**\n- Protos (bd-7bs4) look like regular issues - invites squashing\n- Molecules (poured instances) also use bd- prefix\n- Wisps are in separate DB but still use bd- when referenced\n\n**Proposed Prefixes:**\n- `proto-` for templates (e.g., proto-release, proto-review)\n- `mol-` for active molecules (poured from protos)\n- `wisp-` for ephemeral wisps (vapor phase)\n\n**Benefits:**\n- Instant visual recognition of entity type\n- Prevents accidental modification of templates\n- Clear lifecycle: proto → mol → wisp → digest\n\n**Implementation options:**\n1. Separate databases with different prefixes\n2. Issue type determines prefix generation\n3. Naming convention enforced by bd pour/wisp commands","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T16:45:24.940809-08:00","updated_at":"2025-12-25T02:04:52.459233-08:00","closed_at":"2025-12-25T02:04:52.459233-08:00","labels":["workflow"]}
@@ -395,7 +399,7 @@
{"id":"bd-i0rx","title":"Merge: bd-ao0s","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-ao0s\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:13:42.716658-08:00","updated_at":"2025-12-20T23:17:26.993744-08:00","closed_at":"2025-12-20T23:17:26.993744-08:00"}
{"id":"bd-i5l","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T21:20:47.650732-08:00","created_by":"deacon","updated_at":"2025-12-27T00:10:54.176287-08:00","deleted_at":"2025-12-27T00:10:54.176287-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"}
{"id":"bd-i7a6","title":"Test actor flag","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-26T20:47:28.470006-08:00","updated_at":"2025-12-28T09:26:06.084894-08:00","closed_at":"2025-12-28T09:26:06.084894-08:00"}
{"id":"bd-ia3g","title":"BondRef.ProtoID field name is misleading for mol+mol bonds","description":"In bondMolMol, the BondRef.ProtoID field is used to store molecule IDs:\n\n```go\nBondedFrom: append(molA.BondedFrom, types.BondRef{\n ProtoID: molB.ID, // This is a molecule, not a proto\n ...\n})\n```\n\nThis is semantically confusing since ProtoID suggests it should only hold proto references.\n\n**Options:**\n1. Rename ProtoID to SourceID (breaking change, needs migration)\n2. Add documentation clarifying ProtoID can hold molecule IDs in bond context\n3. Leave as-is, accept the naming is imprecise\n\nLow priority since it's just naming, not functionality.","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/polecats/jasper","created_at":"2025-12-21T10:23:00.755067-08:00","updated_at":"2025-12-30T00:21:53.406998-08:00"}
{"id":"bd-ia3g","title":"BondRef.ProtoID field name is misleading for mol+mol bonds","description":"In bondMolMol, the BondRef.ProtoID field is used to store molecule IDs:\n\n```go\nBondedFrom: append(molA.BondedFrom, types.BondRef{\n ProtoID: molB.ID, // This is a molecule, not a proto\n ...\n})\n```\n\nThis is semantically confusing since ProtoID suggests it should only hold proto references.\n\n**Options:**\n1. Rename ProtoID to SourceID (breaking change, needs migration)\n2. Add documentation clarifying ProtoID can hold molecule IDs in bond context\n3. Leave as-is, accept the naming is imprecise\n\nLow priority since it's just naming, not functionality.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/polecats/jasper","created_at":"2025-12-21T10:23:00.755067-08:00","updated_at":"2025-12-30T00:40:56.399444-08:00","closed_at":"2025-12-30T00:40:56.399444-08:00","close_reason":"Merged via refinery"}
{"id":"bd-ibl9","title":"Merge: bd-4qfb","description":"branch: polecat/Polish\ntarget: main\nsource_issue: bd-4qfb\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:37:57.255125-08:00","updated_at":"2025-12-23T19:12:08.352249-08:00","closed_at":"2025-12-23T19:12:08.352249-08:00"}
{"id":"bd-icfe","title":"gt spawn/crew setup should create .beads/redirect for worktrees","description":"Crew clones and polecats need a .beads/redirect file pointing to the shared beads database (../../mayor/rig/.beads). Currently:\n\n- redirect files can get deleted by git clean\n- not auto-created during gt spawn or worktree setup\n- missing redirects cause 'no beads database found' errors\n\nFound missing in: gastown/joe, beads/zoey (after git clean)\n\nFix options:\n1. gt spawn creates redirect during worktree setup\n2. gt prime regenerates missing redirects\n3. bd commands auto-detect worktree and find shared beads\n\nThis should be standard Gas Town rig configuration.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T01:30:26.115872-08:00","updated_at":"2025-12-21T17:51:25.740811-08:00","closed_at":"2025-12-21T17:51:25.740811-08:00"}
{"id":"bd-icnf","title":"Add bd mol run command (bond + assign + pin)","description":"bd mol run = bond + assign root to caller + pin to startup mail. This is the Gas Town integration point. When agent restarts, check startup mail, find pinned molecule root, query bd ready for next step. Makes molecules immortal.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T23:52:17.462882-08:00","updated_at":"2025-12-21T00:07:25.803058-08:00","closed_at":"2025-12-21T00:07:25.803058-08:00","dependencies":[{"issue_id":"bd-icnf","depends_on_id":"bd-ffjt","type":"blocks","created_at":"2025-12-20T23:52:25.871742-08:00","created_by":"daemon"}]}
@@ -421,7 +425,7 @@
{"id":"bd-j4cr","title":"bd cook: waits_for field not preserved in cooked protos","description":"The `waits_for` field in formula steps is not preserved in the cooked proto.\n\n## Formula\n\n```yaml\n- id: aggregate\n title: Aggregate arm results\n needs: [survey-workers]\n waits_for: all-children\n description: |\n This is a **fanout gate**...\n```\n\n## Expected\n\nThe cooked proto step should have metadata indicating it's a gate:\n- Label: `gate:all-children` or\n- Field in issue metadata indicating wait behavior\n\n## Actual\n\nThe `waits_for` field is silently ignored. Only the description mentions 'fanout gate'.\n\n## Impact\n\nThe execution engine cannot determine which steps are gates that need to wait\nfor dynamically-bonded children. This breaks the Christmas Ornament pattern\nwhere aggregate steps must wait for all polecat-arm wisps to complete.\n\n## Related\n\nbd-hr39: needs field not converted to step dependencies","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T13:51:10.494565-08:00","updated_at":"2025-12-24T13:59:09.932552-08:00","closed_at":"2025-12-24T13:59:09.932552-08:00"}
{"id":"bd-j6lr","title":"GH#402: Add --parent flag documentation to bd onboard","description":"bd onboard output is missing --parent flag for epic subtasks. Agents guess wrong syntax (--deps parent:). See GitHub issue #402.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:03:56.594829-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-jbqx","title":"Code smell: Repeated validation patterns could be centralized","description":"Similar validation patterns appear in multiple commands (create.go, show.go, update.go, etc.):\n- Check if resource exists\n- Check if resource is in valid state\n- Validate user input\n- Check permissions\n\n**Problem:**\n- Duplicated validation logic\n- Inconsistent validation between commands\n- Hard to add new validation rules consistently\n\n**Acceptance Criteria:**\n- [ ] Create internal/validation package\n- [ ] Centralize common validation logic\n- [ ] Use composition for validation chains\n- [ ] Update commands to use shared validators\n- [ ] Tests pass","status":"in_progress","priority":3,"issue_type":"chore","assignee":"beads/polecats/opal","created_at":"2025-12-28T19:00:03.171186-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T00:25:53.326946-08:00","dependencies":[{"issue_id":"bd-jbqx","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.84458-08:00","created_by":"daemon"}]}
{"id":"bd-jdz3","title":"Add pager support to bd list","description":"Add pager support following gh cli conventions:\n\nFlags:\n- --no-pager: disable pager for this command\n\nEnvironment variables:\n- BD_PAGER / PAGER: pager program (default: less)\n- BD_NO_PAGER: disable pager globally\n\nBehavior:\n- Auto-enable pager when output exceeds terminal height\n- Respect LESS env var for pager options\n- Disable pager when stdout is not a TTY (pipes/scripts)","notes":"## Implementation Plan\n\n### Dependencies\n```go\nimport \"github.com/muesli/termenv\" // or golang.org/x/term\n```\n\n### Code Changes\n\n1. **Add pager helper** (internal/ui/pager.go):\n```go\nfunc ToPager(content string) error {\n // Check BD_NO_PAGER or --no-pager\n if os.Getenv(\"BD_NO_PAGER\") \\!= \"\" {\n fmt.Print(content)\n return nil\n }\n \n // Get pager command\n pager := os.Getenv(\"BD_PAGER\")\n if pager == \"\" {\n pager = os.Getenv(\"PAGER\")\n }\n if pager == \"\" {\n pager = \"less\"\n }\n \n // Check if content exceeds terminal height\n // If not, just print directly\n \n // Pipe to pager\n cmd := exec.Command(pager)\n cmd.Stdin = strings.NewReader(content)\n cmd.Stdout = os.Stdout\n cmd.Stderr = os.Stderr\n return cmd.Run()\n}\n```\n\n2. **Add --no-pager flag** (cmd/bd/list.go init):\n```go\nlistCmd.Flags().Bool(\"no-pager\", false, \"Disable pager output\")\n```\n\n3. **Use pager in list output** (end of Run):\n```go\nif \\!noPager \u0026\u0026 isTerminal(os.Stdout) {\n ui.ToPager(output.String())\n} else {\n fmt.Print(output.String())\n}\n```\n\n### Environment Variables\n- `BD_PAGER`: pager program (overrides PAGER)\n- `BD_NO_PAGER`: set to any value to disable\n- `PAGER`: fallback pager\n- `LESS`: passed through for less options\n\n### Testing\n- `bd list` pipes to pager when output \u003e terminal height\n- `bd list --no-pager` prints directly\n- `BD_NO_PAGER=1 bd list` prints directly\n- `bd list | cat` auto-disables pager (not a TTY)","status":"hooked","priority":3,"issue_type":"feature","assignee":"beads/polecats/topaz","created_at":"2025-12-29T15:25:09.109258-08:00","created_by":"stevey","updated_at":"2025-12-30T00:13:24.222295-08:00"}
{"id":"bd-jdz3","title":"Add pager support to bd list","description":"Add pager support following gh cli conventions:\n\nFlags:\n- --no-pager: disable pager for this command\n\nEnvironment variables:\n- BD_PAGER / PAGER: pager program (default: less)\n- BD_NO_PAGER: disable pager globally\n\nBehavior:\n- Auto-enable pager when output exceeds terminal height\n- Respect LESS env var for pager options\n- Disable pager when stdout is not a TTY (pipes/scripts)","notes":"## Implementation Plan\n\n### Dependencies\n```go\nimport \"github.com/muesli/termenv\" // or golang.org/x/term\n```\n\n### Code Changes\n\n1. **Add pager helper** (internal/ui/pager.go):\n```go\nfunc ToPager(content string) error {\n // Check BD_NO_PAGER or --no-pager\n if os.Getenv(\"BD_NO_PAGER\") \\!= \"\" {\n fmt.Print(content)\n return nil\n }\n \n // Get pager command\n pager := os.Getenv(\"BD_PAGER\")\n if pager == \"\" {\n pager = os.Getenv(\"PAGER\")\n }\n if pager == \"\" {\n pager = \"less\"\n }\n \n // Check if content exceeds terminal height\n // If not, just print directly\n \n // Pipe to pager\n cmd := exec.Command(pager)\n cmd.Stdin = strings.NewReader(content)\n cmd.Stdout = os.Stdout\n cmd.Stderr = os.Stderr\n return cmd.Run()\n}\n```\n\n2. **Add --no-pager flag** (cmd/bd/list.go init):\n```go\nlistCmd.Flags().Bool(\"no-pager\", false, \"Disable pager output\")\n```\n\n3. **Use pager in list output** (end of Run):\n```go\nif \\!noPager \u0026\u0026 isTerminal(os.Stdout) {\n ui.ToPager(output.String())\n} else {\n fmt.Print(output.String())\n}\n```\n\n### Environment Variables\n- `BD_PAGER`: pager program (overrides PAGER)\n- `BD_NO_PAGER`: set to any value to disable\n- `PAGER`: fallback pager\n- `LESS`: passed through for less options\n\n### Testing\n- `bd list` pipes to pager when output \u003e terminal height\n- `bd list --no-pager` prints directly\n- `BD_NO_PAGER=1 bd list` prints directly\n- `bd list | cat` auto-disables pager (not a TTY)","status":"closed","priority":3,"issue_type":"feature","assignee":"beads/polecats/topaz","created_at":"2025-12-29T15:25:09.109258-08:00","created_by":"stevey","updated_at":"2025-12-30T00:41:45.168318-08:00","closed_at":"2025-12-30T00:41:45.168318-08:00","close_reason":"Merged via refinery"}
{"id":"bd-jgxi","title":"Auto-migrate database on CLI version bump","description":"When CLI is upgraded (e.g., 0.24.0 → 0.24.1), database version becomes stale. Add auto-migration in PersistentPreRun or daemon startup. Check dbVersion != CLIVersion and run bd migrate automatically. Fixes recurring UX issue where bd doctor shows version mismatch after every CLI upgrade.","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2025-11-21T23:16:09.004619-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-jgxi","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:09.005513-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"}
{"id":"bd-jke6","title":"Add covering index (label, issue_id) for label queries","description":"GetIssuesByLabel joins labels table but requires table lookup after using idx_labels_label.\n\n**Query (labels.go:165):**\n```sql\nSELECT ... FROM issues i\nJOIN labels l ON i.id = l.issue_id\nWHERE l.label = ?\n```\n\n**Problem:** Current idx_labels_label index doesn't cover issue_id, requiring row lookup.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_labels_label_issue ON labels(label, issue_id);\n```\n\nThis is a covering index - query can be satisfied entirely from the index without touching the labels table rows.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T22:58:51.485354-08:00","updated_at":"2025-12-22T23:15:13.839904-08:00","closed_at":"2025-12-22T23:15:13.839904-08:00","dependencies":[{"issue_id":"bd-jke6","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:51.485984-08:00","created_by":"daemon"}]}
{"id":"bd-jsk7","title":"Agent beads: structured labels for filtering","description":"## Agent Beads Need Queryable Labels\n\nCurrently agent beads have role_type/rig in description text, not as labels. This breaks @group resolution in gt mail.\n\n## Current State\n```json\n{\n \"id\": \"gt-gastown-witness\",\n \"issue_type\": \"agent\",\n \"description\": \"...\\\\nrole_type: witness\\\\nrig: gastown\\\\n...\"\n}\n```\n\nCannot query: `bd list --type=agent --label=role_type:witness` returns nothing.\n\n## Required\nAgent bead creation should add labels:\n- `role_type:\u003ctype\u003e` (witness, refinery, crew, polecat, dog, mayor, deacon)\n- `rig:\u003crig\u003e` (gastown, beads, or \"town\" for town-level)\n\n## Where to Fix\ngt polecat/crew/agent creation commands should add labels.\n\n## Acceptance\n- New agent beads created with role_type/rig labels\n- @group patterns work in gt mail router","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T20:49:13.444793-08:00","created_by":"gastown/crew/joe","updated_at":"2025-12-29T20:58:04.67866-08:00","closed_at":"2025-12-29T20:58:04.67866-08:00","close_reason":"Duplicate of bd-g7eq"}
@@ -625,7 +629,7 @@
{"id":"bd-pbh.7","title":"Update beads_mcp/__init__.py to 0.30.4","description":"Update __version__ in integrations/beads-mcp/src/beads_mcp/__init__.py:\n```python\n__version__ = \"0.30.4\"\n```\n\n\n```verify\ngrep -q '__version__ = \"0.30.4\"' integrations/beads-mcp/src/beads_mcp/__init__.py\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:11.005334-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.7","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:11.005699-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-pbh.8","title":"Update npm-package/package.json to 0.30.4","description":"Update version field in npm-package/package.json:\n```json\n\"version\": \"0.30.4\"\n```\n\n\n```verify\njq -e '.version == \"0.30.4\"' npm-package/package.json\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:11.014905-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.8","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:11.01529-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-pbh.9","title":"Update hook templates to 0.30.4","description":"Update bd-hooks-version comment in all 4 hook templates:\n- cmd/bd/templates/hooks/pre-commit\n- cmd/bd/templates/hooks/post-merge\n- cmd/bd/templates/hooks/pre-push\n- cmd/bd/templates/hooks/post-checkout\n\nEach should have:\n```bash\n# bd-hooks-version: 0.30.4\n```\n\n\n```verify\ngrep -l 'bd-hooks-version: 0.30.4' cmd/bd/templates/hooks/* | wc -l | grep -q '4'\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T21:19:11.0248-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","labels":["workflow"],"dependencies":[{"issue_id":"bd-pbh.9","depends_on_id":"bd-pbh","type":"parent-child","created_at":"2025-12-17T21:19:11.025124-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-pdr2","title":"Consider backwards compatibility for ready() and list() return type change","description":"PR #481 changed the return types of `ready()` and `list()` from `list[Issue]` to `list[IssueMinimal] | CompactedResult`. This is a breaking change for MCP clients.\n\n## Impact Assessment\nBreaking change affects:\n- Any MCP client expecting `list[Issue]` from ready()\n- Any MCP client expecting `list[Issue]` from list()\n- Client code that accesses full Issue fields (description, design, acceptance_criteria, timestamps, dependencies, dependents)\n\n## Current Behavior\n- ready() returns `list[IssueMinimal] | CompactedResult`\n- list() returns `list[IssueMinimal] | CompactedResult`\n- show() still returns full `Issue` (good)\n\n## Considerations\n**Pros of current approach:**\n- Forces clients to use show() for full details (good for context efficiency)\n- Simple mental model (always use show for full data)\n- Documentation warns about this\n\n**Cons:**\n- Clients expecting list[Issue] will break\n- No graceful degradation option\n- No migration period\n\n## Potential Solutions\n1. Add optional parameter `full_details=false` to ready/list (would increase payload)\n2. Create separate tools: ready_minimal/list_minimal + ready_full/list_full\n3. Accept breaking change and document upgrade path (current approach)\n4. Version the MCP server and document migration guide\n\n## Recommendation\nCurrent approach (solution 3) is reasonable if:\n- Changelog clearly documents the breaking change\n- Migration guide provided to clients\n- Error handling is graceful for clients expecting specific fields","status":"hooked","priority":2,"issue_type":"task","assignee":"beads/polecats/obsidian","created_at":"2025-12-14T14:24:56.460465-08:00","updated_at":"2025-12-30T00:28:07.148488-08:00","dependencies":[{"issue_id":"bd-pdr2","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:56.461959-08:00","created_by":"stevey"}]}
{"id":"bd-pdr2","title":"Consider backwards compatibility for ready() and list() return type change","description":"PR #481 changed the return types of `ready()` and `list()` from `list[Issue]` to `list[IssueMinimal] | CompactedResult`. This is a breaking change for MCP clients.\n\n## Impact Assessment\nBreaking change affects:\n- Any MCP client expecting `list[Issue]` from ready()\n- Any MCP client expecting `list[Issue]` from list()\n- Client code that accesses full Issue fields (description, design, acceptance_criteria, timestamps, dependencies, dependents)\n\n## Current Behavior\n- ready() returns `list[IssueMinimal] | CompactedResult`\n- list() returns `list[IssueMinimal] | CompactedResult`\n- show() still returns full `Issue` (good)\n\n## Considerations\n**Pros of current approach:**\n- Forces clients to use show() for full details (good for context efficiency)\n- Simple mental model (always use show for full data)\n- Documentation warns about this\n\n**Cons:**\n- Clients expecting list[Issue] will break\n- No graceful degradation option\n- No migration period\n\n## Potential Solutions\n1. Add optional parameter `full_details=false` to ready/list (would increase payload)\n2. Create separate tools: ready_minimal/list_minimal + ready_full/list_full\n3. Accept breaking change and document upgrade path (current approach)\n4. Version the MCP server and document migration guide\n\n## Recommendation\nCurrent approach (solution 3) is reasonable if:\n- Changelog clearly documents the breaking change\n- Migration guide provided to clients\n- Error handling is graceful for clients expecting specific fields","status":"closed","priority":2,"issue_type":"task","assignee":"beads/polecats/obsidian","created_at":"2025-12-14T14:24:56.460465-08:00","updated_at":"2025-12-30T00:38:54.425634-08:00","closed_at":"2025-12-30T00:38:54.425634-08:00","close_reason":"Merged via refinery","dependencies":[{"issue_id":"bd-pdr2","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:24:56.461959-08:00","created_by":"stevey"}]}
{"id":"bd-pe4s","title":"JSON test issue","description":"Line 1\nLine 2\nLine 3","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T16:14:36.969074-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-pgcs","title":"Clean up orphaned child issues (bd-cb64c226.*, bd-cbed9619.*)","description":"## Problem\n\nEvery bd command shows warnings about 12 orphaned child issues:\n- bd-cb64c226.1, .6, .8, .9, .10, .12, .13\n- bd-cbed9619.1, .2, .3, .4, .5\n\nThese are hierarchical IDs (parent.child format) where the parent issues no longer exist.\n\n## Impact\n\n- Clutters output of every bd command\n- Confusing for users\n- Indicates incomplete cleanup of deleted parent issues\n\n## Proposed Solution\n\n1. Delete the orphaned issues since their parents no longer exist:\n ```bash\n bd delete bd-cb64c226.1 bd-cb64c226.6 bd-cb64c226.8 ...\n ```\n\n2. Or convert them to top-level issues if they contain useful content\n\n## Investigation Needed\n\n- What were the parent issues bd-cb64c226 and bd-cbed9619?\n- Why were they deleted without their children?\n- Should bd delete cascade to children automatically?","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T23:06:17.240571-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"}
{"id":"bd-pgh","title":"Deacon Patrol","description":"Mayor's daemon patrol loop for handling callbacks, health checks, and cleanup.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T21:20:47.62144-08:00","created_by":"deacon","updated_at":"2025-12-27T00:10:54.177166-08:00","deleted_at":"2025-12-27T00:10:54.177166-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"}
@@ -639,7 +643,7 @@
{"id":"bd-pspk","title":"Fix: Empty coordinator shows blank in bd swarm create output","description":"Line 992 prints 'Coordinator: ' even when coordinator is empty string.\n\nShould either:\n- Print 'Coordinator: (none)' \n- Skip the line entirely when empty\n\nMinor polish issue.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-28T21:38:28.651591-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:00:57.569797-08:00","closed_at":"2025-12-28T22:00:57.569797-08:00","dependencies":[{"issue_id":"bd-pspk","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.844669-08:00","created_by":"daemon"}]}
{"id":"bd-pvu0","title":"Merge: bd-4opy","description":"branch: polecat/angharad\ntarget: main\nsource_issue: bd-4opy\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T00:24:44.057267-08:00","updated_at":"2025-12-23T01:33:25.730271-08:00","closed_at":"2025-12-23T01:33:25.730271-08:00"}
{"id":"bd-pzw7","title":"gt handoff deadlock at handoff.go:125","notes":"When running 'gt handoff -m \"message\"' after successful MR submit, go panics with 'fatal error: all goroutines are asleep - deadlock\\!' at handoff.go:125. The shutdown request still appears to be sent successfully but the command crashes. Stack trace shows issue is in runHandoff select statement.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-19T23:22:12.46315-08:00","updated_at":"2025-12-21T17:51:25.817355-08:00","closed_at":"2025-12-21T17:51:25.817355-08:00"}
{"id":"bd-qe7j","title":"Code smell: Incomplete TODOs in formula/types.go","description":"internal/formula/types.go has multiple TODO items for features that are defined in the schema but not implemented:\n\n- Line 170: Expand field not implemented in bd cook\n- Line 174: ExpandVars field not implemented\n- Line 179: Gate integration pending (bd-udsi gates)\n- Line 186: Condition evaluation not implemented\n- Line 210: Additional expansion features\n\n**Problem:**\n- Schema defines features that aren't implemented\n- Can confuse users who try to use these fields\n- Creates maintenance burden of unused code paths\n\n**Acceptance Criteria:**\n- [ ] Either implement the features OR\n- [ ] Remove unimplemented fields from schema OR\n- [ ] Document clearly which fields are future-only\n- [ ] Update related beads issues if they exist","status":"hooked","priority":3,"issue_type":"chore","assignee":"beads/polecats/onyx","created_at":"2025-12-28T18:59:59.460434-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T00:13:17.114986-08:00","dependencies":[{"issue_id":"bd-qe7j","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.747872-08:00","created_by":"daemon"}]}
{"id":"bd-qe7j","title":"Code smell: Incomplete TODOs in formula/types.go","description":"internal/formula/types.go has multiple TODO items for features that are defined in the schema but not implemented:\n\n- Line 170: Expand field not implemented in bd cook\n- Line 174: ExpandVars field not implemented\n- Line 179: Gate integration pending (bd-udsi gates)\n- Line 186: Condition evaluation not implemented\n- Line 210: Additional expansion features\n\n**Problem:**\n- Schema defines features that aren't implemented\n- Can confuse users who try to use these fields\n- Creates maintenance burden of unused code paths\n\n**Acceptance Criteria:**\n- [ ] Either implement the features OR\n- [ ] Remove unimplemented fields from schema OR\n- [ ] Document clearly which fields are future-only\n- [ ] Update related beads issues if they exist","status":"closed","priority":3,"issue_type":"chore","assignee":"beads/polecats/onyx","created_at":"2025-12-28T18:59:59.460434-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T00:39:56.504522-08:00","closed_at":"2025-12-30T00:39:56.504522-08:00","close_reason":"Merged via refinery","dependencies":[{"issue_id":"bd-qe7j","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.747872-08:00","created_by":"daemon"}]}
{"id":"bd-qioh","title":"Standardize error handling: replace direct fmt.Fprintf+os.Exit with FatalError","description":"Standardize error handling in cmd/bd/ using FatalError pattern.\n\n## Current State\n~200+ instances of direct `fmt.Fprintf(os.Stderr, ...) + os.Exit(1)` pattern scattered across cmd/bd/*.go files.\n\n## Target Pattern\n\nUse existing FatalError helper (or create if missing):\n\n```go\n// In cmd/bd/helpers.go or similar\nfunc FatalError(format string, args ...interface{}) {\n fmt.Fprintf(os.Stderr, \"Error: \"+format+\"\\n\", args...)\n os.Exit(1)\n}\n\nfunc FatalErrorf(err error, context string) {\n fmt.Fprintf(os.Stderr, \"Error: %s: %v\\n\", context, err)\n os.Exit(1)\n}\n```\n\n## Transformation\n\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Error: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"%v\", err)\n\n// Before\nfmt.Fprintf(os.Stderr, \"Error: invalid --since duration: %v\\n\", err)\nos.Exit(1)\n\n// After\nFatalError(\"invalid --since duration: %v\", err)\n```\n\n## Files to Update (by occurrence count)\nRun: `grep -c \"os.Exit(1)\" cmd/bd/*.go | sort -t: -k2 -rn | head -20`\n\nPriority files (highest occurrence):\n- close.go\n- show.go\n- sync.go\n- init.go\n- list.go\n- create.go\n- update.go\n\n## Implementation Steps\n\n1. **Check if FatalError exists** in cmd/bd/helpers.go or create it\n2. **Create migration script** or use sed:\n ```bash\n # Find patterns to replace\n grep -rn \"fmt.Fprintf(os.Stderr.*Error.*\\n.*os.Exit(1)\" cmd/bd/\n ```\n3. **Replace systematically** file by file\n4. **Run tests** after each file to verify behavior unchanged\n5. **Run linter** to catch any missed patterns\n\n## Verification\n```bash\n# Count remaining direct exits (should be near zero)\ngrep -c \"os.Exit(1)\" cmd/bd/*.go | awk -F: \"{sum+=\\$2} END {print sum}\"\n\n# Run tests\ngo test -short ./cmd/bd/...\n```\n\n## Success Criteria\n- All error exits use FatalError/FatalErrorf\n- Consistent \"Error: \" prefix on all error messages\n- Tests pass\n- No behavior changes (exit codes remain 1)","notes":"## Progress (Dec 2025)\n\nStandardized error handling in 3 major files:\n- compact.go: All 48 os.Exit(1) calls converted to FatalError\n- sync.go: All error patterns converted (kept 1 valid summary exit)\n- migrate.go: 4 patterns converted\n\n## Remaining Work\n~326 fmt.Fprintf(os.Stderr, \"Error:\") patterns remain across ~30 files.\nHigh-count files remaining: show.go (16), dep.go (14), gate.go (28), init.go (11).\n\n## Verification\n- Build compiles successfully\n- Tests pass","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T18:17:19.309394-08:00","updated_at":"2025-12-23T14:14:37.939802-08:00","closed_at":"2025-12-23T14:14:37.939802-08:00","dependencies":[{"issue_id":"bd-qioh","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.43514-08:00","created_by":"daemon"}]}
{"id":"bd-qket","title":"Add computed .parent field to JSON output for convenience","description":"Currently parent is only in dependencies[]. Add a top-level .parent field to JSON/JSONL output that extracts the parent-child dependency for easier querying.\n\nExample:\n```bash\n# Current (works but verbose):\nbd show \u003cid\u003e --json | jq '.[0].dependencies[] | select(.dependency_type == \"parent-child\") | .id'\n\n# Desired:\nbd show \u003cid\u003e --json | jq '.[0].parent'\n```\n\nLow priority enhancement.","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-27T23:32:44.24217-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T02:24:31.453442-08:00","closed_at":"2025-12-28T02:24:31.453442-08:00"}
{"id":"bd-qkw9","title":"Run bump-version.sh {{version}}","description":"Run ./scripts/bump-version.sh {{version}} to update version in all files","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:55:58.841424-08:00","updated_at":"2025-12-20T17:59:26.262877-08:00","closed_at":"2025-12-20T01:18:48.99813-08:00","dependencies":[{"issue_id":"bd-qkw9","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:14.786027-08:00","created_by":"daemon"}]}
@@ -660,7 +664,7 @@
{"id":"bd-qqc.7","title":"Push release v{{version}} 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-18T13:00:26.933082-08:00","updated_at":"2025-12-24T16:25:30.689807-08:00","dependencies":[{"issue_id":"bd-qqc.7","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T13:00:26.933687-08:00","created_by":"stevey"},{"issue_id":"bd-qqc.7","depends_on_id":"bd-qqc.6","type":"blocks","created_at":"2025-12-18T13:01:12.711161-08:00","created_by":"stevey"}],"deleted_at":"2025-12-24T16:25:30.689807-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
{"id":"bd-qqc.8","title":"Create and push git tag v{{version}}","description":"Create the release tag and push it:\n\n```bash\ngit tag v{{version}}\ngit push origin v{{version}}\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:34.659927-08:00","updated_at":"2025-12-24T16:25:30.608841-08:00","dependencies":[{"issue_id":"bd-qqc.8","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:34.660248-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.8","depends_on_id":"bd-vgi5","type":"blocks","created_at":"2025-12-18T22:43:21.209529-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.608841-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
{"id":"bd-qqc.9","title":"Update Homebrew formula","description":"Update the Homebrew tap with new version:\n\n```bash\n./scripts/update-homebrew.sh {{version}}\n```\n\nThis script waits for GitHub Actions to complete (~5 min), then updates the formula with new SHA256 hashes.\n\nAfter running, verify the formula with:\n\n```bash\nbrew info steveyegge/beads/bd\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:35.815096-08:00","updated_at":"2025-12-24T16:25:30.525596-08:00","dependencies":[{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:35.816752-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc.8","type":"blocks","created_at":"2025-12-18T22:43:21.332955-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.525596-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"}
{"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":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/quartz","created_at":"2025-12-28T21:31:08.574846-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T00:28:10.326401-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","assignee":"beads/polecats/quartz","created_at":"2025-12-28T21:31:08.574846-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-30T00:36:28.565331-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-qy37","title":"Work on gt-8tmz.36: Validate expanded step IDs are unique...","description":"Work on gt-8tmz.36: Validate expanded step IDs are unique. After ApplyExpansions in internal/formula/expand.go, new steps can be created that might have duplicate IDs. Add validation in ApplyExpansions to check for duplicate step IDs after expansion. If duplicates found, return an error with the duplicate IDs. Add test in expand_test.go. When done, commit and push to main.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T20:01:27.048018-08:00","updated_at":"2025-12-25T20:04:42.594254-08:00","closed_at":"2025-12-25T20:04:42.594254-08:00"}
{"id":"bd-r06v","title":"Merge: bd-phtv","description":"branch: polecat/Pinner\ntarget: main\nsource_issue: bd-phtv\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:48:16.853715-08:00","updated_at":"2025-12-23T19:12:08.342414-08:00","closed_at":"2025-12-23T19:12:08.342414-08:00"}
{"id":"bd-r22t","title":"Execute molecule bd-mol-xga: Release beads 0.37.0","description":"Execute molecule bd-mol-xga: Release beads 0.37.0","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T01:12:48.454295-08:00","updated_at":"2025-12-26T01:27:26.165571-08:00","closed_at":"2025-12-26T01:27:26.165571-08:00","dependencies":[{"issue_id":"bd-r22t","depends_on_id":"bd-mol-xga","type":"blocks","created_at":"2025-12-26T01:13:17.380653-08:00","created_by":"daemon"}]}
@@ -695,14 +699,15 @@
{"id":"bd-s00m.4","title":"Migration: Convert pinned work items to hooked","description":"Migrate existing pinned beads that represent work-on-hook to use 'hooked' status.\n\n## Migration Logic\n\n```sql\nUPDATE issues \nSET status = 'hooked'\nWHERE status = 'pinned' \n AND issue_type NOT IN ('agent', 'role')\n```\n\n## What Stays Pinned\n\n- Agent identity beads (gt-mayor, gt-witness-gastown, etc.)\n- Role definition beads (gt-mayor-role, etc.)\n\n## What Becomes Hooked\n\n- Molecules on hooks (mol_type field set)\n- Regular issues/tasks that were pinned to hooks\n\n## Verification\n\nAfter migration:\n- bd list --status=pinned should only show agents/roles\n- bd list --status=hooked should show work on hooks","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T22:17:13.872171-08:00","created_by":"stevey","updated_at":"2025-12-28T22:36:09.039612-08:00","closed_at":"2025-12-28T22:36:09.039612-08:00","dependencies":[{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:17:13.872786-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.168228-08:00","created_by":"daemon"}]}
{"id":"bd-s0qf","title":"GH#405: Fix prefix parsing with hyphens - multi-hyphen prefixes parsed incorrectly","description":"Fixed: ExtractIssuePrefix was falling back to first-hyphen for word-like suffixes, breaking multi-hyphen prefixes like 'hacker-news' and 'me-py-toolkit'.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:13:56.951359-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-s1pz","title":"Merge: bd-u2sc.4","description":"branch: polecat/Logger\ntarget: main\nsource_issue: bd-u2sc.4\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:45:52.412757-08:00","updated_at":"2025-12-23T19:12:08.356689-08:00","closed_at":"2025-12-23T19:12:08.356689-08:00"}
{"id":"bd-s2t","title":"wish: a 'continue' or similar cmd/flag which means alter last issue","description":"so many time I create an issue and then have another thought: 'oh, before I did X and it crashed there was ZZZ happening' or 'actually that is P4 not P2'. It would be nice if when `bd {cmd}` is used without a {title} or {id} it just adds or updates the most recently touched issue.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/opal","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-30T00:28:20.614041-08:00"}
{"id":"bd-s2t","title":"wish: a 'continue' or similar cmd/flag which means alter last issue","description":"so many time I create an issue and then have another thought: 'oh, before I did X and it crashed there was ZZZ happening' or 'actually that is P4 not P2'. It would be nice if when `bd {cmd}` is used without a {title} or {id} it just adds or updates the most recently touched issue.","status":"in_progress","priority":3,"issue_type":"task","assignee":"beads/polecats/opal","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-30T00:29:38.032993-08:00"}
{"id":"bd-s5kf","title":"Merge: onyx-1767083477016","description":"branch: polecat/onyx-1767083477016\ntarget: main\nsource_issue: onyx-1767083477016\nrig: beads","status":"open","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:37:08.214926-08:00","created_by":"beads/polecats/onyx","updated_at":"2025-12-30T00:37:08.214926-08:00"}
{"id":"bd-sal9","title":"bd mol current: soft cursor showing current/next step","description":"Add bd mol current command for molecule navigation orientation.\n\n## Usage\n\nbd mol current [mol-id]\n\nIf mol-id given, show status for that molecule.\nIf not given, infer from in_progress issues assigned to current agent.\n\n## Output\n\nYou're working on molecule gt-abc (Feature X)\n\n [done] gt-abc.1: Design\n [done] gt-abc.2: Scaffold \n [done] gt-abc.3: Implement\n [current] gt-abc.4: Write tests [in_progress] \u003c- YOU ARE HERE\n [pending] gt-abc.5: Documentation\n [pending] gt-abc.6: Exit decision\n\nProgress: 3/6 steps complete\n\n## Key behaviors\n- Shows full molecule structure with status indicators\n- Highlights current in_progress step\n- If no in_progress, highlights first ready step\n- Works without explicit cursor tracking (inferred from state)\n\n## Implementation notes\n- Query children of mol-id\n- Sort by dependency order\n- Find first in_progress or first ready\n- Format with status indicators\n\n## Gas Town integration\n- gt-lz13: Update templates with nav workflow\n- gt-um6q: Update docs with nav workflow","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T17:03:30.245964-08:00","updated_at":"2025-12-22T17:36:31.936007-08:00","closed_at":"2025-12-22T17:36:31.936007-08:00"}
{"id":"bd-sh4c","title":"Improve test coverage for cmd/bd/setup (28.4% → 50%)","description":"The setup package has only 28.4% test coverage. Setup commands are critical for first-time user experience.\n\nCurrent coverage: 28.4%\nTarget coverage: 50%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:04.409346-08:00","updated_at":"2025-12-23T22:37:13.494999-08:00","closed_at":"2025-12-23T22:37:13.494999-08:00"}
{"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"}
{"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":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:17:50.561021-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:14:22.838484-08:00","closed_at":"2025-12-28T22:14:22.838484-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-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":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/quartz","created_at":"2025-12-25T23:13:11.718635-08:00","updated_at":"2025-12-30T00:31:11.93194-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"}
{"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"}

11
.beads/mq/bd-5482.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "bd-5482",
"branch": "polecat/obsidian-1767083466920",
"target": "main",
"source_issue": "obsidian-1767083466920",
"worker": "",
"rig": "beads",
"title": "Merge: obsidian-1767083466920",
"priority": 2,
"created_at": "2025-12-30T00:36:06.075415-08:00"
}

11
.beads/mq/bd-71v3.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "bd-71v3",
"branch": "polecat/topaz-1767083484329",
"target": "main",
"source_issue": "topaz-1767083484329",
"worker": "",
"rig": "beads",
"title": "Merge: topaz-1767083484329",
"priority": 2,
"created_at": "2025-12-30T00:39:43.097575-08:00"
}

11
.beads/mq/bd-7wrh.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "bd-7wrh",
"branch": "polecat/jasper-1767083473604",
"target": "main",
"source_issue": "jasper-1767083473604",
"worker": "",
"rig": "beads",
"title": "Merge: jasper-1767083473604",
"priority": 2,
"created_at": "2025-12-30T00:39:04.849184-08:00"
}

11
.beads/mq/bd-agye.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "bd-agye",
"branch": "polecat/quartz-1767083470444",
"target": "main",
"source_issue": "quartz-1767083470444",
"worker": "",
"rig": "beads",
"title": "Merge: quartz-1767083470444",
"priority": 2,
"created_at": "2025-12-30T00:36:39.739127-08:00"
}

11
.beads/mq/bd-s5kf.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "bd-s5kf",
"branch": "polecat/onyx-1767083477016",
"target": "main",
"source_issue": "onyx-1767083477016",
"worker": "",
"rig": "beads",
"title": "Merge: onyx-1767083477016",
"priority": 2,
"created_at": "2025-12-30T00:37:08.216603-08:00"
}