diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 44bcb5ed..1ca5d2cf 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -33,7 +33,7 @@ {"id":"bd-1dez.1","title":"bd distill: Extract formula from mol/epic","description":"Extract a formula from completed work (mol, wisp, or epic).\n\n**Key change**: Distill works on execution artifacts (mols/wisps/epics), not protos.\nProtos are ephemeral - they don't persist. Distillation extracts patterns from\nactual executed work.\n\n## Usage\n```bash\nbd distill bd-mol-xyz -o my-workflow.formula.json\nbd distill bd-epic-abc -o feature-workflow.formula.json\n```\n\n## Use Cases\n- **Emergent patterns**: Structured work manually, want to templatize it\n- **Modified execution**: Poured a formula, added custom steps, want to capture\n- **Learning from success**: Extract what made a complex mol succeed\n\n## Implementation\n1. Load mol/wisp/epic subgraph (root + all children)\n2. Convert to formula JSON structure\n3. Extract variables from patterns (titles, descriptions)\n4. Generate step IDs from issue titles (slugify)\n5. Write .formula.json file\n\n## Output Format\n```json\n{\n \"formula\": \"my-workflow\",\n \"description\": \"...\",\n \"version\": 1,\n \"vars\": { ... },\n \"steps\": [ ... ]\n}\n```\n\n## Architecture Note\nThis closes the formula lifecycle loop:\n Formulas ──cook──→ Mols ──distill──→ Formulas\n\nAll sharing happens via formulas. Mols contain execution context and aren't shared.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:47.045105-08:00","updated_at":"2025-12-25T18:54:39.967765-08:00","closed_at":"2025-12-25T18:54:39.967765-08:00","dependencies":[{"issue_id":"bd-1dez.1","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:47.045596-08:00","created_by":"daemon"}]} {"id":"bd-1dez.2","title":"bd formula add: Import formula to local catalog","description":"Import a formula file to the local catalog (search path).\n\n**Replaces**: \"bd mol promote\" (proto-to-proto concept is obsolete with ephemeral protos)\n\n## Usage\n```bash\n# Add a formula file to project catalog\nbd formula add my-workflow.formula.json\n\n# Add to user-level catalog\nbd formula add my-workflow.formula.json --scope user\n\n# Add from URL\nbd formula add https://example.com/workflow.formula.json\n```\n\n## Implementation\n1. Parse the formula file (validate JSON structure)\n2. Determine target directory based on scope:\n - project: .beads/formulas/\n - user: ~/.beads/formulas/\n - town: ~/gt/.beads/formulas/\n3. Copy/download formula to target\n4. Verify it is loadable: bd formula show \u003cname\u003e\n\n## Flags\n- `--scope \u003clevel\u003e` - Where to add (project|user|town, default: project)\n- `--name \u003cname\u003e` - Override formula name (default: from file)\n\n## Note\nThis is for manually adding formulas. For GitHub-hosted formulas, use:\n bd mol install github.com/org/formula-name","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:48.588283-08:00","updated_at":"2025-12-25T19:54:35.242576-08:00","closed_at":"2025-12-25T19:54:35.242576-08:00","dependencies":[{"issue_id":"bd-1dez.2","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:48.590203-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.2","depends_on_id":"bd-1dez.1","type":"blocks","created_at":"2025-12-25T12:07:06.745686-08:00","created_by":"daemon"}]} {"id":"bd-1dez.3","title":"bd mol install: Install formula from GitHub","description":"Download and cook a formula from a GitHub repository.\n\n## Usage\n```bash\n# Direct GitHub URL\nbd mol install github.com/anthropics/mol-code-review\n\n# With version tag \nbd mol install github.com/anthropics/mol-code-review@v1.2.0\n\n# Shorthand (future: via registry lookup)\nbd mol install @anthropic/mol-code-review\n```\n\n## Implementation\n1. Parse URL: extract org, repo, optional version tag\n2. Construct raw URL: `https://raw.githubusercontent.com/org/repo/[tag]/formula.json`\n3. Fetch formula.json via HTTP\n4. Validate formula structure\n5. Save to .beads/formulas/\n6. Run cook to create local proto\n7. Record in .beads/installed.json for update tracking\n\n## installed.json 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 }\n}\n```\n\n## Dependencies\n- Requires network access\n- Uses `gh` CLI or direct HTTP for auth (private repos)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:49.757336-08:00","updated_at":"2025-12-25T21:53:13.417927-08:00","closed_at":"2025-12-25T21:53:13.417927-08:00","dependencies":[{"issue_id":"bd-1dez.3","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:49.759176-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.3","depends_on_id":"bd-1dez.7","type":"blocks","created_at":"2025-12-25T12:07:06.825716-08:00","created_by":"daemon"}]} -{"id":"bd-1dez.4","title":"bd mol update: Check and update installed formulas","description":"Check for newer versions of installed formulas and update them.\n\n## Usage\n```bash\nbd mol update # Update all\nbd mol update mol-code-review # Update specific formula\nbd mol update --check # Just check, don't update\n```\n\n## Implementation\n1. Read .beads/installed.json\n2. For each installed formula:\n - Fetch latest tag from GitHub API\n - Compare with installed version\n - If newer: download, cook, update installed.json\n3. Report what was updated\n\n## Flags\n- `--check` - Only check for updates, don't install\n- `--force` - Reinstall even if up to date\n- `--json` - Machine-readable output\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:50.952041-08:00","updated_at":"2025-12-25T21:53:13.41919-08:00","closed_at":"2025-12-25T21:53:13.41919-08:00","dependencies":[{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:50.952584-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.3","type":"blocks","created_at":"2025-12-25T12:07:06.90486-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.8","type":"blocks","created_at":"2025-12-25T12:07:06.99578-08:00","created_by":"daemon"}]} +{"id":"bd-1dez.4","title":"bd mol update: Check and update installed formulas","description":"Check for newer versions of installed formulas and update them.\n\n## Usage\n```bash\nbd mol update # Update all\nbd mol update mol-code-review # Update specific formula\nbd mol update --check # Just check, don't update\n```\n\n## Implementation\n1. Read .beads/installed.json\n2. For each installed formula:\n - Fetch latest tag from GitHub API\n - Compare with installed version\n - If newer: download, cook, update installed.json\n3. Report what was updated\n\n## Flags\n- `--check` - Only check for updates, don't install\n- `--force` - Reinstall even if up to date\n- `--json` - Machine-readable output\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:50.952041-08:00","updated_at":"2025-12-25T21:53:13.41919-08:00","closed_at":"2025-12-25T21:53:13.41919-08:00","dependencies":[{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.3","type":"blocks","created_at":"2025-12-25T12:07:06.90486-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.8","type":"blocks","created_at":"2025-12-25T12:07:06.99578-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:50.952584-08:00","created_by":"daemon"}]} {"id":"bd-1dez.5","title":"bd mol search: Find formulas using GitHub API","description":"Search for formulas in the Mol Mall using GitHub's search API.\n\n## Usage\n```bash\nbd mol search \"code review\" # Free text search\nbd mol search --topic molecule # By GitHub topic\nbd mol search --org anthropics # By organization\nbd mol search --stars \"\u003e10\" # By popularity\n```\n\n## Implementation\n1. Use GitHub Search API: `/search/repositories`\n2. Filter by topic:mol-formula or naming convention\n3. Parse results, show name/description/stars/version\n4. Support pagination for large result sets\n\n## Output\n```\nNAME STARS DESCRIPTION\ngithub.com/anthropics/mol-code-review 42 AI-assisted code review workflow\ngithub.com/gastown/mol-polecat-work 12 Standard polecat work lifecycle\n```\n\n## Discovery Convention\nRepos should have:\n- Topic: `mol-formula` or `beads-molecule`\n- Name starting with `mol-`\n- formula.json in root\n","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-25T12:06:40.019394-08:00","updated_at":"2025-12-25T21:53:13.42047-08:00","closed_at":"2025-12-25T21:53:13.42047-08:00","dependencies":[{"issue_id":"bd-1dez.5","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:06:40.01989-08:00","created_by":"daemon"}]} {"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"}]} @@ -125,7 +125,7 @@ {"id":"bd-4hh5","title":"bd sync false-positive force-push detection","description":"bd sync incorrectly detected a force-push when comparing against a commit from main branch instead of beads-sync.\n\nEvidence:\n- bd sync reported: 'Previous known commit: f4d3f674, Current remote commit: 4d24f794'\n- f4d3f674 is a valid beads-sync commit\n- 4d24f794 is a MAIN branch commit: 'refactor: remove unused isFirstRig param (gt-fugmy)'\n\nRoot cause: bd sync is comparing against wrong branch or storing wrong commit reference.\n\nImpact: False force-push warnings during normal operation, requires manual --accept-rebase.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:13:45.102272-08:00","updated_at":"2026-01-04T23:11:19.073963-08:00","closed_at":"2026-01-04T23:11:19.073963-08:00","close_reason":"Fixed false-positive force-push detection (bd-4hh5):\n- Changed fetch to use explicit refspec: +refs/heads/beads-sync:refs/remotes/origin/beads-sync\n- This ensures the remote-tracking ref is always created/updated\n- Without explicit refspec, git fetch only updates existing refs, causing stale comparisons\n- The + prefix ensures force-update even for non-fast-forward cases","created_by":"mayor"} {"id":"bd-4hn","title":"wish: list \u0026 ready show issues as hierarchy tree","description":"`bd ready` and `bd list` just show a flat list, and it's up to the reader to parse which ones are dependent or sub-issues of others. It would be much easier to understand if they were shown in a tree format","status":"hooked","priority":3,"issue_type":"task","created_at":"2025-12-08T06:38:24.016316945-07:00","updated_at":"2025-12-30T15:44:43.343883-08:00"} {"id":"bd-4jxh","title":"Update agent.go to use labels instead of type","description":"Change agent bead management to use gt:agent label instead of TypeAgent.\n\n## Work\n- Change IssueType=agent to IssueType=task when creating agents\n- Add gt:agent label when creating agent beads\n- Update agent queries to filter by label instead of type\n- Update agent type checks (agent.IssueType != \"agent\") to check label\n\n## Files\n- cmd/bd/agent.go","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:20.415469-08:00","updated_at":"2026-01-06T22:10:18.805675-08:00","closed_at":"2026-01-06T22:10:18.805675-08:00","close_reason":"Migrated agent.go and RPC server to use gt:agent label instead of type","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-4jxh","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.578875-08:00","created_by":"beads/crew/dave"}]} -{"id":"bd-4k3c","title":"bd cook creates gate beads for gate steps","description":"When cooking a formula, steps with Gate field create corresponding gate beads.\n\n## Behavior\n1. During cook, detect steps with Gate != nil\n2. Create gate bead with ID: `\u003cmol-id\u003e.gate-\u003cstep-id\u003e`\n3. Gate bead has:\n - issue_type: gate\n - await_type: from Gate.Type\n - await_id: from Gate.AwaitID (or auto-discovered)\n - timeout: from Gate.Timeout\n4. Dependent steps get blocking dep on gate bead\n\n## Example\nStep `await-ci` with gate.type=\"gh:run\" creates:\n- bd-mol-xxx.gate-await-ci (type=gate, await_type=gh:run)\n- bd-mol-xxx.verify-github depends on bd-mol-xxx.gate-await-ci\n\n## Acceptance Criteria\n- [ ] Gate beads created during cook\n- [ ] Correct await_type/await_id populated\n- [ ] Dependent steps blocked by gate\n- [ ] Tests for gate creation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:14.512549-08:00","updated_at":"2026-01-04T15:22:08.702867-08:00","closed_at":"2026-01-02T13:59:57.696282-08:00","close_reason":"Implementation already existed in cook.go (createGateIssue + collectSteps). Added comprehensive tests in cook_test.go covering: gate issue creation, await_type/await_id population, blocking dependencies, parent-child relationships, and timeout parsing.","created_by":"mayor","dependencies":[{"issue_id":"bd-4k3c","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.575284-08:00","created_by":"mayor"},{"issue_id":"bd-4k3c","depends_on_id":"bd-4bt1","type":"blocks","created_at":"2026-01-02T13:28:08.39967-08:00","created_by":"mayor"}]} +{"id":"bd-4k3c","title":"bd cook creates gate beads for gate steps","description":"When cooking a formula, steps with Gate field create corresponding gate beads.\n\n## Behavior\n1. During cook, detect steps with Gate != nil\n2. Create gate bead with ID: `\u003cmol-id\u003e.gate-\u003cstep-id\u003e`\n3. Gate bead has:\n - issue_type: gate\n - await_type: from Gate.Type\n - await_id: from Gate.AwaitID (or auto-discovered)\n - timeout: from Gate.Timeout\n4. Dependent steps get blocking dep on gate bead\n\n## Example\nStep `await-ci` with gate.type=\"gh:run\" creates:\n- bd-mol-xxx.gate-await-ci (type=gate, await_type=gh:run)\n- bd-mol-xxx.verify-github depends on bd-mol-xxx.gate-await-ci\n\n## Acceptance Criteria\n- [ ] Gate beads created during cook\n- [ ] Correct await_type/await_id populated\n- [ ] Dependent steps blocked by gate\n- [ ] Tests for gate creation","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:14.512549-08:00","updated_at":"2026-01-04T15:22:08.702867-08:00","closed_at":"2026-01-02T13:59:57.696282-08:00","close_reason":"Implementation already existed in cook.go (createGateIssue + collectSteps). Added comprehensive tests in cook_test.go covering: gate issue creation, await_type/await_id population, blocking dependencies, parent-child relationships, and timeout parsing.","created_by":"mayor","dependencies":[{"issue_id":"bd-4k3c","depends_on_id":"bd-4bt1","type":"blocks","created_at":"2026-01-02T13:28:08.39967-08:00","created_by":"mayor"},{"issue_id":"bd-4k3c","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.575284-08:00","created_by":"mayor"}]} {"id":"bd-4kp2","title":"Update Obsidian export for removed types","description":"Remove type-to-tag mappings for Gas Town types in Obsidian export.\n\n## Work\n- Remove TypeAgent, TypeRole, TypeRig, TypeConvoy mappings from issueTypeToTag\n- Consider: add label-to-tag mapping for gt:* labels\n\n## Files\n- cmd/bd/export_obsidian.go","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-06T20:40:49.466568-08:00","updated_at":"2026-01-06T22:12:38.010953-08:00","closed_at":"2026-01-06T22:12:38.010953-08:00","close_reason":"Removed Gas Town type mappings from Obsidian export","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-4kp2","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.708755-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-4lm3","title":"Correction: Pinned field already in v0.31.0","description":"Quick correction - the Pinned field is already in the current bd v0.31.0:\n\n```go\n// In beads internal/types/types.go\nPinned bool `json:\"pinned,omitempty\"`\n```\n\nSo you just need to:\n1. Add `Pinned bool `json:\"pinned,omitempty\"`` to BeadsMessage in types.go\n2. Sort pinned messages first in listBeads() after fetching\n\nNo migration needed - the field is already there.\n\n-- Mayor","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:52:27.321458-08:00","updated_at":"2025-12-21T17:52:18.617995-08:00","closed_at":"2025-12-21T17:52:18.617995-08:00"} {"id":"bd-4nqq","title":"Remove dead test code in info_test.go","description":"Code health review found cmd/bd/info_test.go has two tests permanently skipped:\n\n- TestInfoCommand\n- TestInfoCommandNoDaemon\n\nBoth skip with: 'Manual test - bd info command is working, see manual testing'\n\nThese are essentially dead code. Either automate them or remove them entirely.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-16T18:17:27.554019-08:00","updated_at":"2025-12-22T21:01:24.524963-08:00","closed_at":"2025-12-22T21:01:24.524963-08:00"} @@ -148,6 +148,7 @@ {"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"} {"id":"bd-5b6e","title":"Add tests for helper functions (GetDirtyIssueHash, GetAllDependencyRecords, export hashes)","description":"Several utility functions have 0% coverage:\n- GetDirtyIssueHash (dirty.go)\n- GetAllDependencyRecords (dependencies.go)\n- GetExportHash, SetExportHash, ClearAllExportHashes (hash.go)\n\nThese are lower priority but should have basic coverage.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-11-01T22:40:58.989976-07:00","updated_at":"2025-12-28T09:26:06.086196-08:00","closed_at":"2025-12-28T09:26:06.086196-08:00"} +{"id":"bd-5cnq","title":"Add build-from-source option to local-install step","description":"The local-install step currently only offers Homebrew and curl install script options.\n\nAdd Option 3 for developers releasing from this clone:\n\n```bash\n# Build from source\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n\n# macOS ONLY: Codesign to prevent SIGKILL (Killed: 9)\n# Without this, macOS kills unsigned binaries from unknown developers\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n## Why codesigning matters\nOn macOS, unsigned binaries built locally can be killed by Gatekeeper with \"Killed: 9\" (SIGKILL). The ad-hoc codesign (`-s -`) marks the binary as locally trusted.\n\n## Acceptance Criteria\n- [ ] local-install step has Option 3 with build commands\n- [ ] macOS codesigning is documented with explanation\n- [ ] Commands can be copy-pasted and work\n","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-07T00:45:30.577889-08:00","updated_at":"2026-01-07T00:45:30.577889-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-5cnq","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.493442-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-5dlz","title":"GHI #889: postinstall fails on Windows - zip being used by another process","description":"GitHub Issue #889: postinstall fails on Windows: zip 'being used by another process'\n\nhttps://github.com/steveyegge/beads/issues/889","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:22:13.880052-08:00","updated_at":"2026-01-04T15:22:08.708256-08:00","closed_at":"2026-01-04T11:26:35.696283-08:00","close_reason":"Fixed: Added retry logic with exponential backoff for Windows zip extraction to handle file lock delays from antivirus/Node.js","created_by":"mayor"} {"id":"bd-5dmb","title":"Test Agent","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T00:04:29.811433-08:00","updated_at":"2025-12-28T00:11:48.074239-08:00","created_by":"beads/crew/emma","deleted_at":"2025-12-28T00:11:48.074239-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} {"id":"bd-5e9q","title":"Add backwards-compatible aliases and deprecation warnings","description":"## Task\nEnsure backwards compatibility by adding hidden aliases for all moved commands.\n\n## Implementation\n\n### Create aliases.go\nNew file to centralize alias management:\n```go\npackage main\n\nimport (\n \"fmt\"\n \"os\"\n \n \"github.com/spf13/cobra\"\n)\n\n// Deprecated command aliases for backwards compatibility\n// These will be removed in v0.XX.0\n\nfunc init() {\n // migrate-* → migrate *\n addDeprecatedAlias(\"migrate-hash-ids\", \"migrate hash-ids\")\n addDeprecatedAlias(\"migrate-issues\", \"migrate issues\")\n addDeprecatedAlias(\"migrate-sync\", \"migrate sync\")\n addDeprecatedAlias(\"migrate-tombstones\", \"migrate tombstones\")\n \n // top-level → admin *\n addDeprecatedAlias(\"cleanup\", \"admin cleanup\")\n addDeprecatedAlias(\"compact\", \"admin compact\")\n addDeprecatedAlias(\"reset\", \"admin reset\")\n \n // top-level → formula *\n addDeprecatedAlias(\"cook\", \"formula cook\")\n}\n\nfunc addDeprecatedAlias(old, new string) {\n cmd := \u0026cobra.Command{\n Use: old,\n Hidden: true,\n Run: func(cmd *cobra.Command, args []string) {\n fmt.Fprintf(os.Stderr, \"⚠️ '%s' is deprecated, use '%s' instead\\n\", old, new)\n // Forward execution to new command\n },\n }\n rootCmd.AddCommand(cmd)\n}\n```\n\n### Deprecation behavior\n1. First release: Show warning, execute command\n2. One release later: Show warning, still execute\n3. Third release: Remove aliases entirely\n\n## Files to create\n- cmd/bd/aliases.go\n\n## Files to modify \n- cmd/bd/main.go (ensure aliases loaded)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:11:33.54574-08:00","updated_at":"2025-12-27T16:06:08.157887-08:00","closed_at":"2025-12-27T16:06:08.157887-08:00","created_by":"mayor"} @@ -159,7 +160,7 @@ {"id":"bd-5rj1","title":"Merge: bd-gqxd","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: bd-gqxd\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T16:40:21.707706-08:00","updated_at":"2025-12-23T19:12:08.349245-08:00","closed_at":"2025-12-23T19:12:08.349245-08:00"} {"id":"bd-5s91","title":"CLI API Audit for OSS Launch","description":"Comprehensive CLI API audit before OSS launch.\n\n## Tasks\n1. Review gt command groupings - propose consolidation\n2. Review bd command groupings \n3. Document gt vs bd ownership boundaries\n4. Identify naming inconsistencies\n5. Document flag vs subcommand criteria\n\n## Context\n- Pre-OSS launch cleanup\n- Goal: clean, consistent, discoverable CLI surface","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-25T00:15:41.355013-08:00","updated_at":"2025-12-25T13:26:25.587476-08:00","closed_at":"2025-12-25T13:26:25.587476-08:00"} {"id":"bd-5x0j","title":"bd swarm status command","description":"Add bd swarm status to show swarm state derived from beads.\n\n## Context\nThis is the key command that demonstrates 'discovery over tracking'. \nSwarm status is COMPUTED from:\n- Epic children statuses\n- Dependency structure\n- Issue assignments\n\nNOT stored separately. If beads changes, status changes.\n\n## Implementation\n1. New command: bd swarm status \u003cswarm-mol-id\u003e\n2. Find linked epic from swarm molecule\n3. Query all children of epic\n4. Compute and display:\n - Ready front (unblocked, open issues)\n - In progress (in_progress status)\n - Completed (closed)\n - Blocked (has unmet dependencies)\n - Progress percentage\n - Coordinator\n - Estimated remaining (based on avg session time)\n\n## Output Format\nReady Front Analysis: gt-epic-xxx\n\nCompleted: ✓ gt-001 (2h ago)\nActive: ⟳ gt-002 [nux], ⟳ gt-003 [toast]\nReady: ○ gt-004, ○ gt-005\nBlocked: ◌ gt-006 (needs 004, 005)\n\nProgress: 1/6 complete, 2/6 active (17%)\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Ready Front Visualization'\n\n## Acceptance\n- bd swarm status \u003cmol\u003e shows accurate state\n- State reflects current beads (not cached)\n- --json output for programmatic use","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:36.594118-08:00","updated_at":"2025-12-28T21:28:21.976756-08:00","closed_at":"2025-12-28T21:28:21.976756-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-5x0j","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.464245-08:00","created_by":"daemon"}]} -{"id":"bd-615z","title":"Add ValidateTemplate() function","description":"Add internal/validation package with ValidateTemplate(issueType, description) that checks for missing sections and returns actionable errors.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:07.136885-08:00","updated_at":"2026-01-01T12:42:26.397143-08:00","closed_at":"2026-01-01T12:42:26.397143-08:00","close_reason":"Implemented ValidateTemplate() and LintIssue() with tests","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-615z","depends_on_id":"bd-v2mr","type":"blocks","created_at":"2026-01-01T11:19:23.924134-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-615z","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.71669-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-615z","title":"Add ValidateTemplate() function","description":"Add internal/validation package with ValidateTemplate(issueType, description) that checks for missing sections and returns actionable errors.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:07.136885-08:00","updated_at":"2026-01-01T12:42:26.397143-08:00","closed_at":"2026-01-01T12:42:26.397143-08:00","close_reason":"Implemented ValidateTemplate() and LintIssue() with tests","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-615z","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.71669-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-615z","depends_on_id":"bd-v2mr","type":"blocks","created_at":"2026-01-01T11:19:23.924134-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-649s","title":"Add custom type support to beads config","description":"Add types.custom config key mirroring status.custom pattern.\n\n## Work\n- Add CustomTypeConfigKey constant to config.go\n- Add GetCustomTypes() to storage interface \n- Add GetCustomTypes() implementation in sqlite/config.go and memory/memory.go\n- Add IssueType.IsValidWithCustom(customTypes []string) method\n- Update ValidateWithCustomStatuses to ValidateWithCustom (handle both)\n- Update all validation call sites to use GetCustomTypes()\n\n## Files\n- internal/storage/sqlite/config.go\n- internal/storage/storage.go\n- internal/storage/memory/memory.go\n- internal/types/types.go\n- internal/storage/sqlite/queries.go\n- internal/storage/sqlite/transaction.go\n- internal/storage/sqlite/batch_ops.go\n- internal/storage/sqlite/multirepo.go","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T20:40:04.168738-08:00","updated_at":"2026-01-06T21:30:02.035131-08:00","closed_at":"2026-01-06T21:30:02.035131-08:00","close_reason":"Implemented custom type support mirroring custom status pattern","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-649s","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.514971-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-66l4","title":"Runtime bonding: bd mol attach","description":"Attach a molecule to an already-running workflow.\n\nCOMMAND: bd mol attach \u003cepic-id\u003e \u003cproto\u003e [--after \u003cissue-id\u003e]\n\nBEHAVIOR:\n- Resolve running epic and proto\n- Spawn proto as new subtree\n- Wire to specified attachment point (or epic root)\n- Handle in-progress issues: new work doesn't block completed work\n\nUSE CASES:\n- Discovered need for docs while implementing feature\n- Hotfix needs attaching to release workflow\n- Additional testing scope identified mid-flight\n\nFLAGS:\n- --after ISSUE: Specific attachment point within epic\n- --type: sequential (default) or parallel\n- --var: Variables for the attached proto\n\nCONSIDERATIONS:\n- What if epic is already closed? Error or reopen?\n- What if attachment point issue is closed? Attach as ready-to-work?","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:16.920483-08:00","updated_at":"2025-12-21T01:08:43.530597-08:00","closed_at":"2025-12-21T01:08:43.530597-08:00","dependencies":[{"issue_id":"bd-66l4","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.435542-08:00","created_by":"daemon"},{"issue_id":"bd-66l4","depends_on_id":"bd-o91r","type":"blocks","created_at":"2025-12-21T00:59:51.813782-08:00","created_by":"daemon"}]} {"id":"bd-66w1","title":"Add external_projects to config schema","description":"Add external_projects mapping to .beads/config.yaml:\n\n```yaml\nexternal_projects:\n beads: ../beads\n gastown: ../gastown\n other: /absolute/path/to/project\n```\n\nUsed by bd ready and other commands to resolve external: references.\n\nPart of cross-project dependency system.\nSee: gastown/docs/cross-project-deps.md","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:37:39.245017-08:00","updated_at":"2025-12-21T23:03:19.81448-08:00","closed_at":"2025-12-21T23:03:19.81448-08:00"} @@ -173,7 +174,7 @@ {"id":"bd-6fe4622f","title":"Remove unreachable utility functions","description":"Several small utility functions are unreachable:\n\nFiles to clean:\n1. `internal/storage/sqlite/hash.go` - `computeIssueContentHash` (line 17)\n - Check if entire file can be deleted if only contains this function\n\n2. `internal/config/config.go` - `FileUsed` (line 151)\n - Delete unused config helper\n\n3. `cmd/bd/git_sync_test.go` - `verifyIssueOpen` (line 300)\n - Delete dead test helper\n\n4. `internal/compact/haiku.go` - `HaikuClient.SummarizeTier2` (line 81)\n - Tier 2 summarization not implemented\n - Options: implement feature OR delete method\n\nImpact: Removes 50-100 LOC depending on decisions","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.434573-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-6gd","title":"Remove legacy MCP Agent Mail integration","description":"## Summary\n\nRemove the legacy MCP Agent Mail system that requires an external HTTP server. Keep the native `bd mail` system which stores messages as git-synced issues.\n\n## Background\n\nTwo mail systems exist in the codebase:\n1. **Legacy Agent Mail** (`bd message`) - External server dependency, complex setup\n2. **Native bd mail** (`bd mail`) - Built-in, git-synced, no dependencies\n\nThe legacy system causes confusion and is no longer needed. Gas Town's Town Mail will use the native `bd mail` system.\n\n## Files to Delete\n\n### CLI Command\n- [ ] `cmd/bd/message.go` - The `bd message` command implementation\n\n### MCP Integration\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail.py` - HTTP wrapper for Agent Mail server\n- [ ] `integrations/beads-mcp/src/beads_mcp/mail_tools.py` - MCP tool definitions\n- [ ] `integrations/beads-mcp/tests/test_mail.py` - Tests for legacy mail\n\n### Documentation\n- [ ] `docs/AGENT_MAIL.md`\n- [ ] `docs/AGENT_MAIL_QUICKSTART.md`\n- [ ] `docs/AGENT_MAIL_DEPLOYMENT.md`\n- [ ] `docs/AGENT_MAIL_MULTI_WORKSPACE_SETUP.md`\n- [ ] `docs/adr/002-agent-mail-integration.md`\n\n## Code to Update\n\n- [ ] Remove `message` command registration from `cmd/bd/main.go`\n- [ ] Remove mail tool imports/registration from MCP server `__init__.py` or `server.py`\n- [ ] Check for any other references to Agent Mail in the codebase\n\n## Verification\n\n- [ ] `bd message` command no longer exists\n- [ ] `bd mail` command still works\n- [ ] MCP server starts without errors\n- [ ] Tests pass\n","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-17T23:04:04.099935-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-6ns7","title":"test hook pin","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:39:16.619755-08:00","updated_at":"2025-12-23T04:51:29.436788-08:00","deleted_at":"2025-12-23T04:51:29.436788-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} -{"id":"bd-6pc","title":"Implement bd pin/unpin commands","description":"Add 'bd pin \u003cid\u003e' and 'bd unpin \u003cid\u003e' commands to toggle the pinned status of issues. Should support multiple IDs like other bd commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:28.292937-08:00","updated_at":"2025-12-19T17:43:35.713398-08:00","closed_at":"2025-12-19T00:35:31.612589-08:00","dependencies":[{"issue_id":"bd-6pc","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.352848-08:00","created_by":"daemon"},{"issue_id":"bd-6pc","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.119852-08:00","created_by":"daemon"}]} +{"id":"bd-6pc","title":"Implement bd pin/unpin commands","description":"Add 'bd pin \u003cid\u003e' and 'bd unpin \u003cid\u003e' commands to toggle the pinned status of issues. Should support multiple IDs like other bd commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:28.292937-08:00","updated_at":"2025-12-19T17:43:35.713398-08:00","closed_at":"2025-12-19T00:35:31.612589-08:00","dependencies":[{"issue_id":"bd-6pc","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.119852-08:00","created_by":"daemon"},{"issue_id":"bd-6pc","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.352848-08:00","created_by":"daemon"}]} {"id":"bd-6rl","title":"Merge3Way public API does not expose TTL parameter","description":"The public Merge3Way() function in merge.go does not allow callers to configure the tombstone TTL. It hard-codes the default via merge3WayWithTTL(). While merge3WayWithTTL() exists, it is unexported (lowercase). This means the CLI and tests cannot configure TTL at merge time. Use cases: testing with different TTL values, per-repository TTL configuration, debugging with short TTL, supporting --ttl flag in bd merge command (mentioned in design doc bd-zvg). Recommendation: Export Merge3WayWithTTL (rename to uppercase). Files: internal/merge/merge.go:77, 292-298","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-05T16:36:15.756814-08:00","updated_at":"2025-12-25T22:45:32.157938-08:00","closed_at":"2025-12-25T22:45:32.157938-08:00"} {"id":"bd-6s61","title":"Version Bump: {{version}}","description":"Release checklist for version {{version}}. This molecule ensures all release steps are completed properly.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-19T22:55:42.487701-08:00","updated_at":"2026-01-04T23:41:06.944519-08:00","closed_at":"2026-01-04T23:41:06.944519-08:00","close_reason":"Cleanup: stale molecule"} {"id":"bd-6sm6","title":"Improve test coverage for internal/export (37.1% → 60%)","description":"The export package has only 37.1% test coverage. Export functionality needs good coverage to ensure data integrity.\n\nCurrent coverage: 37.1%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:06.802277-08:00","updated_at":"2025-12-23T22:32:29.16846-08:00","closed_at":"2025-12-23T22:32:29.16846-08:00"} @@ -215,9 +216,9 @@ {"id":"bd-7p5l","title":"Fix N+1 query pattern in swarm status blocked check","description":"In getSwarmStatus, when checking if an issue is blocked, we query each dependency individually with GetIssue. With 100 issues and 5 deps each, thats 500 extra queries. Fix: Build a status map upfront from the already-fetched childIssues slice. File: cmd/bd/swarm.go:706-710","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T21:31:07.586335-08:00","updated_at":"2025-12-28T21:35:30.605065-08:00","closed_at":"2025-12-28T21:35:30.605065-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-7p5l","depends_on_id":"bd-m6r3","type":"blocks","created_at":"2025-12-28T21:31:17.309538-08:00","created_by":"daemon"}]} {"id":"bd-7pwh","title":"HOP-compatible schema additions","description":"Add optional fields to Beads schema to enable future HOP integration.\nAll fields are backwards-compatible (optional, omitted if empty).\n\n## Reference\nSee ~/gt/docs/hop/BEADS-SCHEMA-CHANGES.md for full specification.\n\n## P1 Changes (Must Have Before Launch)\n\n### 1. EntityRef type\nStructured entity reference that can become HOP URI:\n```go\ntype EntityRef struct {\n Name string // \"polecat/Nux\"\n Platform string // \"gastown\"\n Org string // \"steveyegge\" \n ID string // \"polecat-nux\"\n}\n```\n\n### 2. creator field\nEvery issue tracks who created it (EntityRef).\n\n### 3. assignee_ref field\nStructured form alongside existing string assignee.\n\n### 4. validations array\nTrack who validated work completion:\n```go\ntype Validation struct {\n Validator *EntityRef\n Outcome string // accepted, rejected, revision_requested\n Timestamp time.Time\n Score *float32 // Future\n}\n```\n\n## P2 Changes (Should Have)\n\n### 5. work_type field\n\"mutex\" (default) or \"open_competition\"\n\n### 6. crystallizes field\nBoolean - does this work compound (true) or evaporate (false)?\n\n### 7. cross_refs field\nArray of URIs to beads in other repos:\n- \"beads://github/anthropics/claude-code/bd-xyz\"\n\n## P3 Changes (Nice to Have)\n\n### 8. skill_vector placeholder\nReserved for future embeddings: []float32\n\n## Implementation Notes\n- All fields optional in JSONL serialization\n- Empty/null fields omit from output\n- No migration needed for existing data\n- CLI additions: --creator, --validated-by filters","notes":"Scope reduced after review. P1 only: EntityRef type, creator field, validations array. Deferred: assignee_ref, work_type, crystallizes, cross_refs, skill_vector (YAGNI - semantics unclear, can add later when needed).","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T02:42:39.267984-08:00","updated_at":"2025-12-22T20:09:09.211821-08:00","closed_at":"2025-12-22T20:09:09.211821-08:00"} {"id":"bd-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","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","created_by":"gastown/polecats/capable"} -{"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-hw3w","type":"blocks","created_at":"2025-12-19T22:56:23.291591-08:00","created_by":"daemon"},{"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"}]} +{"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":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:39:04.84733-08:00","updated_at":"2025-12-30T00:54:58.805495-08:00","closed_at":"2025-12-30T00:54:58.805495-08:00","close_reason":"Branch polecat/jasper-1767083473604 no longer exists on remote","created_by":"beads/polecats/jasper"} -{"id":"bd-7xd7","title":"Update tests for type extraction changes","description":"Update all tests affected by Gas Town type extraction.\n\n## Test files to update\n- internal/types/types_test.go (type validation tests)\n- cmd/bd/agent_routing_test.go (agent type checks)\n- internal/storage/sqlite/sqlite_test.go (convoy tests)\n- internal/validation/bead_test.go (type validation)\n- internal/ui/styles_test.go (style rendering)\n\n## Work\n- Update test cases that use TypeAgent, TypeRole, TypeRig, TypeConvoy, TypeSlot\n- Add tests for custom type support via types.custom config\n- Add tests for label-based filtering","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:52.758221-08:00","updated_at":"2026-01-06T22:17:53.972176-08:00","closed_at":"2026-01-06T22:17:53.972176-08:00","close_reason":"Tests already updated as part of type extraction work","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-7xd7","depends_on_id":"bd-cn56","type":"blocks","created_at":"2026-01-06T20:41:29.039305-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-16z7","type":"blocks","created_at":"2026-01-06T20:41:29.078573-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-mgt2","type":"blocks","created_at":"2026-01-06T20:41:29.113145-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-4kp2","type":"blocks","created_at":"2026-01-06T20:41:29.147522-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-fen8","type":"blocks","created_at":"2026-01-06T22:06:27.177221-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.770837-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-4jxh","type":"blocks","created_at":"2026-01-06T20:41:29.0029-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-7xd7","title":"Update tests for type extraction changes","description":"Update all tests affected by Gas Town type extraction.\n\n## Test files to update\n- internal/types/types_test.go (type validation tests)\n- cmd/bd/agent_routing_test.go (agent type checks)\n- internal/storage/sqlite/sqlite_test.go (convoy tests)\n- internal/validation/bead_test.go (type validation)\n- internal/ui/styles_test.go (style rendering)\n\n## Work\n- Update test cases that use TypeAgent, TypeRole, TypeRig, TypeConvoy, TypeSlot\n- Add tests for custom type support via types.custom config\n- Add tests for label-based filtering","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:40:52.758221-08:00","updated_at":"2026-01-06T22:17:53.972176-08:00","closed_at":"2026-01-06T22:17:53.972176-08:00","close_reason":"Tests already updated as part of type extraction work","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-7xd7","depends_on_id":"bd-4jxh","type":"blocks","created_at":"2026-01-06T20:41:29.0029-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-cn56","type":"blocks","created_at":"2026-01-06T20:41:29.039305-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-16z7","type":"blocks","created_at":"2026-01-06T20:41:29.078573-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-mgt2","type":"blocks","created_at":"2026-01-06T20:41:29.113145-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-4kp2","type":"blocks","created_at":"2026-01-06T20:41:29.147522-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-fen8","type":"blocks","created_at":"2026-01-06T22:06:27.177221-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-7xd7","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.770837-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-7xrg","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"closed","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:31.190713-08:00","updated_at":"2025-12-30T18:12:30.974709-08:00","closed_at":"2025-12-30T18:11:14.234636-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"}]} @@ -249,7 +250,7 @@ {"id":"bd-8zbo","title":"Code smell: runCook function is ~275 lines","description":"attached_args: Refactor runCook function (~275 lines)\n\nThe runCook() function in cmd/bd/cook.go (lines 83-357) is ~275 lines handling:\n\n1. Flag parsing and validation\n2. Mode determination (compile vs runtime)\n3. Formula parsing and resolution\n4. Control flow, advice, and expansion application\n5. Dry-run output\n6. Ephemeral mode JSON output\n7. Persist mode database operations\n8. Result display\n\nConsider extracting:\n- parseAndValidateFlags() - flag handling\n- loadAndResolveFormula() - parse, resolve, apply transformations\n- outputDryRun() - dry run display logic\n- outputEphemeral() - ephemeral JSON output\n- persistFormula() - database persistence logic\n\nThe function has multiple exit points and nested conditionals that make it hard to follow.\n\nLocation: cmd/bd/cook.go:83-357","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T15:33:08.808191-08:00","updated_at":"2025-12-28T16:37:29.397832-08:00","closed_at":"2025-12-28T16:37:29.397832-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-8zbo","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.25998-08:00","created_by":"daemon"}]} {"id":"bd-90fs","title":"Merge: amber-1767138546434","description":"branch: polecat/amber-1767138546434\ntarget: main\nsource_issue: amber-1767138546434\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:57:38.681293-08:00","updated_at":"2025-12-30T18:12:30.966277-08:00","closed_at":"2025-12-30T18:11:08.005131-08:00","created_by":"beads/polecats/amber"} {"id":"bd-90v","title":"bd prime: AI context loading and Claude Code integration","description":"Implement `bd prime` command and Claude Code hooks for context recovery. Hooks work with BOTH MCP server and CLI approaches - they solve the context memory problem (keeping bd workflow fresh after compaction) not the tool access problem (MCP vs CLI).","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-11T23:31:12.119012-08:00","updated_at":"2025-12-25T22:26:54.442614-08:00","closed_at":"2025-12-25T22:26:54.442614-08:00"} -{"id":"bd-9115","title":"CLI cleanup: Consolidate bd top-level commands","description":"## Problem\nbd has 76 top-level commands, making it hard to discover and remember.\n\n## Proposed Changes\n\n### Remove from top-level (nest instead):\n- `bd cook` → `bd formula cook` (cooking is a formula operation)\n- `bd pin` → already covered by `bd mol` commands\n- `bd thanks` → `bd info --thanks` or just README\n- `bd quickstart` → `bd help quickstart` or docs\n- `bd detect-pollution` → `bd doctor --check=pollution`\n\n### Consolidate migrations under `bd migrate`:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n### Consolidate admin under `bd admin`:\n- `bd cleanup` → `bd admin cleanup`\n- `bd compact` → `bd admin compact`\n- `bd reset` → `bd admin reset`\n\n## Backwards Compatibility\nKeep old commands as hidden aliases for one release cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T14:28:03.299469-08:00","updated_at":"2025-12-27T16:19:44.580326-08:00","closed_at":"2025-12-27T16:19:44.580326-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-5e9q","type":"blocks","created_at":"2025-12-27T15:11:45.07537-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-08:00","created_by":"daemon"}]} +{"id":"bd-9115","title":"CLI cleanup: Consolidate bd top-level commands","description":"## Problem\nbd has 76 top-level commands, making it hard to discover and remember.\n\n## Proposed Changes\n\n### Remove from top-level (nest instead):\n- `bd cook` → `bd formula cook` (cooking is a formula operation)\n- `bd pin` → already covered by `bd mol` commands\n- `bd thanks` → `bd info --thanks` or just README\n- `bd quickstart` → `bd help quickstart` or docs\n- `bd detect-pollution` → `bd doctor --check=pollution`\n\n### Consolidate migrations under `bd migrate`:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n### Consolidate admin under `bd admin`:\n- `bd cleanup` → `bd admin cleanup`\n- `bd compact` → `bd admin compact`\n- `bd reset` → `bd admin reset`\n\n## Backwards Compatibility\nKeep old commands as hidden aliases for one release cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T14:28:03.299469-08:00","updated_at":"2025-12-27T16:19:44.580326-08:00","closed_at":"2025-12-27T16:19:44.580326-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-5e9q","type":"blocks","created_at":"2025-12-27T15:11:45.07537-08:00","created_by":"daemon"}]} {"id":"bd-95k8","title":"Pinned field available in beads v0.37.0","description":"Hey max,\n\nHeads up on your mail overhaul work:\n\n1. **Pinned field is available** - beads v0.37.0 (released by dave earlier) includes the pinned field on issues. You'll want to add this to BeadsMessage in types.go.\n\n2. **Database migration** - Check if existing .beads databases need migration to support the pinned field. Run `bd doctor` to see if it flags anything.\n\n3. **Sorting task** - Once you have the pinned field, gt-ngu1 (pinned beads first in mail inbox) needs implementing. Since messages now come from `bd list --type=message`, you'll need to either:\n - Sort in listBeads() after fetching, or\n - Ensure bd list returns pinned items first (may already do this?)\n\nCheck what version of bd you're building against.\n\n-- Mayor","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:51:57.315956-08:00","updated_at":"2025-12-21T17:52:18.542169-08:00","closed_at":"2025-12-21T17:52:18.542169-08:00"} {"id":"bd-987a","title":"bd mol run: panic slice bounds out of range in mol_run.go:130","description":"## Problem\nbd mol run panics after successfully creating the molecule:\n\n```\n✓ Molecule running: created 9 issues\n Root issue: gt-i4lo (pinned, in_progress)\n Assignee: stevey\n\nNext steps:\n bd ready # Find unblocked work in this molecule\npanic: runtime error: slice bounds out of range [:8] with length 7\n\ngoroutine 1 [running]:\nmain.runMolRun(0x1014fc0c0, {0x140001e0f80, 0x1, 0x10089daad?})\n /Users/stevey/gt/beads/crew/dave/cmd/bd/mol_run.go:130 +0xc38\n```\n\n## Reproduction\n```bash\nbd --no-daemon mol run gt-lwuu --var issue=gt-test123\n```\nWhere gt-lwuu is a mol-polecat-work proto with 8 child steps.\n\n## Impact\nThe molecule IS created successfully - the panic happens after creation when formatting the \"Next steps\" output.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T21:48:55.396018-08:00","updated_at":"2025-12-21T22:57:46.827469-08:00","closed_at":"2025-12-21T22:57:46.827469-08:00"} {"id":"bd-98b4","title":"Merge: onyx-1767138516448","description":"branch: polecat/onyx-1767138516448\ntarget: main\nsource_issue: onyx-1767138516448\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T16:17:51.539362-08:00","updated_at":"2025-12-30T18:12:30.974128-08:00","closed_at":"2025-12-30T18:11:07.907737-08:00","created_by":"beads/polecats/onyx"} @@ -271,6 +272,7 @@ {"id":"bd-a1t0","title":"Merge: opal-1767138520240","description":"branch: polecat/opal-1767138520240\ntarget: main\nsource_issue: opal-1767138520240\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:59:09.905942-08:00","updated_at":"2025-12-30T18:12:30.970486-08:00","closed_at":"2025-12-30T18:11:07.988358-08:00","created_by":"beads/polecats/opal"} {"id":"bd-a3sj","title":"RemoveDependency fails on external deps - FK violation in dirty_issues","description":"In dependencies.go:225, RemoveDependency marks BOTH issueID and dependsOnID as dirty. For external refs (e.g., external:project:capability), dependsOnID doesn't exist in the issues table. This causes FK violation since dirty_issues.issue_id has FK constraint to issues.id.\n\nFix: Check if dependsOnID starts with 'external:' and only mark source issue as dirty, matching the logic in AddDependency (lines 162-170).\n\nRepro: bd dep rm \u003cissue\u003e external:project:capability","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T23:44:51.981138-08:00","updated_at":"2025-12-22T17:48:29.062424-08:00","closed_at":"2025-12-22T17:48:29.062424-08:00","dependencies":[{"issue_id":"bd-a3sj","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:44:51.982343-08:00","created_by":"daemon"}]} {"id":"bd-a62m","title":"Update version to 0.33.2 in version.go","description":"Edit cmd/bd/version.go line 17:\n\n```go\nVersion = \"0.33.2\"\n```\n\nVerify with: `grep 'Version =' cmd/bd/version.go`","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760384-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"bd-a854","title":"Break run-bump-script into individual version-update steps","description":"Replace the monolithic `run-bump-script` step with individual steps for each file:\n\n## Steps to Create\n\n1. **bump-version-go** - Update cmd/bd/version.go\n```bash\nsed -i \"\" \"s/Version = \\\"[^\\\"]*\\\"/Version = \\\"{{version}}\\\"/\" cmd/bd/version.go\n```\n\n2. **bump-plugin-json** - Update .claude-plugin/*.json\n```bash\njq \".version = \\\"{{version}}\\\"\" .claude-plugin/plugin.json \u003e tmp \u0026\u0026 mv tmp .claude-plugin/plugin.json\njq \".plugins[0].version = \\\"{{version}}\\\"\" .claude-plugin/marketplace.json \u003e tmp \u0026\u0026 mv tmp .claude-plugin/marketplace.json\n```\n\n3. **bump-mcp-python** - Update MCP package\n```bash\nsed -i \"\" \"s/version = \\\"[^\\\"]*\\\"/version = \\\"{{version}}\\\"/\" integrations/beads-mcp/pyproject.toml\nsed -i \"\" \"s/__version__ = \\\"[^\\\"]*\\\"/__version__ = \\\"{{version}}\\\"/\" integrations/beads-mcp/src/beads_mcp/__init__.py\n```\n\n4. **bump-npm-package** - Update npm package\n```bash\njq \".version = \\\"{{version}}\\\"\" npm-package/package.json \u003e tmp \u0026\u0026 mv tmp npm-package/package.json\n```\n\n5. **bump-hook-templates** - Update hook versions\n```bash\nfor f in cmd/bd/templates/hooks/*; do\n sed -i \"\" \"s/# bd-hooks-version: .*/# bd-hooks-version: {{version}}/\" \"$f\"\ndone\n```\n\n6. **bump-readme** - Update README badge\n```bash\nsed -i \"\" \"s/Alpha (v[^)]*)/Alpha (v{{version}})/\" README.md\n```\n\n7. **stamp-changelog** - Add date to [Unreleased]\n```bash\nDATE=$(date +%Y-%m-%d)\nsed -i \"\" \"s/## \\[Unreleased\\]/## [Unreleased]\\n\\n## [{{version}}] - $DATE/\" CHANGELOG.md\n```\n\n## Notes\n- Each step should have `needs` pointing to the previous step\n- Commands should work on both macOS and Linux (may need platform detection)\n- The existing update-changelog step handles content; stamp-changelog just adds the date\n","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-07T00:45:28.971662-08:00","updated_at":"2026-01-07T00:45:28.971662-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-a854","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.458262-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-a9y3","title":"Add composite index (status, priority) for common list queries","description":"SearchIssues and GetReadyWork frequently filter by status and sort by priority. Currently uses two separate indexes.\n\n**Common query pattern (queries.go:1646-1647):**\n```sql\nWHERE status = ? \nORDER BY priority ASC, created_at DESC\n```\n\n**Problem:** Index merge or full scan when both columns are used.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_issues_status_priority ON issues(status, priority);\n```\n\n**Expected impact:** Faster bd list, bd ready with filters. Particularly noticeable at 10K+ issues.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T22:58:50.515275-08:00","updated_at":"2025-12-22T23:15:13.838976-08:00","closed_at":"2025-12-22T23:15:13.838976-08:00","dependencies":[{"issue_id":"bd-a9y3","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:50.516072-08:00","created_by":"daemon"}]} {"id":"bd-aay","title":"Warn on invalid depends_on references in workflow templates","description":"workflow.go:780-781 silently skips invalid dependency names. Should log a warning when a depends_on reference doesn't match any task ID in the template.","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-17T22:23:04.325253-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-abjn","title":"Review PR #917: fix(doctor) duplicate detection","description":"dispatched_by: beads/crew/emma\n\nReview and merge PR #917 from aaron-sangster.\n\nPR: https://github.com/anthropics/beads/pull/917\nChanges: +281/-3, 2 files (cmd/bd/doctor/validation.go, test)\n\nFix: align duplicate detection with bd duplicates (bd-sali)\n\nReview checklist:\n- [ ] Code quality and style\n- [ ] Tests pass\n- [ ] Logic is correct\n- [ ] Approve or request changes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T19:09:19.254024-08:00","updated_at":"2026-01-05T19:11:50.451499-08:00","closed_at":"2026-01-05T19:11:50.451499-08:00","close_reason":"PR #917 reviewed and merged","created_by":"beads/crew/emma"} @@ -338,6 +340,7 @@ {"id":"bd-bijf","title":"Merge: bd-l13p","description":"branch: polecat/nux\ntarget: main\nsource_issue: bd-l13p\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T16:41:32.467246-08:00","updated_at":"2025-12-23T19:12:08.348252-08:00","closed_at":"2025-12-23T19:12:08.348252-08:00"} {"id":"bd-bivq","title":"Merge: bd-9usz","description":"branch: polecat/slit\ntarget: main\nsource_issue: bd-9usz\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:42:19.995419-08:00","updated_at":"2025-12-23T21:21:57.700579-08:00","closed_at":"2025-12-23T21:21:57.700579-08:00"} {"id":"bd-bkul","title":"Simplify wisp architecture: single DB with ephemeral flag","description":"\n## Problem\n\nThe current wisp architecture uses a separate .beads-wisp/ directory with its own database. This creates unnecessary complexity:\n\n- Separate directory structure and database initialization\n- Parallel routing logic in both beads and gastown\n- Merge queries from two stores for inbox/list operations\n- All this for what is essentially a boolean flag\n\n## Current State\n\nGastown mail code has to:\n- resolveWispDir() vs resolveBeadsDir()\n- Query both, merge results\n- Route deletes to correct store\n\n## Proposed Solution\n\nSingle database with an ephemeral boolean field on Issue. Behavior:\n- bd create --ephemeral sets the flag\n- JSONL export SKIPS ephemeral issues (they never sync)\n- bd list shows all by default, --ephemeral / --persistent filters\n- bd mol squash clears the flag (promotes to permanent, now exports)\n- bd wisp gc deletes old ephemeral issues from the db\n- No separate directory, no separate routing\n\n## Migration\n\n1. Update beads to support ephemeral flag in main db\n2. Update bd wisp commands to work with flag instead of separate dir\n3. Update gastown mail to use simple --ephemeral flag (remove all dual-routing)\n4. Deprecate .beads-wisp/ directory pattern\n\n## Acceptance Criteria\n\n- Single database for all issues (ephemeral and persistent)\n- ephemeral field on Issue type\n- JSONL export skips ephemeral issues\n- bd create --ephemeral works\n- bd mol squash promotes ephemeral to persistent\n- Gastown mail uses simple flag, no dual-routing\n","status":"closed","priority":0,"issue_type":"feature","created_at":"2025-12-24T20:06:27.980055-08:00","updated_at":"2025-12-24T20:43:07.065124-08:00","closed_at":"2025-12-24T20:43:07.065124-08:00"} +{"id":"bd-bl27","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:43:59.985306-08:00","updated_at":"2026-01-07T00:44:00.016527-08:00","closed_at":"2026-01-07T00:44:00.016527-08:00","close_reason":"auto-closed session event","created_by":"beads/crew/emma"} {"id":"bd-blh0","title":"gt nudge doesn't work with crew addresses","description":"## Bug\n\n`gt nudge beads/crew/dave \"message\"` fails because it uses the polecat session manager which produces wrong session names.\n\n## Expected\nSession name: `gt-beads-crew-dave` (hyphen)\n\n## Actual\nSession name: `gt-beads-crew/dave` (slash, from polecat manager)\n\n## Root Cause\n\nIn nudge.go line 46-57:\n```go\nrigName, polecatName, err := parseAddress(target) // beads, crew/dave\nsessionName := mgr.SessionName(polecatName) // gt-beads-crew/dave (WRONG)\n```\n\nShould detect `crew/` prefix in polecatName and use `crewSessionName(rigName, crewName)` instead.\n\n## Fix\n\n```go\nif strings.HasPrefix(polecatName, \"crew/\") {\n crewName := strings.TrimPrefix(polecatName, \"crew/\")\n sessionName = crewSessionName(rigName, crewName)\n} else {\n sessionName = mgr.SessionName(polecatName)\n}\n```","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-26T15:43:32.222784-08:00","updated_at":"2025-12-26T23:36:38.520091-08:00","closed_at":"2025-12-26T23:36:38.520091-08:00"} {"id":"bd-bqcc","title":"Consolidate maintenance commands into bd doctor --fix","description":"Per rsnodgrass in GH#692:\n\u003e \"The biggest improvement to beads from an ergonomics perspective would be to prune down commands. We have a lot of 'maintenance' commands that probably should just be folded into 'bd doctor --fix' automatically.\"\n\nCurrent maintenance commands that could be consolidated:\n- clean - Clean up temporary git merge artifacts\n- cleanup - Delete closed issues and prune expired tombstones\n- compact - Compact old closed issues\n- detect-pollution - Detect and clean test issues\n- migrate-* (5 commands) - Various migration utilities\n- repair-deps - Fix orphaned dependency references\n- validate - Database health checks\n\nProposal:\n1. Make `bd doctor` the single entry point for health checks\n2. Add `bd doctor --fix` to auto-fix common issues\n3. Deprecate (but keep working) individual commands\n4. Add `bd doctor --all` for comprehensive maintenance\n\nThis would reduce cognitive load for users - they just need to remember 'bd doctor'.\n\nNote: This is higher impact but also higher risk - needs careful design to avoid breaking existing workflows.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:27:31.466556-08:00","updated_at":"2025-12-23T01:33:25.732363-08:00","closed_at":"2025-12-23T01:33:25.732363-08:00"} {"id":"bd-bs5j","title":"Release v0.33.2","description":"Version bump workflow for beads release 0.33.2.\n\n## Variables\n- `0.33.2` - The new version number (e.g., 0.31.0)\n- `2025-12-21` - Release date (YYYY-MM-DD format)\n\n## Workflow Steps\n1. Kill running daemons\n2. Run tests and linting\n3. Bump version in all files (10 files total)\n4. Update cmd/bd/info.go with release notes\n5. Commit and push version bump\n6. Create and push git tag\n7. Update Homebrew formula\n8. Upgrade local Homebrew installation\n9. Verify installation\n\n## Files Updated by bump-version.sh\n- cmd/bd/version.go\n- .claude-plugin/plugin.json\n- .claude-plugin/marketplace.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- README.md\n- npm-package/package.json\n- cmd/bd/templates/hooks/* (4 files)\n- CHANGELOG.md\n\n## Manual Step Required\n- cmd/bd/info.go - Add versionChanges entry with release notes","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-21T16:10:13.759062-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} @@ -348,7 +351,7 @@ {"id":"bd-by0d","title":"Work on beads-ldv: Fix bd graph crashes with nil pointer ...","description":"Work on beads-ldv: Fix bd graph crashes with nil pointer dereference (GH#657). Fix nil pointer in computeDependencyCounts at graph.go:428. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:55:27.829359-08:00","updated_at":"2025-12-19T23:28:32.428314-08:00","closed_at":"2025-12-19T23:20:49.038441-08:00"} {"id":"bd-c0b6","title":"bd init --from-jsonl: Skip git history scan","description":"## Problem\n\n`bd init` scans git history to find all issues ever created, which:\n- Resurrects deleted/compacted issues\n- Takes a long time on large repos\n- Defeats manual JSONL cleanup\n\n## Solution\n\nAdd `bd init --from-jsonl` flag that:\n1. Creates fresh database\n2. Imports ONLY from current .beads/issues.jsonl\n3. Skips git history scan entirely\n\n## Use Case\n\nAfter manually cleaning JSONL or receiving a clean JSONL from another source:\n```bash\n# Clean JSONL manually or via script\nbd init --from-jsonl # Use current JSONL as-is\n```\n\n(Moved from hq-c21fj)","status":"closed","priority":3,"issue_type":"feature","created_at":"2026-01-02T01:29:20.851319-08:00","updated_at":"2026-01-02T16:59:09.07064-08:00","closed_at":"2026-01-02T16:59:09.07064-08:00","close_reason":"Already implemented: bd init --from-jsonl exists and does exactly this","created_by":"beads/crew/dave"} {"id":"bd-c2po","title":"Gate eval: Consider rate limiting for GitHub API calls","description":"Each gate evaluation makes a network call to GitHub API via gh CLI. With many gates, this could hit API rate limits.\n\nFuture improvements:\n1. Batch queries where possible\n2. Add caching with TTL for recently-checked gates\n3. Exponential backoff on rate limit errors\n\nLow priority - unlikely to be an issue until we have many concurrent gates.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-25T23:13:13.295309-08:00","updated_at":"2025-12-30T19:32:18.332836-08:00","closed_at":"2025-12-30T19:32:18.332836-08:00","close_reason":"Deferred - unlikely to be an issue until we have many concurrent gates per description"} -{"id":"bd-c2xs","title":"Exclude pinned issues from bd blocked","description":"Update bd blocked to exclude pinned issues. Pinned issues are context markers and should not appear in the blocked work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:44.684242-08:00","updated_at":"2025-12-21T11:29:42.179389-08:00","closed_at":"2025-12-21T11:29:42.179389-08:00","dependencies":[{"issue_id":"bd-c2xs","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.736681-08:00","created_by":"daemon"},{"issue_id":"bd-c2xs","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.521323-08:00","created_by":"daemon"}]} +{"id":"bd-c2xs","title":"Exclude pinned issues from bd blocked","description":"Update bd blocked to exclude pinned issues. Pinned issues are context markers and should not appear in the blocked work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:44.684242-08:00","updated_at":"2025-12-21T11:29:42.179389-08:00","closed_at":"2025-12-21T11:29:42.179389-08:00","dependencies":[{"issue_id":"bd-c2xs","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.521323-08:00","created_by":"daemon"},{"issue_id":"bd-c2xs","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.736681-08:00","created_by":"daemon"}]} {"id":"bd-c3u","title":"Review PR #512: clarify bd ready docs","description":"Review and merge PR #512 from aspiers. This PR clarifies what bd ready does after git pull in README.md. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/512","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:13.405161+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-c4wq","title":"Work on gt-8tmz.36: Validate expanded step IDs are unique...","description":"Work on gt-8tmz.36: Validate expanded step IDs are unique. In internal/formula/, add validation during cooking that checks for duplicate step IDs after expansion. When done: 1) bd close gt-8tmz.36, 2) bd sync, 3) git push, 4) gt mq submit","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:26:31.323192-08:00","updated_at":"2025-12-25T19:37:49.605774-08:00","closed_at":"2025-12-25T19:37:49.605774-08:00"} {"id":"bd-c7y5","title":"Optimization: Tombstones still synced, adding overhead","description":"Tombstoned (deleted) issues are still processed during sync, adding overhead.\n\n## Evidence\n```\nImport complete: 0 created, 0 updated, 407 unchanged, 100 skipped\n```\nThose 100 skipped are tombstones - they're read from JSONL, parsed, then filtered out.\n\n## Current State (Beads repo)\n- 408 total issues\n- 99 tombstones (24% of database)\n- Every sync reads and skips these 99 entries\n\n## Impact\n- Sync time increases with tombstone count\n- JSONL file size grows indefinitely\n- Git history accumulates tombstone churn\n\n## Proposed Solutions\n\n### 1. JSONL Compaction (`bd compact`)\nPeriodically rewrite JSONL without tombstones:\n```bash\nbd compact # Removes tombstones, rewrites issues.jsonl\n```\nTrade-off: Loses delete history, but that's in git anyway.\n\n### 2. Tombstone TTL\nAuto-remove tombstones older than N days during sync:\n```go\nif issue.Deleted \u0026\u0026 time.Since(issue.UpdatedAt) \u003e 7*24*time.Hour {\n // Skip writing to new JSONL\n}\n```\n\n### 3. Archive File\nMove old closed issues to `issues-archive.jsonl`:\n- Not synced regularly\n- Available for historical queries\n- Main JSONL stays small\n\n### 4. Lazy Tombstone Handling \nDon't write tombstones to JSONL at all - just remove the line:\n- Simpler, but loses cross-clone delete propagation\n- Would need different delete propagation mechanism\n\n## Recommendation\nStart with `bd compact` command - simple, explicit, user-controlled.\n\n## Related\n- gt-tnss: Analysis - Beads database size and hygiene strategy\n- gt-ox67: Maintenance - Regular cleanup of closed MR/gate beads","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T14:41:16.925212-08:00","updated_at":"2025-12-23T23:50:23.363222-08:00","closed_at":"2025-12-23T23:50:23.363222-08:00"} @@ -408,7 +411,7 @@ {"id":"bd-dsdh","title":"Document sync.branch 'always dirty' working tree behavior","description":"## Context\n\nWhen sync.branch is configured, the .beads/issues.jsonl file in main's working tree is ALWAYS dirty. This is by design:\n\n1. bd sync commits to beads-sync branch (via worktree)\n2. bd sync copies JSONL to main's working tree (so CLI commands work)\n3. This copy is NOT committed to main (to reduce commit noise)\n\nContributors who watch main branch history pushed for sync.branch to avoid constant beads commit noise. But users need to understand the trade-off.\n\n## Documentation Needed\n\nUpdate README.md sync.branch section with:\n\n1. **Clear explanation** of why .beads/ is always dirty on main\n2. **\"Be Zen about it\"** - this is expected, not a bug\n3. **Workflow options:**\n - Accept dirty state, use `bd sync --merge` periodically to snapshot to main\n - Or disable sync.branch if clean working tree is more important\n4. **Shell alias tip** to hide beads from git status:\n ```bash\n alias gs='git status -- \":!.beads/\"'\n ```\n5. **When to merge**: releases, milestones, or periodic snapshots\n\n## Related\n\n- bd-7b7h: Fix that allows bd sync --merge to work with dirty .beads/\n- bd-elqd: Investigation that identified this as expected behavior","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T23:16:12.253559-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-dsp","title":"Test stdin body-file","status":"tombstone","priority":4,"issue_type":"task","created_at":"2025-12-17T17:27:32.098806-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-dtl8","title":"Test deleteViaDaemon RPC client integration","description":"Add comprehensive tests for the deleteViaDaemon function (cmd/bd/delete.go:21) which handles client-side RPC deletion calls.\n\n## Function under test\n- deleteViaDaemon: CLI command handler that sends delete requests to daemon via RPC\n\n## Test scenarios needed\n1. Successful deletion via daemon\n2. Cascade deletion through daemon\n3. Force deletion through daemon\n4. Dry-run mode (no actual deletion)\n5. Error handling:\n - Daemon unavailable\n - Invalid issue IDs\n - Dependency conflicts\n6. JSON output validation\n7. Human-readable output formatting\n\n## Coverage target\nCurrent: 0%\nTarget: \u003e80%\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:29.805706253-07:00","updated_at":"2025-12-23T23:50:35.615163-08:00","closed_at":"2025-12-23T23:50:35.615163-08:00","dependencies":[{"issue_id":"bd-dtl8","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:29.807984381-07:00","created_by":"mhwilkie"}]} -{"id":"bd-du9h","title":"Add Validation type and validations field to Issue","description":"Add Validation struct (Validator *EntityRef, Outcome string, Timestamp time.Time, Score *float32) and Validations []Validation field to Issue. Tracks who validated/approved work completion. Core to HOP proof-of-stake concept - validators stake reputation on approvals.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:37.725701-08:00","updated_at":"2025-12-22T20:08:59.925028-08:00","closed_at":"2025-12-22T20:08:59.925028-08:00","dependencies":[{"issue_id":"bd-du9h","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.470984-08:00","created_by":"daemon"},{"issue_id":"bd-du9h","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.896552-08:00","created_by":"daemon"}]} +{"id":"bd-du9h","title":"Add Validation type and validations field to Issue","description":"Add Validation struct (Validator *EntityRef, Outcome string, Timestamp time.Time, Score *float32) and Validations []Validation field to Issue. Tracks who validated/approved work completion. Core to HOP proof-of-stake concept - validators stake reputation on approvals.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:37.725701-08:00","updated_at":"2025-12-22T20:08:59.925028-08:00","closed_at":"2025-12-22T20:08:59.925028-08:00","dependencies":[{"issue_id":"bd-du9h","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.896552-08:00","created_by":"daemon"},{"issue_id":"bd-du9h","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.470984-08:00","created_by":"daemon"}]} {"id":"bd-duyg","title":"Feature: bd swarm list - discover existing swarm molecules","description":"No command to list existing swarm molecules.\n\nAdd `bd swarm list` to show all swarm molecules:\n\n```\nbd swarm list\n\nActive swarms:\n bd-xyz: Swarm: Feature X (3/10 complete, 2 active)\n bd-abc: Swarm: Bug fixes (0/5 complete)\n```\n\nCould also be achieved via `bd list --mol-type=swarm` but dedicated command would show richer info.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-28T21:38:11.773961-08:00","updated_at":"2025-12-28T22:03:49.97246-08:00","closed_at":"2025-12-28T22:03:49.97246-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-duyg","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.775264-08:00","created_by":"daemon"}]} {"id":"bd-dwh","title":"Implement or remove ExpectExit/ExpectStdout verification fields","description":"The Verification struct in internal/types/workflow.go has ExpectExit and ExpectStdout fields that are never used by workflowVerifyCmd. Either implement the functionality or remove the dead fields.","status":"tombstone","priority":3,"issue_type":"task","created_at":"2025-12-17T22:23:02.708627-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-dx6e","title":"bd activity --town: Aggregated town feed","description":"Add --town flag to bd activity for aggregated cross-rig feed.\n\nBehavior:\n- Uses routes.jsonl to discover all rigs\n- Aggregates activity from all rig beads\n- Essential for Deacon's convoy tracking and cross-rig dep resolution\n\nUsage:\n bd activity --follow --town # Stream all rig activity\n\nRelated: hq-7h8jx (Convoy System epic in town beads)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-29T18:47:03.057447-08:00","updated_at":"2025-12-29T21:10:00.71961-08:00","closed_at":"2025-12-29T21:10:00.71961-08:00","close_reason":"Implemented --town flag for bd activity. Aggregates mutations from all rig daemons discovered via routes.jsonl.","created_by":"mayor"} @@ -443,7 +446,7 @@ {"id":"bd-f5cc","title":"Thread Test","description":"Testing the thread feature","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:01.244501-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-f5cc","depends_on_id":"bd-x36g","type":"supersedes","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-f616","title":"Digest: Version Bump: test-squash","description":"## Molecule Execution Summary\n\n**Molecule**: Version Bump: test-squash\n**Steps**: 8\n\n**Completed**: 0/8\n\n---\n\n### Steps\n\n1. **[open]** Verify release artifacts\n Check GitHub releases page - binaries for darwin/linux/windows should be available\n\n2. **[open]** Commit and push release\n git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI\n\n3. **[open]** Update CHANGELOG.md with release notes\n Add meaningful release notes to CHANGELOG.md describing what changed in test-squash\n\n4. **[open]** Wait for CI to pass\n Monitor GitHub Actions - all checks must pass before release artifacts are built\n\n5. **[open]** Restart running daemons\n Kill and restart any running bd daemons to pick up new version: pkill -f 'bd daemon' \u0026\u0026 bd daemon --start\n\n6. **[open]** Update local installation\n Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash\n\n7. **[open]** Run bump-version.sh test-squash\n Run ./scripts/bump-version.sh test-squash to update version in all files\n\n8. **[open]** Update info.go versionChanges\n Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for test-squash\n\n","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:53:18.471919-08:00","updated_at":"2025-12-21T13:53:35.256043-08:00","deleted_at":"2025-12-21T13:53:35.256043-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-f7p1","title":"Add tests for mol spawn --attach","description":"Code review (bd-obep) found no tests for the spawn --attach functionality.\n\n**Test cases needed:**\n1. Basic attach - spawn proto with one --attach\n2. Multiple attachments - spawn with --attach A --attach B\n3. Attach types - verify sequential vs parallel bonding\n4. Error case: attaching non-proto (missing template label)\n5. Variable aggregation - vars from primary + attachments combined\n6. Dry-run output includes attachment info\n\n**Implementation notes:**\n- Tests should use in-memory storage\n- Create test protos, spawn with attachments, verify dependency structure\n- Check that sequential uses 'blocks' type, parallel uses 'parent-child'","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T10:58:16.766461-08:00","updated_at":"2025-12-21T21:33:12.136215-08:00","closed_at":"2025-12-21T21:33:12.136215-08:00","dependencies":[{"issue_id":"bd-f7p1","depends_on_id":"bd-obep","type":"discovered-from","created_at":"2025-12-21T10:58:16.767616-08:00","created_by":"daemon"}]} -{"id":"bd-fa1q","title":"bd swarm create command","description":"Add bd swarm create to create a swarm molecule from an epic.\n\n## Context\nSwarms ARE persistent molecules - not separate JSON state. This command creates\na swarm molecule that:\n- Links to the epic it orchestrates\n- Has mol_type=swarm\n- Specifies a coordinator\n- Can be discovered by any agent\n\n## Core Principle: Discovery Over Tracking\nThe swarm molecule doesn't track step-by-step state. Instead:\n- Query bd ready --parent=\u003cepic\u003e to find the ready front\n- Query bd list --parent=\u003cepic\u003e --status=closed to find completed\n- Derive progress from children's statuses\n\n## Implementation\n1. New command: bd swarm create \u003cepic-id\u003e [--coordinator=\u003caddr\u003e]\n2. Validate epic structure first (call bd swarm validate)\n3. Create molecule bead:\n - mol_type: swarm\n - epic: \u003cepic-id\u003e\n - coordinator: \u003caddr\u003e\n - status: open\n4. Return the swarm molecule ID\n\n## Single-Issue Wrapping\nIf given a single issue (not epic), auto-wrap:\n- Create an epic with that issue as child\n- Then create swarm molecule\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Swarm Structure' section\n\n## Acceptance\n- bd swarm create \u003cepic\u003e creates a swarm molecule\n- Molecule has mol_type=swarm\n- Links to epic via epic field\n- Validates structure before creation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:35.067432-08:00","updated_at":"2025-12-28T21:34:32.026937-08:00","closed_at":"2025-12-28T21:34:32.026937-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-fa1q","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.428038-08:00","created_by":"daemon"},{"issue_id":"bd-fa1q","depends_on_id":"bd-nkqx","type":"blocks","created_at":"2025-12-28T19:11:52.446532-08:00","created_by":"daemon"}]} +{"id":"bd-fa1q","title":"bd swarm create command","description":"Add bd swarm create to create a swarm molecule from an epic.\n\n## Context\nSwarms ARE persistent molecules - not separate JSON state. This command creates\na swarm molecule that:\n- Links to the epic it orchestrates\n- Has mol_type=swarm\n- Specifies a coordinator\n- Can be discovered by any agent\n\n## Core Principle: Discovery Over Tracking\nThe swarm molecule doesn't track step-by-step state. Instead:\n- Query bd ready --parent=\u003cepic\u003e to find the ready front\n- Query bd list --parent=\u003cepic\u003e --status=closed to find completed\n- Derive progress from children's statuses\n\n## Implementation\n1. New command: bd swarm create \u003cepic-id\u003e [--coordinator=\u003caddr\u003e]\n2. Validate epic structure first (call bd swarm validate)\n3. Create molecule bead:\n - mol_type: swarm\n - epic: \u003cepic-id\u003e\n - coordinator: \u003caddr\u003e\n - status: open\n4. Return the swarm molecule ID\n\n## Single-Issue Wrapping\nIf given a single issue (not epic), auto-wrap:\n- Create an epic with that issue as child\n- Then create swarm molecule\n\n## Reference\n~/gt/docs/swarm-architecture.md - 'Swarm Structure' section\n\n## Acceptance\n- bd swarm create \u003cepic\u003e creates a swarm molecule\n- Molecule has mol_type=swarm\n- Links to epic via epic field\n- Validates structure before creation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T19:11:35.067432-08:00","updated_at":"2025-12-28T21:34:32.026937-08:00","closed_at":"2025-12-28T21:34:32.026937-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-fa1q","depends_on_id":"bd-nkqx","type":"blocks","created_at":"2025-12-28T19:11:52.446532-08:00","created_by":"daemon"},{"issue_id":"bd-fa1q","depends_on_id":"bd-oxgi","type":"blocks","created_at":"2025-12-28T19:11:52.428038-08:00","created_by":"daemon"}]} {"id":"bd-fa2h","title":"🤝 HANDOFF: v0.31.0 released, molecules discussion","description":"Session completed 0.31.0 release and had important molecules discussion.\n\n## Completed\n- v0.31.0 released (deferred status, audit trail, directory labels, etc.)\n- Fixed lint issues, hook version markers, codesigning\n- All CI green, artifacts verified\n\n## Filed Issues\n- bd-usro: Rename template instantiate → bd mol bond\n- bd-y8bj: Auto-detect identity for bd mail (P1 bug)\n- gt-975: Molecule execution support for polecats/crew\n- gt-976: Crew lifecycle support in Deacon\n\n## Key Insight\nMolecules are the future - TodoWrite is ephemeral, molecules are persistent institutional memory on the world chain. I tried to use TodoWrite for version bump and missed steps (codesigning, MCP verification). Molecules would have caught this.\n\n## Next Steps\n- bd mol bond implementation is priority\n- Max has gt-976 for crew lifecycle (enables automated refresh mid-molecule)\n\nCheck bd ready and gt-975/976 status.","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:23:09.889562-08:00","updated_at":"2025-12-21T17:52:18.467069-08:00","closed_at":"2025-12-21T17:52:18.467069-08:00"} {"id":"bd-fber","title":"Work on gt-8tmz.31: Formula validation specification. Wri...","description":"Work on gt-8tmz.31: Formula validation specification. Write docs/formula-validation.md specifying all validation rules for formulas. When done: 1) bd close gt-8tmz.31, 2) bd sync, 3) git push, 4) gt mq submit","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:26:36.741916-08:00","updated_at":"2025-12-25T19:32:10.788141-08:00","closed_at":"2025-12-25T19:32:10.788141-08:00"} {"id":"bd-fbkd","title":"Gate check should auto-discover non-numeric await_id","description":"When `bd gate check` encounters a gh:run gate with a non-numeric await_id (workflow name hint like 'release.yml'), it currently returns:\n\n```\nawaiting discovery (workflow hint: release.yml) - run 'bd gate discover'\n```\n\nThis requires manual intervention. The fix committed in 8528fcaa added the message, but didn't add auto-discovery.\n\n**Proposal:** `checkGHRun` should automatically call the discovery logic when it encounters a workflow name hint, rather than requiring a separate command.\n\n**Why this matters:**\n- The beads-release formula creates gates with `id = 'release.yml'`\n- Agents running the formula shouldn't need to know about the discover command\n- The chicken-and-egg problem: you can't release the version that fixes the release process\n\n**Implementation:**\n1. In `checkGHRun`, when `!isNumericID(gate.AwaitID)`:\n - Query recent GitHub runs\n - Match using `workflowNameMatches`\n - Auto-update the gate's await_id\n - Then proceed with the normal check","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-07T00:20:21.829762-08:00","updated_at":"2026-01-07T00:37:05.876882-08:00","closed_at":"2026-01-07T00:37:05.876882-08:00","close_reason":"Implemented auto-discovery in gate check - uses gh run list --workflow=X and takes most recent run (ZFC-compliant)","created_by":"beads/crew/emma"} @@ -451,7 +454,7 @@ {"id":"bd-fcl1","title":"Merge: bd-au0.5","description":"branch: polecat/Searcher\ntarget: main\nsource_issue: bd-au0.5\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:39:11.946667-08:00","updated_at":"2025-12-23T19:12:08.346454-08:00","closed_at":"2025-12-23T19:12:08.346454-08:00"} {"id":"bd-fedb","title":"Polecats should spawn with auto-accept mode enabled","description":"During swarm bd-784c, polecats (Toast, Nux) were spawned without --dangerously-skip-permissions or equivalent auto-accept mode.\n\n**Problem:**\nEvery edit, bash command, and tool use required manual confirmation via tmux send-keys. This defeats the purpose of autonomous polecat operation.\n\n**Expected:**\nPolecats in a swarm should run with permissions bypassed so they can work autonomously.\n\n**Workaround used:**\n- Manually sent Enter keys via tmux to accept prompts\n- Eventually polecats entered 'bypass permissions on' mode after restart\n\n**Suggestion:**\n- gt sling should pass --dangerously-skip-permissions by default for polecats\n- Or polecats should have a .claude/settings.local.json pre-configured for auto-accept","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-28T16:17:47.061327-08:00","updated_at":"2025-12-28T22:14:19.109728-08:00","closed_at":"2025-12-28T22:14:19.109728-08:00","created_by":"beads/crew/dave"} {"id":"bd-fej5","title":"bd hook: detect agent from cwd instead of defaulting to $USER","description":"**Problem:**\n`bd hook` without `--agent` defaults to `$USER` (e.g., \"stevey\") instead of detecting the agent identity from the current working directory.\n\n**Expected behavior:**\nWhen running from `/Users/stevey/gt/beads/crew/dave`, the agent should be detected as `beads/crew/dave`.\n\n**Current behavior:**\n```bash\n$ pwd\n/Users/stevey/gt/beads/crew/dave\n$ bd hook\nHook: stevey\n (empty)\n\n$ bd hook --agent beads/crew/dave\nHook: beads/crew/dave\n 📌 bd-hobo (mol) - open\n```\n\n**Fix:**\nbd hook should use the same cwd-based agent detection that other commands use (similar to how `gt mail` determines identity from cwd).","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-24T20:01:27.613892-08:00","updated_at":"2025-12-25T12:41:10.65257-08:00","closed_at":"2025-12-25T12:41:10.65257-08:00"} -{"id":"bd-fen8","title":"Remove Gas Town types from IssueType enum","description":"Remove agent, role, rig, convoy, slot from built-in IssueType constants.\n\n## Work\n- Remove TypeAgent, TypeRole, TypeRig, TypeConvoy, TypeSlot constants\n- Update IsValid() switch statement to remove these types\n- Update RequiredSections() to remove agent/role/convoy references in default case comment\n\n## Files\n- internal/types/types.go","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T20:40:18.97767-08:00","updated_at":"2026-01-06T22:17:27.356036-08:00","closed_at":"2026-01-06T22:17:27.356036-08:00","close_reason":"Removed Gas Town types (agent, role, rig, convoy, slot) from IssueType enum and updated all tests","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-fen8","depends_on_id":"bd-mgt2","type":"blocks","created_at":"2026-01-06T22:06:15.571831-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.547683-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-649s","type":"blocks","created_at":"2026-01-06T20:41:20.894067-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-16z7","type":"blocks","created_at":"2026-01-06T22:06:03.350893-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-4jxh","type":"blocks","created_at":"2026-01-06T22:06:03.379232-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-cn56","type":"blocks","created_at":"2026-01-06T22:06:03.40727-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-4kp2","type":"blocks","created_at":"2026-01-06T22:06:15.543349-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-fen8","title":"Remove Gas Town types from IssueType enum","description":"Remove agent, role, rig, convoy, slot from built-in IssueType constants.\n\n## Work\n- Remove TypeAgent, TypeRole, TypeRig, TypeConvoy, TypeSlot constants\n- Update IsValid() switch statement to remove these types\n- Update RequiredSections() to remove agent/role/convoy references in default case comment\n\n## Files\n- internal/types/types.go","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-06T20:40:18.97767-08:00","updated_at":"2026-01-06T22:17:27.356036-08:00","closed_at":"2026-01-06T22:17:27.356036-08:00","close_reason":"Removed Gas Town types (agent, role, rig, convoy, slot) from IssueType enum and updated all tests","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-fen8","depends_on_id":"bd-cn56","type":"blocks","created_at":"2026-01-06T22:06:03.40727-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-4kp2","type":"blocks","created_at":"2026-01-06T22:06:15.543349-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-mgt2","type":"blocks","created_at":"2026-01-06T22:06:15.571831-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.547683-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-649s","type":"blocks","created_at":"2026-01-06T20:41:20.894067-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-16z7","type":"blocks","created_at":"2026-01-06T22:06:03.350893-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-fen8","depends_on_id":"bd-4jxh","type":"blocks","created_at":"2026-01-06T22:06:03.379232-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-ffjt","title":"Unify template.go and mol.go under bd mol","description":"Consolidate the two DAG-template systems into one under the mol command. mol.go (on rictus branch) has the right UX (catalog/show/bond), template.go has the mechanics. Merge them, deprecate bd template commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T23:52:13.208972-08:00","updated_at":"2025-12-21T00:01:59.283765-08:00","closed_at":"2025-12-21T00:01:59.283765-08:00"} {"id":"bd-ffp5","title":"Review PR #908: feat(doctor) external hook managers","description":"dispatched_by: beads/crew/emma\n\nReview and merge PR #908 from roelofb.\n\nPR: https://github.com/anthropics/beads/pull/908\nChanges: +1364/-5, 4 files (doctor/fix/hooks.go, hooks_test.go, git.go, CHANGELOG.md)\n\nFeature: detect external hook managers and check bd integration\n\nReview checklist:\n- [ ] Code quality and style\n- [ ] Tests pass\n- [ ] Feature works as intended\n- [ ] Approve or request changes","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-05T19:09:22.112242-08:00","updated_at":"2026-01-05T19:12:29.744463-08:00","closed_at":"2026-01-05T19:12:29.744463-08:00","close_reason":"PR #908 reviewed, approved, and merged","created_by":"beads/crew/emma"} {"id":"bd-fgw3","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:05.052016-08:00","updated_at":"2025-12-20T00:49:51.928221-08:00","closed_at":"2025-12-20T00:25:52.805029-08:00","dependencies":[{"issue_id":"bd-fgw3","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.248427-08:00","created_by":"daemon"},{"issue_id":"bd-fgw3","depends_on_id":"bd-si4g","type":"blocks","created_at":"2025-12-19T22:56:23.497325-08:00","created_by":"daemon"}]} @@ -524,18 +527,18 @@ {"id":"bd-ifa0","title":"Merge: amber-1767146829144","description":"branch: polecat/amber-1767146829144\ntarget: main\nsource_issue: amber-1767146829144\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T18:11:33.875918-08:00","updated_at":"2025-12-30T19:35:50.452577-08:00","closed_at":"2025-12-30T18:16:13.605293-08:00","created_by":"beads/polecats/amber"} {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:43:15.598698-08:00","updated_at":"2025-12-23T04:51:29.438139-08:00","deleted_at":"2025-12-23T04:51:29.438139-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-iic1","title":"Phase 2.2: Switch bdt storage to TOON format","description":"Currently bdt stores issues in JSONL format in issues.toon file. Phase 2.2 must implement actual TOON format storage - this is the fundamental goal of the bdtoon project.\n\n## Current State (Phase 2.1)\n- issues.toon stores JSONL (intermediate format)\n- --toon flag allows output in TOON format for LLM consumption\n- Problem: We're not actually using TOON as the fundamental storage format\n\n## Required Work (Phase 2.2)\n1. Switch issue file I/O to write TOON format instead of JSONL\n - Update cmd/bdt/storage.go to use EncodeTOON for writing\n - Update cmd/bdt/storage.go to decode TOON (currently decodes JSON)\n - Ensure round-trip: write TOON → read TOON → write TOON is byte-identical\n\n2. Update command implementations\n - cmd/bdt/create.go: Write newly created issues to TOON format\n - cmd/bdt/list.go: Read issues from TOON format\n - cmd/bdt/show.go: Read from TOON format\n - cmd/bdt/import.go: Convert imported JSONL to TOON\n - cmd/bdt/export.go: Export TOON to JSONL (for bd compatibility)\n\n3. Implement TOON parser that handles gotoon's encoder-only limitation\n - Since gotoon doesn't decode TOON, need custom TOON→JSON decoder\n - OR continue storing TOON but decoding via intermediate JSON conversion\n\n4. Git merge driver optimization\n - TOON is line-oriented, better for 3-way merges than binary formats\n - Configure git merge driver for .toon files\n\n5. Comprehensive testing\n - Round-trip tests: Issue → TOON → storage → read → Issue\n - Merge conflict resolution tests with TOON format\n - Large issue set performance tests\n\n## Success Criteria\n- issues.toon stores actual TOON format (not JSONL)\n- bdt list reads from TOON file\n- bdt create writes to TOON file\n- Round-trip: create issue → list → show returns identical data\n- All 65+ tests still passing\n- Performance comparable to JSONL storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:05:41.394964404-07:00","updated_at":"2025-12-19T14:37:17.879612634-07:00","closed_at":"2025-12-19T14:37:17.879612634-07:00"} -{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","updated_at":"2026-01-04T15:22:08.701283-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","updated_at":"2026-01-04T15:22:08.701283-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-imxi","title":"Add bd setup gemini for Gemini CLI integration","description":"## Summary\n\nAdd `bd setup gemini` command to install beads hooks for Gemini CLI, similar to existing `bd setup claude`.\n\nRef: GitHub #845\n\n## Research Findings\n\n### Gemini CLI Has Compatible Hooks\n\nGemini CLI (https://geminicli.com/docs/hooks/) supports nearly identical hook events:\n\n| Gemini CLI Event | Claude Code Equivalent | Purpose |\n|------------------|----------------------|---------|\n| **SessionStart** | SessionStart | Initialize resources, load context |\n| **SessionEnd** | - | Clean up, save state |\n| **PreCompress** | PreCompact | Before context compression |\n| **BeforeAgent** | - | Add context before planning |\n\nConfiguration format is almost identical to Claude:\n```json\n{\n \"hooks\": {\n \"SessionStart\": [{\n \"matcher\": \"\",\n \"hooks\": [{\n \"type\": \"command\",\n \"command\": \"bd prime\"\n }]\n }]\n }\n}\n```\n\n### GEMINI.md Support\n\n- Hierarchical loading: ~/.gemini/GEMINI.md → project root → subdirectories\n- Concatenated into system prompt automatically\n- Gemini CLI also reads AGENTS.md (already supported via `bd setup factory`)\n\n### Antigravity\n\nGoogle's IDE-based agentic platform (released Nov 2025):\n- Uses Gemini 3 with 1M token context\n- Has \"knowledge base\" for saved context\n- Less documented - may share Gemini CLI infrastructure\n- Needs separate research for dedicated support\n\n## Implementation Plan\n\n### Phase 1: Core Gemini CLI Support\n\n1. **Create `cmd/bd/setup/gemini.go`**\n - Mirror structure from `claude.go`\n - Target: `~/.gemini/settings.json`\n - Install SessionStart and PreCompress hooks\n - Support --project flag for local settings\n - Support --stealth flag\n\n2. **Add doctor check in `cmd/bd/doctor/gemini.go`**\n - Check if hooks installed\n - Verify settings.json structure\n\n3. **Update `cmd/bd/setup.go`**\n - Add gemini subcommand\n - Wire up to setup/gemini.go\n\n### Phase 2: Optional Enhancements\n\n4. **GEMINI.md generation** (optional)\n - Could generate project-level GEMINI.md\n - Or document that AGENTS.md already works\n\n5. **Antigravity support** (separate issue)\n - Needs research on Antigravity's configuration system\n - May be able to share Gemini CLI hooks\n - May need IDE-specific integration\n\n## Open Questions\n\n1. Where does Gemini CLI store settings? Need to verify `~/.gemini/settings.json` path\n2. Does Gemini CLI use same JSON structure as Claude for hooks?\n3. Can one implementation cover both Gemini CLI and Antigravity?\n4. Should we generate GEMINI.md or rely on AGENTS.md?\n\n## Acceptance Criteria\n\n- [ ] `bd setup gemini` installs hooks to Gemini CLI settings\n- [ ] `bd setup gemini --check` verifies installation\n- [ ] `bd doctor` reports Gemini CLI integration status\n- [ ] Documentation updated in docs/SETUP.md","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:47:07.399783-08:00","updated_at":"2026-01-02T00:01:16.319278-08:00","closed_at":"2026-01-02T00:01:16.319278-08:00","close_reason":"Implemented bd setup gemini with SessionStart/PreCompress hooks","created_by":"beads/crew/wolf"} {"id":"bd-in7","title":"Test message","description":"Hello world","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T23:16:13.184946-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":"message"} {"id":"bd-indn","title":"bd template commands fail with daemon mode","description":"The `bd template show` and `bd template instantiate` commands fail with 'Error loading template: no database connection' when daemon is running.\n\n**Reproduction:**\n```bash\nbd daemon --start\nbd template show bd-qqc # Error: no database connection\nbd template show bd-qqc --no-daemon # Works\n```\n\n**Expected:** Template commands should work with daemon like other commands.\n\n**Workaround:** Use `--no-daemon` flag.\n\n**Location:** Likely in cmd/bd/template.go - daemon RPC path not implemented for template operations.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T22:57:35.16596-08:00","updated_at":"2025-12-23T22:40:32.763595-08:00","closed_at":"2025-12-23T22:40:32.763595-08:00"} {"id":"bd-io8c","title":"Improve test coverage for internal/syncbranch (33.0% → 70%)","description":"Improve test coverage for internal/syncbranch package from 27% to 70%.\n\n## Current State\n- Coverage: 27.0%\n- Files: syncbranch.go, worktree.go\n- Tests: syncbranch_test.go (basic tests exist)\n\n## Functions Needing Tests\n\n### syncbranch.go (config management)\n- [x] ValidateBranchName - has tests\n- [ ] Get - needs store mock tests\n- [ ] GetFromYAML - needs YAML parsing tests\n- [ ] IsConfigured - needs file system tests\n- [ ] IsConfiguredWithDB - needs DB path tests\n- [ ] Set - needs store mock tests\n- [ ] Unset - needs store mock tests\n\n### worktree.go (git operations) - PRIORITY\n- [ ] CommitToSyncBranch - needs git repo fixture tests\n- [ ] PullFromSyncBranch - needs merge scenario tests\n- [ ] CheckDivergence - needs ahead/behind tests\n- [ ] ResetToRemote - needs reset scenario tests\n- [ ] performContentMerge - needs 3-way merge tests\n- [ ] extractJSONLFromCommit - needs git show tests\n- [ ] hasChangesInWorktree - needs dirty state tests\n- [ ] commitInWorktree - needs commit scenario tests\n\n## Implementation Guide\n\n1. **Use testutil fixtures:**\n ```go\n import \"github.com/steveyegge/beads/internal/testutil/fixtures\"\n \n func TestCommitToSyncBranch(t *testing.T) {\n repo := fixtures.NewGitRepo(t)\n defer repo.Cleanup()\n // ... test scenarios\n }\n ```\n\n2. **Test scenarios for worktree.go:**\n - Clean commit (no conflicts)\n - Non-fast-forward push (diverged)\n - Merge conflict resolution\n - Empty changes (nothing to commit)\n\n3. **Mock storage for syncbranch.go:**\n ```go\n store := memory.New()\n // Set up test config\n syncbranch.Set(ctx, store, \"beads-sync\")\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- All public functions have at least one test\n- Edge cases covered for git operations\n- Tests pass with `go test -race ./internal/syncbranch`\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/syncbranch\ngo test -race ./internal/syncbranch\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:02.079145-08:00","updated_at":"2025-12-23T13:46:10.191435-08:00","closed_at":"2025-12-23T13:46:10.191435-08:00","dependencies":[{"issue_id":"bd-io8c","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.213092-08:00","created_by":"daemon"}]} {"id":"bd-ipj7","title":"enhance 'bd status' to show recent activity","description":"It would be nice to be able to quickly view the last N changes in the database, to see wha's recently been worked on. I'm imagining something like 'bd status activity'.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T11:08:50.996541974-07:00","updated_at":"2025-12-21T17:54:00.279039-08:00","closed_at":"2025-12-21T17:54:00.279039-08:00"} {"id":"bd-ipva","title":"Update go install bd to 0.33.2","description":"Rebuild and install bd to ~/go/bin:\n\n```bash\ngo install ./cmd/bd\n~/go/bin/bd version # Verify shows 0.33.2\n```\n\nNote: If ~/go/bin is in PATH before /opt/homebrew/bin, this is the version that runs by default.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760715-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-iq19","title":"Distill: promote ad-hoc epic to proto","description":"Extract a reusable proto from an existing ad-hoc epic.\n\nCOMMAND: bd mol distill \u003cepic-id\u003e [--as \u003cproto-name\u003e]\n\nBEHAVIOR:\n- Clone the epic and all children as a new proto\n- Set is_template=true on all cloned issues\n- Replace concrete values with {{variable}} placeholders (interactive or --var flags)\n- Add to proto catalog\n\nFLAGS:\n- --as NAME: Custom proto ID (default: proto-\u003cepic-id\u003e)\n- --var field=placeholder: Replace value with variable placeholder\n- --interactive: Prompt for each field that looks parameterizable\n- --dry-run: Preview the proto structure\n\nEXAMPLE:\n bd mol distill bd-o5xe --as proto-feature-workflow \\\n --var title=feature_name \\\n --var assignee=worker\n\nUSE CASES:\n- Team develops good workflow organically, wants to reuse it\n- Capture tribal knowledge as executable templates\n- Create starting point for similar future work\n\nThe reverse of spawn: instead of proto → molecule, it's molecule → proto.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T01:05:07.953538-08:00","updated_at":"2025-12-21T10:31:56.814246-08:00","closed_at":"2025-12-21T10:31:56.814246-08:00","dependencies":[{"issue_id":"bd-iq19","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T01:05:16.560404-08:00","created_by":"daemon"},{"issue_id":"bd-iq19","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T01:05:16.495774-08:00","created_by":"daemon"}]} +{"id":"bd-iq19","title":"Distill: promote ad-hoc epic to proto","description":"Extract a reusable proto from an existing ad-hoc epic.\n\nCOMMAND: bd mol distill \u003cepic-id\u003e [--as \u003cproto-name\u003e]\n\nBEHAVIOR:\n- Clone the epic and all children as a new proto\n- Set is_template=true on all cloned issues\n- Replace concrete values with {{variable}} placeholders (interactive or --var flags)\n- Add to proto catalog\n\nFLAGS:\n- --as NAME: Custom proto ID (default: proto-\u003cepic-id\u003e)\n- --var field=placeholder: Replace value with variable placeholder\n- --interactive: Prompt for each field that looks parameterizable\n- --dry-run: Preview the proto structure\n\nEXAMPLE:\n bd mol distill bd-o5xe --as proto-feature-workflow \\\n --var title=feature_name \\\n --var assignee=worker\n\nUSE CASES:\n- Team develops good workflow organically, wants to reuse it\n- Capture tribal knowledge as executable templates\n- Create starting point for similar future work\n\nThe reverse of spawn: instead of proto → molecule, it's molecule → proto.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T01:05:07.953538-08:00","updated_at":"2025-12-21T10:31:56.814246-08:00","closed_at":"2025-12-21T10:31:56.814246-08:00","dependencies":[{"issue_id":"bd-iq19","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T01:05:16.495774-08:00","created_by":"daemon"},{"issue_id":"bd-iq19","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T01:05:16.560404-08:00","created_by":"daemon"}]} {"id":"bd-iq7n","title":"Audit and fix JSONL filename mismatches across all repo clones","description":"## Problem\n\nMultiple clones of repos are configured with different JSONL filenames (issues.jsonl vs beads.jsonl), causing:\n1. JSONL files to be resurrected after deletion (one clone pushes issues.jsonl, another pushes beads.jsonl)\n2. Agents unable to see issues filed by other agents after sync\n3. Merge conflicts and data inconsistencies\n\n## Root Cause\n\nWhen repos were \"bd doctored\" or initialized at different times, some got issues.jsonl (old default) and others got beads.jsonl (Beads repo specific). These clones push their respective files, creating duplicates.\n\n## Task\n\nScan all repo clones under ~/src/ (1-2 levels deep) and standardize their JSONL configuration.\n\n### Step 1: Find all beads-enabled repos\n\n```bash\n# Find all directories named 'beads' at levels 1-2 under ~/src/\nfind ~/src -maxdepth 2 -type d -name beads\n```\n\n### Step 2: For each repo found, check configuration\n\nFor each directory from Step 1, check:\n- Does `.beads/metadata.json` exist?\n- What is the `jsonl_export` value?\n- What JSONL files actually exist in `.beads/`?\n- Are there multiple JSONL files (problem!)?\n\n### Step 3: Create audit report\n\nGenerate a report showing:\n```\nRepo Path | Config | Actual Files | Status\n----------------------------------- | ------------- | ---------------------- | --------\n~/src/beads | beads.jsonl | beads.jsonl | OK\n~/src/dave/beads | issues.jsonl | issues.jsonl | MISMATCH\n~/src/emma/beads | issues.jsonl | issues.jsonl, beads.jsonl | DUPLICATE!\n```\n\n### Step 4: Determine canonical name for each repo\n\nFor repos that are the SAME git repository (check `git remote -v`):\n- Group them together\n- Determine which JSONL filename should be canonical (majority wins, or beads.jsonl for the beads repo itself)\n- List which clones need to be updated\n\n### Step 5: Generate fix script\n\nCreate a script that for each mismatched clone:\n1. Updates `.beads/metadata.json` to use the canonical name\n2. If JSONL file needs renaming: `git mv .beads/old.jsonl .beads/new.jsonl`\n3. Removes any duplicate JSONL files: `git rm .beads/duplicate.jsonl`\n4. Commits the change\n5. Syncs: `bd sync`\n\n### Expected Output\n\n1. Audit report showing all repos and their config status\n2. List of repos grouped by git remote (same repository)\n3. Fix script or manual instructions for standardizing each repo\n4. Verification that after fixes, all clones of the same repo use the same JSONL filename\n\n### Edge Cases\n\n- Handle repos without metadata.json (use default discovery)\n- Handle repos with no git remote (standalone/local)\n- Handle repos that are not git repositories\n- Don't modify repos with uncommitted changes (warn instead)\n\n### Success Criteria\n\n- All clones of the same git repository use the same JSONL filename\n- No duplicate JSONL files in any repo\n- All configurations documented in metadata.json\n- bd doctor passes on all repos","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-11-21T23:58:35.044762-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-ir5t","title":"Merge: quartz-1767106247671","description":"branch: polecat/quartz-1767106247671\ntarget: main\nsource_issue: quartz-1767106247671\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:02:08.919103-08:00","updated_at":"2025-12-30T15:44:43.349476-08:00","closed_at":"2025-12-30T10:27:23.069509-08:00","created_by":"beads/polecats/quartz"} {"id":"bd-irah","title":"Add refs field for cross-references with relationship type","description":"The refs field enables rich relationships beyond parent/child and depends-on.\n\nStructure:\n refs: [{id: string, rel: string}]\n\nRelationship types:\n- until: active until target closes\n- caused_by: triggered by target\n- relates_to: general association\n- supersedes: replaces target\n- validates: approval relationship\n\nExample:\n refs:\n - id: gt-abc1\n rel: until\n - id: hq-xyz9\n rel: caused_by\n\nEnables:\n- bd show gt-abc1 --refs (what references this?)\n- Conditional state (muted UNTIL issue closes)\n- Audit trails (this event CAUSED_BY that issue)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-30T15:15:34.948913-08:00","updated_at":"2025-12-30T18:12:30.975264-08:00","closed_at":"2025-12-30T15:51:38.291217-08:00","close_reason":"Implemented refs feature: added until/caused-by/validates dependency types and --refs flag to bd show","created_by":"gastown/crew/max"} -{"id":"bd-is6m","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Note\nThis task is in Gas Town (gt), not beads. May need to be moved there.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:36.839709-08:00","updated_at":"2025-12-23T12:19:44.204647-08:00","closed_at":"2025-12-23T12:19:44.204647-08:00","dependencies":[{"issue_id":"bd-is6m","depends_on_id":"bd-u66e","type":"blocks","created_at":"2025-12-23T11:44:56.428084-08:00","created_by":"daemon"},{"issue_id":"bd-is6m","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.909253-08:00","created_by":"daemon"}]} +{"id":"bd-is6m","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Note\nThis task is in Gas Town (gt), not beads. May need to be moved there.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:36.839709-08:00","updated_at":"2025-12-23T12:19:44.204647-08:00","closed_at":"2025-12-23T12:19:44.204647-08:00","dependencies":[{"issue_id":"bd-is6m","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.909253-08:00","created_by":"daemon"},{"issue_id":"bd-is6m","depends_on_id":"bd-u66e","type":"blocks","created_at":"2025-12-23T11:44:56.428084-08:00","created_by":"daemon"}]} {"id":"bd-it19","title":"Code smell: show.go is 1592 lines - needs splitting","description":"cmd/bd/show.go is 1592 lines mixing data fetching, transformation, output formatting, and thread reconstruction.\n\n**Problem:**\n- Too large to understand and maintain\n- Poor separation of concerns\n- Hard to test individual components\n\n**Acceptance Criteria:**\n- [ ] Extract formatting into show_formatter.go\n- [ ] Extract thread reconstruction into show_threads.go\n- [ ] Each file under 500 lines\n- [ ] No functionality changes\n- [ ] Tests pass","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-28T18:59:00.865612-08:00","updated_at":"2025-12-28T19:01:18.42196-08:00","closed_at":"2025-12-28T19:01:18.42196-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-it19","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.61907-08:00","created_by":"daemon"}]} {"id":"bd-iutu","title":"Test comment display","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T17:50:24.269413-08:00","updated_at":"2025-12-27T17:53:39.950742-08:00","created_by":"beads/crew/dave","deleted_at":"2025-12-27T17:53:39.950742-08:00","deleted_by":"beads/crew/dave","delete_reason":"manual delete","original_type":"task"} {"id":"bd-iw11","title":"Fix TestCheckMetadataVersionTracking test threshold","description":"The test 'TestCheckMetadataVersionTracking/slightly_outdated_version' fails because:\n\n- Test uses version 0.35.0 as 'slightly outdated'\n- Current version is 0.45.0 (10 minor versions ahead)\n- The 'slightly outdated' threshold has been exceeded, so it now reports 'very old'\n\nThe test's version threshold needs updating, or the threshold logic needs adjusting.\n\n## Error\n```\ndoctor_test.go:984: Expected status ok, got warning (message: Last recorded version is very old: 0.35.0 (current: 0.45.0))\n```\n\n## Fix options\n1. Update test version from 0.35.0 to 0.43.0 (within threshold)\n2. Make test threshold calculation relative to current version","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-01-06T22:47:02.397237-08:00","updated_at":"2026-01-06T23:31:14.785508-08:00","closed_at":"2026-01-06T23:31:14.785508-08:00","close_reason":"Fixed by updating test version from 0.35.0 to 0.43.0","created_by":"beads/crew/emma"} @@ -558,7 +561,8 @@ {"id":"bd-jv4w","title":"Phase 1.2: Separate bdt executable - Initial structure","description":"Create minimal bdt command structure completely separate from bd. Must not share code, config, or database.\n\n## Subtasks\n1. Create cmd/bdt/ directory with main.go\n2. Implement bdt version, help, and status commands\n3. Configure separate database location: $HOME/.bdt/ (not $HOME/.beads/)\n4. Create separate issues file: issues.toon (not issues.jsonl)\n5. Update build system:\n - Makefile: Add bdt target\n - .goreleaser.yml: Add bdt binary config\n\n## Files to Create\n- cmd/bdt/main.go - Entry point\n- cmd/bdt/version.go - Version handling\n- cmd/bdt/help.go - Help text (separate from bd)\n\n## Success Criteria\n- `make build` produces both `bd` and `bdt` executables\n- `bdt version` shows distinct version output from bd\n- `bdt --help` shows distinct help text\n- bdt uses $HOME/.bdt/ directory (verify with `bdt info`)\n- bd and bdt completely isolated (no shared imports beyond stdlib)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T11:48:34.866877282-07:00","updated_at":"2025-12-19T12:59:11.389296015-07:00","closed_at":"2025-12-19T12:59:11.389296015-07:00"} {"id":"bd-jvu","title":"Add bd update --parent flag to change issue parent","description":"Allow changing an issue's parent with bd update --parent \u003cnew-parent-id\u003e. Useful for reorganizing tasks under different epics or moving issues between hierarchies. Should update the parent-child dependency relationship.","status":"tombstone","priority":3,"issue_type":"feature","created_at":"2025-12-17T22:24:07.274485-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} {"id":"bd-jxp6","title":"Merge: jasper-1767142011373","description":"branch: polecat/jasper-1767142011373\ntarget: main\nsource_issue: jasper-1767142011373\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T16:57:20.349497-08:00","updated_at":"2025-12-30T18:12:30.965618-08:00","closed_at":"2025-12-30T18:11:07.859316-08:00","created_by":"beads/polecats/jasper"} -{"id":"bd-jybi","title":"Migration: add gt:* labels to existing Gas Town beads","description":"One-time migration to add gt:* labels to existing Gas Town beads.\n\n## Work\n- Create migration command or script\n- Find all beads with type=agent, add label gt:agent\n- Find all beads with type=role, add label gt:role\n- Find all beads with type=rig, add label gt:rig\n- Find all beads with type=convoy, add label gt:convoy\n- Find all beads with type=slot, add label gt:slot\n\n## Notes\nThis runs in Gas Town, not in beads core. May be a gt command rather than bd command.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-06T20:40:54.0364-08:00","updated_at":"2026-01-06T20:40:54.0364-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-jybi","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.801895-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-jybi","depends_on_id":"bd-7xd7","type":"blocks","created_at":"2026-01-06T20:41:29.183759-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-jybi","title":"Migration: add gt:* labels to existing Gas Town beads","description":"One-time migration to add gt:* labels to existing Gas Town beads.\n\n## Work\n- Create migration command or script\n- Find all beads with type=agent, add label gt:agent\n- Find all beads with type=role, add label gt:role\n- Find all beads with type=rig, add label gt:rig\n- Find all beads with type=convoy, add label gt:convoy\n- Find all beads with type=slot, add label gt:slot\n\n## Notes\nThis runs in Gas Town, not in beads core. May be a gt command rather than bd command.","status":"open","priority":3,"issue_type":"task","created_at":"2026-01-06T20:40:54.0364-08:00","updated_at":"2026-01-06T20:40:54.0364-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-jybi","depends_on_id":"bd-7xd7","type":"blocks","created_at":"2026-01-06T20:41:29.183759-08:00","created_by":"beads/crew/dave"},{"issue_id":"bd-jybi","depends_on_id":"bd-i54l","type":"parent-child","created_at":"2026-01-06T20:41:11.801895-08:00","created_by":"beads/crew/dave"}]} +{"id":"bd-k3wd","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:39:59.12092-08:00","updated_at":"2026-01-07T00:39:59.15223-08:00","closed_at":"2026-01-07T00:39:59.15223-08:00","close_reason":"auto-closed session event","created_by":"beads/crew/emma"} {"id":"bd-k4ww","title":"Merge: pearl-mjtmd27a","description":"branch: polecat/pearl-mjtmd27a\ntarget: main\nsource_issue: pearl-mjtmd27a\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:16:38.232474-08:00","updated_at":"2026-01-01T10:43:18.623861-08:00","closed_at":"2026-01-01T10:43:18.623861-08:00","close_reason":"Stale MR - branch no longer exists on remote","created_by":"beads/polecats/pearl"} {"id":"bd-kbfn","title":"Phase 2: Timer Gates (Witness integration)","description":"Implement timer gate evaluation in Witness patrol.\n\n## Behavior\n- Witness patrol includes `bd gate check --type=timer`\n- Gate metadata: timeout, created_at stored on gate issue\n- Expired gates escalate to Deacon/Overseer (not auto-close)\n\n## Implementation\n1. Add timer gate check to mol-witness-patrol.formula.toml\n2. `bd gate check --type=timer` evaluates: now \u003e created_at + timeout\n3. Expired gates: escalate via `gt escalate --type gate_timeout`\n4. Non-expired gates: skip (will check next patrol)\n\n## Acceptance Criteria\n- [ ] `bd gate check --type=timer` works\n- [ ] Witness patrol runs timer check each cycle\n- [ ] Expired gates trigger escalation\n- [ ] Gate timeout configurable per-gate","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T01:55:40.113565-08:00","updated_at":"2026-01-02T12:48:35.498928-08:00","closed_at":"2026-01-02T12:48:35.498928-08:00","close_reason":"Implemented bd gate check --type=timer with escalation support","created_by":"mayor","dependencies":[{"issue_id":"bd-kbfn","depends_on_id":"bd-mcva","type":"parent-child","created_at":"2026-01-02T01:55:53.92126-08:00","created_by":"mayor"}]} {"id":"bd-kblo","title":"bd prime should mention when beads is redirected","description":"## Problem\n\nAgents running in a redirected clone don't know they're sharing beads with other clones. This can cause confusion when molecules or issues seem to 'appear' or 'disappear'.\n\n## Proposed Solution\n\nWhen `bd prime` runs and detects a redirect, include it in the output:\n\n```\nBeads: /Users/stevey/gt/beads/mayor/rig/.beads\n (redirected from crew/dave - you share issues with other clones)\n```\n\n## Why\n\nVisibility over magic. If agents can see the redirect, they can reason about it.\n\n## Related\n\n- bd where command (shows this on demand)\n- gt redirect following (ensures gt matches bd behavior)","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-27T21:15:55.026907-08:00","updated_at":"2025-12-27T21:33:33.765635-08:00","closed_at":"2025-12-27T21:33:33.765635-08:00","created_by":"beads/crew/dave"} @@ -570,7 +574,7 @@ {"id":"bd-kp9y","title":"gt swarm dispatch command not working","description":"The 'gt swarm dispatch' command shown in help doesn't appear to work as expected.\n\n**Observed:**\n```\n$ gt swarm dispatch bd-784c\n[prints help text instead of dispatching]\n```\n\n**Expected:**\nShould dispatch the next ready task from the epic to an available worker.\n\n**Workaround:**\nHad to manually use 'gt sling \u003cissue\u003e \u003cpolecat\u003e' for each task dispatch.\n\n**Impact:**\n- Manual task dispatch defeats swarm automation\n- Coordinator has to track which tasks are ready and which polecats are free\n\n**Suggestion:**\nImplement or fix 'gt swarm dispatch' to:\n1. Find next unassigned task in epic\n2. Find idle polecat in swarm\n3. Sling task to polecat automatically","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:18:10.320094-08:00","updated_at":"2025-12-29T18:30:05.386394-08:00","closed_at":"2025-12-29T18:30:05.386394-08:00","close_reason":"Moved to gastown: gt-s94gq (this is a gt command, not beads)","created_by":"beads/crew/dave"} {"id":"bd-kptp","title":"Merge: bd-qioh","description":"branch: polecat/Errata\ntarget: main\nsource_issue: bd-qioh\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:46:08.832073-08:00","updated_at":"2025-12-23T19:12:08.350136-08:00","closed_at":"2025-12-23T19:12:08.350136-08:00"} {"id":"bd-kpy","title":"Sync race: rebase-based divergence recovery resurrects tombstones","description":"## Problem\nWhen two repos sync simultaneously, tombstones can be resurrected:\n\n1. Repo A deletes issue (creates tombstone), pushes to sync branch\n2. Repo B (with 'closed' status) exports and tries to push\n3. Push fails (non-fast-forward)\n4. fetchAndRebaseInWorktree does git rebase\n5. Git rebase applies B's 'closed' patch on top of A's 'tombstone'\n6. TEXT-level rebase doesn't invoke beads merge driver\n7. 'closed' overwrites 'tombstone' = resurrection\n\n## Root Cause\nCommitToSyncBranch uses git rebase for divergence recovery, but rebase is text-level, not content-level. The proper content-level merge in PullFromSyncBranch handles tombstones correctly, but it runs AFTER the problematic push.\n\n## Proposed Fix\nOption 1: Don't push in CommitToSyncBranch - let PullFromSyncBranch handle merge+push\nOption 2: Replace git rebase with content-level merge in fetchAndRebaseInWorktree\nOption 3: Reorder sync steps: Export → Pull/Merge → Commit → Push\n\n## Workaround Applied\nExcluded tombstones from orphan detection warnings (commit 1e97d9cc).\n\nSee also: bd-3852 (Add orphan detection migration)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-17T23:29:33.049272-08:00","updated_at":"2025-12-24T22:41:09.184574-08:00","closed_at":"2025-12-24T22:41:09.184574-08:00"} -{"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"}]} +{"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"}]} {"id":"bd-kqw0","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066452-08:00","updated_at":"2025-12-21T13:53:49.656073-08:00","deleted_at":"2025-12-21T13:53:49.656073-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-kvus","title":"bd sync fails when .beads/redirect points to different repo","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-31T11:36:35.614607-08:00","updated_at":"2025-12-31T13:31:39.491734-08:00","closed_at":"2025-12-31T13:31:39.491734-08:00","close_reason":"Duplicate of bd-e2q9 (fixed in same commit)","created_by":"gastown/crew/max"} {"id":"bd-kvwf","title":"Merge: quartz-1767142008267","description":"branch: polecat/quartz-1767142008267\ntarget: main\nsource_issue: quartz-1767142008267\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T16:50:35.727954-08:00","updated_at":"2025-12-30T18:12:30.969887-08:00","closed_at":"2025-12-30T18:11:07.891839-08:00","created_by":"beads/polecats/quartz"} @@ -578,7 +582,7 @@ {"id":"bd-kwjh.1","title":".beads-ephemeral/ storage backend","description":"Implement ephemeral storage layer for wisps.\n\n## Requirements\n- New storage location: .beads-ephemeral/issues.jsonl (sibling to .beads/)\n- Gitignored by default (add to .beads/.gitignore)\n- Same JSONL format as regular beads\n- Config option: ephemeral.directory (relative path)\n- ephemeral.enabled config flag\n\n## Storage Behavior\n- Ephemeral issues have `ephemeral: true` field\n- No sync to remote (local only)\n- No daemon tracking needed (transient)\n\n## Implementation\n- Add EphemeralStore in storage package\n- Initialize on demand when --ephemeral flag used\n- Share Issue struct, just different storage path","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-22T00:06:46.706026-08:00","updated_at":"2025-12-22T00:08:26.009875-08:00","dependencies":[{"issue_id":"bd-kwjh.1","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:06:46.706461-08:00","created_by":"daemon"}],"deleted_at":"2025-12-22T00:08:26.009875-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-kwjh.2","title":".beads-ephemeral/ storage backend","description":"Implement ephemeral storage layer for wisps.\n\n## Requirements\n- New storage location: .beads-ephemeral/issues.jsonl (sibling to .beads/)\n- Gitignored by default (add to .beads/.gitignore)\n- Same JSONL format as regular beads\n- Config option: ephemeral.directory (relative path)\n- ephemeral.enabled config flag\n\n## Storage Behavior\n- Ephemeral issues have ephemeral: true field\n- No sync to remote (local only)\n- No daemon tracking needed (transient)\n\n## Implementation\n- Add EphemeralStore in storage package\n- Initialize on demand when --ephemeral flag used\n- Share Issue struct, just different storage path","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T00:06:56.248345-08:00","updated_at":"2025-12-22T00:13:51.281427-08:00","closed_at":"2025-12-22T00:13:51.281427-08:00","dependencies":[{"issue_id":"bd-kwjh.2","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:06:56.248725-08:00","created_by":"daemon"}]} {"id":"bd-kwjh.3","title":"bd mol bond --ephemeral flag","description":"Add --ephemeral flag to bd mol bond command.\n\n## Behavior\n- `bd mol bond \u003cproto\u003e --ephemeral` creates molecule in .beads-ephemeral/\n- Without flag, creates in .beads/ (current behavior)\n- Ephemeral molecules have `ephemeral: true` in their issue record\n\n## Implementation\n- Add --ephemeral bool flag to mol bond command\n- Route to EphemeralStore when flag set\n- Set ephemeral:true on created issue\n\n## Testing\n- Test mol bond creates in correct location\n- Test ephemeral flag is persisted\n- Test regular mol bond still works","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T00:07:26.591728-08:00","updated_at":"2025-12-22T00:17:42.50719-08:00","closed_at":"2025-12-22T00:17:42.50719-08:00","dependencies":[{"issue_id":"bd-kwjh.3","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:26.592102-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.3","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:26.592866-08:00","created_by":"daemon"}]} -{"id":"bd-kwjh.4","title":"bd mol squash handles wisp→digest","description":"Update bd mol squash to handle ephemeral molecules.\n\n## Behavior for Ephemeral Molecules\n1. Delete wisp from .beads-ephemeral/\n2. Create digest issue in .beads/ (permanent)\n3. Digest has type:digest and squashed_from field\n\n## Digest Format\n```json\n{\n \"id\": \"\u003cparent\u003e.digest-NNN\",\n \"type\": \"digest\",\n \"title\": \"\u003cproto\u003e cycle @ \u003ctimestamp\u003e\",\n \"description\": \"\u003csummary from --summary flag\u003e\",\n \"parent\": \"\u003cproto-id\u003e\",\n \"squashed_from\": \"\u003cwisp-id\u003e\"\n}\n```\n\n## Implementation\n- Detect if molecule is ephemeral (check storage location or flag)\n- Delete from ephemeral store\n- Create digest in permanent store\n- Return digest ID\n\n## Testing\n- Test squash of ephemeral mol creates digest\n- Test wisp is deleted after squash\n- Test digest is queryable","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T00:07:27.685116-08:00","updated_at":"2025-12-22T00:53:55.74082-08:00","closed_at":"2025-12-22T00:53:55.74082-08:00","dependencies":[{"issue_id":"bd-kwjh.4","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:27.687773-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.4","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:27.686798-08:00","created_by":"daemon"}]} +{"id":"bd-kwjh.4","title":"bd mol squash handles wisp→digest","description":"Update bd mol squash to handle ephemeral molecules.\n\n## Behavior for Ephemeral Molecules\n1. Delete wisp from .beads-ephemeral/\n2. Create digest issue in .beads/ (permanent)\n3. Digest has type:digest and squashed_from field\n\n## Digest Format\n```json\n{\n \"id\": \"\u003cparent\u003e.digest-NNN\",\n \"type\": \"digest\",\n \"title\": \"\u003cproto\u003e cycle @ \u003ctimestamp\u003e\",\n \"description\": \"\u003csummary from --summary flag\u003e\",\n \"parent\": \"\u003cproto-id\u003e\",\n \"squashed_from\": \"\u003cwisp-id\u003e\"\n}\n```\n\n## Implementation\n- Detect if molecule is ephemeral (check storage location or flag)\n- Delete from ephemeral store\n- Create digest in permanent store\n- Return digest ID\n\n## Testing\n- Test squash of ephemeral mol creates digest\n- Test wisp is deleted after squash\n- Test digest is queryable","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T00:07:27.685116-08:00","updated_at":"2025-12-22T00:53:55.74082-08:00","closed_at":"2025-12-22T00:53:55.74082-08:00","dependencies":[{"issue_id":"bd-kwjh.4","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:27.686798-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.4","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:27.687773-08:00","created_by":"daemon"}]} {"id":"bd-kwjh.5","title":"bd wisp list command","description":"Add bd wisp list command to show ephemeral molecules.\n\n## Usage\n```bash\nbd wisp list # List all wisps in current context\nbd wisp list --json # JSON output\nbd wisp list --all # Include orphaned wisps\n```\n\n## Output\n- Shows in-progress ephemeral molecules\n- Columns: ID, Title, Started, Last Update, Status\n- Warns about orphaned wisps (old updated_at)\n\n## Implementation\n- New 'wisp' command group\n- Read from .beads-ephemeral/issues.jsonl\n- Filter to ephemeral:true issues","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T00:07:29.514936-08:00","updated_at":"2025-12-22T01:09:03.514376-08:00","closed_at":"2025-12-22T01:09:03.514376-08:00","dependencies":[{"issue_id":"bd-kwjh.5","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:29.515301-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.5","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:29.516134-08:00","created_by":"daemon"}]} {"id":"bd-kwjh.6","title":"bd wisp gc command","description":"Add bd wisp gc command to garbage collect orphaned wisps.\n\n## Usage\n```bash\nbd wisp gc # Clean orphaned wisps\nbd wisp gc --dry-run # Show what would be cleaned\nbd wisp gc --age 1h # Custom orphan threshold (default: 1h)\n```\n\n## Orphan Detection\nA wisp is orphaned if:\n- process_id field exists AND process is dead\n- OR updated_at older than threshold AND not complete\n- AND molecule status is not complete/abandoned\n\n## Behavior\n- Delete orphaned wisps (no digest created)\n- Report count of cleaned wisps\n- --dry-run shows candidates without deleting\n\n## Implementation\n- Add 'gc' subcommand to wisp group\n- Process detection via os.FindProcess or /proc\n- Configurable age threshold","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T00:07:30.861155-08:00","updated_at":"2025-12-22T01:12:37.283991-08:00","closed_at":"2025-12-22T01:12:37.283991-08:00","dependencies":[{"issue_id":"bd-kwjh.6","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:30.862681-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.6","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:30.863721-08:00","created_by":"daemon"}]} {"id":"bd-kwjh.7","title":"bd mol burn deletes ephemeral without digest","description":"Update bd mol burn to handle ephemeral molecules.\n\n## Behavior for Ephemeral Molecules\n- Delete wisp from .beads-ephemeral/\n- NO digest created (unlike squash)\n- Used for abandoned/crashed cycles\n\n## Difference from Squash\n| Command | Ephemeral Behavior |\n|---------|-------------------|\n| squash | Delete wisp, create digest |\n| burn | Delete wisp, no trace |\n\n## Implementation\n- Detect if molecule is ephemeral\n- Delete from ephemeral store\n- Skip digest creation","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T00:07:32.020144-08:00","updated_at":"2025-12-22T01:11:05.487605-08:00","closed_at":"2025-12-22T01:11:05.487605-08:00","dependencies":[{"issue_id":"bd-kwjh.7","depends_on_id":"bd-kwjh","type":"parent-child","created_at":"2025-12-22T00:07:32.022117-08:00","created_by":"daemon"},{"issue_id":"bd-kwjh.7","depends_on_id":"bd-kwjh.2","type":"blocks","created_at":"2025-12-22T00:07:32.023217-08:00","created_by":"daemon"}]} @@ -607,8 +611,8 @@ {"id":"bd-lfak.1","title":"Scaffold bd preflight command with checklist output","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:29.297254-08:00","updated_at":"2025-12-30T18:11:15.884294-08:00","closed_at":"2025-12-30T18:11:15.884294-08:00","close_reason":"Implemented static checklist output. Command now shows PR readiness checks. --check and --fix flags documented for future phases.","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.1","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:29.297783-08:00","created_by":"mayor"}]} {"id":"bd-lfak.2","title":"Implement --check flag with test runner","description":"## Summary\nImplement the `--check` flag to run `go test -short ./...` and report results.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Changes Required\n\n1. **Add check execution logic** in `runPreflight()`:\n```go\nif check {\n runChecks(cmd) // New function\n return\n}\n```\n\n2. **Implement test runner**:\n```go\nfunc runTestCheck() CheckResult {\n cmd := exec.Command(\"go\", \"test\", \"-short\", \"./...\")\n output, err := cmd.CombinedOutput()\n return CheckResult{\n Name: \"tests\",\n Passed: err == nil,\n Output: string(output),\n Command: \"go test -short ./...\",\n }\n}\n```\n\n3. **Define CheckResult struct**:\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n}\n```\n\n4. **Output format**:\n```\n$ bd preflight --check\n✓ Tests pass\n Command: go test -short ./...\n \n# On failure:\n✗ Tests fail\n Command: go test -short ./...\n Output: [truncated test output]\n```\n\n### Testing\n- Add tests in `cmd/bd/preflight_test.go`\n- Test with passing tests (this repo)\n- Test with intentionally failing test (mock or temp file)\n\n### Acceptance Criteria\n- [x] `--check` flag runs tests (not just prints message)\n- [x] Clear pass/fail output with ✓/✗ symbols\n- [x] Shows command being run\n- [x] Shows output on failure (truncated if long)\n- [x] Exits with non-zero code if tests fail\n- [x] Works with `--json` flag for programmatic use","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:30.419315-08:00","updated_at":"2026-01-04T15:22:07.768601-08:00","closed_at":"2025-12-30T23:33:04.567543-08:00","close_reason":"Fixed test/implementation mismatch - tests now align with actual preflight.go","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.2","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:30.419875-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.2","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.582603-08:00","created_by":"mayor"}]} {"id":"bd-lfak.3","title":"Implement lint check (golangci-lint)","description":"## Summary\nAdd lint check using golangci-lint to the preflight --check mode.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Changes Required\n\n1. **Implement lint checker**:\n```go\nfunc runLintCheck() CheckResult {\n // First check if golangci-lint is available\n if _, err := exec.LookPath(\"golangci-lint\"); err != nil {\n return CheckResult{\n Name: \"lint\",\n Passed: false,\n Output: \"golangci-lint not found in PATH\",\n Command: \"golangci-lint run ./...\",\n Skipped: true,\n }\n }\n \n cmd := exec.Command(\"golangci-lint\", \"run\", \"./...\")\n output, err := cmd.CombinedOutput()\n return CheckResult{\n Name: \"lint\",\n Passed: err == nil,\n Output: string(output),\n Command: \"golangci-lint run ./...\",\n }\n}\n```\n\n2. **Add Skipped field to CheckResult** (if not already added by bd-lfak.2):\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n Skipped bool // Tool not available\n}\n```\n\n3. **Output format**:\n```\n$ bd preflight --check\n✓ Lint passes\n Command: golangci-lint run ./...\n\n# When tool missing:\n⚠ Lint skipped (golangci-lint not found)\n Install: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\n\n# On failure:\n✗ Lint fails\n Command: golangci-lint run ./...\n Output: [lint errors]\n```\n\n### Dependencies\n- Depends on bd-lfak.2 for CheckResult struct and runChecks() framework\n\n### Testing\n- Test with clean lint (this repo should pass)\n- Test with golangci-lint not in PATH (mock or temp PATH)\n- Test with lint errors (intentional bad code)\n\n### Notes\n- This repo has baseline warnings documented in docs/LINTING.md\n- golangci-lint respects .golangci.yml config if present\n\n### Acceptance Criteria\n- [x] Runs golangci-lint when --check flag is used\n- [x] Gracefully handles missing golangci-lint binary\n- [x] Shows clear pass/fail/skip output\n- [x] Shows lint errors on failure\n- [x] Works with --json flag","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:31.445431-08:00","updated_at":"2025-12-31T00:03:07.142467-08:00","closed_at":"2025-12-31T00:03:07.142467-08:00","close_reason":"Implemented lint check with golangci-lint, graceful skip when tool not available","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:31.447094-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.602793-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.950646-08:00","created_by":"beads/crew/emma"}]} -{"id":"bd-lfak.4","title":"Implement nix-hash staleness detection","description":"## Summary\nDetect when go.sum has changed but vendorHash in default.nix may be stale.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Detection Logic\n\n**Tier 1 (Simple - implement this):**\nCheck if go.sum has uncommitted changes (staged or unstaged). If so, warn that vendorHash might need updating.\n\n```go\nfunc runNixHashCheck() CheckResult {\n // Check if go.sum has changes\n cmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"HEAD\", \"--\", \"go.sum\")\n output, _ := cmd.Output()\n \n // Also check staged changes\n stagedCmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"--cached\", \"--\", \"go.sum\")\n stagedOutput, _ := stagedCmd.Output()\n \n hasChanges := len(output) \u003e 0 || len(stagedOutput) \u003e 0\n \n if hasChanges {\n return CheckResult{\n Name: \"nix-hash\",\n Passed: false,\n Output: \"go.sum has changes - vendorHash in default.nix may need updating\",\n Command: \"git diff HEAD -- go.sum\",\n Warning: true, // Not a hard failure, just a warning\n }\n }\n \n return CheckResult{\n Name: \"nix-hash\",\n Passed: true,\n Output: \"go.sum unchanged\",\n Command: \"git diff HEAD -- go.sum\",\n }\n}\n```\n\n**Tier 2 (Future - auto-fix):**\nIf nix is available, compute the correct vendorHash:\n```bash\nnix-prefetch-url --unpack \"https://...\"\n# or use nix build with --print-out-paths\n```\n\n### Key Files\n- `go.sum` - Go module checksums\n- `default.nix` - Contains vendorHash on line 12\n\n### Output Format\n```\n$ bd preflight --check\n✓ Nix hash current (go.sum unchanged)\n\n# When go.sum changed:\n⚠ Nix hash may be stale\n go.sum has uncommitted changes\n Hint: If you modified dependencies, run nix build to get new vendorHash\n \n# When nix available (future):\n✗ Nix hash stale\n Expected: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n Current: sha256-ovG0EWQFtifHF5leEQTFvTjGvc+yiAjpAaqaV0OklgE=\n Fix: bd preflight --fix\n```\n\n### Add Warning field to CheckResult\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n Skipped bool\n Warning bool // Yellow ⚠ instead of red ✗\n}\n```\n\n### Testing\n- Test with clean go.sum (no changes)\n- Test with modified go.sum (stage a fake change, then reset)\n- Test output format\n\n### Acceptance Criteria\n- [x] Detects when go.sum has uncommitted changes\n- [x] Shows as warning (⚠) not error (✗)\n- [x] Provides helpful hint about vendorHash\n- [x] Works with --json flag\n- [x] Does not require nix to be installed (just git)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:32.318167-08:00","updated_at":"2025-12-31T00:06:02.045812-08:00","closed_at":"2025-12-31T00:06:02.045812-08:00","close_reason":"Implemented nix-hash staleness detection with warning state for go.sum changes","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.9704-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:32.31998-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.621655-08:00","created_by":"mayor"}]} -{"id":"bd-lfak.5","title":"Implement version-sync check (version.go vs default.nix)","description":"## Summary\nCheck that version in `cmd/bd/version.go` matches version in `default.nix`.\n\n## Current State (as of writing)\n- version.go: Version = \"0.41.0\"\n- default.nix: version = \"0.37.0\"\n- **These are already out of sync!** This check would catch this.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Key Files\n- `cmd/bd/version.go` line 17: `Version = \"0.41.0\"`\n- `default.nix` line 4: `version = \"0.37.0\";`\n\n### Implementation\n\n```go\nfunc runVersionSyncCheck() CheckResult {\n // Read version.go\n versionGoContent, err := os.ReadFile(\"cmd/bd/version.go\")\n if err != nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: fmt.Sprintf(\"Cannot read cmd/bd/version.go: %v\", err),\n Skipped: true,\n }\n }\n \n // Extract version from version.go\n // Pattern: Version = \"X.Y.Z\"\n versionGoRe := regexp.MustCompile(`Version\\s*=\\s*\"([^\"]+)\"`)\n versionGoMatch := versionGoRe.FindSubmatch(versionGoContent)\n if versionGoMatch == nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: \"Cannot parse version from version.go\",\n Skipped: true,\n }\n }\n goVersion := string(versionGoMatch[1])\n \n // Read default.nix\n nixContent, err := os.ReadFile(\"default.nix\")\n if err != nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: true, // No nix file = no sync needed\n Output: \"default.nix not found (skipping nix version check)\",\n Skipped: true,\n }\n }\n \n // Extract version from default.nix\n // Pattern: version = \"X.Y.Z\";\n nixRe := regexp.MustCompile(`version\\s*=\\s*\"([^\"]+)\"`)\n nixMatch := nixRe.FindSubmatch(nixContent)\n if nixMatch == nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: \"Cannot parse version from default.nix\",\n Skipped: true,\n }\n }\n nixVersion := string(nixMatch[1])\n \n if goVersion != nixVersion {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: fmt.Sprintf(\"Version mismatch: version.go=%s, default.nix=%s\", goVersion, nixVersion),\n Command: \"Compare cmd/bd/version.go and default.nix\",\n }\n }\n \n return CheckResult{\n Name: \"version-sync\",\n Passed: true,\n Output: fmt.Sprintf(\"Versions match: %s\", goVersion),\n Command: \"Compare cmd/bd/version.go and default.nix\",\n }\n}\n```\n\n### Output Format\n```\n$ bd preflight --check\n✓ Version sync (0.41.0)\n\n# On mismatch:\n✗ Version mismatch\n version.go: 0.41.0\n default.nix: 0.37.0\n Fix: Update default.nix to match version.go\n```\n\n### Future: Auto-fix\nFor --fix mode, update default.nix automatically:\n```go\n// Replace version line in default.nix\nnewContent := nixRe.ReplaceAll(nixContent, \n []byte(fmt.Sprintf(`version = \"%s\"`, goVersion)))\nos.WriteFile(\"default.nix\", newContent, 0644)\n```\n\n### Testing\n- Test with matching versions\n- Test with mismatched versions (current state!)\n- Test with missing files\n\n### Acceptance Criteria\n- [x] Reads version from both files\n- [x] Compares and reports mismatch\n- [x] Shows both versions clearly on mismatch\n- [x] Works when default.nix is missing (skip gracefully)\n- [x] Works with --json flag","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:33.380378-08:00","updated_at":"2025-12-31T00:08:48.691805-08:00","closed_at":"2025-12-31T00:08:48.691805-08:00","close_reason":"Implemented version sync check comparing version.go and default.nix; also fixed existing mismatch","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:33.382134-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.64101-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.989707-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-lfak.4","title":"Implement nix-hash staleness detection","description":"## Summary\nDetect when go.sum has changed but vendorHash in default.nix may be stale.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Detection Logic\n\n**Tier 1 (Simple - implement this):**\nCheck if go.sum has uncommitted changes (staged or unstaged). If so, warn that vendorHash might need updating.\n\n```go\nfunc runNixHashCheck() CheckResult {\n // Check if go.sum has changes\n cmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"HEAD\", \"--\", \"go.sum\")\n output, _ := cmd.Output()\n \n // Also check staged changes\n stagedCmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"--cached\", \"--\", \"go.sum\")\n stagedOutput, _ := stagedCmd.Output()\n \n hasChanges := len(output) \u003e 0 || len(stagedOutput) \u003e 0\n \n if hasChanges {\n return CheckResult{\n Name: \"nix-hash\",\n Passed: false,\n Output: \"go.sum has changes - vendorHash in default.nix may need updating\",\n Command: \"git diff HEAD -- go.sum\",\n Warning: true, // Not a hard failure, just a warning\n }\n }\n \n return CheckResult{\n Name: \"nix-hash\",\n Passed: true,\n Output: \"go.sum unchanged\",\n Command: \"git diff HEAD -- go.sum\",\n }\n}\n```\n\n**Tier 2 (Future - auto-fix):**\nIf nix is available, compute the correct vendorHash:\n```bash\nnix-prefetch-url --unpack \"https://...\"\n# or use nix build with --print-out-paths\n```\n\n### Key Files\n- `go.sum` - Go module checksums\n- `default.nix` - Contains vendorHash on line 12\n\n### Output Format\n```\n$ bd preflight --check\n✓ Nix hash current (go.sum unchanged)\n\n# When go.sum changed:\n⚠ Nix hash may be stale\n go.sum has uncommitted changes\n Hint: If you modified dependencies, run nix build to get new vendorHash\n \n# When nix available (future):\n✗ Nix hash stale\n Expected: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n Current: sha256-ovG0EWQFtifHF5leEQTFvTjGvc+yiAjpAaqaV0OklgE=\n Fix: bd preflight --fix\n```\n\n### Add Warning field to CheckResult\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n Skipped bool\n Warning bool // Yellow ⚠ instead of red ✗\n}\n```\n\n### Testing\n- Test with clean go.sum (no changes)\n- Test with modified go.sum (stage a fake change, then reset)\n- Test output format\n\n### Acceptance Criteria\n- [x] Detects when go.sum has uncommitted changes\n- [x] Shows as warning (⚠) not error (✗)\n- [x] Provides helpful hint about vendorHash\n- [x] Works with --json flag\n- [x] Does not require nix to be installed (just git)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:32.318167-08:00","updated_at":"2025-12-31T00:06:02.045812-08:00","closed_at":"2025-12-31T00:06:02.045812-08:00","close_reason":"Implemented nix-hash staleness detection with warning state for go.sum changes","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:32.31998-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.621655-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.9704-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-lfak.5","title":"Implement version-sync check (version.go vs default.nix)","description":"## Summary\nCheck that version in `cmd/bd/version.go` matches version in `default.nix`.\n\n## Current State (as of writing)\n- version.go: Version = \"0.41.0\"\n- default.nix: version = \"0.37.0\"\n- **These are already out of sync!** This check would catch this.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Key Files\n- `cmd/bd/version.go` line 17: `Version = \"0.41.0\"`\n- `default.nix` line 4: `version = \"0.37.0\";`\n\n### Implementation\n\n```go\nfunc runVersionSyncCheck() CheckResult {\n // Read version.go\n versionGoContent, err := os.ReadFile(\"cmd/bd/version.go\")\n if err != nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: fmt.Sprintf(\"Cannot read cmd/bd/version.go: %v\", err),\n Skipped: true,\n }\n }\n \n // Extract version from version.go\n // Pattern: Version = \"X.Y.Z\"\n versionGoRe := regexp.MustCompile(`Version\\s*=\\s*\"([^\"]+)\"`)\n versionGoMatch := versionGoRe.FindSubmatch(versionGoContent)\n if versionGoMatch == nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: \"Cannot parse version from version.go\",\n Skipped: true,\n }\n }\n goVersion := string(versionGoMatch[1])\n \n // Read default.nix\n nixContent, err := os.ReadFile(\"default.nix\")\n if err != nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: true, // No nix file = no sync needed\n Output: \"default.nix not found (skipping nix version check)\",\n Skipped: true,\n }\n }\n \n // Extract version from default.nix\n // Pattern: version = \"X.Y.Z\";\n nixRe := regexp.MustCompile(`version\\s*=\\s*\"([^\"]+)\"`)\n nixMatch := nixRe.FindSubmatch(nixContent)\n if nixMatch == nil {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: \"Cannot parse version from default.nix\",\n Skipped: true,\n }\n }\n nixVersion := string(nixMatch[1])\n \n if goVersion != nixVersion {\n return CheckResult{\n Name: \"version-sync\",\n Passed: false,\n Output: fmt.Sprintf(\"Version mismatch: version.go=%s, default.nix=%s\", goVersion, nixVersion),\n Command: \"Compare cmd/bd/version.go and default.nix\",\n }\n }\n \n return CheckResult{\n Name: \"version-sync\",\n Passed: true,\n Output: fmt.Sprintf(\"Versions match: %s\", goVersion),\n Command: \"Compare cmd/bd/version.go and default.nix\",\n }\n}\n```\n\n### Output Format\n```\n$ bd preflight --check\n✓ Version sync (0.41.0)\n\n# On mismatch:\n✗ Version mismatch\n version.go: 0.41.0\n default.nix: 0.37.0\n Fix: Update default.nix to match version.go\n```\n\n### Future: Auto-fix\nFor --fix mode, update default.nix automatically:\n```go\n// Replace version line in default.nix\nnewContent := nixRe.ReplaceAll(nixContent, \n []byte(fmt.Sprintf(`version = \"%s\"`, goVersion)))\nos.WriteFile(\"default.nix\", newContent, 0644)\n```\n\n### Testing\n- Test with matching versions\n- Test with mismatched versions (current state!)\n- Test with missing files\n\n### Acceptance Criteria\n- [x] Reads version from both files\n- [x] Compares and reports mismatch\n- [x] Shows both versions clearly on mismatch\n- [x] Works when default.nix is missing (skip gracefully)\n- [x] Works with --json flag","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:33.380378-08:00","updated_at":"2025-12-31T00:08:48.691805-08:00","closed_at":"2025-12-31T00:08:48.691805-08:00","close_reason":"Implemented version sync check comparing version.go and default.nix; also fixed existing mismatch","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.64101-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.989707-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:33.382134-08:00","created_by":"mayor"}]} {"id":"bd-lfiu","title":"bd dep add: Auto-resolve cross-rig IDs using routes.jsonl","description":"Currently, adding a dependency to an issue in another rig requires verbose external reference syntax:\n\n```bash\n# This fails - can't resolve bd-* from gastown context\nbd dep add gt-xyz bd-abc\n\n# This works but is verbose\nbd dep add gt-xyz external:beads:bd-abc\n```\n\nThe town-level routing (~/gt/.beads/routes.jsonl) already knows how to map prefixes to rigs:\n```json\n{\"prefix\": \"gt-\", \"path\": \"gastown/mayor/rig\"}\n{\"prefix\": \"bd-\", \"path\": \"beads/mayor/rig\"}\n```\n\nEnhancement: When `bd dep add` encounters an ID with a foreign prefix, it should:\n1. Check routes.jsonl for the prefix mapping\n2. Auto-resolve to external:\u003cproject\u003e:\u003cid\u003e internally\n3. Allow the simpler `bd dep add gt-xyz bd-abc` syntax\n\nThis would make cross-rig dependencies much more ergonomic.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-26T20:20:40.814713-08:00","updated_at":"2025-12-26T23:47:52.82107-08:00","closed_at":"2025-12-26T23:47:52.82107-08:00"} {"id":"bd-likt","title":"Add daemon RPC support for gate commands","description":"Add daemon RPC support for gate commands.\n\n## Current State\nGate commands require --no-daemon flag because they use direct SQLite access:\n- Gate create needs to write await_type, await_id, timeout_ns, waiters fields\n- Gate wait needs to update waiters JSON array\n- Daemon RPC doesnt have methods for these operations\n\n## Implementation\n\n### 1. Add RPC methods to internal/rpc/protocol.go\n\n```go\n// Gate operations\ntype GateCreateArgs struct {\n Title string \\`json:\"title\"\\`\n AwaitType string \\`json:\"await_type\"\\`\n AwaitID string \\`json:\"await_id\"\\`\n Timeout time.Duration \\`json:\"timeout\"\\`\n Waiters []string \\`json:\"waiters\"\\`\n}\n\ntype GateCreateResult struct {\n Issue *types.Issue \\`json:\"issue\"\\`\n}\n\ntype GateListArgs struct {\n All bool \\`json:\"all\"\\` // Include closed gates\n}\n\ntype GateListResult struct {\n Gates []*types.Issue \\`json:\"gates\"\\`\n}\n\ntype GateWaitArgs struct {\n GateID string \\`json:\"gate_id\"\\`\n Waiters []string \\`json:\"waiters\"\\` // Additional waiters to add\n}\n\ntype GateWaitResult struct {\n Gate *types.Issue \\`json:\"gate\"\\`\n AddedCount int \\`json:\"added_count\"\\`\n}\n```\n\n### 2. Add handler methods to internal/daemon/rpc_handler.go\n\n```go\nfunc (h *RPCHandler) GateCreate(ctx context.Context, args *rpc.GateCreateArgs) (*rpc.GateCreateResult, error) {\n now := time.Now()\n gate := \u0026types.Issue{\n Title: args.Title,\n IssueType: types.TypeGate,\n Status: types.StatusOpen,\n Priority: 1,\n Assignee: \"deacon/\",\n Wisp: true,\n AwaitType: args.AwaitType,\n AwaitID: args.AwaitID,\n Timeout: args.Timeout,\n Waiters: args.Waiters,\n CreatedAt: now,\n UpdatedAt: now,\n }\n gate.ContentHash = gate.ComputeContentHash()\n \n if err := h.store.CreateIssue(ctx, gate, h.actor); err != nil {\n return nil, err\n }\n \n return \u0026rpc.GateCreateResult{Issue: gate}, nil\n}\n\nfunc (h *RPCHandler) GateList(ctx context.Context, args *rpc.GateListArgs) (*rpc.GateListResult, error) {\n gateType := types.TypeGate\n filter := types.IssueFilter{IssueType: \u0026gateType}\n if !args.All {\n openStatus := types.StatusOpen\n filter.Status = \u0026openStatus\n }\n \n gates, err := h.store.SearchIssues(ctx, \"\", filter)\n if err != nil {\n return nil, err\n }\n \n return \u0026rpc.GateListResult{Gates: gates}, nil\n}\n\nfunc (h *RPCHandler) GateWait(ctx context.Context, args *rpc.GateWaitArgs) (*rpc.GateWaitResult, error) {\n gate, err := h.store.GetIssue(ctx, args.GateID)\n if err != nil {\n return nil, err\n }\n if gate.IssueType != types.TypeGate {\n return nil, fmt.Errorf(\"%s is not a gate\", args.GateID)\n }\n \n // Merge waiters (dedupe)\n waiterSet := make(map[string]bool)\n for _, w := range gate.Waiters {\n waiterSet[w] = true\n }\n added := 0\n for _, w := range args.Waiters {\n if !waiterSet[w] {\n gate.Waiters = append(gate.Waiters, w)\n waiterSet[w] = true\n added++\n }\n }\n \n if added \u003e 0 {\n // Update via store\n updates := map[string]interface{}{\n \"waiters\": gate.Waiters,\n }\n if err := h.store.UpdateIssue(ctx, args.GateID, updates, h.actor); err != nil {\n return nil, err\n }\n }\n \n return \u0026rpc.GateWaitResult{Gate: gate, AddedCount: added}, nil\n}\n```\n\n### 3. Register methods in daemon\n\nIn internal/daemon/server.go, register the new methods:\n```go\nrpc.RegisterMethod(\"gate.create\", h.GateCreate)\nrpc.RegisterMethod(\"gate.list\", h.GateList)\nrpc.RegisterMethod(\"gate.wait\", h.GateWait)\n```\n\n### 4. Add client methods to internal/rpc/client.go\n\n```go\nfunc (c *Client) GateCreate(ctx context.Context, args *GateCreateArgs) (*GateCreateResult, error) {\n var result GateCreateResult\n err := c.Call(ctx, \"gate.create\", args, \u0026result)\n return \u0026result, err\n}\n\nfunc (c *Client) GateList(ctx context.Context, args *GateListArgs) (*GateListResult, error) {\n var result GateListResult\n err := c.Call(ctx, \"gate.list\", args, \u0026result)\n return \u0026result, err\n}\n\nfunc (c *Client) GateWait(ctx context.Context, args *GateWaitArgs) (*GateWaitResult, error) {\n var result GateWaitResult\n err := c.Call(ctx, \"gate.wait\", args, \u0026result)\n return \u0026result, err\n}\n```\n\n### 5. Update cmd/bd/gate.go to use daemon\n\n```go\n// In gateCreateCmd Run:\nif daemonClient != nil {\n result, err := daemonClient.GateCreate(ctx, \u0026rpc.GateCreateArgs{\n Title: title,\n AwaitType: awaitType,\n AwaitID: awaitID,\n Timeout: timeout,\n Waiters: notifyAddrs,\n })\n if err != nil {\n FatalError(\"gate create: %v\", err)\n }\n gate = result.Issue\n} else {\n // Existing direct store code\n}\n```\n\n## Files to Modify\n\n1. **internal/rpc/protocol.go** - Add Gate*Args/Result types\n2. **internal/daemon/rpc_handler.go** - Add handler methods\n3. **internal/daemon/server.go** - Register methods\n4. **internal/rpc/client.go** - Add client methods\n5. **cmd/bd/gate.go** - Use daemon client when available\n\n## Testing\n\n```bash\n# Start daemon\nbd daemon start\n\n# Test via daemon (should work without --no-daemon)\nbd gate create --await timer:5m --notify beads/dave\nbd gate list\nbd gate wait \u003cid\u003e --notify beads/alice\n\n# Verify daemon handled it\nbd daemons logs . | grep gate\n```\n\n## Success Criteria\n- All gate commands work without --no-daemon\n- Same behavior in daemon vs direct mode\n- Waiters array updates correctly via RPC\n- Tests pass for RPC gate operations","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T12:13:25.778412-08:00","updated_at":"2025-12-23T13:45:58.398604-08:00","closed_at":"2025-12-23T13:45:58.398604-08:00","dependencies":[{"issue_id":"bd-likt","depends_on_id":"bd-udsi","type":"discovered-from","created_at":"2025-12-23T12:13:36.174822-08:00","created_by":"daemon"},{"issue_id":"bd-likt","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.891992-08:00","created_by":"daemon"}]} {"id":"bd-ljp1","title":"Merge: onyx-mjw4oxsi","description":"branch: polecat/onyx-mjw4oxsi\ntarget: main\nsource_issue: onyx-mjw4oxsi\nrig: beads\nagent_bead: gt-beads-polecat-onyx","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T16:25:15.980399-08:00","updated_at":"2026-01-01T16:28:05.728605-08:00","closed_at":"2026-01-01T16:28:05.728605-08:00","close_reason":"Branch dropped - changes already upstream (but didn't fix the actual test isolation issue)","created_by":"beads/polecats/onyx"} @@ -622,7 +626,7 @@ {"id":"bd-luso","title":"Add agent identity to commit metadata for forensics","description":"## Problem\n\nWhen agents (polecats, crew workers) make commits on behalf of a human, the commit only shows:\n- **Author**: Human (e.g., Steve Yegge)\n- **Co-Authored-By**: Claude Opus 4.5 (generic)\n\nMissing from the audit trail:\n- Which agent instance performed the work\n- Whether it was a polecat (transient) or crew (persistent)\n- What rig/workspace it ran in\n\nExample from a recent release commit:\n```\nAuthor: Steve Yegge \u003csteve.yegge@gmail.com\u003e\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n```\n\nNo way to trace this back to the specific agent session that executed the release molecule.\n\n## Proposal\n\nAdd git trailers to commits made by Gas Town agents:\n\n```\nExecuted-By: beads/polecat/Nux-1766978911613\nRig: beads\nRole: polecat\n```\n\nOr for crew workers:\n```\nExecuted-By: beads/crew/emma\nRig: beads\nRole: crew\n```\n\n## Benefits\n\n1. **Forensics**: If a release goes wrong, trace back to the exact agent session\n2. **Audit**: Query commits by agent type (`git log --grep=\"Role: polecat\"`)\n3. **Debugging**: Correlate commits with handoff mail and session logs\n4. **Accountability**: Distinguish human-direct vs agent-mediated commits\n\n## Implementation\n\nCould be implemented via:\n- Claude Code hooks (UserPromptSubmit or pre-commit)\n- `gt` commit helper that injects trailers\n- CLAUDE.md instructions for agents to include trailers\n\n## Open Questions\n\n- Should molecule ID be included if work was part of a molecule?\n- Should session ID or other correlation data be included?\n- Privacy considerations for commit metadata?","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-29T13:33:53.591916-08:00","updated_at":"2025-12-29T21:26:41.103041-08:00","closed_at":"2025-12-29T21:26:41.103041-08:00","close_reason":"Implemented via prepare-commit-msg git hook that auto-injects agent identity trailers","created_by":"beads/crew/emma"} {"id":"bd-lw0x","title":"Fix bd sync race condition with daemon causing dirty working directory","description":"After bd sync completes with sync.branch mode, subsequent bd commands or daemon file watcher would see a hash mismatch and trigger auto-import, which then schedules re-export, dirtying the working directory.\n\n**Root cause:**\n1. bd sync exports JSONL with NEW content (hash H1)\n2. bd sync updates jsonl_content_hash = H1 in DB\n3. bd sync restores JSONL from HEAD (OLD content, hash H0)\n4. Now: file hash = H0, DB hash = H1 (MISMATCH)\n5. Daemon or next CLI command sees mismatch, imports from OLD JSONL\n6. Import triggers re-export → file is dirty\n\n**Fix:**\nAfter restoreBeadsDirFromBranch(), update jsonl_content_hash to match the restored file's hash. This ensures daemon and CLI see file hash = DB hash → no spurious import/export cycle.\n\nRelated: bd-c83r (multiple daemon prevention)","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:42:17.130839-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-lxzx","title":"Add close_reason to JSONL export format documentation","description":"PR #551 now persists close_reason to the database, but there's a question about whether this field should be exported to JSONL format.\n\n## Current State\n- close_reason is stored in issues.close_reason column\n- close_reason is also stored in events table (audit trail)\n- The JSONL export format may or may not include close_reason\n\n## Questions\n1. Should close_reason be exported to JSONL format?\n2. If yes, where should it go (root level or nested in events)?\n3. Should there be any special handling to avoid duplication?\n4. How should close_reason be handled during JSONL import?\n\n## Why This Matters\n- JSONL is the git-friendly sync format\n- Other beads instances import from JSONL\n- close_reason is meaningful data that should be preserved across clones\n\n## Suggested Action\n- Check if close_reason is currently exported in JSONL\n- If not, add it to the export schema\n- Document the field in JSONL format spec\n- Add tests for round-trip (export -\u003e import -\u003e verify close_reason)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:17.414916-08:00","updated_at":"2025-12-30T18:12:30.972954-08:00","closed_at":"2025-12-30T17:03:27.56903-08:00","close_reason":"Documented close_reason in JSONL schema and added round-trip test","dependencies":[{"issue_id":"bd-lxzx","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:17.416131-08:00","created_by":"stevey"}]} -{"id":"bd-lz49","title":"Add gate fields: await_type, await_id, timeout, waiters","description":"Add gate-specific fields to the Issue type.\n\n## New Fields\n- await_type: string - Type of condition (gh:run, gh:pr, timer, human, mail)\n- await_id: string - Identifier for the condition\n- timeout: duration - Max time to wait before escalation\n- waiters: []string - Mail addresses to notify when gate clears\n\n## Implementation\n- Add fields to Issue struct in internal/types/types.go\n- Update SQLite schema for new columns\n- Add JSONL serialization/deserialization\n- Update import/export logic","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:32.720196-08:00","updated_at":"2025-12-23T12:00:03.837691-08:00","closed_at":"2025-12-23T12:00:03.837691-08:00","dependencies":[{"issue_id":"bd-lz49","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.738823-08:00","created_by":"daemon"},{"issue_id":"bd-lz49","depends_on_id":"bd-2v0f","type":"blocks","created_at":"2025-12-23T11:44:56.269351-08:00","created_by":"daemon"}]} +{"id":"bd-lz49","title":"Add gate fields: await_type, await_id, timeout, waiters","description":"Add gate-specific fields to the Issue type.\n\n## New Fields\n- await_type: string - Type of condition (gh:run, gh:pr, timer, human, mail)\n- await_id: string - Identifier for the condition\n- timeout: duration - Max time to wait before escalation\n- waiters: []string - Mail addresses to notify when gate clears\n\n## Implementation\n- Add fields to Issue struct in internal/types/types.go\n- Update SQLite schema for new columns\n- Add JSONL serialization/deserialization\n- Update import/export logic","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:32.720196-08:00","updated_at":"2025-12-23T12:00:03.837691-08:00","closed_at":"2025-12-23T12:00:03.837691-08:00","dependencies":[{"issue_id":"bd-lz49","depends_on_id":"bd-2v0f","type":"blocks","created_at":"2025-12-23T11:44:56.269351-08:00","created_by":"daemon"},{"issue_id":"bd-lz49","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.738823-08:00","created_by":"daemon"}]} {"id":"bd-m03p","title":"Merge: quartz-mjw4bkpv","description":"branch: polecat/quartz-mjw4bkpv\ntarget: main\nsource_issue: quartz-mjw4bkpv\nrig: beads\nagent_bead: gt-beads-polecat-quartz","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T16:16:18.601679-08:00","updated_at":"2026-01-01T19:27:21.729371-08:00","closed_at":"2026-01-01T19:27:21.729371-08:00","close_reason":"Stale MR - no branch pushed after 3+ hours","created_by":"beads/polecats/quartz"} {"id":"bd-m0tl","title":"bd create -f crashes with nil pointer dereference","description":"GitHub issue #674. The markdown import feature crashes at markdown.go:338 because global variables (store, ctx, actor) aren't initialized when createIssuesFromMarkdown is called. The function uses globals set by cobra command framework but is being called before they're ready. Need to either initialize globals at start of function or pass them as parameters.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T14:35:14.813012-08:00","updated_at":"2025-12-21T15:41:14.600953-08:00","closed_at":"2025-12-21T15:41:14.600953-08:00"} {"id":"bd-m164","title":"Add 0.33.2 to versionChanges in info.go","description":"Add new entry at the TOP of versionChanges array in cmd/bd/info.go:\n\n```go\n{\n Version: \"0.33.2\",\n Date: \"2025-12-21\",\n Changes: []string{\n // Add notable changes here\n },\n},\n```\n\nCopy changes from CHANGELOG.md [Unreleased] section.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.761218-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"} @@ -764,7 +768,7 @@ {"id":"bd-o91r","title":"Polymorphic bond command: bd mol bond A B","description":"Implement proto-to-proto bonding to create compound protos.\n\nCOMMAND: bd mol bond proto-feature proto-testing [--as proto-feature-tested] [--type sequential]\n\nBEHAVIOR:\n- Load both proto subgraphs\n- Create new compound proto with combined structure\n- B's root becomes child of A's root (sequential) or sibling (parallel)\n- Wire dependencies: B depends on A's leaf nodes (sequential) or runs parallel\n- Store bonded_from metadata for lineage tracking\n\nFLAGS:\n- --as NAME: Custom ID for compound proto (default: generates hash)\n- --type: sequential (default) or parallel\n- --dry-run: Preview compound structure\n\nOUTPUT:\n- New compound proto in catalog\n- Shows combined variable requirements","notes":"UPDATE: bond is now polymorphic - handles proto+proto, proto+mol, and mol+mol based on operand types. Separate 'attach' command eliminated.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:58:55.604705-08:00","updated_at":"2025-12-21T10:10:25.385995-08:00","closed_at":"2025-12-21T10:10:25.385995-08:00","dependencies":[{"issue_id":"bd-o91r","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.30026-08:00","created_by":"daemon"},{"issue_id":"bd-o91r","depends_on_id":"bd-mh4w","type":"blocks","created_at":"2025-12-21T00:59:51.569391-08:00","created_by":"daemon"},{"issue_id":"bd-o91r","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T00:59:51.652397-08:00","created_by":"daemon"}]} {"id":"bd-o9o","title":"Exclude pinned issues from bd ready","description":"Update bd ready to exclude pinned issues. Pinned issues are context markers, not work items, and should never appear in the ready-to-work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:41.979073-08:00","updated_at":"2025-12-21T11:29:41.190567-08:00","closed_at":"2025-12-21T11:29:41.190567-08:00","dependencies":[{"issue_id":"bd-o9o","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.392931-08:00","created_by":"daemon"},{"issue_id":"bd-o9o","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.612655-08:00","created_by":"daemon"}]} {"id":"bd-oajy","title":"Merge: garnet-1767142025508","description":"branch: polecat/garnet-1767142025508\ntarget: main\nsource_issue: garnet-1767142025508\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T17:03:48.369872-08:00","updated_at":"2025-12-30T18:12:30.966905-08:00","closed_at":"2025-12-30T18:11:07.825828-08:00","created_by":"beads/polecats/garnet"} -{"id":"bd-obep","title":"Spawn-time bonding: --attach flag","description":"Add --attach flag to bd mol spawn for on-the-fly composition.\n\nCOMMAND: bd mol spawn proto-feature --attach proto-docs --attach proto-testing\n\nBEHAVIOR:\n- Spawn the primary proto as normal\n- For each --attach: spawn that proto and wire to primary\n- Attachments become children of primary's root epic\n- Dependencies wired based on bond type (default: sequential)\n\nFLAGS:\n- --attach PROTO: Attach a proto (can repeat)\n- --attach-type TYPE: sequential (default) or parallel for all attachments\n- --after ISSUE: Attachment point for attached protos\n\nVARIABLE HANDLING:\n- All attached protos share variable namespace\n- Warn on variable name conflicts\n- All --var flags apply to all protos","notes":"DESIGN NOTE: This is syntactic sugar. Equivalent to:\n bd mol spawn proto-A\n bd mol bond $new_epic_id proto-B\n \nKeeping as separate task because it's a common UX pattern worth optimizing.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:06.178092-08:00","updated_at":"2025-12-21T10:42:50.554816-08:00","closed_at":"2025-12-21T10:42:50.554816-08:00","dependencies":[{"issue_id":"bd-obep","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.368491-08:00","created_by":"daemon"},{"issue_id":"bd-obep","depends_on_id":"bd-o91r","type":"blocks","created_at":"2025-12-21T00:59:51.733369-08:00","created_by":"daemon"}]} +{"id":"bd-obep","title":"Spawn-time bonding: --attach flag","description":"Add --attach flag to bd mol spawn for on-the-fly composition.\n\nCOMMAND: bd mol spawn proto-feature --attach proto-docs --attach proto-testing\n\nBEHAVIOR:\n- Spawn the primary proto as normal\n- For each --attach: spawn that proto and wire to primary\n- Attachments become children of primary's root epic\n- Dependencies wired based on bond type (default: sequential)\n\nFLAGS:\n- --attach PROTO: Attach a proto (can repeat)\n- --attach-type TYPE: sequential (default) or parallel for all attachments\n- --after ISSUE: Attachment point for attached protos\n\nVARIABLE HANDLING:\n- All attached protos share variable namespace\n- Warn on variable name conflicts\n- All --var flags apply to all protos","notes":"DESIGN NOTE: This is syntactic sugar. Equivalent to:\n bd mol spawn proto-A\n bd mol bond $new_epic_id proto-B\n \nKeeping as separate task because it's a common UX pattern worth optimizing.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:06.178092-08:00","updated_at":"2025-12-21T10:42:50.554816-08:00","closed_at":"2025-12-21T10:42:50.554816-08:00","dependencies":[{"issue_id":"bd-obep","depends_on_id":"bd-o91r","type":"blocks","created_at":"2025-12-21T00:59:51.733369-08:00","created_by":"daemon"},{"issue_id":"bd-obep","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.368491-08:00","created_by":"daemon"}]} {"id":"bd-oeeb","title":"Fix daemon path mismatch on case-insensitive filesystems (GH#869)","description":"macOS case-insensitive filesystem causes daemon to reject connections when path casing differs (Desktop vs desktop). Fix: normalize paths using filepath.EvalSymlinks + case normalization before comparison in registry lookup.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-03T13:12:51.892534-08:00","updated_at":"2026-01-03T13:23:08.071155-08:00","closed_at":"2026-01-03T13:23:08.071155-08:00","close_reason":"Fixed in 631b067c - normalized paths for case-insensitive filesystem comparison","created_by":"beads/crew/grip"} {"id":"bd-oehv","title":"Add 'rm' as alias for 'remove' in bd dep subcommand","description":"Cobra supports command aliases. Add 'rm' as a short alias for 'remove' in the dep subcommand for convenience.\n\nExample: bd dep rm issue1 issue2 should work the same as bd dep remove issue1 issue2\n\nImplementation: Add Aliases: []string{\"rm\"} to the depRemoveCmd definition.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-29T17:28:04.489734-08:00","updated_at":"2025-12-29T17:50:11.910495-08:00","closed_at":"2025-12-29T17:50:11.910495-08:00","close_reason":"Added Aliases: []string{\"rm\"} to depRemoveCmd","created_by":"mayor"} {"id":"bd-of2p","title":"Improve version bump molecule with missing steps","description":"During v0.32.1 release, discovered missing steps in the release molecule:\n\n**Missing from molecule:**\n1. Rebuild ~/go/bin/bd (only did ~/.local/bin/bd)\n2. Install beads-mcp from local source: `uv tool install --reinstall ./integrations/beads-mcp`\n3. Restart daemons with `bd daemons killall`\n4. (Optional) Publish beads-mcp to PyPI\n\n**Current molecule steps (bd-6s61):**\n1. Update CHANGELOG.md\n2. Update info.go versionChanges \n3. Run bump-version.sh\n4. Run tests and linting\n5. Update local installation\n6. Commit and push release\n7. Wait for CI\n8. Verify release artifacts\n\n**Proposed additions:**\n- After \"Update local installation\": rebuild BOTH ~/.local/bin/bd AND ~/go/bin/bd\n- Add: \"Install beads-mcp from source\" step\n- Add: \"Restart daemons\" step\n- Add: \"Verify all versions match\" step that checks all artifacts\n\n**Also learned:**\n- Must run from mayor/rig to avoid git conflicts with bd sync (already documented in bump-version.sh)","notes":"CORRECTION: npm publishing IS automated and working!\n\n**Package naming:**\n- OLD: `beads` (npm) - deprecated, stuck at 0.2.1\n- CURRENT: `@beads/bd` (npm) - scoped package, auto-published by CI\n\n**How it works:**\n- CI uses OIDC trusted publishing (no token needed)\n- Workflow: .github/workflows/release.yml → publish-npm job\n- Permissions: `id-token: write` enables GitHub OIDC\n- To install: `npm install -g @beads/bd` (not `npm install beads`)\n\n**All publishing is automated on tag push:**\n1. GitHub Release - goreleaser ✓\n2. PyPI - publish-pypi job ✓\n3. Homebrew - update-homebrew job ✓\n4. npm (@beads/bd) - publish-npm job ✓\n\n**Remaining molecule improvements (local steps only):**\n- Rebuild BOTH ~/.local/bin/bd AND ~/go/bin/bd\n- Install beads-mcp from source: `uv tool install --reinstall ./integrations/beads-mcp`\n- Restart daemons: `bd daemons killall`\n- Run from mayor/rig to avoid git conflicts with bd sync\n- Final verification step to check all local versions match","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T22:09:11.845787-08:00","updated_at":"2025-12-22T16:01:18.199132-08:00","closed_at":"2025-12-22T16:01:18.199132-08:00"} @@ -906,7 +910,7 @@ {"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","updated_at":"2025-12-28T22:14:22.838484-08:00","closed_at":"2025-12-28T22:14:22.838484-08:00","created_by":"beads/crew/dave"} {"id":"bd-srhu","title":"Merge: jasper-mk04cv5s","description":"branch: polecat/jasper-mk04cv5s\ntarget: main\nsource_issue: jasper-mk04cv5s\nrig: beads\nagent_bead: bd-beads-polecat-jasper\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-04T11:27:04.224933-08:00","updated_at":"2026-01-05T19:45:43.989296-08:00","closed_at":"2026-01-05T19:45:43.989296-08:00","close_reason":"Branch deleted, already merged","created_by":"beads/polecats/jasper"} {"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":"closed","priority":3,"issue_type":"task","created_at":"2025-12-25T23:13:11.718635-08:00","updated_at":"2026-01-02T18:35:49.165014-08:00","closed_at":"2026-01-02T18:35:49.165014-08:00","close_reason":"Fixed in commit 3c5b7414 (bd-oos3). Error visibility now implemented in bd gate check - errors are printed to stderr with fail icon."} -{"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-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-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.857586-08:00","created_by":"daemon"},{"issue_id":"bd-su45","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.64582-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"} {"id":"bd-sxlt","title":"GHI #885: Sync failure leaves local JSONL stale, causing inconsistent state","description":"GitHub Issue #885: Sync failure leaves local JSONL stale, causing inconsistent state across worktrees\n\nhttps://github.com/steveyegge/beads/issues/885","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T11:22:16.730476-08:00","updated_at":"2026-01-04T15:22:07.771064-08:00","closed_at":"2026-01-04T11:30:32.561965-08:00","close_reason":"Added status mismatch detection to bd doctor. When counts match but statuses differ, the check now reports detailed mismatches and suggests 'bd export' to fix.","created_by":"mayor"} @@ -918,11 +922,11 @@ {"id":"bd-ta4r","title":"Wisp operations should auto-bypass daemon","description":"During the v0.39.1 release, every wisp operation required --no-daemon flag:\n\nbd --no-daemon mol wisp create beads-release --var version=0.39.1\nbd --no-daemon close bd-eph-xxx\nbd --no-daemon mol burn bd-eph-bv2\n\nSince wisps are ephemeral (Ephemeral=true) and never exported to JSONL, they are inherently local-only. The daemon cannot help with them anyway.\n\nProposal: When operating on bd-eph-* issues or wisp subcommands, auto-detect and bypass the daemon. This would:\n- Reduce friction in wisp workflows\n- Prevent accidental daemon use that would fail anyway\n- Make the ephemeral nature more obvious","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-27T22:51:24.409066-08:00","updated_at":"2025-12-28T02:10:30.123755-08:00","closed_at":"2025-12-28T02:10:30.123755-08:00","created_by":"beads/crew/emma"} {"id":"bd-tbz3","title":"bd init UX Improvements","description":"bd init leaves users with incomplete setup, requiring manual bd doctor --fix. Issues found: (1) git hooks not installed if user declines prompt, (2) no auto-migration when CLI is upgraded, (3) stale merge driver configs from old versions. Fix by making bd init more robust with better defaults and auto-migration.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-21T23:16:00.333543-08:00","updated_at":"2025-12-23T04:20:51.88847-08:00","closed_at":"2025-12-23T04:20:51.88847-08:00"} {"id":"bd-tcvh","title":"Test prefix beads","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.707092-08:00","updated_at":"2025-12-27T14:24:50.421598-08:00","created_by":"stevey","deleted_at":"2025-12-27T14:24:50.421598-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} -{"id":"bd-tggf","title":"Code Health Review Dec 2025: Technical Debt Cleanup","description":"Epic grouping technical debt identified in the Dec 16, 2025 code health review.\n\n## Overall Health Grade: B (Solid foundation, needs cleanup)\n\n### P1 (High Priority):\n- bd-74w1: Consolidate duplicate path-finding utilities\n- [deleted:bd-b6xo]: Remove/fix ClearDirtyIssues() race condition\n- [deleted:bd-b3og]: Fix TestImportBugIntegration deadlock\n\n### P2 (Medium Priority):\n- bd-05a8: Split large files (doctor.go, sync.go)\n- bd-qioh: Standardize error handling patterns\n- bd-rgyd: Split queries.go (1586 lines)\n- bd-9g1z: Fix/remove TestFindJSONLPathDefault\n\n### P3 (Low Priority):\n- bd-ork0: Add comments to 30+ ignored errors\n- bd-4nqq: Remove dead test code in info_test.go\n- bd-dhza: Reduce global state in main.go\n\n## Key Areas:\n1. Code duplication in path utilities\n2. Large monolithic files (5 files \u003e1000 lines)\n3. Global state (25+ variables, 3 deprecated)\n4. Silent error suppression (30+ instances)\n5. Test gaps and dead test code\n6. Atomicity risks in batch operations","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-16T18:18:58.115507-08:00","updated_at":"2025-12-30T18:12:30.962234-08:00","closed_at":"2025-12-30T16:59:51.322347-08:00","close_reason":"All technical debt cleanup tasks completed: path utilities consolidated, large files split, error handling standardized, dead test code removed, global state reduced, ignored errors documented","dependencies":[{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-74w1","type":"blocks","created_at":"2025-12-22T21:00:21.429274-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-05a8","type":"blocks","created_at":"2025-12-22T21:00:21.501589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-9g1z","type":"blocks","created_at":"2025-12-22T21:00:21.571116-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"}]} +{"id":"bd-tggf","title":"Code Health Review Dec 2025: Technical Debt Cleanup","description":"Epic grouping technical debt identified in the Dec 16, 2025 code health review.\n\n## Overall Health Grade: B (Solid foundation, needs cleanup)\n\n### P1 (High Priority):\n- bd-74w1: Consolidate duplicate path-finding utilities\n- [deleted:bd-b6xo]: Remove/fix ClearDirtyIssues() race condition\n- [deleted:bd-b3og]: Fix TestImportBugIntegration deadlock\n\n### P2 (Medium Priority):\n- bd-05a8: Split large files (doctor.go, sync.go)\n- bd-qioh: Standardize error handling patterns\n- bd-rgyd: Split queries.go (1586 lines)\n- bd-9g1z: Fix/remove TestFindJSONLPathDefault\n\n### P3 (Low Priority):\n- bd-ork0: Add comments to 30+ ignored errors\n- bd-4nqq: Remove dead test code in info_test.go\n- bd-dhza: Reduce global state in main.go\n\n## Key Areas:\n1. Code duplication in path utilities\n2. Large monolithic files (5 files \u003e1000 lines)\n3. Global state (25+ variables, 3 deprecated)\n4. Silent error suppression (30+ instances)\n5. Test gaps and dead test code\n6. Atomicity risks in batch operations","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-16T18:18:58.115507-08:00","updated_at":"2025-12-30T18:12:30.962234-08:00","closed_at":"2025-12-30T16:59:51.322347-08:00","close_reason":"All technical debt cleanup tasks completed: path utilities consolidated, large files split, error handling standardized, dead test code removed, global state reduced, ignored errors documented","dependencies":[{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-74w1","type":"blocks","created_at":"2025-12-22T21:00:21.429274-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-05a8","type":"blocks","created_at":"2025-12-22T21:00:21.501589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-9g1z","type":"blocks","created_at":"2025-12-22T21:00:21.571116-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"}]} {"id":"bd-tglv","title":"Merge: onyx-1767142014545","description":"branch: polecat/onyx-1767142014545\ntarget: main\nsource_issue: onyx-1767142014545\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T17:05:30.189116-08:00","updated_at":"2025-12-30T18:12:30.983654-08:00","closed_at":"2025-12-30T18:11:07.809452-08:00","created_by":"beads/polecats/onyx"} {"id":"bd-thgk","title":"Improve test coverage for internal/compact (18.2% → 70%)","description":"Improve test coverage for internal/compact package from 17% to 70%.\n\n## Current State\n- Coverage: 17.3%\n- Files: compactor.go, git.go, haiku.go\n- Tests: compactor_test.go (minimal tests)\n\n## Functions Needing Tests\n\n### compactor.go (core compaction)\n- [ ] New - needs config validation tests\n- [ ] CompactTier1 - needs single issue compaction tests\n- [ ] CompactTier1Batch - needs batch processing tests\n- [ ] compactSingleWithResult - internal, test via public API\n\n### git.go\n- [ ] GetCurrentCommitHash - needs git repo fixture tests\n\n### haiku.go (AI summarization) - MOCK REQUIRED\n- [ ] NewHaikuClient - needs API key validation tests\n- [ ] SummarizeTier1 - needs mock API response tests\n- [ ] callWithRetry - needs retry logic tests\n- [ ] isRetryable - needs error classification tests\n- [ ] renderTier1Prompt - needs template rendering tests\n\n## Implementation Guide\n\n1. **Mock the Anthropic API:**\n ```go\n // Create mock HTTP server\n server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n json.NewEncoder(w).Encode(map[string]interface{}{\n \"content\": []map[string]string{{\"text\": \"Summarized content\"}},\n })\n }))\n defer server.Close()\n \n // Point client at mock\n client.baseURL = server.URL\n ```\n\n2. **Test scenarios:**\n - Successful compaction with AI summary\n - API failure with retry\n - Rate limit handling\n - Empty issue handling\n - Large issue truncation\n\n3. **Use test database:**\n ```go\n store, cleanup := testutil.NewTestStore(t)\n defer cleanup()\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- AI calls properly mocked (no real API calls in tests)\n- Retry logic verified\n- Error paths covered\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/compact\ngo test -race ./internal/compact\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:42:58.455767-08:00","updated_at":"2025-12-23T13:41:10.80832-08:00","closed_at":"2025-12-23T13:41:10.80832-08:00","dependencies":[{"issue_id":"bd-thgk","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.287377-08:00","created_by":"daemon"}]} {"id":"bd-ti1m","title":"Test hooked styling","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T22:33:47.135871-08:00","updated_at":"2025-12-28T22:34:26.00871-08:00","closed_at":"2025-12-28T22:34:26.00871-08:00","created_by":"beads/crew/emma"} -{"id":"bd-tj00","title":"Update local installation","description":"go build -o ~/.local/bin/bd ./cmd/bd \u0026\u0026 codesign -s - ~/.local/bin/bd","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:20.616907-08:00","updated_at":"2025-12-20T21:55:42.756171-08:00","closed_at":"2025-12-20T21:55:42.756171-08:00","dependencies":[{"issue_id":"bd-tj00","depends_on_id":"bd-9l0h","type":"blocks","created_at":"2025-12-20T21:53:29.817989-08:00","created_by":"daemon"},{"issue_id":"bd-tj00","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:20.619834-08:00","created_by":"daemon"}]} +{"id":"bd-tj00","title":"Update local installation","description":"go build -o ~/.local/bin/bd ./cmd/bd \u0026\u0026 codesign -s - ~/.local/bin/bd","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:20.616907-08:00","updated_at":"2025-12-20T21:55:42.756171-08:00","closed_at":"2025-12-20T21:55:42.756171-08:00","dependencies":[{"issue_id":"bd-tj00","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:20.619834-08:00","created_by":"daemon"},{"issue_id":"bd-tj00","depends_on_id":"bd-9l0h","type":"blocks","created_at":"2025-12-20T21:53:29.817989-08:00","created_by":"daemon"}]} {"id":"bd-tksk","title":"Support session_id field on issue close/update mutations","description":"## Context\n\nPer Gas Town decision 009-session-events-architecture.md, work attribution for\nentity CV building requires capturing which Claude Code session performed work.\n\n## Implementation\n\nAdd session_id support to issue mutations:\n\n### Schema\nAdd optional field to issue close:\n- closed_by_session: string (Claude Code session UUID)\n\n### CLI\n```bash\nbd close gt-abc --session \"abc123-session-id\"\n# Or via env var:\nCLAUDE_SESSION_ID=abc123 bd close gt-abc\n```\n\n### Storage\nStore in issues.jsonl:\n```json\n{\"id\": \"gt-abc\", \"status\": \"closed\", \"closed_by_session\": \"abc123\", ...}\n```\n\n## Acceptance Criteria\n\n- [ ] bd close accepts --session flag or reads CLAUDE_SESSION_ID env\n- [ ] session_id stored in issue close record\n- [ ] bd show displays closed_by_session if present\n- [ ] Works for bd update --status=closed as well\n\n## Future\n\n- Query by session: bd list --closed-by-session=X\n- Entity chain: aggregate session activity for CV\n\n## Related\n\n- Gas Town docs/hop/decisions/009-session-events-architecture.md\n- gt-nvz8b: gt done captures session_id","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-31T12:49:58.379182-08:00","updated_at":"2025-12-31T13:13:17.590098-08:00","closed_at":"2025-12-31T13:13:17.590098-08:00","close_reason":"Implemented session_id tracking for issue close/update mutations","created_by":"gastown/crew/joe"} {"id":"bd-tm2p","title":"Polecats get stuck on interactive shell prompts (cp/mv/rm -i)","description":"During swarm operations, polecats frequently get stuck waiting for interactive prompts from shell commands like:\n- cp prompting 'overwrite file? (y/n)'\n- mv prompting 'overwrite file? (y/n)' \n- rm prompting 'remove file?'\n\nThis happens because macOS aliases or shell configs may have -i flags set by default.\n\nRoot cause: Claude Code runs commands that trigger interactive confirmation prompts, but cannot respond to them, causing the agent to hang indefinitely.\n\nObserved in: Multiple polecats during GH issues swarm (Dec 2024)\n- Derrick, Roustabout, Prospector, Warboy all got stuck on y/n prompts\n\nSuggested fixes:\n1. AGENTS.md should instruct agents to always use -f flag with cp/mv/rm\n2. Polecat startup could set shell aliases to use non-interactive versions\n3. bd prime hook could include guidance about non-interactive commands\n4. Consider detecting stuck prompts and auto-recovering","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-14T16:51:24.572271-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-to1u","title":"Run bump-version.sh test-squash","description":"Run ./scripts/bump-version.sh test-squash to update version in all files","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.06696-08:00","updated_at":"2025-12-21T13:53:41.841677-08:00","deleted_at":"2025-12-21T13:53:41.841677-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} @@ -940,8 +944,8 @@ {"id":"bd-u2sc.1","title":"Replace map[string]interface{} with typed JSON response structs","description":"Many CLI commands use map[string]interface{} for JSON output which loses type safety and compile-time error detection.\n\nFiles with map[string]interface{}:\n- cmd/bd/compact.go (10+ instances)\n- cmd/bd/cleanup.go\n- cmd/bd/daemons.go\n- cmd/bd/daemon_lifecycle.go\n\nExample fix:\n```go\n// Before\nresult := map[string]interface{}{\n \"status\": \"ok\",\n \"count\": 42,\n}\n\n// After\ntype CompactResponse struct {\n Status string `json:\"status\"`\n Count int `json:\"count\"`\n}\nresult := CompactResponse{Status: \"ok\", Count: 42}\n```\n\nBenefits:\n- Compile-time type checking\n- IDE autocompletion\n- Easier refactoring\n- Self-documenting API","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T14:26:44.088548-08:00","updated_at":"2025-12-22T15:48:22.88824-08:00","closed_at":"2025-12-22T15:48:22.88824-08:00","dependencies":[{"issue_id":"bd-u2sc.1","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:44.088931-08:00","created_by":"daemon"}]} {"id":"bd-u2sc.2","title":"Migrate sort.Slice to slices.SortFunc","description":"Go 1.21+ provides slices.SortFunc which is cleaner and slightly faster than sort.Slice.\n\nFound 15+ instances of sort.Slice in:\n- cmd/bd/autoflush.go\n- cmd/bd/count.go\n- cmd/bd/daemon_sync.go\n- cmd/bd/doctor.go\n- cmd/bd/export.go\n- cmd/bd/import.go\n- cmd/bd/integrity.go\n- cmd/bd/jira.go\n- cmd/bd/list.go\n- cmd/bd/migrate_hash_ids.go\n- cmd/bd/rename_prefix.go\n- cmd/bd/show.go\n\nExample migration:\n```go\n// Before\nsort.Slice(issues, func(i, j int) bool {\n return issues[i].Priority \u003c issues[j].Priority\n})\n\n// After\nslices.SortFunc(issues, func(a, b *types.Issue) int {\n return cmp.Compare(a.Priority, b.Priority)\n})\n```\n\nBenefits:\n- Cleaner 3-way comparison\n- Slightly better performance\n- Modern idiomatic Go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:26:55.573524-08:00","updated_at":"2025-12-22T15:10:12.639807-08:00","closed_at":"2025-12-22T15:10:12.639807-08:00","dependencies":[{"issue_id":"bd-u2sc.2","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:55.573978-08:00","created_by":"daemon"}]} {"id":"bd-u2sc.3","title":"Split large cmd/bd files into logical modules","description":"Split large cmd/bd files into logical modules for maintainability.\n\n## Current State\n| File | Lines | Status |\n|------|-------|--------|\n| sync.go | 2203 | Too large |\n| init.go | 1742 | Too large |\n| show.go | 1419 | Too large |\n| compact.go | 1190 | Borderline |\n\n## Proposed Splits\n\n### 1. sync.go (2203 lines) → 4 files\n\n**sync.go** (~500 lines) - Main command and coordination\n```go\nvar syncCmd = \u0026cobra.Command{...}\nfunc init() {...}\nfunc doSync(...) {...}\n```\n\n**sync_export.go** (~400 lines) - Export operations\n```go\nfunc exportToJSONL(...)\nfunc markDirtyAndScheduleFlush(...)\nfunc flushPendingChanges(...)\n```\n\n**sync_import.go** (~500 lines) - Import operations\n```go\nfunc importFromJSONL(...)\nfunc handleImportConflicts(...)\nfunc mergeImportedIssues(...)\n```\n\n**sync_branch.go** (~400 lines) - Git branch operations\n```go\nfunc commitToSyncBranch(...)\nfunc pullFromSyncBranch(...)\nfunc handleSyncBranchDivergence(...)\n```\n\n### 2. init.go (1742 lines) → 3 files\n\n**init.go** (~400 lines) - Main init command\n```go\nvar initCmd = \u0026cobra.Command{...}\nfunc runInit(...)\nfunc determinePrefix(...)\n```\n\n**init_wizard.go** (~500 lines) - Interactive setup\n```go\nfunc runContributorWizard(...)\nfunc runTeamWizard(...)\nfunc promptForConfig(...)\n```\n\n**init_hooks.go** (~400 lines) - Git hooks setup\n```go\nfunc installGitHooks(...)\nfunc configureAutosync(...)\nfunc setupMergeDriver(...)\n```\n\n### 3. show.go (1419 lines) → 3 files\n\n**show.go** (~400 lines) - Main show command\n```go\nvar showCmd = \u0026cobra.Command{...}\nfunc showIssue(...)\nfunc showMultipleIssues(...)\n```\n\n**show_format.go** (~400 lines) - Output formatting\n```go\nfunc formatIssueText(...)\nfunc formatIssueMarkdown(...)\nfunc formatDependencyTree(...)\n```\n\n**show_threads.go** (~300 lines) - Thread/conversation display\n```go\nfunc showThread(...)\nfunc formatThreadMessages(...)\n```\n\n### 4. compact.go (1190 lines) → 2 files\n\n**compact.go** (~600 lines) - Main compact command\n```go\nvar compactCmd = \u0026cobra.Command{...}\nfunc runCompact(...)\n```\n\n**compact_tiers.go** (~400 lines) - Tier-specific logic\n```go\nfunc compactTier1(...)\nfunc compactTier2(...)\nfunc squashWisps(...)\n```\n\n## Implementation Steps\n\n1. **Start with sync.go** (largest file)\n2. **Create new files** with same package declaration\n3. **Move functions** maintaining related code together\n4. **Update any file-local variables** that need to be shared\n5. **Run tests** after each split:\n ```bash\n go test -short ./cmd/bd/...\n ```\n\n## File Organization After Split\n```\ncmd/bd/\n├── sync.go (~500 lines)\n├── sync_export.go (~400 lines)\n├── sync_import.go (~500 lines)\n├── sync_branch.go (~400 lines)\n├── init.go (~400 lines)\n├── init_wizard.go (~500 lines)\n├── init_hooks.go (~400 lines)\n├── show.go (~400 lines)\n├── show_format.go (~400 lines)\n├── show_threads.go (~300 lines)\n├── compact.go (~600 lines)\n└── compact_tiers.go (~400 lines)\n```\n\n## Success Criteria\n- No file \u003e 600 lines\n- All tests pass\n- Related code stays together\n- Clear file naming indicates purpose","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:27:06.146343-08:00","updated_at":"2025-12-23T14:14:39.023606-08:00","closed_at":"2025-12-23T14:14:39.023606-08:00","dependencies":[{"issue_id":"bd-u2sc.3","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:27:06.146704-08:00","created_by":"daemon"},{"issue_id":"bd-u2sc.3","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.583136-08:00","created_by":"daemon"}]} -{"id":"bd-u2sc.4","title":"Introduce slog for structured daemon logging","description":"Introduce slog for structured daemon logging.\n\n## Current State\nDaemon uses fmt.Fprintf for logging:\n```go\nfmt.Fprintf(os.Stderr, \"Warning: failed to detect user role: %v\\n\", err)\nfmt.Fprintf(logFile, \"[%s] %s\\n\", time.Now().Format(time.RFC3339), msg)\n```\n\nThis produces unstructured, hard-to-parse logs.\n\n## Target State\nUse Go 1.21+ slog for structured logging:\n```go\nslog.Warn(\"failed to detect user role\", \"error\", err)\nslog.Info(\"sync completed\", \"created\", 5, \"updated\", 3, \"duration_ms\", 150)\n```\n\n## Implementation\n\n### 1. Create logger setup (internal/daemon/logger.go)\n\n```go\npackage daemon\n\nimport (\n \"io\"\n \"log/slog\"\n \"os\"\n)\n\n// SetupLogger configures the daemon logger.\n// Returns a cleanup function to close the log file.\nfunc SetupLogger(logPath string, jsonFormat bool, level slog.Level) (func(), error) {\n var w io.Writer = os.Stderr\n var cleanup func()\n \n if logPath \\!= \"\" {\n f, err := os.OpenFile(logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)\n if err \\!= nil {\n return nil, err\n }\n w = io.MultiWriter(os.Stderr, f)\n cleanup = func() { f.Close() }\n }\n \n var handler slog.Handler\n opts := \u0026slog.HandlerOptions{Level: level}\n \n if jsonFormat {\n handler = slog.NewJSONHandler(w, opts)\n } else {\n handler = slog.NewTextHandler(w, opts)\n }\n \n slog.SetDefault(slog.New(handler))\n \n return cleanup, nil\n}\n```\n\n### 2. Add log level flag\n\nIn cmd/bd/daemon.go:\n```go\ndaemonCmd.Flags().String(\"log-level\", \"info\", \"Log level (debug, info, warn, error)\")\ndaemonCmd.Flags().Bool(\"log-json\", false, \"Output logs in JSON format\")\n```\n\n### 3. Replace fmt.Fprintf with slog calls\n\n**Pattern 1: Simple messages**\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Starting daemon on %s\\n\", socketPath)\n\n// After\nslog.Info(\"starting daemon\", \"socket\", socketPath)\n```\n\n**Pattern 2: Errors**\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Error: failed to connect: %v\\n\", err)\n\n// After\nslog.Error(\"failed to connect\", \"error\", err)\n```\n\n**Pattern 3: Debug info**\n```go\n// Before\nif debug {\n fmt.Fprintf(os.Stderr, \"Received request: %s\\n\", method)\n}\n\n// After\nslog.Debug(\"received request\", \"method\", method)\n```\n\n**Pattern 4: Structured data**\n```go\n// Before\nfmt.Fprintf(logFile, \"Import: %d created, %d updated\\n\", created, updated)\n\n// After\nslog.Info(\"import completed\", \n \"created\", created,\n \"updated\", updated,\n \"unchanged\", unchanged,\n \"duration_ms\", duration.Milliseconds())\n```\n\n### 4. Files to Update\n\n| File | Changes |\n|------|---------|\n| cmd/bd/daemon.go | Add log flags, call SetupLogger |\n| internal/daemon/server.go | Replace fmt with slog |\n| internal/daemon/rpc_handler.go | Replace fmt with slog |\n| internal/daemon/sync.go | Replace fmt with slog |\n| internal/daemon/autoflush.go | Replace fmt with slog |\n| internal/daemon/logger.go | New file |\n\n### 5. Log output examples\n\n**Text format (default):**\n```\ntime=2025-12-23T12:30:00Z level=INFO msg=\"daemon started\" socket=/tmp/bd.sock pid=12345\ntime=2025-12-23T12:30:01Z level=INFO msg=\"import completed\" created=5 updated=3 duration_ms=150\ntime=2025-12-23T12:30:05Z level=WARN msg=\"sync branch diverged\" local_ahead=2 remote_ahead=1\n```\n\n**JSON format (--log-json):**\n```json\n{\"time\":\"2025-12-23T12:30:00Z\",\"level\":\"INFO\",\"msg\":\"daemon started\",\"socket\":\"/tmp/bd.sock\",\"pid\":12345}\n{\"time\":\"2025-12-23T12:30:01Z\",\"level\":\"INFO\",\"msg\":\"import completed\",\"created\":5,\"updated\":3,\"duration_ms\":150}\n```\n\n## Migration Strategy\n\n1. **Add logger.go** with SetupLogger\n2. **Update daemon startup** to initialize slog\n3. **Convert one file at a time** (start with server.go)\n4. **Test after each file**\n5. **Remove old logging code** once all converted\n\n## Testing\n\n```bash\n# Start daemon with debug logging\nbd daemon start --log-level debug\n\n# Check logs\nbd daemons logs . | head -20\n\n# Test JSON output\nbd daemon start --log-json --log-level debug\nbd daemons logs . | jq .\n```\n\n## Success Criteria\n- All daemon logging uses slog\n- --log-level controls verbosity\n- --log-json produces machine-parseable output\n- Log entries have consistent structure\n- No fmt.Fprintf to stderr in daemon code","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:27:16.47144-08:00","updated_at":"2025-12-23T13:44:23.374935-08:00","closed_at":"2025-12-23T13:44:23.374935-08:00","dependencies":[{"issue_id":"bd-u2sc.4","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:27:16.471878-08:00","created_by":"daemon"},{"issue_id":"bd-u2sc.4","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:08.048156-08:00","created_by":"daemon"}]} -{"id":"bd-u66e","title":"Implement bd gate create/show/list/close/wait commands","description":"Implement the gate CLI commands.\n\n## Commands\n```bash\n# Create gate (returns gate ID)\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\n\n# Check gate status\nbd gate show \u003cid\u003e\n\n# List open gates\nbd gate list\n\n# Close gate (usually done by Deacon)\nbd gate close \u003cid\u003e --reason \"completed\"\n\n# Add waiter to existing gate\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Implementation\n- Add cmd/bd/gate.go with subcommands\n- Gate create creates wisp issue of type gate\n- Gate list filters for open gates\n- Gate wait adds to waiters[] array\n- All support --json output","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:34.022464-08:00","updated_at":"2025-12-23T12:06:18.550673-08:00","closed_at":"2025-12-23T12:06:18.550673-08:00","dependencies":[{"issue_id":"bd-u66e","depends_on_id":"bd-lz49","type":"blocks","created_at":"2025-12-23T11:44:56.349662-08:00","created_by":"daemon"},{"issue_id":"bd-u66e","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.823353-08:00","created_by":"daemon"}]} +{"id":"bd-u2sc.4","title":"Introduce slog for structured daemon logging","description":"Introduce slog for structured daemon logging.\n\n## Current State\nDaemon uses fmt.Fprintf for logging:\n```go\nfmt.Fprintf(os.Stderr, \"Warning: failed to detect user role: %v\\n\", err)\nfmt.Fprintf(logFile, \"[%s] %s\\n\", time.Now().Format(time.RFC3339), msg)\n```\n\nThis produces unstructured, hard-to-parse logs.\n\n## Target State\nUse Go 1.21+ slog for structured logging:\n```go\nslog.Warn(\"failed to detect user role\", \"error\", err)\nslog.Info(\"sync completed\", \"created\", 5, \"updated\", 3, \"duration_ms\", 150)\n```\n\n## Implementation\n\n### 1. Create logger setup (internal/daemon/logger.go)\n\n```go\npackage daemon\n\nimport (\n \"io\"\n \"log/slog\"\n \"os\"\n)\n\n// SetupLogger configures the daemon logger.\n// Returns a cleanup function to close the log file.\nfunc SetupLogger(logPath string, jsonFormat bool, level slog.Level) (func(), error) {\n var w io.Writer = os.Stderr\n var cleanup func()\n \n if logPath \\!= \"\" {\n f, err := os.OpenFile(logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)\n if err \\!= nil {\n return nil, err\n }\n w = io.MultiWriter(os.Stderr, f)\n cleanup = func() { f.Close() }\n }\n \n var handler slog.Handler\n opts := \u0026slog.HandlerOptions{Level: level}\n \n if jsonFormat {\n handler = slog.NewJSONHandler(w, opts)\n } else {\n handler = slog.NewTextHandler(w, opts)\n }\n \n slog.SetDefault(slog.New(handler))\n \n return cleanup, nil\n}\n```\n\n### 2. Add log level flag\n\nIn cmd/bd/daemon.go:\n```go\ndaemonCmd.Flags().String(\"log-level\", \"info\", \"Log level (debug, info, warn, error)\")\ndaemonCmd.Flags().Bool(\"log-json\", false, \"Output logs in JSON format\")\n```\n\n### 3. Replace fmt.Fprintf with slog calls\n\n**Pattern 1: Simple messages**\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Starting daemon on %s\\n\", socketPath)\n\n// After\nslog.Info(\"starting daemon\", \"socket\", socketPath)\n```\n\n**Pattern 2: Errors**\n```go\n// Before\nfmt.Fprintf(os.Stderr, \"Error: failed to connect: %v\\n\", err)\n\n// After\nslog.Error(\"failed to connect\", \"error\", err)\n```\n\n**Pattern 3: Debug info**\n```go\n// Before\nif debug {\n fmt.Fprintf(os.Stderr, \"Received request: %s\\n\", method)\n}\n\n// After\nslog.Debug(\"received request\", \"method\", method)\n```\n\n**Pattern 4: Structured data**\n```go\n// Before\nfmt.Fprintf(logFile, \"Import: %d created, %d updated\\n\", created, updated)\n\n// After\nslog.Info(\"import completed\", \n \"created\", created,\n \"updated\", updated,\n \"unchanged\", unchanged,\n \"duration_ms\", duration.Milliseconds())\n```\n\n### 4. Files to Update\n\n| File | Changes |\n|------|---------|\n| cmd/bd/daemon.go | Add log flags, call SetupLogger |\n| internal/daemon/server.go | Replace fmt with slog |\n| internal/daemon/rpc_handler.go | Replace fmt with slog |\n| internal/daemon/sync.go | Replace fmt with slog |\n| internal/daemon/autoflush.go | Replace fmt with slog |\n| internal/daemon/logger.go | New file |\n\n### 5. Log output examples\n\n**Text format (default):**\n```\ntime=2025-12-23T12:30:00Z level=INFO msg=\"daemon started\" socket=/tmp/bd.sock pid=12345\ntime=2025-12-23T12:30:01Z level=INFO msg=\"import completed\" created=5 updated=3 duration_ms=150\ntime=2025-12-23T12:30:05Z level=WARN msg=\"sync branch diverged\" local_ahead=2 remote_ahead=1\n```\n\n**JSON format (--log-json):**\n```json\n{\"time\":\"2025-12-23T12:30:00Z\",\"level\":\"INFO\",\"msg\":\"daemon started\",\"socket\":\"/tmp/bd.sock\",\"pid\":12345}\n{\"time\":\"2025-12-23T12:30:01Z\",\"level\":\"INFO\",\"msg\":\"import completed\",\"created\":5,\"updated\":3,\"duration_ms\":150}\n```\n\n## Migration Strategy\n\n1. **Add logger.go** with SetupLogger\n2. **Update daemon startup** to initialize slog\n3. **Convert one file at a time** (start with server.go)\n4. **Test after each file**\n5. **Remove old logging code** once all converted\n\n## Testing\n\n```bash\n# Start daemon with debug logging\nbd daemon start --log-level debug\n\n# Check logs\nbd daemons logs . | head -20\n\n# Test JSON output\nbd daemon start --log-json --log-level debug\nbd daemons logs . | jq .\n```\n\n## Success Criteria\n- All daemon logging uses slog\n- --log-level controls verbosity\n- --log-json produces machine-parseable output\n- Log entries have consistent structure\n- No fmt.Fprintf to stderr in daemon code","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:27:16.47144-08:00","updated_at":"2025-12-23T13:44:23.374935-08:00","closed_at":"2025-12-23T13:44:23.374935-08:00","dependencies":[{"issue_id":"bd-u2sc.4","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:08.048156-08:00","created_by":"daemon"},{"issue_id":"bd-u2sc.4","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:27:16.471878-08:00","created_by":"daemon"}]} +{"id":"bd-u66e","title":"Implement bd gate create/show/list/close/wait commands","description":"Implement the gate CLI commands.\n\n## Commands\n```bash\n# Create gate (returns gate ID)\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\n\n# Check gate status\nbd gate show \u003cid\u003e\n\n# List open gates\nbd gate list\n\n# Close gate (usually done by Deacon)\nbd gate close \u003cid\u003e --reason \"completed\"\n\n# Add waiter to existing gate\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Implementation\n- Add cmd/bd/gate.go with subcommands\n- Gate create creates wisp issue of type gate\n- Gate list filters for open gates\n- Gate wait adds to waiters[] array\n- All support --json output","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:34.022464-08:00","updated_at":"2025-12-23T12:06:18.550673-08:00","closed_at":"2025-12-23T12:06:18.550673-08:00","dependencies":[{"issue_id":"bd-u66e","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.823353-08:00","created_by":"daemon"},{"issue_id":"bd-u66e","depends_on_id":"bd-lz49","type":"blocks","created_at":"2025-12-23T11:44:56.349662-08:00","created_by":"daemon"}]} {"id":"bd-u8g4","title":"Merge: bd-dxtc","description":"branch: polecat/cheedo\ntarget: main\nsource_issue: bd-dxtc\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:42:17.222567-08:00","updated_at":"2025-12-23T21:21:57.696047-08:00","closed_at":"2025-12-23T21:21:57.696047-08:00"} {"id":"bd-ucgz","title":"Migration invariants should exclude external dependencies from orphan check","description":"## Summary\n\nThe `checkForeignKeys` function in `migration_invariants.go` flags external dependencies as orphaned because they dont exist in the local issues table.\n\n## Location\n\n`internal/storage/sqlite/migration_invariants.go` around line 150-162\n\n## Current Code (buggy)\n\n```go\n// Check for orphaned dependencies\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n\\`).Scan(\u0026orphanCount)\n```\n\n## Fix\n\nExclude external references (format: `external:\u003cproject\u003e:\u003ccapability\u003e`):\n\n```go\n// Check for orphaned dependencies (excluding external refs)\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n AND d.depends_on_id NOT LIKE 'external:%'\n\\`).Scan(\u0026orphanCount)\n```\n\n## Reproduction\n\n```bash\n# Add external dependency\nbd dep add bd-xxx external:other-project:some-capability\n\n# Try to sync - fails\nbd sync\n# Error: found 1 orphaned dependencies\n```\n\n## Files to Modify\n\n1. **internal/storage/sqlite/migration_invariants.go** - Add WHERE clause\n\n## Testing\n\n```bash\n# Create issue with external dep\nbd create \"Test external deps\" -t task\nbd dep add bd-xxx external:beads:release-workflow\n\n# Sync should succeed\nbd sync\n\n# Verify dep exists\nbd show bd-xxx --json | jq .dependencies\n```\n\n## Success Criteria\n- External dependencies dont trigger orphan check\n- `bd sync` succeeds with external deps\n- Regular orphan detection still works for internal deps","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T12:37:08.99387-08:00","updated_at":"2025-12-23T12:42:03.722691-08:00","closed_at":"2025-12-23T12:42:03.722691-08:00"} {"id":"bd-ucj8","title":"Rename wisp prefix from 'eph' to 'wisp'","description":"The wisp system uses 'eph' as the ID prefix segment (e.g., gt-eph-xxx) but should use 'wisp' (e.g., gt-wisp-xxx) for consistency with terminology.\n\n**Location:** cmd/bd/wisp.go:260-261\n```go\n// Use \"eph\" prefix for distinct visual recognition\nresult, err := spawnMolecule(ctx, store, subgraph, vars, \"\", actor, true, \"eph\")\n```\n\n**Fix:** Change \"eph\" to \"wisp\"\n\n**Also update:**\n- main_errors.go:100,107 - detection patterns for ephemeral IDs\n- Any tests expecting '-eph-' pattern\n- Documentation if it references the prefix\n\n**Migration:** Existing gt-eph-* wisps in databases will continue to work (they have ephemeral=true flag). New wisps will use gt-wisp-* prefix.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T20:10:54.323196-08:00","updated_at":"2026-01-01T23:55:44.286924-08:00","closed_at":"2026-01-01T23:55:44.286924-08:00","close_reason":"Renamed wisp prefix from 'eph' to 'wisp'. Legacy eph-* pattern still supported for backwards compatibility.","created_by":"gastown/crew/gus"} @@ -971,6 +975,7 @@ {"id":"bd-vdw4","title":"Enhancement: bd swarm status accepts swarm molecule ID","description":"Currently `bd swarm status` only accepts an epic ID.\n\nWould be more intuitive to also accept the swarm molecule ID and follow the relates-to link to find the epic:\n\n```bash\nbd swarm status bd-swarm-xyz # Follow link to epic, show status\nbd swarm status bd-epic-123 # Direct epic lookup (current behavior)\n```\n\nDetect by checking if the issue has mol_type=swarm.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:38:20.692476-08:00","updated_at":"2025-12-28T22:05:10.112717-08:00","closed_at":"2025-12-28T22:05:10.112717-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-vdw4","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.809594-08:00","created_by":"daemon"}]} {"id":"bd-vgi5","title":"Push version bump to GitHub","description":"git push origin main - triggers CI but no release yet.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:05.363604-08:00","updated_at":"2025-12-24T16:25:30.019895-08:00","dependencies":[{"issue_id":"bd-vgi5","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.87736-08:00","created_by":"daemon"},{"issue_id":"bd-vgi5","depends_on_id":"bd-3ggb","type":"blocks","created_at":"2025-12-18T22:43:21.078208-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.019895-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-vii9","title":"bd agent state fails when agent bead doesn't exist","description":"## Bug\n\n`bd agent state \u003cagent\u003e \u003cstate\u003e` fails if the agent doesn't already exist as a bead.\n\n## Reproduction\n\n```\ngt sling gt-nrpiq gastown\n...\nWarning: couldn't update agent gt-gastown-polecat-toast hook to gt-nrpiq: \n updating agent state: bd agent state gt-gastown-polecat-toast running: \n Error: failed to resolve agent gt-gastown-polecat-toast: \n no issue found matching \"gt-gastown-polecat-toast\"\n```\n\n## Context from HOP Design\n\nFrom **docs/hop/CONTEXT.md**:\n\u003e \"Each polecat should have a chain: What work have they done? What's their success rate? What skills have they demonstrated?\"\n\nFrom **docs/PRIMING.md**:\n\u003e \"Polecats are ephemeral executors. Like K8s pods. They have names (for debugging, logs) but no persistent identity.\"\n\n**Resolution**: Polecat *sessions* are ephemeral, but polecat *names* (toast, nux, furiosa, etc.) are recycled and SHOULD have persistent identity beads. The name is the identity - sessions come and go.\n\nThink of it like K8s:\n- **Pod** = polecat session (ephemeral, killed after task)\n- **ServiceAccount** = polecat identity bead (persistent, accumulates history)\n\n## Solution\n\n`bd agent state` should **auto-create** the agent bead on first use:\n\n```go\n// If agent bead doesn't exist, create it\nif errors.Is(err, ErrNotFound) {\n // Create identity bead for this agent\n _, err = CreateIssue(Issue{\n Title: fmt.Sprintf(\"Agent: %s\", agentName),\n Type: \"agent\",\n Status: state,\n Metadata: map[string]string{\n \"role\": parseRole(agentName), // polecat, witness, etc.\n \"rig\": parseRig(agentName), // gastown, beads, etc.\n },\n })\n}\n```\n\nThis enables:\n1. Work history accumulation per polecat name\n2. Skill/success tracking over time\n3. CV chain for the polecat identity\n4. `bd list --type=agent` to see all agents\n\n## Non-goals\n\n- Session tracking (ephemeral, don't persist)\n- Work attribution to polecat (credits human owner)\n- Agent scheduling (Gas Town handles that)","status":"closed","priority":3,"issue_type":"bug","created_at":"2026-01-02T12:16:39.116652-08:00","updated_at":"2026-01-02T12:27:05.679183-08:00","closed_at":"2026-01-02T12:27:05.679183-08:00","close_reason":"Implemented auto-create logic in runAgentState to create agent beads on first use","created_by":"mayor"} +{"id":"bd-vizy","title":"Deprecate bump-version.sh script","description":"The bump-version.sh script is now legacy. The formula is the authority for release mechanics.\n\n## Options\n\n1. **Add deprecation notice** (minimal change)\n - Add warning at top of script pointing to formula\n - Keep script working for quick manual releases\n\n2. **Convert to formula wrapper** (medium change)\n - Script becomes: `bd mol execute beads-release --var version=$1`\n - Maintains CLI convenience while using formula\n\n3. **Remove entirely** (breaking change)\n - Delete scripts/bump-version.sh\n - Update any docs referencing it\n - Formula is the only way to release\n\n## Recommendation\nOption 2 - keeps convenience of `./scripts/bump-version.sh 0.47.0` but executes via formula, getting all the durability/visibility benefits.\n\n## Acceptance Criteria\n- [ ] Script has deprecation notice or is removed\n- [ ] CLAUDE.md and other docs updated if needed\n- [ ] No duplicate release logic (script vs formula)\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-07T00:45:32.586506-08:00","updated_at":"2026-01-07T00:45:32.586506-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-vizy","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.527149-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-vizy","depends_on_id":"bd-a854","type":"blocks","created_at":"2026-01-07T00:45:48.380809-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vjas","title":"Add --pretty flag to bd ready","description":"bd list has --pretty but bd ready doesn't. Should support same tree format with status/priority symbols for consistency.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-31T11:54:59.911409-08:00","updated_at":"2026-01-01T11:16:53.096168-08:00","closed_at":"2026-01-01T11:16:53.096168-08:00","close_reason":"Implemented --pretty flag for bd ready","created_by":"mayor"} {"id":"bd-vjdt","title":"Add bd doctor check for JSONL/SQLite/git divergence","description":"Part of GH#885 fix: recovery mechanism. Add new doctor check that detects: 1) JSONL on disk differs from git HEAD version, 2) SQLite last_import_time does not match JSONL mtime, 3) Uncommitted .beads/ changes exist. Auto-fix options: re-export from SQLite, re-import from JSONL, or commit pending changes. Key file: cmd/bd/doctor/fix/sync.go","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-04T13:53:43.848369-08:00","updated_at":"2026-01-04T15:22:08.704257-08:00","closed_at":"2026-01-04T15:14:01.129418-08:00","close_reason":"Implemented CheckSyncDivergence doctor check","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-vjdt","depends_on_id":"bd-pnx2","type":"parent-child","created_at":"2026-01-04T13:53:55.84741-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vks2","title":"bd dep tree doesn't display external dependencies","description":"GetDependencyTree (dependencies.go:464-624) uses a recursive CTE that JOINs with the issues table, which means external refs (external:project:capability) are invisible in the tree output.\n\nWhen an issue has an external blocking dependency, running 'bd dep tree \u003cid\u003e' won't show it.\n\nOptions:\n1. Query dependencies table separately for external refs and display them as leaf nodes\n2. Add a synthetic 'external' node type that shows the ref and resolution status\n3. Document that external deps aren't shown in tree view (use bd show for full deps)\n\nLower priority since bd show \u003cid\u003e displays all dependencies including external refs.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T23:45:27.121934-08:00","updated_at":"2025-12-22T22:30:19.083652-08:00","closed_at":"2025-12-22T22:30:19.083652-08:00","dependencies":[{"issue_id":"bd-vks2","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:45:27.122511-08:00","created_by":"daemon"}]} @@ -1024,7 +1029,7 @@ {"id":"bd-x2ht","title":"Add BD_AGENT_MODE for ultra-compact output","description":"Optional agent-optimized output mode triggered by BD_AGENT_MODE=1 env var:\n\n- Compact format: just ID and title per line\n- Default to open/in_progress only\n- No colors, no emojis\n- Lower default limit (~20)\n- One-line summaries\n\nThis is independent but benefits from TTY detection infrastructure.\n\nConsider auto-detecting agent context via CLAUDE_CODE or similar env vars.","notes":"## Implementation Plan\n\n### Trigger\n```bash\nBD_AGENT_MODE=1 bd list\n```\n\nOr auto-detect common agent environments:\n```go\nfunc IsAgentMode() bool {\n if os.Getenv(\"BD_AGENT_MODE\") != \"\" {\n return true\n }\n // Auto-detect known agent contexts\n if os.Getenv(\"CLAUDE_CODE\") != \"\" {\n return true\n }\n // Add other agent env vars as discovered\n return false\n}\n```\n\n### Code Changes\n\n1. **Add agent output format** (cmd/bd/list.go):\n```go\nif ui.IsAgentMode() {\n // Ultra-compact: just ID and title\n for _, issue := range issues {\n fmt.Printf(\"%s: %s\\n\", issue.ID, issue.Title)\n }\n return\n}\n```\n\n2. **Agent mode defaults**:\n```go\nif ui.IsAgentMode() {\n if limit == 0 {\n limit = 20 // Lower default for agents\n }\n if status == \"\" {\n // Only actionable work\n filter.Status = []types.Status{\"open\", \"in_progress\"}\n }\n}\n```\n\n### Output Format (Agent Mode)\n```\nbd-mypl: Default bd list to non-closed issues\nbd-v5fn: Add default limit to bd list (50 issues)\nbd-jdz3: Add pager support to bd list\n```\n\nNo colors, no emojis, no brackets, no priority display.\nJust ID + title for maximum context efficiency.\n\n### Testing\n- `BD_AGENT_MODE=1 bd list` outputs compact format\n- Verify no ANSI codes in output\n- Verify default limit is 20\n- Verify only open/in_progress shown by default","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-29T15:25:11.057467-08:00","updated_at":"2025-12-30T18:12:30.979385-08:00","closed_at":"2025-12-30T15:59:24.474412-08:00","close_reason":"Implemented: BD_AGENT_MODE=1 triggers ultra-compact output format","created_by":"stevey"} {"id":"bd-x36g","title":"Thread Test 2","description":"Testing direct mode","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:16.470631-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-x3hi","title":"Support redirect files in .beads/ directory","description":"Gas Town creates polecat worktrees with .beads/redirect files that point to a shared beads database. The bd CLI should:\n\n1. When finding a .beads/ directory, check if it contains a 'redirect' file\n2. If redirect exists, read the relative path and use that as the beads directory\n3. This allows multiple git worktrees to share a single beads database\n\nExample:\n- polecats/alpha/.beads/redirect contains '../../mayor/rig/.beads'\n- bd commands from alpha should use mayor/rig/.beads\n\nCurrently bd ignores redirect files and either uses the local .beads/ or walks up to find a parent .beads/.\n\nRelated: gt-nriy (test message that can't be retrieved due to missing redirect support)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:46:23.415172-08:00","updated_at":"2025-12-20T21:59:25.759664-08:00","closed_at":"2025-12-20T21:59:25.759664-08:00"} -{"id":"bd-x3j8","title":"Update info.go versionChanges","description":"Add 0.32.1 entry to versionChanges map in cmd/bd/info.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:17.344841-08:00","updated_at":"2025-12-20T21:54:31.906761-08:00","closed_at":"2025-12-20T21:54:31.906761-08:00","dependencies":[{"issue_id":"bd-x3j8","depends_on_id":"bd-rgd7","type":"blocks","created_at":"2025-12-20T21:53:29.62309-08:00","created_by":"daemon"},{"issue_id":"bd-x3j8","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:17.346736-08:00","created_by":"daemon"}]} +{"id":"bd-x3j8","title":"Update info.go versionChanges","description":"Add 0.32.1 entry to versionChanges map in cmd/bd/info.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:17.344841-08:00","updated_at":"2025-12-20T21:54:31.906761-08:00","closed_at":"2025-12-20T21:54:31.906761-08:00","dependencies":[{"issue_id":"bd-x3j8","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:17.346736-08:00","created_by":"daemon"},{"issue_id":"bd-x3j8","depends_on_id":"bd-rgd7","type":"blocks","created_at":"2025-12-20T21:53:29.62309-08:00","created_by":"daemon"}]} {"id":"bd-x5wg","title":"Create and push git tag v0.33.2","description":"Create the release tag and push it:\n\n```bash\ngit tag v0.33.2\ngit push origin v0.33.2\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.76223-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-x6kv","title":"Merge: jade-mjtlsejo","description":"branch: polecat/jade-mjtlsejo\ntarget: main\nsource_issue: jade-mjtlsejo\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:06:59.327455-08:00","updated_at":"2026-01-01T10:43:18.62673-08:00","closed_at":"2026-01-01T10:43:18.62673-08:00","close_reason":"Stale MR - branch no longer exists on remote","created_by":"beads/polecats/jade"} {"id":"bd-xctp","title":"GH#519: bd sync fails when sync.branch is currently checked-out branch","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:06:05.319281-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"} @@ -1069,8 +1074,8 @@ {"id":"bd-z830","title":"Test child task","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T23:26:58.246573-08:00","updated_at":"2025-12-27T23:27:40.451603-08:00","closed_at":"2025-12-27T23:27:40.451603-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-z830","depends_on_id":"bd-fbl9","type":"parent-child","created_at":"2025-12-27T23:27:02.984294-08:00","created_by":"daemon"}]} {"id":"bd-z86n","title":"Code Review: PR #551 - Persist close_reason to issues table","description":"Code review of PR #551 which fixes close_reason persistence bug.\n\n## Summary\nThe PR correctly fixes a bug where close_reason was only stored in the events table, not in the issues.close_reason column. This caused `bd show --json` to return empty close_reason.\n\n## What Was Fixed\n- ✅ CloseIssue now updates both close_reason and closed_at\n- ✅ ReOpenIssue clears both close_reason and closed_at\n- ✅ Comprehensive tests added for both storage and CLI layers\n- ✅ Clear documentation in queries.go about dual storage strategy\n\n## Quality Assessment\n✅ Tests cover both storage layer and CLI JSON output\n✅ Handles reopen case (clearing close_reason)\n✅ Good comments explaining dual-storage design\n✅ No known issues\n\n## Potential Followups\nSee linked issues for suggestions.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:06.887069-08:00","updated_at":"2025-12-29T13:40:29.724656-08:00","closed_at":"2025-12-29T13:40:29.724656-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates"} {"id":"bd-z8a6","title":"bd delete --from-file should add deleted issues to deletions manifest","description":"When using bd delete --from-file to bulk delete issues, the deleted issue IDs are not being added to the deletions.jsonl manifest.\n\nThis causes those issues to be resurrected during bd sync when git history scanning finds them in old commits.\n\nExpected: All deleted issues should be added to deletions.jsonl so they wont be reimported from git history.\n\nWorkaround: Manually add deletion records to deletions.jsonl.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T01:48:14.099855-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-z8xz","title":"beads-release formula: fix local-install dev path and clarify bump-version.sh","description":"The beads-release formula has several issues discovered during the v0.46.0 release:\n\n## ~~Problem 1: Missing gate discover step~~ ✅ SOLVED\n\n~~The formula creates a gate with `id = 'release.yml'` (workflow name hint), but there's no step to run `bd gate discover` after pushing the tag.~~\n\n**Fixed by bd-fbkd**: `bd gate check` now auto-discovers workflow run IDs when await_id is a workflow name hint. No changes needed to the formula.\n\n## Problem 2: local-install step missing dev path\n\nThe formula's local-install step says:\n- Option 1: brew upgrade bd\n- Option 2: curl ... | bash\n\nNeither is appropriate for a developer releasing from source. Missing:\n```bash\n# Option 3 - Build from source (dev):\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n[[ $(uname) == 'Darwin' ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\nThe macOS codesigning is critical - without it, the binary gets SIGKILL'd.\n\n## Problem 3: Formula calls bump-version.sh\n\nThe formula's run-bump-script step delegates to bump-version.sh. This means:\n- Two implementations of release logic (formula + script)\n- Script has codesigning; formula documentation doesn't mention it\n- Hybrid approach is confusing\n\n**Recommendation:** Either make bump-version.sh the authority (formula is just wrapper), or migrate script logic into formula steps with explicit commands.","status":"open","priority":1,"issue_type":"bug","created_at":"2026-01-07T00:20:38.312564-08:00","updated_at":"2026-01-07T00:39:41.823381-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-z8xz","depends_on_id":"bd-fbkd","type":"related","created_at":"2026-01-07T00:20:49.331713-08:00","created_by":"beads/crew/emma"}]} -{"id":"bd-zc3","title":"Add --pinned and --no-pinned flags to bd list","description":"Add filtering flags to bd list: --pinned shows only pinned issues, --no-pinned excludes pinned issues. Default behavior shows all issues with a pin indicator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:29.518028-08:00","updated_at":"2025-12-21T11:30:01.484978-08:00","closed_at":"2025-12-21T11:30:01.484978-08:00","dependencies":[{"issue_id":"bd-zc3","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.256764-08:00","created_by":"daemon"},{"issue_id":"bd-zc3","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.486361-08:00","created_by":"daemon"}]} +{"id":"bd-z8xz","title":"beads-release formula: fix local-install dev path and clarify bump-version.sh","description":"## Overview\n\nThe beads-release formula delegates to a monolithic `bump-version.sh` script, which defeats the purpose of having fine-grained molecule steps:\n\n- **Durability**: If interrupted mid-script, you lose progress and must restart\n- **Visibility**: Activity feed only shows one step, not progress through sub-operations \n- **Atomicity**: Cant resume from a specific sub-operation\n\nThe formula's fine-grained steps ARE the feature. The script is legacy.\n\n## Current State\n\nThe `run-bump-script` step calls `./scripts/bump-version.sh {{version}}` which does:\n\n### Version Updates (should be individual steps)\n1. `cmd/bd/version.go` - Go version constant\n2. `.claude-plugin/plugin.json` - Plugin manifest\n3. `.claude-plugin/marketplace.json` - Marketplace entry\n4. `integrations/beads-mcp/pyproject.toml` - Python package version\n5. `integrations/beads-mcp/src/beads_mcp/__init__.py` - Python __version__\n6. `npm-package/package.json` - npm package version\n7. `cmd/bd/templates/hooks/*` - Hook template versions (4 files)\n8. `README.md` - Alpha version badge\n9. `CHANGELOG.md` - Stamp [Unreleased] with date\n\n### Local Install (needs dev path added)\n- Build binary: `go build -o bd ./cmd/bd`\n- Copy to `~/.local/bin/bd`\n- **macOS codesigning** (critical - without this binary gets SIGKILL)\n- MCP local install via uv/pip\n- Daemon restart\n\n## Target State\n\n### Phase 1: Break version updates into individual steps\n\nReplace `run-bump-script` with explicit steps:\n- `bump-version-go` - sed on cmd/bd/version.go\n- `bump-plugin-json` - jq on .claude-plugin/*.json\n- `bump-mcp-python` - sed on pyproject.toml and __init__.py\n- `bump-npm-package` - jq on npm-package/package.json \n- `bump-hook-templates` - sed on cmd/bd/templates/hooks/*\n- `bump-readme` - sed on README.md\n- `stamp-changelog` - sed to add date to [Unreleased]\n\nEach step has explicit commands that can be copy-pasted.\n\n### Phase 2: Fix local-install step\n\nAdd Option 3 for devs building from source:\n```bash\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n# macOS ONLY - prevents SIGKILL (Killed: 9)\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n### Phase 3: Deprecate bump-version.sh\n\nEither:\n- Add deprecation notice pointing to formula\n- Remove entirely (formula is the authority)\n- Keep as convenience wrapper that just runs `bd mol execute beads-release`\n\n## Acceptance Criteria\n\n- [ ] Formula has explicit steps for each version file update\n- [ ] Each step shows clear commands (no script delegation)\n- [ ] local-install includes build-from-source with codesigning\n- [ ] bump-version.sh is deprecated or removed\n- [ ] Release can complete even if interrupted mid-execution (resume from step)\n","status":"hooked","priority":1,"issue_type":"epic","created_at":"2026-01-07T00:20:38.312564-08:00","updated_at":"2026-01-07T00:45:04.785639-08:00","created_by":"beads/crew/emma","dependencies":[{"issue_id":"bd-z8xz","depends_on_id":"bd-fbkd","type":"related","created_at":"2026-01-07T00:20:49.331713-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-zc3","title":"Add --pinned and --no-pinned flags to bd list","description":"Add filtering flags to bd list: --pinned shows only pinned issues, --no-pinned excludes pinned issues. Default behavior shows all issues with a pin indicator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:29.518028-08:00","updated_at":"2025-12-21T11:30:01.484978-08:00","closed_at":"2025-12-21T11:30:01.484978-08:00","dependencies":[{"issue_id":"bd-zc3","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.486361-08:00","created_by":"daemon"},{"issue_id":"bd-zc3","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.256764-08:00","created_by":"daemon"}]} {"id":"bd-zf5w","title":"bd mail uses git user.name for sender instead of BEADS_AGENT_NAME","description":"When sending mail via `bd mail send`, the sender field in the stored issue uses git config user.name instead of the BEADS_AGENT_NAME environment variable.\n\nReproduction:\n1. Set BEADS_AGENT_NAME=gastown-alpha\n2. Run: bd mail send mayor/ -s 'Test' -m 'Body'\n3. Check the issue.jsonl: sender is 'Steve Yegge' (git user.name) not 'gastown-alpha'\n\nExpected: The sender field should use BEADS_AGENT_NAME when set.\n\nThis breaks the mail system for multi-agent workflows where agents need to identify themselves by their role (polecat, refinery, etc.) rather than the human user's git identity.\n\nRelated: gt mail routing integration with Gas Town","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T21:46:33.646746-08:00","updated_at":"2025-12-20T21:59:25.771325-08:00","closed_at":"2025-12-20T21:59:25.771325-08:00"} {"id":"bd-zgb9","title":"gt polecat done should auto-stop running session","description":"Currently 'gt polecat done' fails if session is running, requiring a separate 'gt session stop' first. This is unnecessary friction - done should just stop the session automatically since that's always what you want.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-23T04:11:23.899653-08:00","updated_at":"2025-12-23T04:12:13.029479-08:00","closed_at":"2025-12-23T04:12:13.029479-08:00"} {"id":"bd-ziy5","title":"GH#409: bd init uses issues.jsonl but docs say beads.jsonl","description":"bd init creates config referencing issues.jsonl but README/docs reference beads.jsonl as canonical. Standardize naming. See GitHub issue #409.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:58.109954-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"}