From e049b30fe08d7d3b5a5e9b4ac5ad173aa980cae5 Mon Sep 17 00:00:00 2001 From: emma Date: Wed, 7 Jan 2026 00:23:22 -0800 Subject: [PATCH] bd sync: 2026-01-07 00:23:22 --- .beads/issues.jsonl | 70 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 152997d4..2c68d350 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -31,9 +31,9 @@ {"id":"bd-1ban","title":"Test actor direct","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-26T20:46:02.423367-08:00","updated_at":"2025-12-28T09:26:06.083095-08:00","closed_at":"2025-12-28T09:26:06.083095-08:00"} {"id":"bd-1dez","title":"Mol Mall: Formula marketplace using GitHub as backend","description":"Create a marketplace for sharing molecule formulas using GitHub repos as the hosting backend.\n\n## Architecture Update (Dec 2025)\n\n**Formulas are the sharing layer.** With ephemeral protos (bd-rciw), the architecture is:\n\n```\nFormulas ──cook──→ [ephemeral proto] ──pour/wisp──→ Mol/Wisp\n ↑ │\n └────────────────── distill ─────────────────────────┘\n```\n\n- **Formulas**: JSON source files (.formula.json) - the thing you share\n- **Protos**: Transient compilation artifacts - auto-deleted after use\n- **Mols/Wisps**: Execution instances - not shared directly\n\n**Key operations:**\n- `bd distill \u003cmol-id\u003e` → Extract formula from completed work\n- `bd mol publish \u003cformula\u003e` → Share to GitHub\n- `bd mol install \u003curl\u003e` → Fetch from GitHub\n- `bd pour \u003cformula\u003e` → Cook and spawn (proto is ephemeral)\n\n## Why GitHub?\n\nGitHub solves multiple problems at once:\n- **Hosting**: Raw file URLs for formula.json\n- **Versioning**: Git tags (v1.0.0, v1.2.0)\n- **Auth**: GitHub tokens for private formulas\n- **Discovery**: GitHub search, topics, stars\n- **Collaboration**: PRs for contributions, issues for bugs\n- **Organizations**: Natural scoping (@anthropic/, @gastown/)\n\n## URL Scheme\n\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 (via registry lookup)\nbd mol install @anthropic/mol-code-review\n```\n\n## Architecture\n\nEach formula lives in its own repo (like Go modules):\n```\ngithub.com/anthropics/mol-code-review/\n├── formula.json # The formula\n├── README.md # Documentation\n└── CHANGELOG.md # Version history\n```\n\n## ID Namespace\n\n| Entity | ID Format | Example |\n|--------|-----------|---------|\n| Formula (GitHub) | `github.com/org/repo` | `github.com/anthropics/mol-code-review` |\n| Installed formula | `mol-name` | `mol-code-review` |\n| Poured instance | `\u003cdb\u003e-mol-xxx` | `bd-mol-b8c` |","notes":"Deferred - focusing on Christmas launch first","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-25T12:05:17.666574-08:00","updated_at":"2025-12-25T21:53:13.415431-08:00","closed_at":"2025-12-25T21:53:13.415431-08:00"} {"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.1","type":"blocks","created_at":"2025-12-25T12:07:06.745686-08:00","created_by":"daemon"},{"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"}]} +{"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"}]} @@ -58,7 +58,7 @@ {"id":"bd-29fb","title":"Implement bd close --continue flag","description":"Auto-advance to next step in molecule when closing an issue. Referenced by gt-um6q, gt-lz13. Needed for molecule navigation workflow.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:17:55.032875-08:00","updated_at":"2025-12-23T01:26:47.255313-08:00","closed_at":"2025-12-23T01:26:47.255313-08:00"} {"id":"bd-2c64","title":"Merge: ruby-1767142029451","description":"branch: polecat/ruby-1767142029451\ntarget: main\nsource_issue: ruby-1767142029451\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T17:00:14.136568-08:00","updated_at":"2025-12-30T18:12:30.96303-08:00","closed_at":"2025-12-30T18:11:07.842778-08:00","created_by":"beads/polecats/ruby"} {"id":"bd-2dwo","title":"Remove deprecated daemon logger function","description":"In cmd/bd/daemon_logger.go:131, there's a TODO to remove a deprecated function once all callers are updated to use the new signature. Need to audit callers and clean up.\n\nFile: cmd/bd/daemon_logger.go:131","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T16:32:39.513622-08:00","updated_at":"2025-12-30T15:44:43.365401-08:00","closed_at":"2025-12-30T00:28:06.54315-08:00","close_reason":"Merged via refinery","created_by":"stevey"} -{"id":"bd-2ep8","title":"Update CHANGELOG.md with release notes","description":"Add meaningful release notes to CHANGELOG.md describing what changed in 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649053-08:00","updated_at":"2025-12-19T22:57:31.69559-08:00","closed_at":"2025-12-19T22:57:31.69559-08:00","dependencies":[{"issue_id":"bd-2ep8","depends_on_id":"bd-rupw","type":"blocks","created_at":"2025-12-19T22:56:48.651136-08:00","created_by":"stevey"},{"issue_id":"bd-2ep8","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.650816-08:00","created_by":"stevey"}]} +{"id":"bd-2ep8","title":"Update CHANGELOG.md with release notes","description":"Add meaningful release notes to CHANGELOG.md describing what changed in 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649053-08:00","updated_at":"2025-12-19T22:57:31.69559-08:00","closed_at":"2025-12-19T22:57:31.69559-08:00","dependencies":[{"issue_id":"bd-2ep8","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.650816-08:00","created_by":"stevey"},{"issue_id":"bd-2ep8","depends_on_id":"bd-rupw","type":"blocks","created_at":"2025-12-19T22:56:48.651136-08:00","created_by":"stevey"}]} {"id":"bd-2f0f","title":"Merge: obsidian-mjvtl03h","description":"branch: polecat/obsidian-mjvtl03h\ntarget: main\nsource_issue: obsidian-mjvtl03h\nrig: beads\nagent_bead: gt-beads-polecat-obsidian","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T11:12:56.221323-08:00","updated_at":"2026-01-01T15:48:48.262491-08:00","closed_at":"2026-01-01T15:48:48.262491-08:00","close_reason":"Branch already merged and deleted by previous refinery session","created_by":"beads/polecats/obsidian"} {"id":"bd-2fs7","title":"Move pour/ephemeral under bd mol subcommand","description":"For consistency, bd pour and bd ephemeral should become bd mol pour and bd mol ephemeral:\n\nCurrent:\n bd mol list # Available protos\n bd mol show \u003cid\u003e # Proto details\n bd pour \u003cproto\u003e # Create mol ← sticks out\n bd ephemeral \u003cproto\u003e # Create ephemeral ← sticks out \n bd mol bond \u003cproto\u003e \u003cparent\u003e # Attach to existing mol\n bd mol squash \u003cid\u003e # Condense to digest\n bd mol burn \u003cid\u003e # Discard\n\nProposed:\n bd mol list\n bd mol show \u003cid\u003e\n bd mol pour \u003cproto\u003e # Moved under mol\n bd mol ephemeral \u003cproto\u003e # Moved under mol\n bd mol bond \u003cproto\u003e \u003cparent\u003e\n bd mol squash \u003cid\u003e\n bd mol burn \u003cid\u003e\n\nAll molecule operations should be under bd mol for discoverability and consistency.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T23:36:23.945902-08:00","updated_at":"2025-12-26T23:41:01.096333-08:00","closed_at":"2025-12-26T23:41:01.096333-08:00","created_by":"stevey"} {"id":"bd-2gkg","title":"Fix path casing mismatch on macOS causing sync failures (GH#880)","description":"bd sync fails with exit status 128 when daemon started from terminal with different path casing than git worktree registry. macOS case-insensitive filesystem causes mismatch. Fix: normalize paths using realpath or canonical lowercase when daemon starts.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T16:09:19.727279-08:00","updated_at":"2026-01-04T16:11:30.968102-08:00","closed_at":"2026-01-04T16:11:30.968102-08:00","close_reason":"Fixed: use utils.PathsEqual() for case-insensitive path comparison in worktree validation","created_by":"beads/crew/emma"} @@ -78,8 +78,8 @@ {"id":"bd-2vh3.1","title":"Tier 1: Ephemeral repo routing","description":"Add routing.ephemeral config option to route ephemeral=true issues to separate location.\n\n## Changes Required\n\n1. Add `routing.ephemeral` config option (default: empty = disabled)\n2. Update routing logic in `determineRepo()` to check ephemeral flag\n3. Update `bd create` to respect ephemeral routing\n4. Update import/export for multi-location support\n5. Ephemeral repo can be:\n - Separate git repo (~/.beads-ephemeral)\n - Non-git directory (just filesystem)\n - Same repo, different branch (future)\n\n## Config\n\n```bash\nbd config set routing.ephemeral \"~/.beads-ephemeral\"\n```\n\n## Acceptance Criteria\n\n- `bd create \"test\" --ephemeral` creates in ephemeral repo when configured\n- `bd list` shows issues from both repos\n- Ephemeral repo never synced to remote","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T12:57:26.648052-08:00","updated_at":"2025-12-21T12:59:01.815357-08:00","deleted_at":"2025-12-21T12:59:01.815357-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-2vh3.2","title":"Tier 1: Ephemeral repo routing","description":"Simplified: Make mol spawn set ephemeral=true on spawned issues.\n\n## The Fix\n\nModify cloneSubgraph() in template.go to set Ephemeral: true:\n\n```go\n// template.go:474\nnewIssue := \u0026types.Issue{\n Title: substituteVariables(oldIssue.Title, vars),\n // ... existing fields ...\n Ephemeral: true, // ADD THIS LINE\n}\n```\n\n## Optional: Add --persistent flag\n\nAdd flag to bd mol spawn for when you want spawned issues to persist:\n\n```bash\nbd mol spawn mol-code-review --var pr=123 # ephemeral (default)\nbd mol spawn mol-code-review --var pr=123 --persistent # not ephemeral\n```\n\n## Why This Is Simpler Than Original Design\n\nOriginal design proposed separate ephemeral repo routing. After code review:\n\n- Ephemeral field already exists in schema\n- bd cleanup --ephemeral already works\n- No new config needed\n- No multi-repo complexity\n\n## Acceptance Criteria\n\n- bd mol spawn creates issues with ephemeral=true\n- bd cleanup --ephemeral -f deletes them after closing\n- --persistent flag opts out of ephemeral\n- Existing molecules continue to work","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T12:57:36.661604-08:00","updated_at":"2025-12-21T13:43:22.990244-08:00","closed_at":"2025-12-21T13:43:22.990244-08:00","dependencies":[{"issue_id":"bd-2vh3.2","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:57:36.662118-08:00","created_by":"stevey"}]} {"id":"bd-2vh3.3","title":"Tier 2: Basic bd mol squash command","description":"Add bd mol squash command for basic molecule execution compression.\n\n## Command\n\nbd mol squash \u003cmolecule-id\u003e [flags]\n --dry-run Preview what would be squashed\n --keep-children Don't delete ephemeral children after squash\n --json JSON output\n\n## Implementation\n\n1. Find all ephemeral children of molecule (parent-child deps)\n2. Concatenate child descriptions/notes into digest\n3. Create digest issue in main repo with:\n - Title: 'Molecule Execution Summary: \u003coriginal-title\u003e'\n - digest_of: [list of squashed child IDs]\n - ephemeral: false (digest is permanent)\n4. Delete ephemeral children (unless --keep-children)\n5. Link digest to parent work item\n\n## Schema Changes\n\nAdd to Issue struct:\n- SquashedAt *time.Time\n- SquashDigest string (ID of digest)\n- DigestOf []string (IDs of squashed children)\n\n## Acceptance Criteria\n\n- bd mol squash \u003cid\u003e creates digest, removes children\n- --dry-run shows preview\n- Digest has proper metadata linking","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T12:57:48.338114-08:00","updated_at":"2025-12-21T13:53:58.974433-08:00","closed_at":"2025-12-21T13:53:58.974433-08:00","dependencies":[{"issue_id":"bd-2vh3.3","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:57:48.338636-08:00","created_by":"stevey"},{"issue_id":"bd-2vh3.3","depends_on_id":"bd-2vh3.2","type":"blocks","created_at":"2025-12-21T12:58:22.601321-08:00","created_by":"stevey"}]} -{"id":"bd-2vh3.4","title":"Tier 3: AI-powered squash summarization","description":"## Design: Agent-Provided Summarization (Inversion of Control)\n\nbd is a tool FOR agents, not an agent itself. The calling agent provides\nthe summary; bd just stores it.\n\n### API\n\n```bash\n# Agent generates summary, passes to bd\nbd mol squash bd-xxx --summary \"Agent-generated summary here\"\n\n# Without --summary, falls back to basic concatenation\nbd mol squash bd-xxx\n```\n\n### Gas Town Integration Pattern\n\n```go\n// In polecat completion handler or witness\nraw := exec.Command(\"bd\", \"mol\", \"show\", molID, \"--json\").Output()\nsummary := callHaiku(buildSummaryPrompt(raw)) // agent's job\nexec.Command(\"bd\", \"mol\", \"squash\", molID, \"--summary\", summary).Run()\n```\n\n### Why This Design\n\n| Concern | bd's job | Agent's job |\n|---------|----------|-------------|\n| Store data | ✅ | |\n| Query data | ✅ | |\n| Generate summaries | | ✅ |\n| Call LLMs | | ✅ |\n| Manage API keys | | ✅ |\n\n### Implementation Status\n\n- [x] --summary flag added to bd mol squash\n- [x] Tests for agent-provided summary\n- [ ] Gas Town integration (separate task)\n\n### Acceptance Criteria\n\n- ✅ bd mol squash --summary uses provided text\n- ✅ Without --summary, falls back to concatenation\n- ✅ No LLM calls in bd itself","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T12:58:00.732749-08:00","updated_at":"2025-12-21T14:29:16.288713-08:00","closed_at":"2025-12-21T14:29:16.288713-08:00","dependencies":[{"issue_id":"bd-2vh3.4","depends_on_id":"bd-2vh3.3","type":"blocks","created_at":"2025-12-21T12:58:22.698686-08:00","created_by":"stevey"},{"issue_id":"bd-2vh3.4","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:58:00.733264-08:00","created_by":"stevey"}]} -{"id":"bd-2vh3.5","title":"Tier 4: Auto-squash on molecule completion","description":"Automatically squash molecules when they reach terminal state.\n\n## Integration Points\n\n1. Hook into molecule completion handler\n2. Detect when all steps are done/failed\n3. Trigger squash automatically\n\n## Config\n\nbd config set mol.auto_squash true # Default: false\nbd config set mol.auto_squash_on_success true # Only on success\nbd config set mol.auto_squash_delay '5m' # Wait before squash\n\n## Implementation Options\n\n### Option A: Post-Completion Hook\nIn mol completion handler:\n- Check if auto_squash enabled\n- Call Squash() after terminal state\n\n### Option B: Git Hook\nIn .beads/hooks/post-commit:\n- bd mol squash --auto\n\n### Option C: Daemon Background Task\n- Daemon periodically checks for squashable molecules\n- Squashes in background\n\n## Acceptance Criteria\n\n- Completed molecules auto-squash without manual intervention\n- Configurable delay before squash\n- Option to squash only on success vs always\n- Works with both daemon and no-daemon modes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T12:58:13.345577-08:00","updated_at":"2025-12-21T17:40:39.794527-08:00","closed_at":"2025-12-21T17:40:39.794527-08:00","dependencies":[{"issue_id":"bd-2vh3.5","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:58:13.346152-08:00","created_by":"stevey"},{"issue_id":"bd-2vh3.5","depends_on_id":"bd-2vh3.4","type":"blocks","created_at":"2025-12-21T12:58:22.797141-08:00","created_by":"stevey"}]} +{"id":"bd-2vh3.4","title":"Tier 3: AI-powered squash summarization","description":"## Design: Agent-Provided Summarization (Inversion of Control)\n\nbd is a tool FOR agents, not an agent itself. The calling agent provides\nthe summary; bd just stores it.\n\n### API\n\n```bash\n# Agent generates summary, passes to bd\nbd mol squash bd-xxx --summary \"Agent-generated summary here\"\n\n# Without --summary, falls back to basic concatenation\nbd mol squash bd-xxx\n```\n\n### Gas Town Integration Pattern\n\n```go\n// In polecat completion handler or witness\nraw := exec.Command(\"bd\", \"mol\", \"show\", molID, \"--json\").Output()\nsummary := callHaiku(buildSummaryPrompt(raw)) // agent's job\nexec.Command(\"bd\", \"mol\", \"squash\", molID, \"--summary\", summary).Run()\n```\n\n### Why This Design\n\n| Concern | bd's job | Agent's job |\n|---------|----------|-------------|\n| Store data | ✅ | |\n| Query data | ✅ | |\n| Generate summaries | | ✅ |\n| Call LLMs | | ✅ |\n| Manage API keys | | ✅ |\n\n### Implementation Status\n\n- [x] --summary flag added to bd mol squash\n- [x] Tests for agent-provided summary\n- [ ] Gas Town integration (separate task)\n\n### Acceptance Criteria\n\n- ✅ bd mol squash --summary uses provided text\n- ✅ Without --summary, falls back to concatenation\n- ✅ No LLM calls in bd itself","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T12:58:00.732749-08:00","updated_at":"2025-12-21T14:29:16.288713-08:00","closed_at":"2025-12-21T14:29:16.288713-08:00","dependencies":[{"issue_id":"bd-2vh3.4","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:58:00.733264-08:00","created_by":"stevey"},{"issue_id":"bd-2vh3.4","depends_on_id":"bd-2vh3.3","type":"blocks","created_at":"2025-12-21T12:58:22.698686-08:00","created_by":"stevey"}]} +{"id":"bd-2vh3.5","title":"Tier 4: Auto-squash on molecule completion","description":"Automatically squash molecules when they reach terminal state.\n\n## Integration Points\n\n1. Hook into molecule completion handler\n2. Detect when all steps are done/failed\n3. Trigger squash automatically\n\n## Config\n\nbd config set mol.auto_squash true # Default: false\nbd config set mol.auto_squash_on_success true # Only on success\nbd config set mol.auto_squash_delay '5m' # Wait before squash\n\n## Implementation Options\n\n### Option A: Post-Completion Hook\nIn mol completion handler:\n- Check if auto_squash enabled\n- Call Squash() after terminal state\n\n### Option B: Git Hook\nIn .beads/hooks/post-commit:\n- bd mol squash --auto\n\n### Option C: Daemon Background Task\n- Daemon periodically checks for squashable molecules\n- Squashes in background\n\n## Acceptance Criteria\n\n- Completed molecules auto-squash without manual intervention\n- Configurable delay before squash\n- Option to squash only on success vs always\n- Works with both daemon and no-daemon modes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T12:58:13.345577-08:00","updated_at":"2025-12-21T17:40:39.794527-08:00","closed_at":"2025-12-21T17:40:39.794527-08:00","dependencies":[{"issue_id":"bd-2vh3.5","depends_on_id":"bd-2vh3.4","type":"blocks","created_at":"2025-12-21T12:58:22.797141-08:00","created_by":"stevey"},{"issue_id":"bd-2vh3.5","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:58:13.346152-08:00","created_by":"stevey"}]} {"id":"bd-2vh3.6","title":"Tier 5 (Future): JSONL archive rotation","description":"Periodic rotation of issues.jsonl for long-running repos.\n\n## Design\n\n.beads/\n├── issues.jsonl # Current (hot)\n├── archive/\n│ ├── issues-2025-12.jsonl.gz # Archived (cold)\n│ └── ...\n└── index.jsonl # Merged index for queries\n\n## Commands\n\nbd archive rotate [flags]\n --older-than N Archive issues closed \u003e N days\n --compress Gzip archives\n --dry-run Preview\n\nbd archive list # Show archived periods\nbd archive restore \u003cperiod\u003e # Restore from archive\n\n## Config\n\nbd config set archive.enabled true\nbd config set archive.rotate_days 90\nbd config set archive.compress true\nbd config set archive.path '.beads/archive'\n\n## Considerations\n\n- Archives can be gitignored (local only) or committed (shared)\n- Query layer must check index, hydrate from archive\n- Cold storage tiering (S3/GCS) for enterprise\n- Merkle proofs preserved for audit\n\n## Priority\n\nThis is post-1.0 work. Current focus is on squash (removes ephemeral).\nArchive helps with long-term history but is less critical.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-21T12:58:38.210008-08:00","updated_at":"2026-01-02T00:17:14.308269-08:00","dependencies":[{"issue_id":"bd-2vh3.6","depends_on_id":"bd-2vh3","type":"parent-child","created_at":"2025-12-21T12:58:38.210543-08:00","created_by":"stevey"}]} {"id":"bd-2wh","title":"Test pinned for stats","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-18T21:47:09.334108-08:00","updated_at":"2025-12-18T21:47:25.17917-08:00","deleted_at":"2025-12-18T21:47:25.17917-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-2wm2","title":"bd repair: Check comments and events tables for orphans","description":"bd repair currently checks dependencies and labels tables, but the schema also has comments and events tables with issue_id foreign keys that could be orphaned.\n\nAdd orphan detection and cleanup for:\n- comments table (issue_id not in issues)\n- events table (issue_id not in issues)","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-29T12:48:11.563302-08:00","updated_at":"2025-12-29T12:57:43.745176-08:00","closed_at":"2025-12-29T12:57:43.745176-08:00","close_reason":"Implemented in repair.go: added orphan detection for comments/events tables and --json output flag","created_by":"stevey"} @@ -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"} @@ -138,7 +138,7 @@ {"id":"bd-4ri","title":"Fix TestFallbackToDirectModeEnablesFlush deadlock causing 10min test timeout","description":"## Problem\n\nTestFallbackToDirectModeEnablesFlush in direct_mode_test.go deadlocks for 9m59s before timing out, causing the entire test suite to take 10+ minutes instead of \u003c10 seconds.\n\n## Root Cause\n\nDatabase lock contention between test cleanup and flushToJSONL():\n- Test cleanup (line 36) tries to close DB via defer\n- flushToJSONL() (line 132) is still accessing DB\n- Results in deadlock: database/sql.(*DB).Close() waits for mutex while GetJSONLFileHash() holds it\n\n## Stack Trace Evidence\n\n```\ngoroutine 512 [sync.Mutex.Lock, 9 minutes]:\ndatabase/sql.(*DB).Close(0x14000643790)\n .../database/sql/sql.go:927 +0x84\ngithub.com/steveyegge/beads/cmd/bd.TestFallbackToDirectModeEnablesFlush.func1()\n .../direct_mode_test.go:36 +0xf4\n\nWhile goroutine running flushToJSONL() holds DB connection via GetJSONLFileHash()\n```\n\n## Impact\n\n- Test suite: 10+ minutes → should be \u003c10 seconds\n- ALL other tests pass in ~4 seconds\n- This ONE test accounts for 99.9% of test runtime\n\n## Related\n\nThis is the EXACT same issue documented in MAIN_TEST_REFACTOR_NOTES.md for why main_test.go refactoring was deferred - global state manipulation + DB cleanup = deadlock.\n\n## Fix Approaches\n\n1. **Add proper cleanup sequencing** - stop flush goroutines BEFORE closing DB\n2. **Use test-specific DB lifecycle** - ensure flush completes before cleanup\n3. **Mock the flush mechanism** - avoid real DB for testing this code path \n4. **Add explicit timeout handling** - fail fast with clear error instead of hanging\n\n## Files\n\n- cmd/bd/direct_mode_test.go:36-132\n- cmd/bd/autoflush.go:353 (validateJSONLIntegrity)\n- cmd/bd/autoflush.go:508 (flushToJSONLWithState)\n\n## Acceptance\n\n- Test passes without timeout\n- Test suite completes in \u003c10 seconds\n- No deadlock between cleanup and flush operations","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-11-21T20:09:00.794372-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-4sfl","title":"Merge: bd-14ie","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-14ie\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:23:37.360782-08:00","updated_at":"2025-12-20T23:17:26.997276-08:00","closed_at":"2025-12-20T23:17:26.997276-08:00"} {"id":"bd-4sxh","title":"Code smell: Issue struct still has ~100 fields - consider composition","description":"internal/types/types.go Issue struct (lines 14-100) still has approximately 100 fields across many categories despite prior cleanup:\n\n- Core identification (ID, ContentHash)\n- Content (Title, Description, Design)\n- Status \u0026 Workflow\n- Assignment, Timestamps\n- External integration\n- Compaction metadata\n- Relational data (Labels, Dependencies, Comments)\n- Tombstone, Messaging, Context markers\n- Bonding, HOP, Gate, Source tracing, Agent identity fields\n\n**Problem:**\n- Very large struct is difficult to understand\n- Hard to identify required vs optional fields\n- High change risk\n\n**Acceptance Criteria:**\n- [ ] Group related fields into embedded structs (IssueMetadata, IssueCompaction, IssueAgent, etc.)\n- [ ] Use composition instead of single flat struct\n- [ ] Maintain backward compatibility for serialization\n- [ ] Tests pass","status":"hooked","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:00.560267-08:00","updated_at":"2025-12-30T15:44:43.353922-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-4sxh","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.780801-08:00","created_by":"daemon"}]} -{"id":"bd-4uoc","title":"Code Review Followup Summary: PR #481 + PR #551","description":"## Merged PRs Summary\n\n### PR #551: Persist close_reason to issues table\n- ✅ Merged successfully\n- ✅ Bug fix: close_reason now persisted in database column (not just events table)\n- ✅ Comprehensive test coverage added\n- ✅ Handles reopen case (clearing close_reason)\n\n**Followup Issues Filed:**\n- bd-lxzx: Document close_reason in JSONL export format\n- bd-077e: Update CLI documentation for close_reason field\n\n---\n\n### PR #481: Context Engineering Optimizations (80-90% context reduction)\n- ✅ Merged successfully \n- ✅ Lazy tool discovery: discover_tools() + get_tool_info()\n- ✅ Minimal issue models: IssueMinimal (~80% smaller than full Issue)\n- ✅ Result compaction: Auto-compacts results \u003e20 items\n- ✅ All 28 tests passing\n- ⚠️ Breaking change: ready() and list() return type changed\n\n**Followup Issues Filed:**\n- bd-b318: Add integration tests for CompactedResult\n- bd-4u2b: Make compaction settings configurable (THRESHOLD, PREVIEW_COUNT)\n- bd-2kf8: Document CompactedResult response format in CONTEXT_ENGINEERING.md\n- bd-pdr2: Document backwards compatibility considerations\n\n---\n\n## Overall Assessment\n\nBoth PRs are production-ready with solid implementations. All critical functionality works and tests pass. Followup issues focus on:\n1. Documentation improvements (5 issues)\n2. Integration test coverage (1 issue)\n3. Configuration flexibility (1 issue)\n4. Backwards compatibility guidance (1 issue)\n\nNo critical bugs or design issues found.\n\n## Review Completed By\nCode review process completed. Issues auto-created for tracking improvements.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-29T13:40:29.723233-08:00","closed_at":"2025-12-29T13:40:29.723233-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-4uoc","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:59.217296-08:00","created_by":"stevey"},{"issue_id":"bd-4uoc","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:25:59.216884-08:00","created_by":"stevey"}]} +{"id":"bd-4uoc","title":"Code Review Followup Summary: PR #481 + PR #551","description":"## Merged PRs Summary\n\n### PR #551: Persist close_reason to issues table\n- ✅ Merged successfully\n- ✅ Bug fix: close_reason now persisted in database column (not just events table)\n- ✅ Comprehensive test coverage added\n- ✅ Handles reopen case (clearing close_reason)\n\n**Followup Issues Filed:**\n- bd-lxzx: Document close_reason in JSONL export format\n- bd-077e: Update CLI documentation for close_reason field\n\n---\n\n### PR #481: Context Engineering Optimizations (80-90% context reduction)\n- ✅ Merged successfully \n- ✅ Lazy tool discovery: discover_tools() + get_tool_info()\n- ✅ Minimal issue models: IssueMinimal (~80% smaller than full Issue)\n- ✅ Result compaction: Auto-compacts results \u003e20 items\n- ✅ All 28 tests passing\n- ⚠️ Breaking change: ready() and list() return type changed\n\n**Followup Issues Filed:**\n- bd-b318: Add integration tests for CompactedResult\n- bd-4u2b: Make compaction settings configurable (THRESHOLD, PREVIEW_COUNT)\n- bd-2kf8: Document CompactedResult response format in CONTEXT_ENGINEERING.md\n- bd-pdr2: Document backwards compatibility considerations\n\n---\n\n## Overall Assessment\n\nBoth PRs are production-ready with solid implementations. All critical functionality works and tests pass. Followup issues focus on:\n1. Documentation improvements (5 issues)\n2. Integration test coverage (1 issue)\n3. Configuration flexibility (1 issue)\n4. Backwards compatibility guidance (1 issue)\n\nNo critical bugs or design issues found.\n\n## Review Completed By\nCode review process completed. Issues auto-created for tracking improvements.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-29T13:40:29.723233-08:00","closed_at":"2025-12-29T13:40:29.723233-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","dependencies":[{"issue_id":"bd-4uoc","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:25:59.216884-08:00","created_by":"stevey"},{"issue_id":"bd-4uoc","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:59.217296-08:00","created_by":"stevey"}]} {"id":"bd-4y4g","title":"Bump version in all files","description":"Run ./scripts/bump-version.sh {{version}} to update 10 version files. Then run with --commit after info.go is updated.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:01.859728-08:00","updated_at":"2025-12-24T16:25:30.160776-08:00","dependencies":[{"issue_id":"bd-4y4g","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.623724-08:00","created_by":"daemon"},{"issue_id":"bd-4y4g","depends_on_id":"bd-8v2","type":"blocks","created_at":"2025-12-18T22:43:20.823329-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.160776-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-5012","title":"Merge: ux-1766978911613","description":"branch: polecat/Nux-1766978911613\ntarget: main\nsource_issue: ux-1766978911613\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-28T19:35:42.938017-08:00","updated_at":"2025-12-29T13:40:29.719953-08:00","closed_at":"2025-12-29T13:40:29.719953-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates","created_by":"beads/polecats/Nux"} {"id":"bd-512v","title":"Verify release artifacts","description":"Check GitHub releases page - binaries for darwin/linux/windows should be available","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.067124-08:00","updated_at":"2025-12-21T13:53:49.35495-08:00","deleted_at":"2025-12-21T13:53:49.35495-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} @@ -159,7 +159,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 +173,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"} @@ -217,7 +217,7 @@ {"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-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-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"},{"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"}]} +{"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-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"},{"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"}]} {"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"}]} @@ -248,7 +248,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-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-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-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-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-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-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"}]} +{"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-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-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-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-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-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-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"}]} {"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"} @@ -341,7 +341,7 @@ {"id":"bd-bw6","title":"Fix G104 errors unhandled in internal/storage/sqlite/queries.go:1181","description":"Linting issue: G104: Errors unhandled (gosec) at internal/storage/sqlite/queries.go:1181:4. Error: rows.Close()","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-07T15:35:09.008444133-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-bwk2","title":"Centralize error handling patterns in storage layer","description":"80+ instances of inconsistent error handling across sqlite.go with mix of %w, %v, and no wrapping.\n\nLocation: internal/storage/sqlite/sqlite.go (throughout)\n\nProblem:\n- Some use fmt.Errorf(\"op failed: %w\", err) - correct wrapping\n- Some use fmt.Errorf(\"op failed: %v\", err) - loses error chain\n- Some return err directly - no context\n- Hard to debug production issues\n- Can't distinguish error types\n\nSolution: Create internal/storage/sqlite/errors.go:\n- Define sentinel errors (ErrNotFound, ErrInvalidID, etc.)\n- Create wrapDBError(op string, err error) helper\n- Convert sql.ErrNoRows to ErrNotFound\n- Always wrap with operation context\n\nImpact: Lost error context; inconsistent messages; hard to debug\n\nEffort: 5-7 hours","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-16T14:51:54.974909-08:00","updated_at":"2025-12-21T21:44:37.237175-08:00","closed_at":"2025-12-21T21:44:37.237175-08:00"} {"id":"bd-bxha","title":"Default to YES for git hooks and merge driver installation","description":"Currently bd init prompts user to install git hooks and merge driver, but setup is incomplete if user declines. Change to install by default unless --skip-hooks or --skip-merge-driver flags are passed. Better safe defaults. If installation fails, warn user and suggest bd doctor --fix.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-11-21T23:16:10.172238-08:00","updated_at":"2025-12-23T04:20:51.885765-08:00","closed_at":"2025-12-23T04:20:51.885765-08:00","dependencies":[{"issue_id":"bd-bxha","depends_on_id":"bd-tbz3","type":"parent-child","created_at":"2025-11-21T23:16:10.173034-08:00","created_by":"daemon"}]} -{"id":"bd-bxqv","title":"Update documentation for CLI consolidation","description":"## Task\nUpdate all documentation to reflect CLI consolidation changes.\n\n## Files requiring updates\n\n### Primary docs\n- docs/CLI_REFERENCE.md - Major updates\n - Add admin section (cleanup, compact, reset)\n - Update migrate section (subcommands)\n - Update formula section (add cook)\n - Remove/update standalone command references\n\n### Secondary docs \n- docs/DELETIONS.md - migrate-tombstones → migrate tombstones, compact → admin compact\n- docs/FAQ.md - compact → admin compact\n- docs/QUICKSTART.md - compact, cleanup → admin compact, admin cleanup\n- docs/TROUBLESHOOTING.md - compact → admin compact\n- docs/CONFIG.md - compact → admin compact\n- docs/INSTALLING.md - quickstart reference\n- docs/EXTENDING.md - quickstart reference\n\n### Skills docs\n- skills/beads/SKILL.md - compact, quickstart references\n- skills/beads/references/CLI_REFERENCE.md - mirror main CLI_REFERENCE.md\n\n### Other docs\n- commands/quickstart.md - update or remove\n- commands/compact.md - update to admin compact\n- examples/compaction/README.md - update examples\n- README.md - quickstart reference\n- CHANGELOG.md - add consolidation changes section\n\n## Implementation notes\n- Keep backwards compatibility notices where aliases exist\n- Update command examples to use new paths\n- Consider adding deprecation warnings section\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:11:33.307408-08:00","updated_at":"2025-12-27T16:19:36.155138-08:00","closed_at":"2025-12-27T16:19:36.155138-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-bxqv","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:52.475688-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:52.504528-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:52.533506-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:52.445529-08:00","created_by":"daemon"}]} +{"id":"bd-bxqv","title":"Update documentation for CLI consolidation","description":"## Task\nUpdate all documentation to reflect CLI consolidation changes.\n\n## Files requiring updates\n\n### Primary docs\n- docs/CLI_REFERENCE.md - Major updates\n - Add admin section (cleanup, compact, reset)\n - Update migrate section (subcommands)\n - Update formula section (add cook)\n - Remove/update standalone command references\n\n### Secondary docs \n- docs/DELETIONS.md - migrate-tombstones → migrate tombstones, compact → admin compact\n- docs/FAQ.md - compact → admin compact\n- docs/QUICKSTART.md - compact, cleanup → admin compact, admin cleanup\n- docs/TROUBLESHOOTING.md - compact → admin compact\n- docs/CONFIG.md - compact → admin compact\n- docs/INSTALLING.md - quickstart reference\n- docs/EXTENDING.md - quickstart reference\n\n### Skills docs\n- skills/beads/SKILL.md - compact, quickstart references\n- skills/beads/references/CLI_REFERENCE.md - mirror main CLI_REFERENCE.md\n\n### Other docs\n- commands/quickstart.md - update or remove\n- commands/compact.md - update to admin compact\n- examples/compaction/README.md - update examples\n- README.md - quickstart reference\n- CHANGELOG.md - add consolidation changes section\n\n## Implementation notes\n- Keep backwards compatibility notices where aliases exist\n- Update command examples to use new paths\n- Consider adding deprecation warnings section\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T15:11:33.307408-08:00","updated_at":"2025-12-27T16:19:36.155138-08:00","closed_at":"2025-12-27T16:19:36.155138-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-bxqv","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:52.533506-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:52.445529-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:52.475688-08:00","created_by":"daemon"},{"issue_id":"bd-bxqv","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:52.504528-08:00","created_by":"daemon"}]} {"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"} @@ -399,13 +399,13 @@ {"id":"bd-dpbm","title":"Test no validate","description":"Quick capture","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T19:24:58.637574-08:00","updated_at":"2026-01-01T19:25:09.044121-08:00","closed_at":"2026-01-01T19:25:09.044121-08:00","close_reason":"Test issue cleanup","created_by":"beads/polecats/opal"} {"id":"bd-dq74","title":"bd repair: Handle .beads/redirect files","description":"The bd repair command hardcodes .beads/beads.db path but doesn't follow .beads/redirect files like other commands do. This means repair won't work on clones that use redirected beads directories.\n\nFix: Check for .beads/redirect file and follow it to find the actual database location.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T12:47:53.089729-08:00","updated_at":"2025-12-29T12:59:05.121303-08:00","closed_at":"2025-12-29T12:59:05.121303-08:00","close_reason":"Fixed in commit d7a67ad6","created_by":"stevey"} {"id":"bd-dqck","title":"Version Bump: test-squash","description":"Release checklist for version test-squash. This molecule ensures all release steps are completed properly.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-21T13:52:33.065408-08:00","updated_at":"2025-12-21T13:53:41.946036-08:00","deleted_at":"2025-12-21T13:53:41.946036-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"epic"} -{"id":"bd-dqu8","title":"Restart running daemons","description":"Kill and restart any running bd daemons to pick up new version: pkill -f 'bd daemon' \u0026\u0026 bd daemon --start","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T00:32:26.559311-08:00","updated_at":"2025-12-20T00:32:59.123766-08:00","closed_at":"2025-12-20T00:32:59.123766-08:00","dependencies":[{"issue_id":"bd-dqu8","depends_on_id":"bd-fgw3","type":"blocks","created_at":"2025-12-20T00:32:39.427846-08:00","created_by":"daemon"},{"issue_id":"bd-dqu8","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-20T00:32:39.36213-08:00","created_by":"daemon"}]} +{"id":"bd-dqu8","title":"Restart running daemons","description":"Kill and restart any running bd daemons to pick up new version: pkill -f 'bd daemon' \u0026\u0026 bd daemon --start","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T00:32:26.559311-08:00","updated_at":"2025-12-20T00:32:59.123766-08:00","closed_at":"2025-12-20T00:32:59.123766-08:00","dependencies":[{"issue_id":"bd-dqu8","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-20T00:32:39.36213-08:00","created_by":"daemon"},{"issue_id":"bd-dqu8","depends_on_id":"bd-fgw3","type":"blocks","created_at":"2025-12-20T00:32:39.427846-08:00","created_by":"daemon"}]} {"id":"bd-drcx","title":"bd mol run: Support proto lookup by title","description":"`bd mol run` only accepts proto ID (e.g., gt-lwuu), not proto title (e.g., mol-polecat-work).\n\n## Current Behavior\n```bash\nbd mol run mol-polecat-work --var issue=gt-xxx\n# Error: no issue found matching \"mol-polecat-work\"\n\nbd mol run gt-lwuu --var issue=gt-xxx \n# Works\n```\n\n## Desired Behavior\nBoth should work - lookup by ID or by title.\n\n## Why This Matters\n- Proto titles are human-readable and memorable\n- Proto IDs are opaque (gt-lwuu vs mol-polecat-work)\n- Hardcoding IDs in code is fragile (IDs change across databases)\n- `bd mol catalog` shows both: `gt-lwuu: mol-polecat-work`\n\n## Workaround\nCurrently using hardcoded proto ID in gt spawn, which is brittle.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T23:12:49.151242-08:00","updated_at":"2025-12-24T23:32:20.615624-08:00","closed_at":"2025-12-24T23:32:20.615624-08:00"} {"id":"bd-drxs","title":"Make merge requests ephemeral wisps instead of permanent issues","description":"## Problem\n\nMerge requests (MRs) are currently created as regular beads issues (type: merge-request). This means they:\n- Sync to JSONL and propagate via git\n- Accumulate in the issue database indefinitely\n- Clutter `bd list` output with closed MRs\n- Create permanent records for inherently transient artifacts\n\nMRs are process artifacts, not work products. They exist briefly while code awaits merge, then their purpose is fulfilled. The git merge commit and GitHub PR (if applicable) provide the permanent audit trail - the beads MR is redundant.\n\n## Proposed Solution\n\nMake MRs ephemeral wisps that exist only during the merge process:\n\n1. **Create MRs as wisps**: When a polecat completes work and requests merge, create the MR in `.beads-wisp/` instead of `.beads/`\n\n2. **Refinery visibility**: This works because all clones within a rig share the same database:\n ```\n beads/ ← Rig root\n ├── .beads/ ← Permanent issues (synced to JSONL)\n ├── .beads-wisp/ ← Ephemeral wisps (NOT synced)\n ├── crew/dave/ ← Uses rig's shared DB\n ├── polecats/*/ ← Uses rig's shared DB\n └── refinery/ ← Uses rig's shared DB\n ```\n The refinery can see wisp MRs immediately - same SQLite database.\n\n3. **On merge completion**: Burn the wisp (delete without digest). The git merge commit IS the permanent record. No digest needed since:\n - Digest wouldn't be smaller than the MR itself (~200-300 bytes either way)\n - Git history provides complete audit trail\n - GitHub PR (if used) provides discussion/approval record\n\n4. **On merge rejection/abandonment**: Burn the wisp. Optionally notify the source polecat via mail.\n\n## Benefits\n\n- **Clean JSONL**: MRs never pollute the permanent issue history\n- **No accumulation**: Wisps are burned on completion, no cleanup needed\n- **Correct semantics**: Wisps are for \"operational ephemera\" - MRs fit perfectly\n- **Reduced sync churn**: Fewer JSONL updates, faster `bd sync`\n- **Cleaner queries**: `bd list` shows work items, not process artifacts\n\n## Implementation Notes\n\n### Where MRs are created\n\nCurrently MRs are created by the witness or polecat when work is ready for merge. This code needs to:\n- Set `wisp: true` on the MR issue\n- Or use a dedicated wisp creation path\n\n### Refinery changes\n\nThe refinery queries for pending MRs to process. It needs to:\n- Query wisp storage as well as (or instead of) permanent storage\n- Use `bd mol burn` or equivalent to delete processed MRs\n\n### What about cross-rig MRs?\n\nIf an MR needs to be visible outside the rig (e.g., external collaborators):\n- They would see the GitHub PR anyway\n- Or we could create a permanent \"merge completed\" notification issue\n- But this is likely unnecessary - MRs are internal coordination\n\n### Migration\n\nExisting MRs in permanent storage:\n- Can be cleaned up with `bd cleanup` or manual deletion\n- Or left to age out naturally\n- No migration of open MRs needed (they'll complete under old system\n\n## Alternatives Considered\n\n1. **Auto-cleanup of closed MRs**: Keep MRs as permanent issues but auto-delete after 24h. Simpler but still creates sync churn and temporary JSONL pollution.\n\n2. **MRs as mail only**: Polecat sends mail to refinery with merge details, no MR issue at all. Loses queryability (bd-801b [P2] [merge-request] closed - Merge: bd-bqcc\nbd-pvu0 [P2] [merge-request] closed - Merge: bd-4opy\nbd-i0rx [P2] [merge-request] closed - Merge: bd-ao0s\nbd-u0sb [P2] [merge-request] closed - Merge: bd-uqfn\nbd-8e0q [P2] [merge-request] closed - Merge: beads-ocs\nbd-hvng [P2] [merge-request] closed - Merge: bd-w193\nbd-4sfl [P2] [merge-request] closed - Merge: bd-14ie\nbd-sumr [P2] [merge-request] closed - Merge: bd-t4sb\nbd-3x9o [P2] [merge-request] closed - Merge: bd-by0d\nbd-whgv [P2] [merge-request] closed - Merge: bd-401h\nbd-f3ll [P2] [merge-request] closed - Merge: bd-ot0w\nbd-fmdy [P3] [merge-request] closed - Merge: bd-kzda).\n\n3. **Separate merge queue**: Refinery maintains internal state for pending merges, not in beads at all. Clean but requires new infrastructure.\n\nWisps are the cleanest solution - they already exist, have the right semantics, and require minimal changes.\n\n## Related\n\n- Wisp architecture: \n- Current MR creation: witness/refinery code paths\n- bd-pvu0, bd-801b: Example MRs currently in permanent storage\nEOF\n)","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2025-12-23T01:39:25.4918-08:00","updated_at":"2025-12-23T01:58:23.550668-08:00","deleted_at":"2025-12-23T01:58:23.550668-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"} {"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"} @@ -448,7 +448,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-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-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-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"},{"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"}]} {"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"}]} @@ -504,9 +504,9 @@ {"id":"bd-hulf","title":"Molecule execution state management","description":"Implement molecule execution state tracking.\n\n## State Location\n\n```\n.beads/molecules/\u003cmol-id\u003e.state.yaml\n```\n\n## State Schema\n\n```yaml\nid: mol-deacon-patrol\nformula: mol-deacon-patrol # Source formula\nbonded_at: ISO timestamp\nbonded_by: entity who created it\n\n# Execution state\nstatus: running | paused | completed | failed\ncurrent_step: step-id\nstarted_at: ISO timestamp\ncompleted_at: ISO timestamp (if done)\n\n# Loop tracking\nreset_count: 0\nlast_reset_at: null\n\n# Per-step state\nsteps:\n inbox-check:\n status: completed | in_progress | pending\n started_at: ...\n completed_at: ...\n spawn-work:\n status: pending\n self-inspect:\n status: pending\n\n# Variables (from formula instantiation)\nvariables:\n rig: gastown\n issue_id: gt-xxx\n```\n\n## Operations\n\n- CreateState(molID, formula, variables) - Initialize state\n- LoadState(molID) - Read current state \n- SaveState(molID, state) - Write state\n- AdvanceStep(molID) - Mark current complete, find next\n- ResetState(molID) - Reset all steps to pending\n\n## Files\n\n- internal/mol/state.go\n- internal/mol/types.go","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-24T15:53:43.381634-08:00","updated_at":"2025-12-24T16:53:11.807645-08:00","closed_at":"2025-12-24T16:53:11.807645-08:00"} {"id":"bd-hvng","title":"Merge: bd-w193","description":"branch: polecat/nux\ntarget: main\nsource_issue: bd-w193\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:23:47.496139-08:00","updated_at":"2025-12-20T23:17:26.996479-08:00","closed_at":"2025-12-20T23:17:26.996479-08:00"} {"id":"bd-hw1g","title":"Merge: quartz-mjxey2w1","description":"branch: polecat/quartz-mjxey2w1\ntarget: main\nsource_issue: quartz-mjxey2w1\nrig: beads\nagent_bead: bd-beads-polecat-quartz","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-02T14:00:55.648449-08:00","updated_at":"2026-01-02T17:14:49.305672-08:00","closed_at":"2026-01-02T17:14:49.305672-08:00","close_reason":"Orphaned MR - quartz stopped (design doc), branch never pushed","created_by":"beads/polecats/quartz"} -{"id":"bd-hw3w","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for {{version}}","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:01.016558-08:00","updated_at":"2025-12-20T17:59:26.262511-08:00","closed_at":"2025-12-20T01:23:50.3879-08:00","dependencies":[{"issue_id":"bd-hw3w","depends_on_id":"bd-czss","type":"blocks","created_at":"2025-12-19T22:56:23.219257-08:00","created_by":"daemon"},{"issue_id":"bd-hw3w","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:14.941855-08:00","created_by":"daemon"}]} +{"id":"bd-hw3w","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for {{version}}","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:01.016558-08:00","updated_at":"2025-12-20T17:59:26.262511-08:00","closed_at":"2025-12-20T01:23:50.3879-08:00","dependencies":[{"issue_id":"bd-hw3w","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:14.941855-08:00","created_by":"daemon"},{"issue_id":"bd-hw3w","depends_on_id":"bd-czss","type":"blocks","created_at":"2025-12-19T22:56:23.219257-08:00","created_by":"daemon"}]} {"id":"bd-hy9p","title":"Add --body-file flag to bd create for reading descriptions from files","description":"## Problem\n\nCreating issues with long/complex descriptions via CLI requires shell escaping gymnastics:\n\n```bash\n# Current workaround - awkward heredoc quoting\nbd create --title=\"...\" --description=\"$(cat \u003c\u003c'EOF'\n...markdown...\nEOF\n)\"\n\n# Often fails with quote escaping errors in eval context\n# Agents resort to writing temp files then reading them\n```\n\n## Proposed Solution\n\nAdd `--body-file` and `--description-file` flags to read description from a file, matching `gh` CLI pattern.\n\n```bash\n# Natural pattern that aligns with training data\ncat \u003e /tmp/desc.md \u003c\u003c 'EOF'\n...markdown content...\nEOF\n\nbd create --title=\"...\" --body-file=/tmp/desc.md\n```\n\n## Implementation\n\n### 1. Add new flags to `bd create`\n\n```go\ncreateCmd.Flags().String(\"body-file\", \"\", \"Read description from file (use - for stdin)\")\ncreateCmd.Flags().String(\"description-file\", \"\", \"Alias for --body-file\")\n```\n\n### 2. Flag precedence\n\n- If `--body-file` or `--description-file` is provided, read from file\n- If value is `-`, read from stdin\n- Otherwise fall back to `--body` or `--description` flag\n- If neither provided, description is empty (current behavior)\n\n### 3. Error handling\n\n- File doesn't exist → clear error message\n- File not readable → clear error message\n- stdin specified but not available → clear error message\n\n## Benefits\n\n✅ **Matches training data**: `gh issue create --body-file file.txt` is a common pattern\n✅ **No shell escaping issues**: File content is read directly\n✅ **Works with any content**: Markdown, special characters, quotes, etc.\n✅ **Agent-friendly**: Agents already write complex content to temp files\n✅ **User-friendly**: Easier for humans too when pasting long descriptions\n\n## Related Commands\n\nConsider adding similar support to:\n- `bd update --body-file` (for updating descriptions)\n- `bd comment --body-file` (if/when we add comments)\n\n## Examples\n\n```bash\n# From file\nbd create --title=\"Add new feature\" --body-file=feature.md\n\n# From stdin\necho \"Quick description\" | bd create --title=\"Bug fix\" --body-file=-\n\n# With other flags\nbd create \\\n --title=\"Security issue\" \\\n --type=bug \\\n --priority=0 \\\n --body-file=security-report.md \\\n --label=security\n```\n\n## Testing\n\n- Test with normal files\n- Test with stdin (`-`)\n- Test with non-existent files (error handling)\n- Test with binary files (should handle gracefully)\n- Test with empty files (valid - empty description)\n- Test that `--description-file` and `--body-file` are equivalent aliases","status":"tombstone","priority":1,"issue_type":"feature","created_at":"2025-11-22T00:02:08.762684-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} -{"id":"bd-hzvz","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649359-08:00","updated_at":"2025-12-19T22:57:31.604229-08:00","closed_at":"2025-12-19T22:57:31.604229-08:00","dependencies":[{"issue_id":"bd-hzvz","depends_on_id":"bd-2ep8","type":"blocks","created_at":"2025-12-19T22:56:48.652376-08:00","created_by":"stevey"},{"issue_id":"bd-hzvz","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.652068-08:00","created_by":"stevey"}]} +{"id":"bd-hzvz","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for 0.30.7","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:48.649359-08:00","updated_at":"2025-12-19T22:57:31.604229-08:00","closed_at":"2025-12-19T22:57:31.604229-08:00","dependencies":[{"issue_id":"bd-hzvz","depends_on_id":"bd-8pyn","type":"parent-child","created_at":"2025-12-19T22:56:48.652068-08:00","created_by":"stevey"},{"issue_id":"bd-hzvz","depends_on_id":"bd-2ep8","type":"blocks","created_at":"2025-12-19T22:56:48.652376-08:00","created_by":"stevey"}]} {"id":"bd-i0rx","title":"Merge: bd-ao0s","description":"branch: polecat/rictus\ntarget: main\nsource_issue: bd-ao0s\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-20T01:13:42.716658-08:00","updated_at":"2025-12-20T23:17:26.993744-08:00","closed_at":"2025-12-20T23:17:26.993744-08:00"} {"id":"bd-i3ed","title":"Refactor bd setup to recipe-based architecture (GH#898)","description":"## Summary\n\nReplace tool-specific setup commands (cursor, claude, etc.) with a generic recipe-based system. New tools become config entries, not code changes.\n\n## Motivation\n\nGH#898 requests Kilo Code integration. Current approach requires new Go code for each tool:\n- `cmd/bd/setup/cursor.go`\n- `cmd/bd/setup/kilocode.go` (proposed)\n- `cmd/bd/setup/windsurf.go` (future?)\n- ...\n\nThis does not scale. All these integrations do the same thing:\n1. Generate markdown content (beads workflow instructions)\n2. Write to tool-specific path\n\nThe **content** is identical. Only the **destination path** varies.\n\n## Design\n\n### Core Insight\n\nBeads does not need to know anything about Kilo Code, Cursor, or Claude Code beyond where they read their rules files. That is a path mapping—data, not code.\n\n### Recipe Format\n\n```toml\n# .beads/recipes.toml (user additions/overrides)\n[cursor]\npath = \".cursor/rules/bd.md\"\n\n[claude]\npath = \"CLAUDE.md\"\n\n[kilocode]\npath = \".kilocode/rules/bd.md\"\n\n[my-custom-editor]\npath = \".myeditor/config/bd.md\"\n```\n\n### Built-in Defaults\n\nShip sensible defaults compiled into binary:\n- cursor → `.cursor/rules/bd.md`\n- claude → `CLAUDE.md`\n- windsurf → `.windsurf/rules/bd.md`\n- cody → `.cody/rules/bd.md` (verify path)\n\nUser file overrides/extends built-in defaults.\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `bd setup \u003crecipe\u003e` | Write template to recipe path |\n| `bd setup --list` | Show available recipes (built-in + user) |\n| `bd setup --print` | Dump template to stdout |\n| `bd setup -o \u003cpath\u003e` | Write to arbitrary path (escape hatch) |\n| `bd setup \u003crecipe\u003e --check` | Verify if installed |\n| `bd setup \u003crecipe\u003e --remove` | Delete the file |\n| `bd setup --add \u003cname\u003e \u003cpath\u003e` | Save custom recipe |\n\n### Template\n\nSingle markdown template embedded in binary. Contains:\n- What beads is\n- Key commands (`bd ready`, `bd create`, `bd close`, etc.)\n- Workflow guidance\n- JSON flags for programmatic use\n\n### Implementation Plan\n\n1. Add `--print` and `-o` flags to existing setup command\n2. Create `internal/recipes/` package\n - Built-in recipes (Go map or embed)\n - Load/merge user `.beads/recipes.toml`\n3. Refactor `cmd/bd/setup/setup.go` to use recipes\n4. Remove tool-specific files (`cursor.go`, etc.)\n5. Add `--add` command to save custom recipes\n6. Update documentation\n\n### Migration\n\nExisting `bd setup cursor` continues to work—just backed by recipe lookup instead of dedicated code.\n\n## Out of Scope (for now)\n\n- `--global` flag (user-level config paths) — use `-o` escape hatch\n- `mode: append` (add to existing file) — wait until requested\n- GitHub recipe registry — overkill for path mappings\n- TOML migration for config.yaml — separate initiative\n\n## Response to GH#898\n\nOnce implemented, respond to PR:\n\n\u003e Thanks for the contribution! We are refactoring `bd setup` to a recipe-based approach where new tools are config entries, not code changes.\n\u003e\n\u003e Instead of new Go files, please submit a PR adding Kilo Code to the built-in recipes in `internal/recipes/builtin.go` (or equivalent). Happy to help if you have questions!\n\n## References\n\n- GH#898: Kilo Code integration request\n- Current setup code: `cmd/bd/setup/`\n","status":"closed","priority":1,"issue_type":"feature","created_at":"2026-01-04T20:05:44.32166-08:00","updated_at":"2026-01-04T21:57:21.225792-08:00","closed_at":"2026-01-04T21:57:21.225792-08:00","close_reason":"Implemented recipe-based architecture for bd setup","created_by":"beads/crew/fang"} {"id":"bd-i54l","title":"Extract Gas Town-specific issue types from beads core","description":"dispatched_by: beads/crew/dave\n\n## Problem\n\nBeads has accumulated issue types that are specific to Gas Town's orchestration model:\n\n```go\nTypeAgent IssueType = \"agent\" // Agent identity bead\nTypeRole IssueType = \"role\" // Agent role definition \nTypeRig IssueType = \"rig\" // Rig identity bead (project container)\nTypeConvoy IssueType = \"convoy\" // Cross-project tracking\nTypeSlot IssueType = \"slot\" // Exclusive access slot (merge-slot gate)\n```\n\nThis violates separation of concerns. Beads is supposed to be a **generic AI-friendly issue tracker** that Gas Town happens to use - not \"Gas Town's issue tracker.\"\n\n## Impact\n\n- **Credibility**: Beads can't be presented as a standalone tool when it has hardcoded knowledge of a specific orchestration system\n- **Coupling**: Changes to Gas Town's identity model require beads releases\n- **Confusion**: Users outside Gas Town see types that don't apply to them\n\n## Solution\n\n### Option A: Labels instead of types\nGas Town uses labels like `gt:agent`, `gt:role`, `gt:rig` instead of dedicated types. Beads stays generic.\n\n### Option B: Type extension mechanism\nBeads supports custom type registration via config. Gas Town registers its types at init time.\n\n### Option C: Separate identity store\nGas Town maintains agent/role/rig identity outside beads entirely. Beads only tracks work items.\n\n## Types to evaluate\n\n| Type | Keep in beads? | Rationale |\n|------|----------------|-----------|\n| `gate` | Yes | Generic workflow concept (async waits) |\n| `molecule` | Yes | Generic workflow templates |\n| `agent` | **No** | Gas Town identity |\n| `role` | **No** | Gas Town identity |\n| `rig` | **No** | Gas Town identity |\n| `convoy` | **No** | Gas Town cross-rig tracking |\n| `slot` | Maybe | Could be generic \"mutex\" concept |\n\n## Files affected\n\n- `internal/types/types.go` - Type definitions\n- `cmd/bd/create.go` - Type validation\n- `cmd/bd/update.go` - Type validation \n- `internal/storage/sqlite/migrations/030_agent_fields.go` - Schema fields\n- Possibly others with type switch statements","status":"closed","priority":1,"issue_type":"epic","created_at":"2026-01-06T20:26:52.332746-08:00","updated_at":"2026-01-06T22:19:33.376638-08:00","closed_at":"2026-01-06T22:19:33.376638-08:00","close_reason":"Core type extraction complete. All Gas Town types (agent, role, rig, convoy, slot) removed from beads core and replaced with label-based identification. Remaining task bd-jybi is a data migration for existing beads, which is a deployment concern.","created_by":"beads/crew/dave"} @@ -574,7 +574,7 @@ {"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.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.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.2","type":"blocks","created_at":"2025-12-22T00:07:29.516134-08:00","created_by":"daemon"},{"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"}]} {"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"}]} {"id":"bd-kwro","title":"Beads Messaging \u0026 Knowledge Graph (v0.30.2)","description":"Add messaging semantics and extended graph links to Beads, enabling it to serve as\nthe universal substrate for knowledge work - issues, messages, documents, and threads\nas nodes in a queryable graph.\n\n## Motivation\n\nGas Town (GGT) needs inter-agent communication. Rather than a separate mail system,\ncollapse messaging into Beads - one system, one sync, one query interface, all in git.\n\nThis also positions Beads as a foundation for:\n- Company-wide issue tracking (like Notion)\n- Threaded conversations (like Reddit/Slack)\n- Knowledge graphs with loose associations\n- Arbitrary workflow UIs built on top\n\n## New Issue Type\n\n**message** - ephemeral communication between workers\n- sender: who sent it\n- assignee: recipient\n- priority: P0 (urgent) to P4 (routine)\n- status: open (unread) -\u003e closed (read)\n- ephemeral: true = can be bulk-deleted after swarm\n\n## New Graph Links\n\n**replies_to** - conversation threading\n- Messages reply to messages\n- Enables Reddit-style nested threads\n- Different from parent_id (not hierarchy, its conversation flow)\n\n**relates_to** - loose see also associations\n- Bidirectional knowledge graph edges\n- Not blocking, not hierarchical, just related\n- Enables discovery and traversal\n\n**duplicates** - deduplication at scale\n- Mark issue B as duplicate of canonical issue A\n- Close B, link to A\n- Essential for large issue databases\n\n**supersedes** - version chains\n- Design Doc v2 supersedes Design Doc v1\n- Track evolution of artifacts\n\n## New Fields (optional, any issue type)\n\n- sender (string) - who created this (for messages)\n- ephemeral (boolean) - can be bulk-deleted when closed\n\n## New Commands\n\nMessaging:\n- bd mail send \u003crecipient\u003e -s Subject -m Body\n- bd mail inbox (list open messages for me)\n- bd mail read \u003cid\u003e (show message content)\n- bd mail ack \u003cid\u003e (mark as read/close)\n- bd mail reply \u003cid\u003e -m Response (reply to thread)\n\nGraph links:\n- bd relate \u003cid1\u003e \u003cid2\u003e (create relates_to link)\n- bd duplicate \u003cid\u003e --of \u003ccanonical\u003e (mark as duplicate)\n- bd supersede \u003cid\u003e --with \u003cnew\u003e (mark superseded)\n\nCleanup:\n- bd cleanup --ephemeral (delete closed ephemeral issues)\n\n## Identity Configuration\n\nWorkers need identity for sender field:\n- BEADS_IDENTITY env var\n- Or .beads/config.json: identity field\n\n## Hooks (for GGT integration)\n\nBeads as platform - extensible without knowing about GGT.\nHook files in .beads/hooks/:\n- on_create (runs after bd create)\n- on_update (runs after bd update)\n- on_close (runs after bd close)\n- on_message (runs after bd mail send)\n\nGGT registers hooks to notify daemons of new messages.\n\n## Schema Changes (Migration Required)\n\nAdd to issue schema:\n- type: message (new valid type)\n- sender: string (optional)\n- ephemeral: boolean (optional)\n- replies_to: string (issue ID, optional)\n- relates_to: []string (issue IDs, optional)\n- duplicates: string (canonical issue ID, optional)\n- superseded_by: string (new issue ID, optional)\n\nMigration adds fields as optional - existing beads unchanged.\n\n## Success Criteria\n\n1. bd mail send/inbox/read/ack/reply work end-to-end\n2. replies_to creates proper thread structure\n3. relates_to, duplicates, supersedes links queryable\n4. Hooks fire on create/update/close/message\n5. Identity configurable via env or config\n6. Migration preserves all existing data\n7. All new features have tests","status":"tombstone","priority":0,"issue_type":"epic","created_at":"2025-12-16T03:00:53.912223-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":"epic"} @@ -600,10 +600,10 @@ {"id":"bd-lejq","title":"Release: minor version bump","description":"Bump minor version for beads release. Update version in relevant files, update CHANGELOG if present, ensure tests pass, tag release.","status":"closed","priority":1,"issue_type":"task","created_at":"2026-01-02T00:56:08.161483-08:00","updated_at":"2026-01-02T01:08:35.81288-08:00","closed_at":"2026-01-02T01:08:35.81288-08:00","close_reason":"Version 0.43.0 released","created_by":"beads/crew/dave"} {"id":"bd-lfak","title":"bd preflight: PR readiness checks for contributors","description":"## Vision\n\nEncode project-specific institutional knowledge into executable checks. CONTRIBUTING.md is documentation that's read once and forgotten; `bd preflight` is documentation that runs at exactly the right moment.\n\n## Problem Statement\n\nContributors face a \"last mile\" problem - they do the work but stumble on project-specific gotchas at PR time:\n- Nix vendorHash gets stale when go.sum changes\n- Beads artifacts leak into PRs (see bd-umbf for namespace solution)\n- Version mismatches between version.go and default.nix\n- Tests/lint not run locally before pushing\n- Other project-specific checks that only surface when CI fails\n\nThese are too obscure to remember, exist in docs nobody reads end-to-end, and waste CI round-trips.\n\n## Why beads?\n\nBeads already has a foothold in the contributor workflow. It knows:\n- Git state (staged files, branch, dirty status)\n- Project structure\n- The specific issue being worked on\n- Project-specific configuration\n\n## Proposed Interface\n\n### Tier 1: Checklist Mode (v1)\n\n $ bd preflight\n PR Readiness Checklist:\n\n [ ] Tests pass: go test -short ./...\n [ ] Lint passes: golangci-lint run ./...\n [ ] No beads pollution: check .beads/issues.jsonl diff\n [ ] Nix hash current: go.sum unchanged or vendorHash updated\n [ ] Version sync: version.go matches default.nix\n\n Run 'bd preflight --check' to validate automatically.\n\n### Tier 2: Check Mode (v2)\n\n $ bd preflight --check\n ✓ Tests pass\n ✓ Lint passes\n ⚠ Beads pollution: 3 issues in diff - are these project issues or personal?\n ✗ Nix hash stale: go.sum changed, vendorHash needs update\n Fix: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n ✓ Version sync\n\n 1 error, 1 warning. Run 'bd preflight --fix' to auto-fix where possible.\n\n### Tier 3: Fix Mode (v3)\n\n $ bd preflight --fix\n ✓ Updated vendorHash in default.nix\n ⚠ Cannot auto-fix beads pollution - manual review needed\n\n## Checks to Implement\n\n| Check | Description | Auto-fixable |\n|-------|-------------|--------------|\n| tests | Run go test -short ./... | No |\n| lint | Run golangci-lint | Partial (gofmt) |\n| beads-pollution | Detect personal issues in diff | No (see bd-umbf) |\n| nix-hash | Detect stale vendorHash | Yes (if nix available) |\n| version-sync | version.go matches default.nix | Yes |\n| no-debug | No TODO/FIXME/console.log | Warn only |\n| clean-stage | No unintended files staged | Warn only |\n\n## Future: Configuration\n\nMake checks configurable per-project via .beads/preflight.yaml:\n\n preflight:\n checks:\n - name: tests\n run: go test -short ./...\n required: true\n - name: no-secrets\n pattern: \"**/*.env\"\n staged: deny\n - name: custom-check\n run: ./scripts/validate.sh\n\nThis lets any project using beads define their own preflight checks.\n\n## Implementation Phases\n\n### Phase 1: Static Checklist\n- Implement bd preflight with hardcoded checklist for beads\n- No execution, just prints what to check\n- Update CONTRIBUTING.md to reference it\n\n### Phase 2: Automated Checks\n- Implement bd preflight --check\n- Run tests, lint, detect stale hashes\n- Clear pass/fail/warn output\n\n### Phase 3: Auto-fix\n- Implement bd preflight --fix\n- Fix vendorHash, version sync\n- Integrate with bd-umbf solution for pollution\n\n### Phase 4: Configuration\n- .beads/preflight.yaml support\n- Make it useful for other projects using beads\n- Plugin/hook system for custom checks\n\n## Dependencies\n\n- bd-umbf: Namespace isolation for beads pollution (blocking for full solution)\n\n## Success Metrics\n\n- Fewer CI failures on first PR push\n- Reduced \"fix nix hash\" commits\n- Contributors report preflight caught issues before CI","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-13T18:01:39.587078-08:00","updated_at":"2025-12-31T00:09:22.400043-08:00","closed_at":"2025-12-31T00:09:22.400043-08:00","close_reason":"All subtasks complete: bd preflight --check now runs tests, lint, nix-hash, and version-sync checks","dependencies":[{"issue_id":"bd-lfak","depends_on_id":"bd-umbf","type":"blocks","created_at":"2025-12-13T18:01:46.059901-08:00","created_by":"daemon"}]} {"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.1","type":"blocks","created_at":"2025-12-30T18:06:48.582603-08:00","created_by":"mayor"},{"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"}]} +{"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.2","type":"blocks","created_at":"2025-12-30T19:31:30.950646-08:00","created_by":"beads/crew/emma"},{"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"}]} -{"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-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.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"},{"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"}]} {"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"} @@ -621,7 +621,7 @@ {"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"} {"id":"bd-m6r3","title":"Refactor: Extract shared getEpicChildren helper for swarm commands","description":"## Context\n`getSwarmStatus` and `analyzeEpicForSwarm` in cmd/bd/swarm.go have nearly identical code for:\n- Getting epic dependents via GetDependents\n- Filtering to parent-child relationships\n- Building childIDSet map\n- Building dependency maps\n\n## Implementation\n1. Extract `getEpicChildren(ctx, store, epicID)` that returns:\n - `[]*types.Issue` - child issues\n - `map[string]bool` - child ID set\n - `map[string][]string` - dependency map (within children)\n - `error`\n\n2. Refactor both `analyzeEpicForSwarm` and `getSwarmStatus` to use it\n\n3. Consider defining a named interface for the store methods:\n ```go\n type SwarmStore interface {\n GetIssue(context.Context, string) (*types.Issue, error)\n GetDependents(context.Context, string) ([]*types.Issue, error)\n GetDependencyRecords(context.Context, string) ([]*types.Dependency, error)\n }\n ```\n\n## Files\n- cmd/bd/swarm.go (lines 150-248, 616-682)\n\n## Acceptance\n- No duplicated code for fetching epic children\n- Both commands produce identical results as before","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T21:30:55.55377-08:00","updated_at":"2025-12-28T21:43:50.759453-08:00","closed_at":"2025-12-28T21:43:50.759453-08:00","created_by":"beads/crew/emma"} -{"id":"bd-m7ib","title":"Add creator field to Issue struct","description":"Add Creator *EntityRef field to Issue. Tracks who created the issue. Optional, omitted if nil in JSONL. This enables CV chain tracking - every piece of work is attributed to its creator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:31.599447-08:00","updated_at":"2025-12-22T20:03:24.264672-08:00","closed_at":"2025-12-22T20:03:24.264672-08:00","dependencies":[{"issue_id":"bd-m7ib","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.826309-08:00","created_by":"daemon"},{"issue_id":"bd-m7ib","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.39957-08:00","created_by":"daemon"}]} +{"id":"bd-m7ib","title":"Add creator field to Issue struct","description":"Add Creator *EntityRef field to Issue. Tracks who created the issue. Optional, omitted if nil in JSONL. This enables CV chain tracking - every piece of work is attributed to its creator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:31.599447-08:00","updated_at":"2025-12-22T20:03:24.264672-08:00","closed_at":"2025-12-22T20:03:24.264672-08:00","dependencies":[{"issue_id":"bd-m7ib","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.39957-08:00","created_by":"daemon"},{"issue_id":"bd-m7ib","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.826309-08:00","created_by":"daemon"}]} {"id":"bd-m8ew","title":"Fix release molecule gate discovery and validation","description":"## Problem\n\nThe beads-release molecule has critical issues that cause it to report success when everything fails:\n\n### 1. Gate Discovery Mismatch (Critical)\n\nThe formula declares:\n```toml\n[steps.gate]\ntype = \"gh:run\"\nid = \"release.yml\" # workflow NAME\n```\n\nThis creates a gate with `AwaitID=\"release.yml\"`. But:\n- `bd gate discover` only finds gates where `AwaitID == \"\"` (empty)\n- `bd gate check` passes `release.yml` to `gh run view release.yml` which fails (expects numeric run ID)\n\n**Result**: Gate can never be automatically resolved. Agent either bypasses it manually or gets stuck.\n\n### 2. No Validation on Step Completion\n\nFormula steps are prose instructions. Nothing validates:\n- Commands actually ran successfully (exit codes)\n- Expected changes actually occurred\n- Verification assertions passed\n\nAgent can mark any step complete regardless of actual success.\n\n## Solution\n\n### Gate Fix Options\n- **Option A**: Store workflow name in separate field, discover populates await_id from matching run\n- **Option B**: Detect non-numeric await_id as workflow name hint, use it to filter gh run list\n\n### Validation Improvements\n- Steps with ```bash``` blocks should capture exit codes\n- Verification steps should have machine-checkable assertions\n- Consider script gates that run validation commands\n\n## Related\n- bd-mcva (Gate Evaluation epic) - infrastructure is done, usage pattern is broken\n- Continues design toward event-driven releases","status":"closed","priority":0,"issue_type":"bug","created_at":"2026-01-06T20:07:09.055747-08:00","updated_at":"2026-01-06T23:33:46.422048-08:00","closed_at":"2026-01-06T23:33:46.422048-08:00","close_reason":"Fixed gate discovery to handle workflow name hints in AwaitID. Gates with non-numeric AwaitID (e.g., 'release.yml') are now discovered and matched to runs by workflow name. Gate check also handles this gracefully. Created bd-u0fn for step validation improvements.","created_by":"beads/crew/dave"} {"id":"bd-m8ro","title":"Improve test coverage for internal/rpc (47.5% → 60%)","description":"The RPC package has only 47.5% test coverage. RPC is the communication layer for daemon operations.\n\nCurrent coverage: 47.5%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:09.515299-08:00","updated_at":"2025-12-23T22:42:11.921388-08:00","closed_at":"2025-12-23T22:42:11.921388-08:00"} {"id":"bd-m964","title":"Consider FTS5 for text search at scale","description":"SearchIssues uses LIKE patterns for text search which can't use indexes.\n\n**Current query (queries.go:1475-1477):**\n```sql\n(title LIKE ? OR description LIKE ? OR id LIKE ?)\n```\n\n**Problem:** Full table scan on every text search. At 100K+ issues, this becomes slow.\n\n**SQLite FTS5 solution:**\n```sql\nCREATE VIRTUAL TABLE issues_fts USING fts5(\n id, title, description, design, notes,\n content='issues',\n content_rowid='rowid'\n);\n\n-- Triggers to keep FTS in sync\nCREATE TRIGGER issues_ai AFTER INSERT ON issues BEGIN\n INSERT INTO issues_fts(rowid, id, title, description, design, notes)\n VALUES (new.rowid, new.id, new.title, new.description, new.design, new.notes);\nEND;\n-- (similar for UPDATE, DELETE)\n```\n\n**Trade-offs:**\n- Database size increase (~30-50% for text content)\n- Additional write overhead (trigger execution)\n- Better search capabilities (ranking, phrase search)\n\n**Decision needed:** Is full-text search a priority feature? Current LIKE search may be acceptable for most use cases.\n\n**Benchmark first:** Measure SearchIssues at 100K scale before implementing.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-22T22:58:56.466121-08:00","updated_at":"2026-01-02T00:17:14.332908-08:00","dependencies":[{"issue_id":"bd-m964","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:56.466764-08:00","created_by":"daemon"}]} @@ -748,15 +748,15 @@ {"id":"bd-nuh1","title":"GH#403: bd doctor --fix circular error message","description":"bd doctor --fix suggests running bd doctor --fix for deletions manifest issue. Fix to provide actual resolution. See GitHub issue #403.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:16.290018-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-nurq","title":"Implement bd mol current command","description":"Show what molecule the agent should currently be working on. Referenced by gt-um6q, gt-lz13. Needed for molecule navigation workflow in templates.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:17:54.069983-08:00","updated_at":"2025-12-23T01:23:59.523404-08:00","closed_at":"2025-12-23T01:23:59.523404-08:00"} {"id":"bd-nv1z","title":"Fix PR→MR terminology in internal workflow docs","description":"Polecats create MRs (merge requests), not PRs. Fix these references:\n\n- docs/reference.md:326 - 'review PRs' → 'review MRs'\n- docs/INSTALLING.md:187 - 'PR review' → 'MR review'\n\nPRs are external GitHub concept. MRs are internal Gas Town workflow.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-04T22:13:03.636757-08:00","updated_at":"2026-01-04T22:13:13.932166-08:00","closed_at":"2026-01-04T22:13:13.932166-08:00","close_reason":"Wrong rig - recreating in gastown","created_by":"mayor"} -{"id":"bd-nv4g","title":"Add pre-sync validation hook","description":"Future: Hook integration to run bd lint before sync, respecting config settings.","status":"closed","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:11.00402-08:00","updated_at":"2026-01-02T00:04:24.394347-08:00","closed_at":"2026-01-02T00:04:24.394347-08:00","close_reason":"Pre-sync validation hook already implemented; added comprehensive tests","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-nv4g","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.791249-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-nv4g","depends_on_id":"bd-t7jq","type":"blocks","created_at":"2026-01-01T11:19:24.008812-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-nv4g","title":"Add pre-sync validation hook","description":"Future: Hook integration to run bd lint before sync, respecting config settings.","status":"closed","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:11.00402-08:00","updated_at":"2026-01-02T00:04:24.394347-08:00","closed_at":"2026-01-02T00:04:24.394347-08:00","close_reason":"Pre-sync validation hook already implemented; added comprehensive tests","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-nv4g","depends_on_id":"bd-t7jq","type":"blocks","created_at":"2026-01-01T11:19:24.008812-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-nv4g","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.791249-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-o18s","title":"Rename 'wisp' back to 'ephemeral' in beads API","description":"The beads API uses 'wisp' terminology (Wisp field, bd wisp command) but the underlying SQLite column is 'ephemeral'. \n\nThis creates cognitive overhead since wisp is a Gas Town concept.\n\nRename to use 'ephemeral' consistently:\n- types.Issue.Wisp → types.Issue.Ephemeral\n- JSON field: wisp → ephemeral \n- CLI: bd wisp → bd ephemeral (or just use flags on existing commands)\n\nThe SQLite column already uses 'ephemeral' so no schema migration needed.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T20:16:36.627876-08:00","updated_at":"2025-12-26T21:04:10.212439-08:00","closed_at":"2025-12-26T21:04:10.212439-08:00"} {"id":"bd-o34a","title":"Design auto-squash behavior for wisps","description":"Explore the design space for automatic wisp squashing.\n\n**Context:**\nWisps are ephemeral molecules that should be squashed (digest) or burned (no trace)\nwhen complete. Currently this is manual. Should it be automatic?\n\n**Questions to answer:**\n1. When should auto-squash trigger?\n - On molecule completion?\n - On session end/handoff?\n - On patrol detection?\n \n2. What's the default summary for auto-squash?\n - Generic: 'Auto-squashed on completion'\n - Step-based: List closed steps\n - AI-generated: Require agent to provide\n\n3. Should this be configurable?\n - Per-molecule setting in formula?\n - Global config: auto_squash: true/false\n - Per-wisp flag at creation time?\n\n4. Who decides - Beads or Gas Town?\n - Beads: Provides operators (squash, burn)\n - Gas Town: Makes policy decisions\n - Proposal: GT patrol molecules call bd mol squash\n\n**Constraints:**\n- Don't lose important context (summary matters)\n- Don't create noise in digest history\n- Respect agent's intent (some wisps should burn, not squash)\n\n**Recommendation:**\nGas Town patrol molecules should have explicit squash/burn steps.\nBeads provides primitives, GT makes policy decisions.\nAuto-squash at Beads level is probably wrong layer.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-24T18:23:24.833877-08:00","updated_at":"2025-12-25T22:56:59.210809-08:00","closed_at":"2025-12-25T22:56:59.210809-08:00"} {"id":"bd-o4qy","title":"Improve CheckStaleness error handling","description":"## Problem\n\nCheckStaleness returns 'false' (not stale) for multiple error conditions instead of returning errors. This masks problems.\n\n**Location:** internal/autoimport/autoimport.go:253-285\n\n## Edge Cases That Return False\n\n1. **Invalid last_import_time format** (line 259-262)\n2. **No JSONL file found** (line 267-277) \n3. **JSONL stat fails** (line 279-282)\n\n## Fix\n\nReturn errors for abnormal conditions:\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err != nil {\n return false, fmt.Errorf(\"corrupted last_import_time: %w\", err)\n}\n\nif jsonlPath == \"\" {\n return false, fmt.Errorf(\"no JSONL file found\")\n}\n\nstat, err := os.Stat(jsonlPath)\nif err != nil {\n return false, fmt.Errorf(\"cannot stat JSONL: %w\", err)\n}\n```\n\n## Impact\nMedium - edge cases are rare but should be handled\n\n## Effort \n30 minutes - requires updating callers in RPC server","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:17:27.606219-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-o4qy","depends_on_id":"bd-2q6d","type":"blocks","created_at":"2025-11-20T20:18:26.81065-05:00","created_by":"stevey"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-o55a","title":"GH#509: bd doesn't find .beads when running from nested worktrees","description":"When worktrees are nested under main repo (.worktrees/feature/), bd stops at worktree git root instead of continuing to find .beads in parent. See GitHub issue #509 for detailed fix suggestion.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:20.281591-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-o5xe","title":"Molecule bonding: composable workflow templates","description":"Vision: Molecules should be composable like LEGO bricks or Mad Max war rig sections. Bonding lets you attach molecules together to create compound workflows.\n\nTHREE BONDING CONTEXTS:\n1. Template-time: bd mol bond A B → Create reusable compound proto\n2. Spawn-time: bd mol spawn A --attach B → Attach modules when instantiating \n3. Runtime: bd mol attach epic B → Add to running workflow\n\nBOND TYPES:\n- Sequential: B after A completes (feature → deploy)\n- Parallel: B runs alongside A (feature + docs)\n- Conditional: B only if A fails (feature → hotfix)\n\nBOND POINTS (Attachment Sites):\n- Default: B depends on A root epic completion\n- Explicit: --after issue-id for specific attachment\n- Future: Named bond points in proto definitions\n\nVARIABLE FLOW:\n- Shared namespace between bonded molecules\n- Warn on variable name conflicts\n- Future: explicit mapping with --map\n\nDATA MODEL: Issues track bonded_from to preserve compound lineage.\n\nSUCCESS CRITERIA:\n- Can bond two protos into a compound proto\n- Can spawn with --attach for on-the-fly composition\n- Can attach molecules to running workflows\n- Compound structure visible in bd mol show\n- Variables flow correctly between bonded molecules","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-21T00:58:35.479009-08:00","updated_at":"2025-12-21T17:19:45.871164-08:00","closed_at":"2025-12-21T17:19:45.871164-08:00"} {"id":"bd-o7ik","title":"Priority: refactor mol.go then bd squash","description":"Two tasks:\n\n1. bd-cnwx - Refactor mol.go (1200+ lines, split by subcommand)\n2. bd-2vh3 - Ephemeral cleanup (bd cleanup --ephemeral)\n\nRefactor first - smaller, unblocks easier review of future mol work.\n\n- Mayor","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-21T11:31:38.287244-08:00","updated_at":"2025-12-21T12:59:32.937472-08:00","closed_at":"2025-12-21T12:59:32.937472-08:00"} -{"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-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-rnnr","type":"blocks","created_at":"2025-12-21T00:59:51.652397-08:00","created_by":"daemon"},{"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"}]} +{"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-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.612655-08:00","created_by":"daemon"},{"issue_id":"bd-o9o","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.392931-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-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"} @@ -771,7 +771,7 @@ {"id":"bd-oryk","title":"Fix update-homebrew.sh awk script corrupts formula","description":"The awk script in scripts/update-homebrew.sh incorrectly removes platform conditionals (on_macos do, on_linux do, if Hardware::CPU.arm?, etc.) when updating SHA256 hashes. This corrupts the Homebrew formula.\n\nThe issue is the awk script uses 'next' to skip lines containing platform conditionals but never reconstructs them, resulting in a syntax-invalid formula.\n\nFound during v0.34.0 release - had to manually fix the formula.\n\nFix options:\n1. Rewrite awk script to properly preserve structure while updating sha256 lines only\n2. Use sed instead with targeted sha256 replacements\n3. Template approach - store formula template and fill in version/hashes","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-22T12:17:17.748792-08:00","updated_at":"2025-12-22T13:13:31.947353-08:00","closed_at":"2025-12-22T13:13:31.947353-08:00"} {"id":"bd-ot0w","title":"Work on beads-tip: Fix broken Claude integration link in ...","description":"Work on beads-tip: Fix broken Claude integration link in bd doctor (GH#623). Update URL that doesn't exist. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:08.429157-08:00","updated_at":"2025-12-19T23:20:39.790305-08:00","closed_at":"2025-12-19T23:20:39.790305-08:00"} {"id":"bd-otf4","title":"Code Review: PR #481 - Context Engineering Optimizations","description":"Comprehensive code review of the merged context engineering PR (PR #481) that reduces MCP context usage by 80-90%.\n\n## Summary\nThe PR successfully implements lazy tool schema loading and minimal issue models to reduce context window usage. Overall implementation is solid and well-tested.\n\n## Positive Findings\n✅ Well-designed models (IssueMinimal, CompactedResult)\n✅ Comprehensive test coverage (28 tests, all passing)\n✅ Clear documentation and comments\n✅ Backward compatibility preserved (show() still returns full Issue)\n✅ Sensible defaults (COMPACTION_THRESHOLD=20, PREVIEW_COUNT=5)\n✅ Tool catalog complete with all 15 tools documented\n\n## Issues Identified\nSee linked issues for specific followup tasks.\n\n## Context Engineering Architecture\n- discover_tools(): List tool names only (~500 bytes vs ~15KB)\n- get_tool_info(name): Get specific tool details on-demand\n- IssueMinimal: Lightweight model for list views (~80 bytes vs ~400 bytes)\n- CompactedResult: Auto-compacts results with \u003e20 issues\n- _to_minimal(): Conversion function (efficient, no N+1 issues)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-14T14:24:13.523532-08:00","updated_at":"2025-12-29T13:40:29.726141-08:00","closed_at":"2025-12-29T13:40:29.726141-08:00","close_reason":"Stale/spurious - test artifacts, merged PRs, or auto-close candidates"} -{"id":"bd-otli","title":"Wait for CI to pass","description":"Monitor GitHub Actions - all checks must pass before release artifacts are built","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:03.022281-08:00","updated_at":"2025-12-20T00:49:51.928591-08:00","closed_at":"2025-12-20T00:25:52.635223-08:00","dependencies":[{"issue_id":"bd-otli","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.097564-08:00","created_by":"daemon"},{"issue_id":"bd-otli","depends_on_id":"bd-7tuu","type":"blocks","created_at":"2025-12-19T22:56:23.360436-08:00","created_by":"daemon"}]} +{"id":"bd-otli","title":"Wait for CI to pass","description":"Monitor GitHub Actions - all checks must pass before release artifacts are built","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:03.022281-08:00","updated_at":"2025-12-20T00:49:51.928591-08:00","closed_at":"2025-12-20T00:25:52.635223-08:00","dependencies":[{"issue_id":"bd-otli","depends_on_id":"bd-7tuu","type":"blocks","created_at":"2025-12-19T22:56:23.360436-08:00","created_by":"daemon"},{"issue_id":"bd-otli","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.097564-08:00","created_by":"daemon"}]} {"id":"bd-otyh","title":"Agent bead prefix mismatch: gt- vs bd- for beads polecat agents","description":"When spawning polecats in beads rig, gt sling tries to create agent beads with gt-beads-polecat-* prefix, but beads requires bd- prefix. Warning: 'issue ID gt-beads-polecat-obsidian does not match configured prefix bd'. Agent beads should use the rig's configured prefix.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-30T00:13:42.570237-08:00","updated_at":"2025-12-30T18:12:30.982503-08:00","closed_at":"2025-12-30T16:57:00.673794-08:00","close_reason":"Fixed in gastown commit 05b1f30. Agent beads now use the rig's configured prefix from routes.jsonl instead of hardcoding 'gt-'. Modified polecat/manager.go and prime.go to look up the correct prefix.","created_by":"mayor"} {"id":"bd-ou35","title":"Opt-in template validation for issues","description":"## Summary\n\nAdd optional validation that issues include required sections based on type, without making it mandatory by default.\n\n## Background\n\nGH#821 proposed mandatory template validation, but that's too draconian for quick capture workflows. Instead, provide opt-in validation through multiple mechanisms.\n\n## Design\n\n### 1. `bd lint` command\n\nCheck issues for missing recommended sections:\n\n```bash\nbd lint # Lint all open issues\nbd lint bd-xxx # Lint specific issue\nbd lint --fix # Interactive: prompt to add missing sections\n```\n\nOutput:\n```\nbd-abc [bug]: Missing \"## Steps to Reproduce\"\nbd-def [task]: Missing \"## Acceptance Criteria\"\n\n2 issues with warnings\n```\n\n### 2. `--validate` flag on `bd create`\n\nOpt-in strict mode at creation time:\n\n```bash\nbd create -t bug --validate -d \"...\" # Fails if missing required sections\nbd create -t bug -d \"...\" # Succeeds (current behavior)\n```\n\n### 3. Section requirements by type\n\n| Type | Recommended Sections |\n|------|---------------------|\n| Bug | Steps to Reproduce, Acceptance Criteria |\n| Task/Feature | Acceptance Criteria |\n| Epic | Success Criteria |\n| Chore/Message | None |\n\nNote: \"Workaround\" dropped from GH#821 - not always applicable.\n\n### 4. Config option (future)\n\n```json\n// .beads/config.json\n{\n \"validation\": {\n \"on_create\": \"warn\" | \"error\" | \"none\",\n \"on_sync\": \"warn\" | \"error\" | \"none\"\n }\n}\n```\n\n### 5. Hook integration (future)\n\nPre-sync hook could run `bd lint` and warn/block based on config.\n\n## Implementation Order\n\n1. Add `RequiredSections()` to IssueType (internal/types)\n2. Add `ValidateTemplate()` function (internal/validation)\n3. Implement `bd lint` command\n4. Add `--validate` flag to `bd create`\n5. (Future) Config file support\n6. (Future) Hook integration\n\n## Acceptance Criteria\n\n- [ ] `bd lint` reports missing sections without blocking\n- [ ] `bd lint \u003cid\u003e` works on single issue\n- [ ] `bd create --validate` enforces sections\n- [ ] `bd create` without flag works as today\n- [ ] Clear, actionable error messages\n\n## References\n\n- GH#821: Original proposal (will close referencing this epic)","status":"closed","priority":3,"issue_type":"epic","created_at":"2026-01-01T11:18:04.828755-08:00","updated_at":"2026-01-04T15:22:08.707597-08:00","closed_at":"2026-01-01T19:25:09.99215-08:00","close_reason":"All P3 acceptance criteria complete. P4 items (config, hooks) are future work.","created_by":"beads/crew/grip"} {"id":"bd-ov1u","title":"Clean repo cruft: bd_new, @AGENTS.md, state.json","description":"Remove tracked cruft:\n- git rm bd_new (31MB old binary)\n- git rm @AGENTS.md (duplicate, was 'removed' but still tracked)\n- Add state.json to .gitignore, git rm --cached state.json\n- Consider moving history/EPHEMERAL_MOLECULES_DESIGN.md to docs/ or removing","status":"closed","priority":2,"issue_type":"chore","created_at":"2026-01-01T11:09:49.833027-08:00","updated_at":"2026-01-01T11:12:22.320022-08:00","closed_at":"2026-01-01T11:12:22.320022-08:00","close_reason":"Removed bd_new (31MB) and @AGENTS.md. state.json already gitignored, history/EPHEMERAL_MOLECULES_DESIGN.md did not exist.","created_by":"mayor"} @@ -845,12 +845,12 @@ {"id":"bd-qqc.8","title":"Create and push git tag v{{version}}","description":"Create the release tag and push it:\n\n```bash\ngit tag v{{version}}\ngit push origin v{{version}}\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:34.659927-08:00","updated_at":"2025-12-24T16:25:30.608841-08:00","dependencies":[{"issue_id":"bd-qqc.8","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:34.660248-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.8","depends_on_id":"bd-vgi5","type":"blocks","created_at":"2025-12-18T22:43:21.209529-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.608841-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-qqc.9","title":"Update Homebrew formula","description":"Update the Homebrew tap with new version:\n\n```bash\n./scripts/update-homebrew.sh {{version}}\n```\n\nThis script waits for GitHub Actions to complete (~5 min), then updates the formula with new SHA256 hashes.\n\nAfter running, verify the formula with:\n\n```bash\nbrew info steveyegge/beads/bd\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:42:35.815096-08:00","updated_at":"2025-12-24T16:25:30.525596-08:00","dependencies":[{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:42:35.816752-08:00","created_by":"daemon"},{"issue_id":"bd-qqc.9","depends_on_id":"bd-qqc.8","type":"blocks","created_at":"2025-12-18T22:43:21.332955-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.525596-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-qsbn","title":"swarm status: Handle external dependencies and error cases","description":"Three issues: (1) Silent error swallowing - GetDependencyRecords errors are silently continued, but analyzeEpicForSwarm returns errors. Inconsistent. (2) External dependencies ignored - if issue depends on something outside epic thats still open, we mark it Ready incorrectly. (3) Command usage string says [epic-id] (optional) but requires exactly 1 arg. File: cmd/bd/swarm.go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:31:08.574846-08:00","updated_at":"2025-12-30T15:44:43.363959-08:00","closed_at":"2025-12-30T00:36:28.565331-08:00","close_reason":"Fixed all three issues: (1) Made error handling consistent - analyzeEpicForSwarm now adds warnings for GetDependencyRecords failures instead of returning errors. (2) External dependencies now checked in getSwarmStatus - open external deps block issues. (3) Usage strings fixed to use \u003cepic-id\u003e instead of [epic-id] for required arguments.","created_by":"beads/crew/emma"} -{"id":"bd-quw1","title":"Polecat phase handoff: gt done --phase-complete","description":"Add phase handoff protocol for polecats hitting gate steps.\n\n## Current Behavior\nPolecat runs all steps, blocks on external waits, times out.\n\n## New Behavior\n1. Polecat completes work up to gate step\n2. Polecat runs: gt done --phase-complete\n3. This signals: 'phase done, molecule awaiting gate'\n4. Witness recycles polecat (context freed)\n5. When gate closes, Witness dispatches new polecat\n6. New polecat continues from step after gate\n\n## Implementation\n- Add --phase-complete flag to gt done\n- Witness tracks molecules in 'awaiting-gate' state\n- When gate closes (via bd gate resolve), molecule unblocks\n- Dispatch logic resumes molecule with new polecat\n\n## Acceptance Criteria\n- [ ] gt done --phase-complete implemented\n- [ ] Witness tracks awaiting-gate molecules\n- [ ] Gate closure triggers molecule resume\n- [ ] New polecat picks up from correct step","notes":"Beads changes committed (9269325e):\n- bd gate add-waiter \u003cgate-id\u003e \u003cwaiter\u003e\n- bd gate show \u003cgate-id\u003e --json\n- Waiters field in RPC protocol\n\nGastown changes written but need separate commit (bd-gxb4):\n- gt done --phase-complete --gate flag\n- Witness PHASE_COMPLETE handler\n- AddGateWaiter in beads wrapper\n\nBlocked on bd-gxb4 for gastown commit.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.298423-08:00","updated_at":"2026-01-04T15:22:07.769837-08:00","closed_at":"2026-01-02T16:46:55.671506-08:00","close_reason":"Complete: beads part (jasper) + gastown part (bd-gxb4/furiosa) both merged","created_by":"mayor","dependencies":[{"issue_id":"bd-quw1","depends_on_id":"bd-gxb4","type":"blocks","created_at":"2026-01-02T16:36:55.38367-08:00","created_by":"beads/polecats/jasper"},{"issue_id":"bd-quw1","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.599801-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-4k3c","type":"blocks","created_at":"2026-01-02T13:28:18.665709-08:00","created_by":"mayor"}]} +{"id":"bd-quw1","title":"Polecat phase handoff: gt done --phase-complete","description":"Add phase handoff protocol for polecats hitting gate steps.\n\n## Current Behavior\nPolecat runs all steps, blocks on external waits, times out.\n\n## New Behavior\n1. Polecat completes work up to gate step\n2. Polecat runs: gt done --phase-complete\n3. This signals: 'phase done, molecule awaiting gate'\n4. Witness recycles polecat (context freed)\n5. When gate closes, Witness dispatches new polecat\n6. New polecat continues from step after gate\n\n## Implementation\n- Add --phase-complete flag to gt done\n- Witness tracks molecules in 'awaiting-gate' state\n- When gate closes (via bd gate resolve), molecule unblocks\n- Dispatch logic resumes molecule with new polecat\n\n## Acceptance Criteria\n- [ ] gt done --phase-complete implemented\n- [ ] Witness tracks awaiting-gate molecules\n- [ ] Gate closure triggers molecule resume\n- [ ] New polecat picks up from correct step","notes":"Beads changes committed (9269325e):\n- bd gate add-waiter \u003cgate-id\u003e \u003cwaiter\u003e\n- bd gate show \u003cgate-id\u003e --json\n- Waiters field in RPC protocol\n\nGastown changes written but need separate commit (bd-gxb4):\n- gt done --phase-complete --gate flag\n- Witness PHASE_COMPLETE handler\n- AddGateWaiter in beads wrapper\n\nBlocked on bd-gxb4 for gastown commit.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.298423-08:00","updated_at":"2026-01-04T15:22:07.769837-08:00","closed_at":"2026-01-02T16:46:55.671506-08:00","close_reason":"Complete: beads part (jasper) + gastown part (bd-gxb4/furiosa) both merged","created_by":"mayor","dependencies":[{"issue_id":"bd-quw1","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.599801-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-4k3c","type":"blocks","created_at":"2026-01-02T13:28:18.665709-08:00","created_by":"mayor"},{"issue_id":"bd-quw1","depends_on_id":"bd-gxb4","type":"blocks","created_at":"2026-01-02T16:36:55.38367-08:00","created_by":"beads/polecats/jasper"}]} {"id":"bd-qvpn","title":"Merge: jasper-1767138512869","description":"branch: polecat/jasper-1767138512869\ntarget: main\nsource_issue: jasper-1767138512869\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T15:51:49.011389-08:00","updated_at":"2025-12-30T18:12:30.968698-08:00","closed_at":"2025-12-30T18:11:08.036693-08:00","created_by":"beads/polecats/jasper"} {"id":"bd-qy37","title":"Work on gt-8tmz.36: Validate expanded step IDs are unique...","description":"Work on gt-8tmz.36: Validate expanded step IDs are unique. After ApplyExpansions in internal/formula/expand.go, new steps can be created that might have duplicate IDs. Add validation in ApplyExpansions to check for duplicate step IDs after expansion. If duplicates found, return an error with the duplicate IDs. Add test in expand_test.go. When done, commit and push to main.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T20:01:27.048018-08:00","updated_at":"2025-12-25T20:04:42.594254-08:00","closed_at":"2025-12-25T20:04:42.594254-08:00"} {"id":"bd-r06v","title":"Merge: bd-phtv","description":"branch: polecat/Pinner\ntarget: main\nsource_issue: bd-phtv\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T13:48:16.853715-08:00","updated_at":"2025-12-23T19:12:08.342414-08:00","closed_at":"2025-12-23T19:12:08.342414-08:00"} {"id":"bd-r22t","title":"Execute molecule bd-mol-xga: Release beads 0.37.0","description":"Execute molecule bd-mol-xga: Release beads 0.37.0","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-26T01:12:48.454295-08:00","updated_at":"2026-01-04T23:49:29.777567-08:00","dependencies":[{"issue_id":"bd-r22t","depends_on_id":"bd-mol-xga","type":"blocks","created_at":"2025-12-26T01:13:17.380653-08:00","created_by":"daemon"}],"deleted_at":"2026-01-04T23:49:29.777567-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-r24e","title":"Gate-aware beads-release.formula v2","description":"Rewrite beads-release.formula.toml with gates for async waits.\n\n## Design\nSee ultrathink analysis in bd-d1n1 epic.\n\n## Key Changes\n1. Split into phases: Prep, Gate, Verify, Install\n2. await-ci step with gate.type=gh:run\n3. Parallel verification after gate (verify-github, verify-npm, verify-pypi)\n4. Fan-in at local-install\n\n## Formula Structure\n```toml\n# Phase 1: Prep \u0026 Push\n[[steps]]\nid = \"push-tag\"\n...\n\n# Gate: CI Completion \n[[steps]]\nid = \"await-ci\"\nneeds = [\"push-tag\"]\n[steps.gate]\ntype = \"gh:run\"\nworkflow = \"release.yml\"\ntimeout = \"30m\"\n\n# Phase 2: Verify (parallel)\n[[steps]]\nid = \"verify-github\"\nneeds = [\"await-ci\"]\n...\n```\n\n## Acceptance Criteria\n- [ ] Formula uses gate syntax\n- [ ] Phases cleanly separated\n- [ ] Parallel verification works\n- [ ] Successfully releases beads","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.414518-08:00","updated_at":"2026-01-04T15:22:07.770475-08:00","closed_at":"2026-01-02T16:52:15.309685-08:00","close_reason":"Formula v2 complete with gate syntax, phases, and parallel verification","created_by":"mayor","dependencies":[{"issue_id":"bd-r24e","depends_on_id":"bd-z6kw","type":"blocks","created_at":"2026-01-02T13:28:18.732758-08:00","created_by":"mayor"},{"issue_id":"bd-r24e","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.643128-08:00","created_by":"mayor"},{"issue_id":"bd-r24e","depends_on_id":"bd-quw1","type":"blocks","created_at":"2026-01-02T13:28:18.711394-08:00","created_by":"mayor"}]} +{"id":"bd-r24e","title":"Gate-aware beads-release.formula v2","description":"Rewrite beads-release.formula.toml with gates for async waits.\n\n## Design\nSee ultrathink analysis in bd-d1n1 epic.\n\n## Key Changes\n1. Split into phases: Prep, Gate, Verify, Install\n2. await-ci step with gate.type=gh:run\n3. Parallel verification after gate (verify-github, verify-npm, verify-pypi)\n4. Fan-in at local-install\n\n## Formula Structure\n```toml\n# Phase 1: Prep \u0026 Push\n[[steps]]\nid = \"push-tag\"\n...\n\n# Gate: CI Completion \n[[steps]]\nid = \"await-ci\"\nneeds = [\"push-tag\"]\n[steps.gate]\ntype = \"gh:run\"\nworkflow = \"release.yml\"\ntimeout = \"30m\"\n\n# Phase 2: Verify (parallel)\n[[steps]]\nid = \"verify-github\"\nneeds = [\"await-ci\"]\n...\n```\n\n## Acceptance Criteria\n- [ ] Formula uses gate syntax\n- [ ] Phases cleanly separated\n- [ ] Parallel verification works\n- [ ] Successfully releases beads","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-02T13:27:42.414518-08:00","updated_at":"2026-01-04T15:22:07.770475-08:00","closed_at":"2026-01-02T16:52:15.309685-08:00","close_reason":"Formula v2 complete with gate syntax, phases, and parallel verification","created_by":"mayor","dependencies":[{"issue_id":"bd-r24e","depends_on_id":"bd-d1n1","type":"parent-child","created_at":"2026-01-02T13:28:18.643128-08:00","created_by":"mayor"},{"issue_id":"bd-r24e","depends_on_id":"bd-quw1","type":"blocks","created_at":"2026-01-02T13:28:18.711394-08:00","created_by":"mayor"},{"issue_id":"bd-r24e","depends_on_id":"bd-z6kw","type":"blocks","created_at":"2026-01-02T13:28:18.732758-08:00","created_by":"mayor"}]} {"id":"bd-r2n1","title":"Add integration tests for RPC server and event loops","description":"After adding basic unit tests for daemon utilities, the complex daemon functions still need integration tests:\n\nCore daemon lifecycle:\n- startRPCServer: Initializes and starts RPC server with proper error handling\n- runEventLoop: Polling-based sync loop with parent monitoring and signal handling\n- runDaemonLoop: Main daemon initialization and setup\n\nHealth checking:\n- isDaemonHealthy: Checks daemon responsiveness and health metrics\n- checkDaemonHealth: Periodic health verification\n\nThese require more complex test infrastructure (mock RPC, test contexts, signal handling) and should be tackled after the unit test foundation is in place.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T12:28:56.022996362-07:00","updated_at":"2025-12-18T12:44:32.167862713-07:00","closed_at":"2025-12-18T12:44:32.167862713-07:00","dependencies":[{"issue_id":"bd-r2n1","depends_on_id":"bd-4or","type":"discovered-from","created_at":"2025-12-18T12:28:56.045893852-07:00","created_by":"mhwilkie"}]} {"id":"bd-r36u","title":"gt mq list shows empty when MRs exist","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T01:13:07.561256-08:00","updated_at":"2025-12-21T17:51:25.891037-08:00","closed_at":"2025-12-21T17:51:25.891037-08:00"} {"id":"bd-r46","title":"Support --reason flag in daemon mode for reopen command","description":"The reopen.go command has a TODO at line 61 to add reason as a comment once RPC supports AddComment. Currently --reason flag is ignored in daemon mode with a warning.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-21T18:55:10.773626-05:00","updated_at":"2025-12-21T21:47:15.43375-08:00","closed_at":"2025-12-21T21:47:15.43375-08:00"} @@ -867,7 +867,7 @@ {"id":"bd-rgd7","title":"Update CHANGELOG.md with release notes","description":"Add release notes for 0.32.1: MCP output control params (#667), pin field fix","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:16.031879-08:00","updated_at":"2025-12-20T21:54:07.982164-08:00","closed_at":"2025-12-20T21:54:07.982164-08:00","dependencies":[{"issue_id":"bd-rgd7","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:16.034926-08:00","created_by":"daemon"}]} {"id":"bd-rgyd","title":"Split internal/storage/sqlite/queries.go (1586 lines)","description":"Split internal/storage/sqlite/queries.go (1704 lines) into logical modules.\n\n## Current State\nqueries.go is 1704 lines with mixed responsibilities:\n- Issue CRUD operations\n- Search/filter operations\n- Delete operations (complex cascade logic)\n- Helper functions (parsing, formatting)\n\n## Proposed Split\n\n### 1. queries.go (keep ~400 lines) - Core CRUD\n```go\n// Core issue operations\nfunc (s *SQLiteStorage) CreateIssue(...)\nfunc (s *SQLiteStorage) GetIssue(...)\nfunc (s *SQLiteStorage) UpdateIssue(...)\nfunc (s *SQLiteStorage) CloseIssue(...)\n```\n\n### 2. queries_search.go (~300 lines) - Search/Filter\n```go\n// Search and filtering\nfunc (s *SQLiteStorage) SearchIssues(...)\nfunc (s *SQLiteStorage) GetIssueByExternalRef(...)\nfunc (s *SQLiteStorage) GetCloseReason(...)\nfunc (s *SQLiteStorage) GetCloseReasonsForIssues(...)\n```\n\n### 3. queries_delete.go (~400 lines) - Delete Operations\n```go\n// Delete operations with cascade logic\nfunc (s *SQLiteStorage) CreateTombstone(...)\nfunc (s *SQLiteStorage) DeleteIssue(...)\nfunc (s *SQLiteStorage) DeleteIssues(...)\nfunc (s *SQLiteStorage) resolveDeleteSet(...)\nfunc (s *SQLiteStorage) expandWithDependents(...)\nfunc (s *SQLiteStorage) validateNoDependents(...)\nfunc (s *SQLiteStorage) checkSingleIssueValidation(...)\nfunc (s *SQLiteStorage) trackOrphanedIssues(...)\nfunc (s *SQLiteStorage) collectOrphansForID(...)\nfunc (s *SQLiteStorage) populateDeleteStats(...)\nfunc (s *SQLiteStorage) executeDelete(...)\nfunc (s *SQLiteStorage) findAllDependentsRecursive(...)\n```\n\n### 4. queries_helpers.go (~100 lines) - Utilities\n```go\n// Helper functions (already at top of file)\nfunc parseNullableTimeString(...)\nfunc parseJSONStringArray(...)\nfunc formatJSONStringArray(...)\n```\n\n### 5. queries_rename.go (~100 lines) - ID/Prefix Operations\n```go\n// ID and prefix management\nfunc (s *SQLiteStorage) UpdateIssueID(...)\nfunc (s *SQLiteStorage) RenameDependencyPrefix(...)\nfunc (s *SQLiteStorage) RenameCounterPrefix(...)\nfunc (s *SQLiteStorage) ResetCounter(...)\n```\n\n## Implementation Steps\n\n1. **Create new files** with package declaration:\n ```go\n // queries_delete.go\n package sqlite\n \n import (...)\n ```\n\n2. **Move functions** - cut/paste, maintaining order within each file\n\n3. **Update imports** - each file needs its own imports\n\n4. **Run tests** after each file split:\n ```bash\n go test ./internal/storage/sqlite/...\n ```\n\n5. **Run linter** to catch any issues:\n ```bash\n golangci-lint run ./internal/storage/sqlite/...\n ```\n\n## File Organization\n```\ninternal/storage/sqlite/\n├── queries.go # Core CRUD (~400 lines)\n├── queries_search.go # Search/filter (~300 lines)\n├── queries_delete.go # Delete cascade (~400 lines)\n├── queries_helpers.go # Utilities (~100 lines)\n└── queries_rename.go # ID operations (~100 lines)\n```\n\n## Success Criteria\n- No file \u003e 500 lines\n- All tests pass\n- No functionality changes\n- Clear separation of concerns","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-16T18:17:23.85869-08:00","updated_at":"2025-12-23T13:40:51.62551-08:00","closed_at":"2025-12-23T13:40:51.62551-08:00","dependencies":[{"issue_id":"bd-rgyd","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.50733-08:00","created_by":"daemon"}]} {"id":"bd-rinx","title":"Witness should auto-nuke idle polecats, not escalate","description":"When witness detects an idle polecat with no work, it escalates to Mayor asking what to do.\n\nExpected: Witness should nuke idle polecats automatically if:\n1. No work hooked\n2. No uncommitted/unpushed changes (cleanup_status=clean)\n3. Idle for \u003ethreshold (e.g., 5 minutes)\n\nOnly escalate if polecat has unsaved work that needs recovery.\n\nCurrent behavior creates unnecessary mail noise for the Mayor.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-30T21:21:57.918823-08:00","updated_at":"2025-12-31T00:21:22.701781-08:00","closed_at":"2025-12-31T00:21:22.701781-08:00","close_reason":"Added Step 3a to witness patrol formula for auto-nuke of idle polecats with clean git state","created_by":"mayor"} -{"id":"bd-rl5t","title":"Integration test: agent waits for CI via gate","description":"End-to-end test of the gate workflow.\n\n## Test Scenario\n1. Agent creates gate: bd gate create --await gh:run:123 --timeout 5m --notify beads/dave\n2. Agent writes handoff and exits\n3. Deacon patrol checks gate condition\n4. (Mock) GitHub run completes\n5. Deacon notifies waiter and closes gate\n6. New agent session reads mail and resumes\n\n## Test Requirements\n- Mock GitHub API responses\n- Test timeout path\n- Test multiple waiters\n- Verify mail notifications sent","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:41.725752-08:00","updated_at":"2025-12-23T12:24:08.346347-08:00","closed_at":"2025-12-23T12:24:08.346347-08:00","dependencies":[{"issue_id":"bd-rl5t","depends_on_id":"bd-2l03","type":"blocks","created_at":"2025-12-23T11:44:56.674866-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-ykqu","type":"blocks","created_at":"2025-12-23T11:44:56.753264-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.157037-08:00","created_by":"daemon"}]} +{"id":"bd-rl5t","title":"Integration test: agent waits for CI via gate","description":"End-to-end test of the gate workflow.\n\n## Test Scenario\n1. Agent creates gate: bd gate create --await gh:run:123 --timeout 5m --notify beads/dave\n2. Agent writes handoff and exits\n3. Deacon patrol checks gate condition\n4. (Mock) GitHub run completes\n5. Deacon notifies waiter and closes gate\n6. New agent session reads mail and resumes\n\n## Test Requirements\n- Mock GitHub API responses\n- Test timeout path\n- Test multiple waiters\n- Verify mail notifications sent","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:41.725752-08:00","updated_at":"2025-12-23T12:24:08.346347-08:00","closed_at":"2025-12-23T12:24:08.346347-08:00","dependencies":[{"issue_id":"bd-rl5t","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.157037-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-2l03","type":"blocks","created_at":"2025-12-23T11:44:56.674866-08:00","created_by":"daemon"},{"issue_id":"bd-rl5t","depends_on_id":"bd-ykqu","type":"blocks","created_at":"2025-12-23T11:44:56.753264-08:00","created_by":"daemon"}]} {"id":"bd-rm8m","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"open","priority":2,"issue_type":"molecule","created_at":"2025-12-30T19:23:45.503188-08:00","updated_at":"2025-12-30T19:23:45.503188-08:00","created_by":"deacon"} {"id":"bd-rnle","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T00:17:08.220689-08:00","updated_at":"2026-01-07T00:17:08.258596-08:00","closed_at":"2026-01-07T00:17:08.258596-08:00","close_reason":"auto-closed session event","created_by":"beads/crew/emma"} {"id":"bd-rnnr","title":"BondRef data model for compound lineage","description":"Add data model support for tracking compound molecule lineage.\n\nNEW FIELDS on Issue:\n bonded_from: []BondRef // For compounds: constituent protos\n\nNEW TYPE:\n type BondRef struct {\n ProtoID string // Source proto ID\n BondType string // sequential, parallel, conditional\n BondPoint string // Attachment site (issue ID or empty for root)\n }\n\nJSONL SERIALIZATION:\n {\n \"id\": \"proto-feature-tested\",\n \"title\": \"Feature with tests\",\n \"bonded_from\": [\n {\"proto_id\": \"proto-feature\", \"bond_type\": \"root\"},\n {\"proto_id\": \"proto-testing\", \"bond_type\": \"sequential\"}\n ],\n ...\n }\n\nQUERIES:\n- GetCompoundConstituents(id) → []BondRef\n- IsCompound(id) → bool\n- GetCompoundsUsing(protoID) → []Issue // Reverse lookup","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:59:38.582509-08:00","updated_at":"2025-12-21T01:19:43.922416-08:00","closed_at":"2025-12-21T01:19:43.922416-08:00","dependencies":[{"issue_id":"bd-rnnr","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.234246-08:00","created_by":"daemon"}]} @@ -897,7 +897,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-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-su45","title":"Protect pinned issues from bd cleanup/compact","description":"Update bd cleanup and bd compact to never delete pinned issues, even if they are closed. Pinned issues should persist indefinitely as reference material.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:46.204783-08:00","updated_at":"2025-12-19T17:43:35.712617-08:00","closed_at":"2025-12-19T00:43:04.06406-08:00","dependencies":[{"issue_id":"bd-su45","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.64582-08:00","created_by":"daemon"},{"issue_id":"bd-su45","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.857586-08:00","created_by":"daemon"}]} {"id":"bd-sumr","title":"Merge: bd-t4sb","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-t4sb\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:22:21.343724-08:00","updated_at":"2025-12-20T23:17:26.997992-08:00","closed_at":"2025-12-20T23:17:26.997992-08:00"} {"id":"bd-svb5","title":"GH#505: Add bd reset/wipe command","description":"Add command to cleanly reset/wipe beads database. User reports painful manual process to start fresh. See GitHub issue #505.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:42.160966-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"feature"} {"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"} @@ -909,11 +909,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-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-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"},{"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-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-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-9g1z","type":"blocks","created_at":"2025-12-22T21:00:21.571116-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"},{"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-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"}]} {"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"} @@ -930,9 +930,9 @@ {"id":"bd-u2sc","title":"GH#692: Code quality and refactoring improvements","description":"Epic for implementing refactoring suggestions from GitHub issue #692 (rsnodgrass). These are code quality improvements that don't change functionality but improve maintainability, type safety, and performance.\n\nOriginal issue: https://github.com/steveyegge/beads/issues/692\n\nHigh priority items:\n1. Replace map[string]interface{} with typed structs for JSON output\n2. Adopt slices.SortFunc instead of sort.Slice (Go 1.21+)\n3. Split large files (sync.go, init.go, show.go)\n4. Introduce slog for structured logging in daemon\n\nLower priority:\n5. Further CLI helper extraction\n6. Preallocate slices in hot paths\n7. Polish items (error wrapping, table-driven parsing)","status":"closed","priority":3,"issue_type":"epic","created_at":"2025-12-22T14:26:31.630004-08:00","updated_at":"2025-12-23T22:07:32.477628-08:00","closed_at":"2025-12-23T22:07:32.477628-08:00"} {"id":"bd-u2sc.1","title":"Replace map[string]interface{} with typed JSON response structs","description":"Many CLI commands use map[string]interface{} for JSON output which loses type safety and compile-time error detection.\n\nFiles with map[string]interface{}:\n- cmd/bd/compact.go (10+ instances)\n- cmd/bd/cleanup.go\n- cmd/bd/daemons.go\n- cmd/bd/daemon_lifecycle.go\n\nExample fix:\n```go\n// Before\nresult := map[string]interface{}{\n \"status\": \"ok\",\n \"count\": 42,\n}\n\n// After\ntype CompactResponse struct {\n Status string `json:\"status\"`\n Count int `json:\"count\"`\n}\nresult := CompactResponse{Status: \"ok\", Count: 42}\n```\n\nBenefits:\n- Compile-time type checking\n- IDE autocompletion\n- Easier refactoring\n- Self-documenting API","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T14:26:44.088548-08:00","updated_at":"2025-12-22T15:48:22.88824-08:00","closed_at":"2025-12-22T15:48:22.88824-08:00","dependencies":[{"issue_id":"bd-u2sc.1","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:44.088931-08:00","created_by":"daemon"}]} {"id":"bd-u2sc.2","title":"Migrate sort.Slice to slices.SortFunc","description":"Go 1.21+ provides slices.SortFunc which is cleaner and slightly faster than sort.Slice.\n\nFound 15+ instances of sort.Slice in:\n- cmd/bd/autoflush.go\n- cmd/bd/count.go\n- cmd/bd/daemon_sync.go\n- cmd/bd/doctor.go\n- cmd/bd/export.go\n- cmd/bd/import.go\n- cmd/bd/integrity.go\n- cmd/bd/jira.go\n- cmd/bd/list.go\n- cmd/bd/migrate_hash_ids.go\n- cmd/bd/rename_prefix.go\n- cmd/bd/show.go\n\nExample migration:\n```go\n// Before\nsort.Slice(issues, func(i, j int) bool {\n return issues[i].Priority \u003c issues[j].Priority\n})\n\n// After\nslices.SortFunc(issues, func(a, b *types.Issue) int {\n return cmp.Compare(a.Priority, b.Priority)\n})\n```\n\nBenefits:\n- Cleaner 3-way comparison\n- Slightly better performance\n- Modern idiomatic Go","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T14:26:55.573524-08:00","updated_at":"2025-12-22T15:10:12.639807-08:00","closed_at":"2025-12-22T15:10:12.639807-08:00","dependencies":[{"issue_id":"bd-u2sc.2","depends_on_id":"bd-u2sc","type":"parent-child","created_at":"2025-12-22T14:26:55.573978-08:00","created_by":"daemon"}]} -{"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.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-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.583136-08:00","created_by":"daemon"},{"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"}]} {"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-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"} @@ -1061,7 +1061,7 @@ {"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: add gate discover step and fix local-install","description":"The beads-release formula has several issues discovered during the v0.46.0 release:\n\n## Problem 1: Missing gate discover step\n\nThe 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\nCurrent flow:\n1. push-tag (triggers CI)\n2. await-ci (gate with await_id='release.yml')\n\nThe gate check fails with 404 because 'release.yml' isn't a run ID.\n\n**Fix:** Add explicit discover step, or rely on bd-fbkd (auto-discover in gate check).\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:20:38.312564-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-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"}