From 77f817b4c34e96243104219b45bbd83d6a315cef Mon Sep 17 00:00:00 2001 From: wolf Date: Mon, 5 Jan 2026 19:13:53 -0800 Subject: [PATCH] bd sync: 2026-01-05 19:13:53 --- .beads/issues.jsonl | 62 ++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 4de76616..7c82b9e2 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -32,7 +32,7 @@ {"id":"bd-1dez.1","title":"bd distill: Extract formula from mol/epic","description":"Extract a formula from completed work (mol, wisp, or epic).\n\n**Key change**: Distill works on execution artifacts (mols/wisps/epics), not protos.\nProtos are ephemeral - they don't persist. Distillation extracts patterns from\nactual executed work.\n\n## Usage\n```bash\nbd distill bd-mol-xyz -o my-workflow.formula.json\nbd distill bd-epic-abc -o feature-workflow.formula.json\n```\n\n## Use Cases\n- **Emergent patterns**: Structured work manually, want to templatize it\n- **Modified execution**: Poured a formula, added custom steps, want to capture\n- **Learning from success**: Extract what made a complex mol succeed\n\n## Implementation\n1. Load mol/wisp/epic subgraph (root + all children)\n2. Convert to formula JSON structure\n3. Extract variables from patterns (titles, descriptions)\n4. Generate step IDs from issue titles (slugify)\n5. Write .formula.json file\n\n## Output Format\n```json\n{\n \"formula\": \"my-workflow\",\n \"description\": \"...\",\n \"version\": 1,\n \"vars\": { ... },\n \"steps\": [ ... ]\n}\n```\n\n## Architecture Note\nThis closes the formula lifecycle loop:\n Formulas ──cook──→ Mols ──distill──→ Formulas\n\nAll sharing happens via formulas. Mols contain execution context and aren't shared.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:47.045105-08:00","updated_at":"2025-12-25T18:54:39.967765-08:00","closed_at":"2025-12-25T18:54:39.967765-08:00","dependencies":[{"issue_id":"bd-1dez.1","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:47.045596-08:00","created_by":"daemon"}]} {"id":"bd-1dez.2","title":"bd formula add: Import formula to local catalog","description":"Import a formula file to the local catalog (search path).\n\n**Replaces**: \"bd mol promote\" (proto-to-proto concept is obsolete with ephemeral protos)\n\n## Usage\n```bash\n# Add a formula file to project catalog\nbd formula add my-workflow.formula.json\n\n# Add to user-level catalog\nbd formula add my-workflow.formula.json --scope user\n\n# Add from URL\nbd formula add https://example.com/workflow.formula.json\n```\n\n## Implementation\n1. Parse the formula file (validate JSON structure)\n2. Determine target directory based on scope:\n - project: .beads/formulas/\n - user: ~/.beads/formulas/\n - town: ~/gt/.beads/formulas/\n3. Copy/download formula to target\n4. Verify it is loadable: bd formula show \u003cname\u003e\n\n## Flags\n- `--scope \u003clevel\u003e` - Where to add (project|user|town, default: project)\n- `--name \u003cname\u003e` - Override formula name (default: from file)\n\n## Note\nThis is for manually adding formulas. For GitHub-hosted formulas, use:\n bd mol install github.com/org/formula-name","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:48.588283-08:00","updated_at":"2025-12-25T19:54:35.242576-08:00","closed_at":"2025-12-25T19:54:35.242576-08:00","dependencies":[{"issue_id":"bd-1dez.2","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:48.590203-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.2","depends_on_id":"bd-1dez.1","type":"blocks","created_at":"2025-12-25T12:07:06.745686-08:00","created_by":"daemon"}]} {"id":"bd-1dez.3","title":"bd mol install: Install formula from GitHub","description":"Download and cook a formula from a GitHub repository.\n\n## Usage\n```bash\n# Direct GitHub URL\nbd mol install github.com/anthropics/mol-code-review\n\n# With version tag \nbd mol install github.com/anthropics/mol-code-review@v1.2.0\n\n# Shorthand (future: via registry lookup)\nbd mol install @anthropic/mol-code-review\n```\n\n## Implementation\n1. Parse URL: extract org, repo, optional version tag\n2. Construct raw URL: `https://raw.githubusercontent.com/org/repo/[tag]/formula.json`\n3. Fetch formula.json via HTTP\n4. Validate formula structure\n5. Save to .beads/formulas/\n6. Run cook to create local proto\n7. Record in .beads/installed.json for update tracking\n\n## installed.json Format\n```json\n{\n \"mol-code-review\": {\n \"source\": \"github.com/anthropics/mol-code-review\",\n \"version\": \"v1.2.0\",\n \"installed_at\": \"2025-12-25T12:00:00Z\"\n }\n}\n```\n\n## Dependencies\n- Requires network access\n- Uses `gh` CLI or direct HTTP for auth (private repos)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:49.757336-08:00","updated_at":"2025-12-25T21:53:13.417927-08:00","closed_at":"2025-12-25T21:53:13.417927-08:00","dependencies":[{"issue_id":"bd-1dez.3","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:49.759176-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.3","depends_on_id":"bd-1dez.7","type":"blocks","created_at":"2025-12-25T12:07:06.825716-08:00","created_by":"daemon"}]} -{"id":"bd-1dez.4","title":"bd mol update: Check and update installed formulas","description":"Check for newer versions of installed formulas and update them.\n\n## Usage\n```bash\nbd mol update # Update all\nbd mol update mol-code-review # Update specific formula\nbd mol update --check # Just check, don't update\n```\n\n## Implementation\n1. Read .beads/installed.json\n2. For each installed formula:\n - Fetch latest tag from GitHub API\n - Compare with installed version\n - If newer: download, cook, update installed.json\n3. Report what was updated\n\n## Flags\n- `--check` - Only check for updates, don't install\n- `--force` - Reinstall even if up to date\n- `--json` - Machine-readable output\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:50.952041-08:00","updated_at":"2025-12-25T21:53:13.41919-08:00","closed_at":"2025-12-25T21:53:13.41919-08:00","dependencies":[{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez","type":"parent-child","created_at":"2025-12-25T12:05:50.952584-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.3","type":"blocks","created_at":"2025-12-25T12:07:06.90486-08:00","created_by":"daemon"},{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.8","type":"blocks","created_at":"2025-12-25T12:07:06.99578-08:00","created_by":"daemon"}]} +{"id":"bd-1dez.4","title":"bd mol update: Check and update installed formulas","description":"Check for newer versions of installed formulas and update them.\n\n## Usage\n```bash\nbd mol update # Update all\nbd mol update mol-code-review # Update specific formula\nbd mol update --check # Just check, don't update\n```\n\n## Implementation\n1. Read .beads/installed.json\n2. For each installed formula:\n - Fetch latest tag from GitHub API\n - Compare with installed version\n - If newer: download, cook, update installed.json\n3. Report what was updated\n\n## Flags\n- `--check` - Only check for updates, don't install\n- `--force` - Reinstall even if up to date\n- `--json` - Machine-readable output\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T12:05:50.952041-08:00","updated_at":"2025-12-25T21:53:13.41919-08:00","closed_at":"2025-12-25T21:53:13.41919-08:00","dependencies":[{"issue_id":"bd-1dez.4","depends_on_id":"bd-1dez.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"},{"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"}]} {"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"}]} @@ -56,7 +56,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"} @@ -75,9 +75,9 @@ {"id":"bd-2vh3","title":"Ephemeral issue cleanup and history compaction","description":"## Problem\n\nBeads history grows without bound. Every message, handoff, work assignment\nstays in issues.jsonl forever. Enterprise users will balk at \"git as database.\"\n\n## Solution: Two-Tier Cleanup\n\n### Tier 1: Ephemeral Cleanup (v1)\n\nbd cleanup --ephemeral --closed\n\n- Deletes closed issues where ephemeral=true from issues.jsonl\n- Safe: only removes explicitly marked ephemeral + closed\n- Preserves git history (commits still exist)\n- Run after swarm completion\n\n### Tier 2: History Compaction (v2)\n\nbd compact --squash\n\n- Rewrites issues.jsonl to remove tombstones\n- Optionally squashes git history (interactive rebase equivalent)\n- Preserves Merkle proofs for deleted items\n- Advanced: cold storage tiering\n\n## HOP Context\n\n| Layer | HOP Role | Persistence |\n|-------|----------|-------------|\n| Execution trace | None | Ephemeral |\n| Work scaffolding | None | Summarizable |\n| Work outcome | CV entry | Permanent |\n| Validation record | Stake proof | Permanent |\n\n\"Execution is ephemeral. Outcomes are permanent. You can't squash your CV.\"\n\n## Success Criteria\n\n- After cleanup --ephemeral: issues.jsonl only contains persistent work\n- Work outcomes preserved (CV entries)\n- Validation records preserved (stake proofs)\n- Execution scaffolding removed (transient coordination)","notes":"## Implementation Plan (REVISED after code review)\n\nSee history/EPHEMERAL_MOLECULES_DESIGN.md for comprehensive design + review.\n\n## Key Simplification\n\nAfter code review, Tier 1 is MUCH simpler than originally designed:\n\n- **Original**: Separate ephemeral repo with routing.ephemeral config\n- **Revised**: Just set Wisp: true in cloneSubgraph()\n\nThe wisp field and bd cleanup --wisp already exist\\!\n\n## Child Tasks (in dependency order)\n\n1. **bd-2vh3.2**: Tier 1 - Ephemeral spawning (SIMPLIFIED) [READY]\n - Just add Wisp: true to template.go:474\n - Add --persistent flag to opt out\n2. **bd-2vh3.3**: Tier 2 - Basic bd mol squash command\n3. **bd-2vh3.4**: Tier 3 - AI-powered squash summarization\n4. **bd-2vh3.5**: Tier 4 - Auto-squash on molecule completion\n5. **bd-2vh3.6**: Tier 5 - JSONL archive rotation (DEFERRED: post-1.0)\n\n## What Already Exists\n\n| Component | Location |\n|-----------|----------|\n| Ephemeral field | internal/types/types.go:45 |\n| bd cleanup --wisp | cmd/bd/cleanup.go:72 |\n| cloneSubgraph() | cmd/bd/template.go:456 |\n| loadTemplateSubgraph() | cmd/bd/template.go |\n\n## HOP Alignment\n\n'Execution is ephemeral. Outcomes are permanent. You can't squash your CV.'","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:02:20.101367-08:00","updated_at":"2025-12-21T17:50:02.958155-08:00","closed_at":"2025-12-21T17:50:02.958155-08:00"} {"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.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.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.2","type":"blocks","created_at":"2025-12-21T12:58:22.601321-08:00","created_by":"stevey"},{"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"}]} +{"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","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.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"} @@ -166,7 +166,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-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-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-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"} @@ -239,7 +239,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-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-5e9q","type":"blocks","created_at":"2025-12-27T15:11:45.07537-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-3u8m","type":"blocks","created_at":"2025-12-27T15:11:44.929207-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-x0zl","type":"blocks","created_at":"2025-12-27T15:11:44.953799-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-do8e","type":"blocks","created_at":"2025-12-27T15:11:44.905058-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-08:00","created_by":"daemon"}]} +{"id":"bd-9115","title":"CLI cleanup: Consolidate bd top-level commands","description":"## Problem\nbd has 76 top-level commands, making it hard to discover and remember.\n\n## Proposed Changes\n\n### Remove from top-level (nest instead):\n- `bd cook` → `bd formula cook` (cooking is a formula operation)\n- `bd pin` → already covered by `bd mol` commands\n- `bd thanks` → `bd info --thanks` or just README\n- `bd quickstart` → `bd help quickstart` or docs\n- `bd detect-pollution` → `bd doctor --check=pollution`\n\n### Consolidate migrations under `bd migrate`:\n- `bd migrate-hash-ids` → `bd migrate hash-ids`\n- `bd migrate-issues` → `bd migrate issues`\n- `bd migrate-sync` → `bd migrate sync`\n- `bd migrate-tombstones` → `bd migrate tombstones`\n\n### Consolidate admin under `bd admin`:\n- `bd cleanup` → `bd admin cleanup`\n- `bd compact` → `bd admin compact`\n- `bd reset` → `bd admin reset`\n\n## Backwards Compatibility\nKeep old commands as hidden aliases for one release cycle.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-27T14:28:03.299469-08:00","updated_at":"2025-12-27T16:19:44.580326-08:00","closed_at":"2025-12-27T16:19:44.580326-08:00","created_by":"mayor","dependencies":[{"issue_id":"bd-9115","depends_on_id":"bd-w3z7","type":"blocks","created_at":"2025-12-27T15:11:44.88081-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-wb9g","type":"blocks","created_at":"2025-12-27T15:11:44.977559-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-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-kff0","type":"blocks","created_at":"2025-12-27T15:11:45.027177-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-bxqv","type":"blocks","created_at":"2025-12-27T15:11:45.051629-08:00","created_by":"daemon"},{"issue_id":"bd-9115","depends_on_id":"bd-twbi","type":"blocks","created_at":"2025-12-27T15:11:45.002403-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"}]} {"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"} @@ -303,7 +303,7 @@ {"id":"bd-beads-crew-emma","title":"Crew worker emma in beads - human-managed persistent workspace.","description":"Crew worker emma in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.604042-08:00","updated_at":"2026-01-05T16:25:05.801106-08:00","created_by":"deacon"} {"id":"bd-beads-crew-fang","title":"Crew worker fang in beads - human-managed persistent workspace.","description":"Crew worker fang in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.672037-08:00","updated_at":"2026-01-05T16:31:04.551537-08:00","created_by":"deacon"} {"id":"bd-beads-crew-giles","title":"Crew worker giles in beads - human-managed persistent workspace.","description":"Crew worker giles in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null\nactive_mr: null\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T11:22:11.009942-08:00","updated_at":"2026-01-05T16:31:04.53481-08:00","created_by":"mayor"} -{"id":"bd-beads-crew-grip","title":"Crew worker grip in beads - human-managed persistent workspace.","description":"Crew worker grip in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.739788-08:00","updated_at":"2026-01-05T18:19:53.908971-08:00","created_by":"deacon"} +{"id":"bd-beads-crew-grip","title":"Crew worker grip in beads - human-managed persistent workspace.","description":"Crew worker grip in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.739788-08:00","updated_at":"2026-01-05T19:13:06.015961-08:00","created_by":"deacon"} {"id":"bd-beads-crew-wolf","title":"Crew worker wolf in beads - human-managed persistent workspace.","description":"Crew worker wolf in beads - human-managed persistent workspace.\n\nrole_type: crew\nrig: beads\nagent_state: idle\nhook_bead: null\nrole_bead: gt-crew-role\ncleanup_status: null","status":"open","priority":2,"issue_type":"agent","created_at":"2025-12-30T23:14:04.805884-08:00","updated_at":"2026-01-05T18:19:54.017172-08:00","created_by":"deacon"} {"id":"bd-beads-polecat-amber","title":"bd-beads-polecat-amber","description":"bd-beads-polecat-amber\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-uuo9\nrole_bead: hq-polecat-role\ncleanup_status: has_stash\nactive_mr: bd-3mky\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T16:17:26.278115-08:00","updated_at":"2026-01-04T16:21:46.90714-08:00","created_by":"mayor"} {"id":"bd-beads-polecat-garnet","title":"bd-beads-polecat-garnet","description":"bd-beads-polecat-garnet\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-hmeb\nrole_bead: hq-polecat-role\ncleanup_status: null\nactive_mr: bd-f1xm\nnotification_level: null","status":"open","priority":2,"issue_type":"agent","created_at":"2026-01-04T15:12:49.812132-08:00","updated_at":"2026-01-04T15:17:19.353906-08:00","created_by":"mayor"} @@ -335,7 +335,7 @@ {"id":"bd-by0d","title":"Work on beads-ldv: Fix bd graph crashes with nil pointer ...","description":"Work on beads-ldv: Fix bd graph crashes with nil pointer dereference (GH#657). Fix nil pointer in computeDependencyCounts at graph.go:428. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:55:27.829359-08:00","updated_at":"2025-12-19T23:28:32.428314-08:00","closed_at":"2025-12-19T23:20:49.038441-08:00"} {"id":"bd-c0b6","title":"bd init --from-jsonl: Skip git history scan","description":"## Problem\n\n`bd init` scans git history to find all issues ever created, which:\n- Resurrects deleted/compacted issues\n- Takes a long time on large repos\n- Defeats manual JSONL cleanup\n\n## Solution\n\nAdd `bd init --from-jsonl` flag that:\n1. Creates fresh database\n2. Imports ONLY from current .beads/issues.jsonl\n3. Skips git history scan entirely\n\n## Use Case\n\nAfter manually cleaning JSONL or receiving a clean JSONL from another source:\n```bash\n# Clean JSONL manually or via script\nbd init --from-jsonl # Use current JSONL as-is\n```\n\n(Moved from hq-c21fj)","status":"closed","priority":3,"issue_type":"feature","created_at":"2026-01-02T01:29:20.851319-08:00","updated_at":"2026-01-02T16:59:09.07064-08:00","closed_at":"2026-01-02T16:59:09.07064-08:00","close_reason":"Already implemented: bd init --from-jsonl exists and does exactly this","created_by":"beads/crew/dave"} {"id":"bd-c2po","title":"Gate eval: Consider rate limiting for GitHub API calls","description":"Each gate evaluation makes a network call to GitHub API via gh CLI. With many gates, this could hit API rate limits.\n\nFuture improvements:\n1. Batch queries where possible\n2. Add caching with TTL for recently-checked gates\n3. Exponential backoff on rate limit errors\n\nLow priority - unlikely to be an issue until we have many concurrent gates.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-25T23:13:13.295309-08:00","updated_at":"2025-12-30T19:32:18.332836-08:00","closed_at":"2025-12-30T19:32:18.332836-08:00","close_reason":"Deferred - unlikely to be an issue until we have many concurrent gates per description"} -{"id":"bd-c2xs","title":"Exclude pinned issues from bd blocked","description":"Update bd blocked to exclude pinned issues. Pinned issues are context markers and should not appear in the blocked work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:44.684242-08:00","updated_at":"2025-12-21T11:29:42.179389-08:00","closed_at":"2025-12-21T11:29:42.179389-08:00","dependencies":[{"issue_id":"bd-c2xs","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.521323-08:00","created_by":"daemon"},{"issue_id":"bd-c2xs","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.736681-08:00","created_by":"daemon"}]} +{"id":"bd-c2xs","title":"Exclude pinned issues from bd blocked","description":"Update bd blocked to exclude pinned issues. Pinned issues are context markers and should not appear in the blocked work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:44.684242-08:00","updated_at":"2025-12-21T11:29:42.179389-08:00","closed_at":"2025-12-21T11:29:42.179389-08:00","dependencies":[{"issue_id":"bd-c2xs","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.736681-08:00","created_by":"daemon"},{"issue_id":"bd-c2xs","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.521323-08:00","created_by":"daemon"}]} {"id":"bd-c3u","title":"Review PR #512: clarify bd ready docs","description":"Review and merge PR #512 from aspiers. This PR clarifies what bd ready does after git pull in README.md. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/512","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:13.405161+11:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-c4wq","title":"Work on gt-8tmz.36: Validate expanded step IDs are unique...","description":"Work on gt-8tmz.36: Validate expanded step IDs are unique. In internal/formula/, add validation during cooking that checks for duplicate step IDs after expansion. When done: 1) bd close gt-8tmz.36, 2) bd sync, 3) git push, 4) gt mq submit","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T19:26:31.323192-08:00","updated_at":"2025-12-25T19:37:49.605774-08:00","closed_at":"2025-12-25T19:37:49.605774-08:00"} {"id":"bd-c7y5","title":"Optimization: Tombstones still synced, adding overhead","description":"Tombstoned (deleted) issues are still processed during sync, adding overhead.\n\n## Evidence\n```\nImport complete: 0 created, 0 updated, 407 unchanged, 100 skipped\n```\nThose 100 skipped are tombstones - they're read from JSONL, parsed, then filtered out.\n\n## Current State (Beads repo)\n- 408 total issues\n- 99 tombstones (24% of database)\n- Every sync reads and skips these 99 entries\n\n## Impact\n- Sync time increases with tombstone count\n- JSONL file size grows indefinitely\n- Git history accumulates tombstone churn\n\n## Proposed Solutions\n\n### 1. JSONL Compaction (`bd compact`)\nPeriodically rewrite JSONL without tombstones:\n```bash\nbd compact # Removes tombstones, rewrites issues.jsonl\n```\nTrade-off: Loses delete history, but that's in git anyway.\n\n### 2. Tombstone TTL\nAuto-remove tombstones older than N days during sync:\n```go\nif issue.Deleted \u0026\u0026 time.Since(issue.UpdatedAt) \u003e 7*24*time.Hour {\n // Skip writing to new JSONL\n}\n```\n\n### 3. Archive File\nMove old closed issues to `issues-archive.jsonl`:\n- Not synced regularly\n- Available for historical queries\n- Main JSONL stays small\n\n### 4. Lazy Tombstone Handling \nDon't write tombstones to JSONL at all - just remove the line:\n- Simpler, but loses cross-clone delete propagation\n- Would need different delete propagation mechanism\n\n## Recommendation\nStart with `bd compact` command - simple, explicit, user-controlled.\n\n## Related\n- gt-tnss: Analysis - Beads database size and hygiene strategy\n- gt-ox67: Maintenance - Regular cleanup of closed MR/gate beads","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T14:41:16.925212-08:00","updated_at":"2025-12-23T23:50:23.363222-08:00","closed_at":"2025-12-23T23:50:23.363222-08:00"} @@ -387,13 +387,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-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-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-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-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-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-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"} @@ -454,7 +454,7 @@ {"id":"bd-gigi","title":"bd admin compact --older-than=0 ignores the flag, uses default 30 days","description":"When running bd admin compact --prune --older-than=0, the output says 'No expired tombstones to prune (TTL: 30 days)' - the flag value is ignored.\n\nRoot cause: In runCompactPrune() in compact_tombstone.go:180, the check 'if compactOlderThan \u003e 0' means that --older-than=0 is treated the same as not passing the flag, defaulting to 30 days.\n\nFix: Change the default flag value in compact.go:785 to -1 (sentinel for 'use default'), and treat 0 as 'expire all tombstones' by passing a negative TTL to pruneExpiredTombstones().\n\nMoved from gt-65gwa (gastown) - was filed in wrong rig.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-29T23:34:41.255352-08:00","updated_at":"2025-12-30T00:00:43.476085-08:00","closed_at":"2025-12-30T00:00:43.476085-08:00","close_reason":"Fixed: flag default changed to -1 sentinel, 0 now means expire all","created_by":"gastown/polecats/dementus"} {"id":"bd-gjla","title":"Test Thread","description":"Initial message for threading test","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:19:51.704324-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","dependencies":[{"issue_id":"bd-gjla","depends_on_id":"bd-f5cc","type":"duplicates","created_at":"2025-12-18T13:45:31.137191-08:00","created_by":"migration"}],"deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-glnl","title":"Fix agent ID parser for hyphenated rig names (GH#868)","description":"Agent ID format \u003cprefix\u003e-\u003crig\u003e-\u003crole\u003e-\u003cname\u003e fails when rig contains hyphens. Fix: parse from ends - prefix first, name last, role second-to-last (must be crew/polecat/witness/etc), rig is everything in between.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-03T13:12:36.582939-08:00","updated_at":"2026-01-03T13:22:34.844129-08:00","closed_at":"2026-01-03T13:22:34.844129-08:00","close_reason":"Fixed in commit 86c91aea","created_by":"beads/crew/grip"} -{"id":"bd-gn5r","title":"Implement bd lint command","description":"New command to check issues for missing sections. Supports: bd lint (all open), bd lint \u003cid\u003e (single), bd lint --fix (interactive).","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:08.013558-08:00","updated_at":"2026-01-01T14:18:39.458936-08:00","closed_at":"2026-01-01T14:18:39.458936-08:00","close_reason":"Implemented bd lint command with daemon and direct mode support","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-gn5r","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.944461-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-gn5r","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.736105-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-gn5r","title":"Implement bd lint command","description":"New command to check issues for missing sections. Supports: bd lint (all open), bd lint \u003cid\u003e (single), bd lint --fix (interactive).","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:08.013558-08:00","updated_at":"2026-01-01T14:18:39.458936-08:00","closed_at":"2026-01-01T14:18:39.458936-08:00","close_reason":"Implemented bd lint command with daemon and direct mode support","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-gn5r","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.736105-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-gn5r","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.944461-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-gocx","title":"Run bump-version.sh 0.32.1","description":"Execute ./scripts/bump-version.sh 0.32.1 to update all version references","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:18.470174-08:00","updated_at":"2025-12-20T21:54:54.500836-08:00","closed_at":"2025-12-20T21:54:54.500836-08:00","dependencies":[{"issue_id":"bd-gocx","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:18.471793-08:00","created_by":"daemon"},{"issue_id":"bd-gocx","depends_on_id":"bd-x3j8","type":"blocks","created_at":"2025-12-20T21:53:29.688436-08:00","created_by":"daemon"}]} {"id":"bd-gqxd","title":"Enrich MutationEvent with title and assignee","description":"Current MutationEvent only has IssueID, no context. Add Title and Assignee fields so activity feeds can display meaningful info without extra lookups. Emit these fields when creating mutation events in server_core.go.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T16:26:34.907259-08:00","updated_at":"2025-12-23T16:39:39.229462-08:00","closed_at":"2025-12-23T16:39:39.229462-08:00"} {"id":"bd-gr4q","title":"Gate await fields cleared by auto-flush/auto-import cycle","description":"## Problem\n\nWhen creating a gate with `--await` fields (e.g., `gh:run:123`), the await_type and await_id are initially stored correctly in the SQLite database. However, they get cleared (set to empty strings) during subsequent bd commands due to the auto-flush/auto-import cycle.\n\n## Reproduction Steps\n\n1. Create a gate with await:\n ```\n bd gate create --molecule test-mol --await gh:run:20517738002\n ```\n Output shows correct `await_type: gh:run, await_id: 20517738002`\n\n2. Check database - fields are present\n\n3. Run any bd command (e.g., `bd list`)\n\n4. Check database again - await_type and await_id are now empty\n\n## Root Cause\n\nGates are wisps (ephemeral issues). During the auto-flush cycle:\n1. Auto-flush exports issues to JSONL (filtering out wisps)\n2. Auto-import reads JSONL and updates DB rows\n3. The update clears fields that weren't in the JSONL (including await fields)\n\n## Workaround\n\nUsing `--no-auto-import --no-auto-flush` flags preserves the fields, but this isn't practical for normal use.\n\n## Impact\n\nGitHub gate evaluation (`bd gate eval`) cannot work because by the time eval runs, the await fields have been cleared.\n\n## Suggested Fix\n\nEither:\n1. Don't clear await fields during auto-import if they weren't in the source\n2. Store wisp fields separately from the main JSONL export\n3. Include wisps in export but filter them at sync time","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-25T22:59:11.309657-08:00","updated_at":"2025-12-25T23:20:20.33151-08:00","closed_at":"2025-12-25T23:20:20.33151-08:00"} @@ -487,7 +487,7 @@ {"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-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-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-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-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"} @@ -503,21 +503,21 @@ {"id":"bd-ifa0","title":"Merge: amber-1767146829144","description":"branch: polecat/amber-1767146829144\ntarget: main\nsource_issue: amber-1767146829144\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T18:11:33.875918-08:00","updated_at":"2025-12-30T19:35:50.452577-08:00","closed_at":"2025-12-30T18:16:13.605293-08:00","created_by":"beads/polecats/amber"} {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:43:15.598698-08:00","updated_at":"2025-12-23T04:51:29.438139-08:00","deleted_at":"2025-12-23T04:51:29.438139-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-iic1","title":"Phase 2.2: Switch bdt storage to TOON format","description":"Currently bdt stores issues in JSONL format in issues.toon file. Phase 2.2 must implement actual TOON format storage - this is the fundamental goal of the bdtoon project.\n\n## Current State (Phase 2.1)\n- issues.toon stores JSONL (intermediate format)\n- --toon flag allows output in TOON format for LLM consumption\n- Problem: We're not actually using TOON as the fundamental storage format\n\n## Required Work (Phase 2.2)\n1. Switch issue file I/O to write TOON format instead of JSONL\n - Update cmd/bdt/storage.go to use EncodeTOON for writing\n - Update cmd/bdt/storage.go to decode TOON (currently decodes JSON)\n - Ensure round-trip: write TOON → read TOON → write TOON is byte-identical\n\n2. Update command implementations\n - cmd/bdt/create.go: Write newly created issues to TOON format\n - cmd/bdt/list.go: Read issues from TOON format\n - cmd/bdt/show.go: Read from TOON format\n - cmd/bdt/import.go: Convert imported JSONL to TOON\n - cmd/bdt/export.go: Export TOON to JSONL (for bd compatibility)\n\n3. Implement TOON parser that handles gotoon's encoder-only limitation\n - Since gotoon doesn't decode TOON, need custom TOON→JSON decoder\n - OR continue storing TOON but decoding via intermediate JSON conversion\n\n4. Git merge driver optimization\n - TOON is line-oriented, better for 3-way merges than binary formats\n - Configure git merge driver for .toon files\n\n5. Comprehensive testing\n - Round-trip tests: Issue → TOON → storage → read → Issue\n - Merge conflict resolution tests with TOON format\n - Large issue set performance tests\n\n## Success Criteria\n- issues.toon stores actual TOON format (not JSONL)\n- bdt list reads from TOON file\n- bdt create writes to TOON file\n- Round-trip: create issue → list → show returns identical data\n- All 65+ tests still passing\n- Performance comparable to JSONL storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:05:41.394964404-07:00","updated_at":"2025-12-19T14:37:17.879612634-07:00","closed_at":"2025-12-19T14:37:17.879612634-07:00"} -{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","updated_at":"2026-01-04T15:22:08.701283-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-01T11:19:09.036754-08:00","updated_at":"2026-01-04T15:22:08.701283-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-imxi","title":"Add bd setup gemini for Gemini CLI integration","description":"## Summary\n\nAdd `bd setup gemini` command to install beads hooks for Gemini CLI, similar to existing `bd setup claude`.\n\nRef: GitHub #845\n\n## Research Findings\n\n### Gemini CLI Has Compatible Hooks\n\nGemini CLI (https://geminicli.com/docs/hooks/) supports nearly identical hook events:\n\n| Gemini CLI Event | Claude Code Equivalent | Purpose |\n|------------------|----------------------|---------|\n| **SessionStart** | SessionStart | Initialize resources, load context |\n| **SessionEnd** | - | Clean up, save state |\n| **PreCompress** | PreCompact | Before context compression |\n| **BeforeAgent** | - | Add context before planning |\n\nConfiguration format is almost identical to Claude:\n```json\n{\n \"hooks\": {\n \"SessionStart\": [{\n \"matcher\": \"\",\n \"hooks\": [{\n \"type\": \"command\",\n \"command\": \"bd prime\"\n }]\n }]\n }\n}\n```\n\n### GEMINI.md Support\n\n- Hierarchical loading: ~/.gemini/GEMINI.md → project root → subdirectories\n- Concatenated into system prompt automatically\n- Gemini CLI also reads AGENTS.md (already supported via `bd setup factory`)\n\n### Antigravity\n\nGoogle's IDE-based agentic platform (released Nov 2025):\n- Uses Gemini 3 with 1M token context\n- Has \"knowledge base\" for saved context\n- Less documented - may share Gemini CLI infrastructure\n- Needs separate research for dedicated support\n\n## Implementation Plan\n\n### Phase 1: Core Gemini CLI Support\n\n1. **Create `cmd/bd/setup/gemini.go`**\n - Mirror structure from `claude.go`\n - Target: `~/.gemini/settings.json`\n - Install SessionStart and PreCompress hooks\n - Support --project flag for local settings\n - Support --stealth flag\n\n2. **Add doctor check in `cmd/bd/doctor/gemini.go`**\n - Check if hooks installed\n - Verify settings.json structure\n\n3. **Update `cmd/bd/setup.go`**\n - Add gemini subcommand\n - Wire up to setup/gemini.go\n\n### Phase 2: Optional Enhancements\n\n4. **GEMINI.md generation** (optional)\n - Could generate project-level GEMINI.md\n - Or document that AGENTS.md already works\n\n5. **Antigravity support** (separate issue)\n - Needs research on Antigravity's configuration system\n - May be able to share Gemini CLI hooks\n - May need IDE-specific integration\n\n## Open Questions\n\n1. Where does Gemini CLI store settings? Need to verify `~/.gemini/settings.json` path\n2. Does Gemini CLI use same JSON structure as Claude for hooks?\n3. Can one implementation cover both Gemini CLI and Antigravity?\n4. Should we generate GEMINI.md or rely on AGENTS.md?\n\n## Acceptance Criteria\n\n- [ ] `bd setup gemini` installs hooks to Gemini CLI settings\n- [ ] `bd setup gemini --check` verifies installation\n- [ ] `bd doctor` reports Gemini CLI integration status\n- [ ] Documentation updated in docs/SETUP.md","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:47:07.399783-08:00","updated_at":"2026-01-02T00:01:16.319278-08:00","closed_at":"2026-01-02T00:01:16.319278-08:00","close_reason":"Implemented bd setup gemini with SessionStart/PreCompress hooks","created_by":"beads/crew/wolf"} {"id":"bd-in7","title":"Test message","description":"Hello world","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T23:16:13.184946-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-indn","title":"bd template commands fail with daemon mode","description":"The `bd template show` and `bd template instantiate` commands fail with 'Error loading template: no database connection' when daemon is running.\n\n**Reproduction:**\n```bash\nbd daemon --start\nbd template show bd-qqc # Error: no database connection\nbd template show bd-qqc --no-daemon # Works\n```\n\n**Expected:** Template commands should work with daemon like other commands.\n\n**Workaround:** Use `--no-daemon` flag.\n\n**Location:** Likely in cmd/bd/template.go - daemon RPC path not implemented for template operations.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-18T22:57:35.16596-08:00","updated_at":"2025-12-23T22:40:32.763595-08:00","closed_at":"2025-12-23T22:40:32.763595-08:00"} {"id":"bd-io8c","title":"Improve test coverage for internal/syncbranch (33.0% → 70%)","description":"Improve test coverage for internal/syncbranch package from 27% to 70%.\n\n## Current State\n- Coverage: 27.0%\n- Files: syncbranch.go, worktree.go\n- Tests: syncbranch_test.go (basic tests exist)\n\n## Functions Needing Tests\n\n### syncbranch.go (config management)\n- [x] ValidateBranchName - has tests\n- [ ] Get - needs store mock tests\n- [ ] GetFromYAML - needs YAML parsing tests\n- [ ] IsConfigured - needs file system tests\n- [ ] IsConfiguredWithDB - needs DB path tests\n- [ ] Set - needs store mock tests\n- [ ] Unset - needs store mock tests\n\n### worktree.go (git operations) - PRIORITY\n- [ ] CommitToSyncBranch - needs git repo fixture tests\n- [ ] PullFromSyncBranch - needs merge scenario tests\n- [ ] CheckDivergence - needs ahead/behind tests\n- [ ] ResetToRemote - needs reset scenario tests\n- [ ] performContentMerge - needs 3-way merge tests\n- [ ] extractJSONLFromCommit - needs git show tests\n- [ ] hasChangesInWorktree - needs dirty state tests\n- [ ] commitInWorktree - needs commit scenario tests\n\n## Implementation Guide\n\n1. **Use testutil fixtures:**\n ```go\n import \"github.com/steveyegge/beads/internal/testutil/fixtures\"\n \n func TestCommitToSyncBranch(t *testing.T) {\n repo := fixtures.NewGitRepo(t)\n defer repo.Cleanup()\n // ... test scenarios\n }\n ```\n\n2. **Test scenarios for worktree.go:**\n - Clean commit (no conflicts)\n - Non-fast-forward push (diverged)\n - Merge conflict resolution\n - Empty changes (nothing to commit)\n\n3. **Mock storage for syncbranch.go:**\n ```go\n store := memory.New()\n // Set up test config\n syncbranch.Set(ctx, store, \"beads-sync\")\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- All public functions have at least one test\n- Edge cases covered for git operations\n- Tests pass with `go test -race ./internal/syncbranch`\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/syncbranch\ngo test -race ./internal/syncbranch\n```","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-13T20:43:02.079145-08:00","updated_at":"2025-12-23T13:46:10.191435-08:00","closed_at":"2025-12-23T13:46:10.191435-08:00","dependencies":[{"issue_id":"bd-io8c","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.213092-08:00","created_by":"daemon"}]} {"id":"bd-ipj7","title":"enhance 'bd status' to show recent activity","description":"It would be nice to be able to quickly view the last N changes in the database, to see wha's recently been worked on. I'm imagining something like 'bd status activity'.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T11:08:50.996541974-07:00","updated_at":"2025-12-21T17:54:00.279039-08:00","closed_at":"2025-12-21T17:54:00.279039-08:00"} {"id":"bd-ipva","title":"Update go install bd to 0.33.2","description":"Rebuild and install bd to ~/go/bin:\n\n```bash\ngo install ./cmd/bd\n~/go/bin/bd version # Verify shows 0.33.2\n```\n\nNote: If ~/go/bin is in PATH before /opt/homebrew/bin, this is the version that runs by default.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760715-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-iq19","title":"Distill: promote ad-hoc epic to proto","description":"Extract a reusable proto from an existing ad-hoc epic.\n\nCOMMAND: bd mol distill \u003cepic-id\u003e [--as \u003cproto-name\u003e]\n\nBEHAVIOR:\n- Clone the epic and all children as a new proto\n- Set is_template=true on all cloned issues\n- Replace concrete values with {{variable}} placeholders (interactive or --var flags)\n- Add to proto catalog\n\nFLAGS:\n- --as NAME: Custom proto ID (default: proto-\u003cepic-id\u003e)\n- --var field=placeholder: Replace value with variable placeholder\n- --interactive: Prompt for each field that looks parameterizable\n- --dry-run: Preview the proto structure\n\nEXAMPLE:\n bd mol distill bd-o5xe --as proto-feature-workflow \\\n --var title=feature_name \\\n --var assignee=worker\n\nUSE CASES:\n- Team develops good workflow organically, wants to reuse it\n- Capture tribal knowledge as executable templates\n- Create starting point for similar future work\n\nThe reverse of spawn: instead of proto → molecule, it's molecule → proto.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T01:05:07.953538-08:00","updated_at":"2025-12-21T10:31:56.814246-08:00","closed_at":"2025-12-21T10:31:56.814246-08:00","dependencies":[{"issue_id":"bd-iq19","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T01:05:16.560404-08:00","created_by":"daemon"},{"issue_id":"bd-iq19","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T01:05:16.495774-08:00","created_by":"daemon"}]} +{"id":"bd-iq19","title":"Distill: promote ad-hoc epic to proto","description":"Extract a reusable proto from an existing ad-hoc epic.\n\nCOMMAND: bd mol distill \u003cepic-id\u003e [--as \u003cproto-name\u003e]\n\nBEHAVIOR:\n- Clone the epic and all children as a new proto\n- Set is_template=true on all cloned issues\n- Replace concrete values with {{variable}} placeholders (interactive or --var flags)\n- Add to proto catalog\n\nFLAGS:\n- --as NAME: Custom proto ID (default: proto-\u003cepic-id\u003e)\n- --var field=placeholder: Replace value with variable placeholder\n- --interactive: Prompt for each field that looks parameterizable\n- --dry-run: Preview the proto structure\n\nEXAMPLE:\n bd mol distill bd-o5xe --as proto-feature-workflow \\\n --var title=feature_name \\\n --var assignee=worker\n\nUSE CASES:\n- Team develops good workflow organically, wants to reuse it\n- Capture tribal knowledge as executable templates\n- Create starting point for similar future work\n\nThe reverse of spawn: instead of proto → molecule, it's molecule → proto.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T01:05:07.953538-08:00","updated_at":"2025-12-21T10:31:56.814246-08:00","closed_at":"2025-12-21T10:31:56.814246-08:00","dependencies":[{"issue_id":"bd-iq19","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T01:05:16.495774-08:00","created_by":"daemon"},{"issue_id":"bd-iq19","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T01:05:16.560404-08:00","created_by":"daemon"}]} {"id":"bd-iq7n","title":"Audit and fix JSONL filename mismatches across all repo clones","description":"## Problem\n\nMultiple clones of repos are configured with different JSONL filenames (issues.jsonl vs beads.jsonl), causing:\n1. JSONL files to be resurrected after deletion (one clone pushes issues.jsonl, another pushes beads.jsonl)\n2. Agents unable to see issues filed by other agents after sync\n3. Merge conflicts and data inconsistencies\n\n## Root Cause\n\nWhen repos were \"bd doctored\" or initialized at different times, some got issues.jsonl (old default) and others got beads.jsonl (Beads repo specific). These clones push their respective files, creating duplicates.\n\n## Task\n\nScan all repo clones under ~/src/ (1-2 levels deep) and standardize their JSONL configuration.\n\n### Step 1: Find all beads-enabled repos\n\n```bash\n# Find all directories named 'beads' at levels 1-2 under ~/src/\nfind ~/src -maxdepth 2 -type d -name beads\n```\n\n### Step 2: For each repo found, check configuration\n\nFor each directory from Step 1, check:\n- Does `.beads/metadata.json` exist?\n- What is the `jsonl_export` value?\n- What JSONL files actually exist in `.beads/`?\n- Are there multiple JSONL files (problem!)?\n\n### Step 3: Create audit report\n\nGenerate a report showing:\n```\nRepo Path | Config | Actual Files | Status\n----------------------------------- | ------------- | ---------------------- | --------\n~/src/beads | beads.jsonl | beads.jsonl | OK\n~/src/dave/beads | issues.jsonl | issues.jsonl | MISMATCH\n~/src/emma/beads | issues.jsonl | issues.jsonl, beads.jsonl | DUPLICATE!\n```\n\n### Step 4: Determine canonical name for each repo\n\nFor repos that are the SAME git repository (check `git remote -v`):\n- Group them together\n- Determine which JSONL filename should be canonical (majority wins, or beads.jsonl for the beads repo itself)\n- List which clones need to be updated\n\n### Step 5: Generate fix script\n\nCreate a script that for each mismatched clone:\n1. Updates `.beads/metadata.json` to use the canonical name\n2. If JSONL file needs renaming: `git mv .beads/old.jsonl .beads/new.jsonl`\n3. Removes any duplicate JSONL files: `git rm .beads/duplicate.jsonl`\n4. Commits the change\n5. Syncs: `bd sync`\n\n### Expected Output\n\n1. Audit report showing all repos and their config status\n2. List of repos grouped by git remote (same repository)\n3. Fix script or manual instructions for standardizing each repo\n4. Verification that after fixes, all clones of the same repo use the same JSONL filename\n\n### Edge Cases\n\n- Handle repos without metadata.json (use default discovery)\n- Handle repos with no git remote (standalone/local)\n- Handle repos that are not git repositories\n- Don't modify repos with uncommitted changes (warn instead)\n\n### Success Criteria\n\n- All clones of the same git repository use the same JSONL filename\n- No duplicate JSONL files in any repo\n- All configurations documented in metadata.json\n- bd doctor passes on all repos","status":"tombstone","priority":0,"issue_type":"task","created_at":"2025-11-21T23:58:35.044762-08:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-ir5t","title":"Merge: quartz-1767106247671","description":"branch: polecat/quartz-1767106247671\ntarget: main\nsource_issue: quartz-1767106247671\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T07:02:08.919103-08:00","updated_at":"2025-12-30T15:44:43.349476-08:00","closed_at":"2025-12-30T10:27:23.069509-08:00","created_by":"beads/polecats/quartz"} {"id":"bd-irah","title":"Add refs field for cross-references with relationship type","description":"The refs field enables rich relationships beyond parent/child and depends-on.\n\nStructure:\n refs: [{id: string, rel: string}]\n\nRelationship types:\n- until: active until target closes\n- caused_by: triggered by target\n- relates_to: general association\n- supersedes: replaces target\n- validates: approval relationship\n\nExample:\n refs:\n - id: gt-abc1\n rel: until\n - id: hq-xyz9\n rel: caused_by\n\nEnables:\n- bd show gt-abc1 --refs (what references this?)\n- Conditional state (muted UNTIL issue closes)\n- Audit trails (this event CAUSED_BY that issue)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-30T15:15:34.948913-08:00","updated_at":"2025-12-30T18:12:30.975264-08:00","closed_at":"2025-12-30T15:51:38.291217-08:00","close_reason":"Implemented refs feature: added until/caused-by/validates dependency types and --refs flag to bd show","created_by":"gastown/crew/max"} {"id":"bd-is6m","title":"Add gate checking to Deacon patrol loop","description":"Integrate gate checking into Deacon's patrol cycle.\n\n## Patrol Integration\n```go\nfunc (d *Deacon) checkGates(ctx context.Context) {\n gates, _ := d.store.ListOpenGates(ctx)\n \n for _, gate := range gates {\n // Check timeout\n if time.Since(gate.CreatedAt) \u003e gate.Timeout {\n d.notifyWaiters(gate, \"timeout\")\n d.closeGate(gate, \"timed out\")\n continue\n }\n \n // Check condition\n if d.checkCondition(gate.AwaitType, gate.AwaitID) {\n d.notifyWaiters(gate, \"cleared\")\n d.closeGate(gate, \"condition met\")\n }\n }\n}\n```\n\n## Note\nThis task is in Gas Town (gt), not beads. May need to be moved there.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:36.839709-08:00","updated_at":"2025-12-23T12:19:44.204647-08:00","closed_at":"2025-12-23T12:19:44.204647-08:00","dependencies":[{"issue_id":"bd-is6m","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.909253-08:00","created_by":"daemon"},{"issue_id":"bd-is6m","depends_on_id":"bd-u66e","type":"blocks","created_at":"2025-12-23T11:44:56.428084-08:00","created_by":"daemon"}]} {"id":"bd-it19","title":"Code smell: show.go is 1592 lines - needs splitting","description":"cmd/bd/show.go is 1592 lines mixing data fetching, transformation, output formatting, and thread reconstruction.\n\n**Problem:**\n- Too large to understand and maintain\n- Poor separation of concerns\n- Hard to test individual components\n\n**Acceptance Criteria:**\n- [ ] Extract formatting into show_formatter.go\n- [ ] Extract thread reconstruction into show_threads.go\n- [ ] Each file under 500 lines\n- [ ] No functionality changes\n- [ ] Tests pass","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-28T18:59:00.865612-08:00","updated_at":"2025-12-28T19:01:18.42196-08:00","closed_at":"2025-12-28T19:01:18.42196-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-it19","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.61907-08:00","created_by":"daemon"}]} {"id":"bd-iutu","title":"Test comment display","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T17:50:24.269413-08:00","updated_at":"2025-12-27T17:53:39.950742-08:00","created_by":"beads/crew/dave","deleted_at":"2025-12-27T17:53:39.950742-08:00","deleted_by":"beads/crew/dave","delete_reason":"manual delete","original_type":"task"} -{"id":"bd-iw4z","title":"Compound visualization in bd mol show","description":"Enhance bd mol show to display compound structure.\n\nENHANCEMENTS:\n- Show constituent protos and how they're bonded\n- Display bond type (sequential/parallel) between components\n- Indicate attachment points\n- Show combined variable requirements across all protos\n\nEXAMPLE OUTPUT:\n\n Compound: proto-feature-with-tests\n Bonded from:\n └─ proto-feature (root)\n └─ proto-testing (sequential, after completion)\n \n Variables: {{name}}, {{version}}, {{test_suite}}\n \n Structure:\n proto-feature-with-tests\n ├─ Design feature {{name}}\n ├─ Implement core\n ├─ Write unit tests ← from proto-testing\n └─ Run test suite {{test_suite}} ← from proto-testing","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:26.71318-08:00","updated_at":"2026-01-02T13:42:51.390118-08:00","closed_at":"2026-01-02T13:42:51.390118-08:00","close_reason":"Implemented compound visualization in mol show. Added showCompoundBondingInfo() to display bonded-from lineage with bond types. Updated both showMolecule() and showMoleculeWithParallel() to detect compounds and show the 'Bonded from:' section. Added JSON output fields is_compound and bonded_from. Added unit tests for IsCompound(), GetConstituents(), and formatBondType().","dependencies":[{"issue_id":"bd-iw4z","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.500865-08:00","created_by":"daemon"},{"issue_id":"bd-iw4z","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T00:59:51.891643-08:00","created_by":"daemon"}]} +{"id":"bd-iw4z","title":"Compound visualization in bd mol show","description":"Enhance bd mol show to display compound structure.\n\nENHANCEMENTS:\n- Show constituent protos and how they're bonded\n- Display bond type (sequential/parallel) between components\n- Indicate attachment points\n- Show combined variable requirements across all protos\n\nEXAMPLE OUTPUT:\n\n Compound: proto-feature-with-tests\n Bonded from:\n └─ proto-feature (root)\n └─ proto-testing (sequential, after completion)\n \n Variables: {{name}}, {{version}}, {{test_suite}}\n \n Structure:\n proto-feature-with-tests\n ├─ Design feature {{name}}\n ├─ Implement core\n ├─ Write unit tests ← from proto-testing\n └─ Run test suite {{test_suite}} ← from proto-testing","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:26.71318-08:00","updated_at":"2026-01-02T13:42:51.390118-08:00","closed_at":"2026-01-02T13:42:51.390118-08:00","close_reason":"Implemented compound visualization in mol show. Added showCompoundBondingInfo() to display bonded-from lineage with bond types. Updated both showMolecule() and showMoleculeWithParallel() to detect compounds and show the 'Bonded from:' section. Added JSON output fields is_compound and bonded_from. Added unit tests for IsCompound(), GetConstituents(), and formatBondType().","dependencies":[{"issue_id":"bd-iw4z","depends_on_id":"bd-rnnr","type":"blocks","created_at":"2025-12-21T00:59:51.891643-08:00","created_by":"daemon"},{"issue_id":"bd-iw4z","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.500865-08:00","created_by":"daemon"}]} {"id":"bd-iz5t","title":"Swarm: 13 beads backlog issues for polecat execution","description":"## Swarm Overview\n\n13 issues prepared for parallel polecat execution. All issues have been enhanced with concrete implementation guidance, file lists, and success criteria.\n\n## Issue List\n\n### Bug (1) - HIGH PRIORITY\n| ID | Priority | Title |\n|----|----------|-------|\n| bd-phtv | P1 | Pinned field overwritten by subsequent commands |\n\n### Test Coverage (3)\n| ID | Package | Target |\n|----|---------|--------|\n| bd-io8c | internal/syncbranch | 27% → 70% |\n| bd-thgk | internal/compact | 17% → 70% |\n| bd-tvu3 | internal/beads | 48% → 70% |\n\n### Code Quality (3)\n| ID | Task |\n|----|------|\n| bd-qioh | FatalError pattern standardization |\n| bd-rgyd | Split queries.go (1704 lines → 5 files) |\n| bd-u2sc.3 | Split cmd/bd files (sync/init/show/compact) |\n\n### Features (4)\n| ID | Task |\n|----|------|\n| bd-au0.5 | Search date/priority filters |\n| bd-ykd9 | Doctor --fix auto-repair |\n| bd-g4b4 | Close hooks system |\n| bd-likt | Gate daemon RPC |\n\n### Polish (2)\n| ID | Task |\n|----|------|\n| bd-4qfb | Doctor output formatting |\n| bd-u2sc.4 | slog structured logging |\n\n## Issue Details\n\nAll issues have been enhanced with:\n- Concrete file lists to modify\n- Code snippets and patterns\n- Success criteria\n- Test commands\n\nRun `bd show \u003cid\u003e` for full details on any issue.\n\n## Execution Notes\n\n- All issues are independent (no blockers between them)\n- bd-phtv (P1 bug) should get priority - affects bd pin functionality\n- Test coverage tasks are straightforward but time-consuming\n- File split tasks (bd-rgyd, bd-u2sc.3) are mechanical but important\n\n## Completed During Prep\n\n- bd-ucgz (P2 bug) - Fixed inline: external deps orphan check (commit f2db0a1d)\n- Moved 5 gastown issues out of beads backlog (gt-dh65, gt-ng6g, gt-fqcz, gt-gswn, gt-rw2z)\n- Deferred 4 premature/post-1.0 issues\n- Closed bd-udsi epic (core implementation complete)","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T12:43:58.427835-08:00","updated_at":"2025-12-23T20:26:50.629471-08:00","closed_at":"2025-12-23T20:26:50.629471-08:00"} {"id":"bd-j0tr","title":"Phase 1.3: Basic TOON read/write operations","description":"Add basic TOON read/write operations to bdt executable. Implement create, list, and show commands that use the internal/toon package for encoding/decoding to TOON format.\n\n## Subtasks\n1. Implement bdt create command - Create issues and serialize to TOON format\n2. Implement bdt list command - Read issues.toon and display all issues\n3. Implement bdt show command - Display single issue by ID\n4. Add file I/O operations for issues.toon\n5. Integrate internal/toon package (EncodeTOON, DecodeJSON)\n6. Write tests for create, list, show operations\n\n## Files to Create/Modify\n- cmd/bdt/create.go - Create command\n- cmd/bdt/list.go - List command \n- cmd/bdt/show.go - Show command\n- cmd/bdt/storage.go - File I/O helper\n\n## Success Criteria\n- bdt create \"Issue title\" creates and saves to issues.toon\n- bdt list displays all issues in human-readable format\n- bdt list --json shows JSON output\n- bdt show \u003cid\u003e displays single issue\n- Issues round-trip correctly: create → list → show\n- All tests passing with \u003e80% coverage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T12:59:54.270296918-07:00","updated_at":"2025-12-19T13:09:00.196045685-07:00","closed_at":"2025-12-19T13:09:00.196045685-07:00"} {"id":"bd-j3dj","title":"Code smell: Duplicated issue type switch in cook.go","description":"The same switch statement for mapping step type to IssueType appears twice in cook.go:\n\nLocation 1 (line 425):\n```go\nswitch step.Type {\ncase \"task\":\n issueType = types.TypeTask\ncase \"bug\":\n issueType = types.TypeBug\n// ...\n}\n```\n\nLocation 2 (line 764): Identical switch statement.\n\nShould extract to a helper function:\n```go\nfunc stepTypeToIssueType(stepType string) types.IssueType {\n switch stepType {\n case \"task\": return types.TypeTask\n case \"bug\": return types.TypeBug\n // ...\n default: return types.TypeTask\n }\n}\n```\n\nLocation: cmd/bd/cook.go:425 and cmd/bd/cook.go:764","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-12-28T15:31:56.630449-08:00","updated_at":"2025-12-28T15:42:13.001897-08:00","closed_at":"2025-12-28T15:42:13.001897-08:00","created_by":"beads/crew/dave","dependencies":[{"issue_id":"bd-j3dj","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.14981-08:00","created_by":"daemon"}]} @@ -545,7 +545,7 @@ {"id":"bd-kp9y","title":"gt swarm dispatch command not working","description":"The 'gt swarm dispatch' command shown in help doesn't appear to work as expected.\n\n**Observed:**\n```\n$ gt swarm dispatch bd-784c\n[prints help text instead of dispatching]\n```\n\n**Expected:**\nShould dispatch the next ready task from the epic to an available worker.\n\n**Workaround:**\nHad to manually use 'gt sling \u003cissue\u003e \u003cpolecat\u003e' for each task dispatch.\n\n**Impact:**\n- Manual task dispatch defeats swarm automation\n- Coordinator has to track which tasks are ready and which polecats are free\n\n**Suggestion:**\nImplement or fix 'gt swarm dispatch' to:\n1. Find next unassigned task in epic\n2. Find idle polecat in swarm\n3. Sling task to polecat automatically","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-28T16:18:10.320094-08:00","updated_at":"2025-12-29T18:30:05.386394-08:00","closed_at":"2025-12-29T18:30:05.386394-08:00","close_reason":"Moved to gastown: gt-s94gq (this is a gt command, not beads)","created_by":"beads/crew/dave"} {"id":"bd-kptp","title":"Merge: bd-qioh","description":"branch: polecat/Errata\ntarget: main\nsource_issue: bd-qioh\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T13:46:08.832073-08:00","updated_at":"2025-12-23T19:12:08.350136-08:00","closed_at":"2025-12-23T19:12:08.350136-08:00"} {"id":"bd-kpy","title":"Sync race: rebase-based divergence recovery resurrects tombstones","description":"## Problem\nWhen two repos sync simultaneously, tombstones can be resurrected:\n\n1. Repo A deletes issue (creates tombstone), pushes to sync branch\n2. Repo B (with 'closed' status) exports and tries to push\n3. Push fails (non-fast-forward)\n4. fetchAndRebaseInWorktree does git rebase\n5. Git rebase applies B's 'closed' patch on top of A's 'tombstone'\n6. TEXT-level rebase doesn't invoke beads merge driver\n7. 'closed' overwrites 'tombstone' = resurrection\n\n## Root Cause\nCommitToSyncBranch uses git rebase for divergence recovery, but rebase is text-level, not content-level. The proper content-level merge in PullFromSyncBranch handles tombstones correctly, but it runs AFTER the problematic push.\n\n## Proposed Fix\nOption 1: Don't push in CommitToSyncBranch - let PullFromSyncBranch handle merge+push\nOption 2: Replace git rebase with content-level merge in fetchAndRebaseInWorktree\nOption 3: Reorder sync steps: Export → Pull/Merge → Commit → Push\n\n## Workaround Applied\nExcluded tombstones from orphan detection warnings (commit 1e97d9cc).\n\nSee also: bd-3852 (Add orphan detection migration)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-17T23:29:33.049272-08:00","updated_at":"2025-12-24T22:41:09.184574-08:00","closed_at":"2025-12-24T22:41:09.184574-08:00"} -{"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"}]} +{"id":"bd-kqo1","title":"Show pin indicator in bd list output","description":"Add a visual indicator (e.g., pin emoji or [P] marker) for pinned issues in bd list output so users can easily identify them.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T23:33:47.402549-08:00","updated_at":"2025-12-21T11:30:27.272768-08:00","closed_at":"2025-12-21T11:30:27.272768-08:00","dependencies":[{"issue_id":"bd-kqo1","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.771791-08:00","created_by":"daemon"},{"issue_id":"bd-kqo1","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.985271-08:00","created_by":"daemon"}]} {"id":"bd-kqw0","title":"Update local installation","description":"Run install script or brew upgrade to get new version locally: curl -fsSL .../install.sh | bash","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066452-08:00","updated_at":"2025-12-21T13:53:49.656073-08:00","deleted_at":"2025-12-21T13:53:49.656073-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task"} {"id":"bd-kvus","title":"bd sync fails when .beads/redirect points to different repo","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-31T11:36:35.614607-08:00","updated_at":"2025-12-31T13:31:39.491734-08:00","closed_at":"2025-12-31T13:31:39.491734-08:00","close_reason":"Duplicate of bd-e2q9 (fixed in same commit)","created_by":"gastown/crew/max"} {"id":"bd-kvwf","title":"Merge: quartz-1767142008267","description":"branch: polecat/quartz-1767142008267\ntarget: main\nsource_issue: quartz-1767142008267\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T16:50:35.727954-08:00","updated_at":"2025-12-30T18:12:30.969887-08:00","closed_at":"2025-12-30T18:11:07.891839-08:00","created_by":"beads/polecats/quartz"} @@ -580,12 +580,12 @@ {"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","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.1","type":"blocks","created_at":"2025-12-30T18:06:48.602793-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.950646-08:00","created_by":"beads/crew/emma"},{"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"}]} +{"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.3","title":"Implement lint check (golangci-lint)","description":"## Summary\nAdd lint check using golangci-lint to the preflight --check mode.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Changes Required\n\n1. **Implement lint checker**:\n```go\nfunc runLintCheck() CheckResult {\n // First check if golangci-lint is available\n if _, err := exec.LookPath(\"golangci-lint\"); err != nil {\n return CheckResult{\n Name: \"lint\",\n Passed: false,\n Output: \"golangci-lint not found in PATH\",\n Command: \"golangci-lint run ./...\",\n Skipped: true,\n }\n }\n \n cmd := exec.Command(\"golangci-lint\", \"run\", \"./...\")\n output, err := cmd.CombinedOutput()\n return CheckResult{\n Name: \"lint\",\n Passed: err == nil,\n Output: string(output),\n Command: \"golangci-lint run ./...\",\n }\n}\n```\n\n2. **Add Skipped field to CheckResult** (if not already added by bd-lfak.2):\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n Skipped bool // Tool not available\n}\n```\n\n3. **Output format**:\n```\n$ bd preflight --check\n✓ Lint passes\n Command: golangci-lint run ./...\n\n# When tool missing:\n⚠ Lint skipped (golangci-lint not found)\n Install: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\n\n# On failure:\n✗ Lint fails\n Command: golangci-lint run ./...\n Output: [lint errors]\n```\n\n### Dependencies\n- Depends on bd-lfak.2 for CheckResult struct and runChecks() framework\n\n### Testing\n- Test with clean lint (this repo should pass)\n- Test with golangci-lint not in PATH (mock or temp PATH)\n- Test with lint errors (intentional bad code)\n\n### Notes\n- This repo has baseline warnings documented in docs/LINTING.md\n- golangci-lint respects .golangci.yml config if present\n\n### Acceptance Criteria\n- [x] Runs golangci-lint when --check flag is used\n- [x] Gracefully handles missing golangci-lint binary\n- [x] Shows clear pass/fail/skip output\n- [x] Shows lint errors on failure\n- [x] Works with --json flag","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:31.445431-08:00","updated_at":"2025-12-31T00:03:07.142467-08:00","closed_at":"2025-12-31T00:03:07.142467-08:00","close_reason":"Implemented lint check with golangci-lint, graceful skip when tool not available","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak","type":"parent-child","created_at":"2025-12-30T18:06:31.447094-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.602793-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.3","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.950646-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-lfak.4","title":"Implement nix-hash staleness detection","description":"## Summary\nDetect when go.sum has changed but vendorHash in default.nix may be stale.\n\n## Implementation Details\n\n### Location\nFile: `cmd/bd/preflight.go`\n\n### Detection Logic\n\n**Tier 1 (Simple - implement this):**\nCheck if go.sum has uncommitted changes (staged or unstaged). If so, warn that vendorHash might need updating.\n\n```go\nfunc runNixHashCheck() CheckResult {\n // Check if go.sum has changes\n cmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"HEAD\", \"--\", \"go.sum\")\n output, _ := cmd.Output()\n \n // Also check staged changes\n stagedCmd := exec.Command(\"git\", \"diff\", \"--name-only\", \"--cached\", \"--\", \"go.sum\")\n stagedOutput, _ := stagedCmd.Output()\n \n hasChanges := len(output) \u003e 0 || len(stagedOutput) \u003e 0\n \n if hasChanges {\n return CheckResult{\n Name: \"nix-hash\",\n Passed: false,\n Output: \"go.sum has changes - vendorHash in default.nix may need updating\",\n Command: \"git diff HEAD -- go.sum\",\n Warning: true, // Not a hard failure, just a warning\n }\n }\n \n return CheckResult{\n Name: \"nix-hash\",\n Passed: true,\n Output: \"go.sum unchanged\",\n Command: \"git diff HEAD -- go.sum\",\n }\n}\n```\n\n**Tier 2 (Future - auto-fix):**\nIf nix is available, compute the correct vendorHash:\n```bash\nnix-prefetch-url --unpack \"https://...\"\n# or use nix build with --print-out-paths\n```\n\n### Key Files\n- `go.sum` - Go module checksums\n- `default.nix` - Contains vendorHash on line 12\n\n### Output Format\n```\n$ bd preflight --check\n✓ Nix hash current (go.sum unchanged)\n\n# When go.sum changed:\n⚠ Nix hash may be stale\n go.sum has uncommitted changes\n Hint: If you modified dependencies, run nix build to get new vendorHash\n \n# When nix available (future):\n✗ Nix hash stale\n Expected: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n Current: sha256-ovG0EWQFtifHF5leEQTFvTjGvc+yiAjpAaqaV0OklgE=\n Fix: bd preflight --fix\n```\n\n### Add Warning field to CheckResult\n```go\ntype CheckResult struct {\n Name string\n Passed bool\n Output string\n Command string\n Skipped bool\n Warning bool // Yellow ⚠ instead of red ✗\n}\n```\n\n### Testing\n- Test with clean go.sum (no changes)\n- Test with modified go.sum (stage a fake change, then reset)\n- Test output format\n\n### Acceptance Criteria\n- [x] Detects when go.sum has uncommitted changes\n- [x] Shows as warning (⚠) not error (✗)\n- [x] Provides helpful hint about vendorHash\n- [x] Works with --json flag\n- [x] Does not require nix to be installed (just git)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-30T18:06:32.318167-08:00","updated_at":"2025-12-31T00:06:02.045812-08:00","closed_at":"2025-12-31T00:06:02.045812-08:00","close_reason":"Implemented nix-hash staleness detection with warning state for go.sum changes","created_by":"mayor","dependencies":[{"issue_id":"bd-lfak.4","depends_on_id":"bd-lfak","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","type":"parent-child","created_at":"2025-12-30T18:06:33.382134-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.1","type":"blocks","created_at":"2025-12-30T18:06:48.64101-08:00","created_by":"mayor"},{"issue_id":"bd-lfak.5","depends_on_id":"bd-lfak.2","type":"blocks","created_at":"2025-12-30T19:31:30.989707-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-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-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-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.891992-08:00","created_by":"daemon"},{"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"}]} {"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"} {"id":"bd-lk39","title":"Add composite index (issue_id, event_type) on events table","description":"GetCloseReason and GetCloseReasonsForIssues filter by both issue_id and event_type.\n\n**Query (queries.go:355-358):**\n```sql\nSELECT comment FROM events\nWHERE issue_id = ? AND event_type = ?\nORDER BY created_at DESC LIMIT 1\n```\n\n**Problem:** Currently uses idx_events_issue but must filter event_type in memory.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_events_issue_type ON events(issue_id, event_type);\n```\n\n**Priority:** Low - events table is typically small relative to issues.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T22:58:54.070587-08:00","updated_at":"2025-12-22T23:15:13.841988-08:00","closed_at":"2025-12-22T23:15:13.841988-08:00","dependencies":[{"issue_id":"bd-lk39","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:54.071286-08:00","created_by":"daemon"}]} {"id":"bd-ll2n","title":"Move relate/unrelate under dep command","description":"Make relate and unrelate subcommands of dep (dep relate, dep unrelate). They're dependency operations and belong there.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:10.379321-08:00","updated_at":"2025-12-28T13:04:02.520266-08:00","closed_at":"2025-12-28T13:04:02.520266-08:00","created_by":"stevey"} @@ -733,10 +733,10 @@ {"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-obep","title":"Spawn-time bonding: --attach flag","description":"Add --attach flag to bd mol spawn for on-the-fly composition.\n\nCOMMAND: bd mol spawn proto-feature --attach proto-docs --attach proto-testing\n\nBEHAVIOR:\n- Spawn the primary proto as normal\n- For each --attach: spawn that proto and wire to primary\n- Attachments become children of primary's root epic\n- Dependencies wired based on bond type (default: sequential)\n\nFLAGS:\n- --attach PROTO: Attach a proto (can repeat)\n- --attach-type TYPE: sequential (default) or parallel for all attachments\n- --after ISSUE: Attachment point for attached protos\n\nVARIABLE HANDLING:\n- All attached protos share variable namespace\n- Warn on variable name conflicts\n- All --var flags apply to all protos","notes":"DESIGN NOTE: This is syntactic sugar. Equivalent to:\n bd mol spawn proto-A\n bd mol bond $new_epic_id proto-B\n \nKeeping as separate task because it's a common UX pattern worth optimizing.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T00:59:06.178092-08:00","updated_at":"2025-12-21T10:42:50.554816-08:00","closed_at":"2025-12-21T10:42:50.554816-08:00","dependencies":[{"issue_id":"bd-obep","depends_on_id":"bd-o91r","type":"blocks","created_at":"2025-12-21T00:59:51.733369-08:00","created_by":"daemon"},{"issue_id":"bd-obep","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.368491-08:00","created_by":"daemon"}]} {"id":"bd-oeeb","title":"Fix daemon path mismatch on case-insensitive filesystems (GH#869)","description":"macOS case-insensitive filesystem causes daemon to reject connections when path casing differs (Desktop vs desktop). Fix: normalize paths using filepath.EvalSymlinks + case normalization before comparison in registry lookup.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-03T13:12:51.892534-08:00","updated_at":"2026-01-03T13:23:08.071155-08:00","closed_at":"2026-01-03T13:23:08.071155-08:00","close_reason":"Fixed in 631b067c - normalized paths for case-insensitive filesystem comparison","created_by":"beads/crew/grip"} {"id":"bd-oehv","title":"Add 'rm' as alias for 'remove' in bd dep subcommand","description":"Cobra supports command aliases. Add 'rm' as a short alias for 'remove' in the dep subcommand for convenience.\n\nExample: bd dep rm issue1 issue2 should work the same as bd dep remove issue1 issue2\n\nImplementation: Add Aliases: []string{\"rm\"} to the depRemoveCmd definition.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-29T17:28:04.489734-08:00","updated_at":"2025-12-29T17:50:11.910495-08:00","closed_at":"2025-12-29T17:50:11.910495-08:00","close_reason":"Added Aliases: []string{\"rm\"} to depRemoveCmd","created_by":"mayor"} {"id":"bd-of2p","title":"Improve version bump molecule with missing steps","description":"During v0.32.1 release, discovered missing steps in the release molecule:\n\n**Missing from molecule:**\n1. Rebuild ~/go/bin/bd (only did ~/.local/bin/bd)\n2. Install beads-mcp from local source: `uv tool install --reinstall ./integrations/beads-mcp`\n3. Restart daemons with `bd daemons killall`\n4. (Optional) Publish beads-mcp to PyPI\n\n**Current molecule steps (bd-6s61):**\n1. Update CHANGELOG.md\n2. Update info.go versionChanges \n3. Run bump-version.sh\n4. Run tests and linting\n5. Update local installation\n6. Commit and push release\n7. Wait for CI\n8. Verify release artifacts\n\n**Proposed additions:**\n- After \"Update local installation\": rebuild BOTH ~/.local/bin/bd AND ~/go/bin/bd\n- Add: \"Install beads-mcp from source\" step\n- Add: \"Restart daemons\" step\n- Add: \"Verify all versions match\" step that checks all artifacts\n\n**Also learned:**\n- Must run from mayor/rig to avoid git conflicts with bd sync (already documented in bump-version.sh)","notes":"CORRECTION: npm publishing IS automated and working!\n\n**Package naming:**\n- OLD: `beads` (npm) - deprecated, stuck at 0.2.1\n- CURRENT: `@beads/bd` (npm) - scoped package, auto-published by CI\n\n**How it works:**\n- CI uses OIDC trusted publishing (no token needed)\n- Workflow: .github/workflows/release.yml → publish-npm job\n- Permissions: `id-token: write` enables GitHub OIDC\n- To install: `npm install -g @beads/bd` (not `npm install beads`)\n\n**All publishing is automated on tag push:**\n1. GitHub Release - goreleaser ✓\n2. PyPI - publish-pypi job ✓\n3. Homebrew - update-homebrew job ✓\n4. npm (@beads/bd) - publish-npm job ✓\n\n**Remaining molecule improvements (local steps only):**\n- Rebuild BOTH ~/.local/bin/bd AND ~/go/bin/bd\n- Install beads-mcp from source: `uv tool install --reinstall ./integrations/beads-mcp`\n- Restart daemons: `bd daemons killall`\n- Run from mayor/rig to avoid git conflicts with bd sync\n- Final verification step to check all local versions match","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T22:09:11.845787-08:00","updated_at":"2025-12-22T16:01:18.199132-08:00","closed_at":"2025-12-22T16:01:18.199132-08:00"} @@ -822,7 +822,7 @@ {"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-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-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-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"} @@ -844,7 +844,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-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"},{"issue_id":"bd-rl5t","depends_on_id":"bd-2l03","type":"blocks","created_at":"2025-12-23T11:44:56.674866-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-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"}]} {"id":"bd-rp4o","title":"Deleted issues resurrect during bd sync (tombstones not propagating)","description":"## Problem\n\nWhen issues are deleted with bd delete --force, they get deleted from the local DB but resurrect during the next bd sync.\n\n## Reproduction\n\n1. Observe orphan warnings (bd-cb64c226.*, bd-cbed9619.*)\n2. Delete them: bd delete bd-cb64c226.1 ... --force\n3. Run bd sync\n4. Orphan warnings reappear - issues were resurrected!\n\n## Root Cause Hypothesis\n\nThe sync branch workflow (beads-sync) has the old state before deletions. When bd sync pulls from beads-sync and copies JSONL to main, the deleted issues are re-imported.\n\nTombstones may not be properly:\n1. Written to beads-sync during export\n2. Propagated during pull/merge\n3. Honored during import\n\n## Related\n\n- bd-7b7h: chicken-and-egg sync.branch bug (same workflow)\n- bd-ncwo: ID-based fallback matching to prevent ghost resurrection\n\n## Files to Investigate\n\n- cmd/bd/sync.go (export/import flow)\n- internal/syncbranch/worktree.go (PullFromSyncBranch, copyJSONLToMainRepo)\n- internal/importer/ (tombstone handling)","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T23:09:43.072696-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -858,7 +858,7 @@ {"id":"bd-s00m.1","title":"Schema: Add 'hooked' as valid status","description":"Add 'hooked' to the valid status enum in the beads schema.\n\n## Files to Update\n\n1. `internal/types/types.go` - Add StatusHooked constant\n2. `internal/storage/sqlite/schema.go` - Add 'hooked' to CHECK constraint\n3. `internal/storage/sqlite/migrations/` - New migration to alter constraint\n\n## Status Values After Change\n\n- open\n- in_progress\n- blocked\n- deferred\n- hooked (NEW)\n- closed\n- pinned\n- tombstone\n\n## Validation\n\n- bd update \u003cid\u003e --status=hooked should work\n- bd list --status=hooked should filter correctly","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T22:16:56.596014-08:00","updated_at":"2025-12-28T22:30:39.09597-08:00","closed_at":"2025-12-28T22:30:39.09597-08:00","created_by":"stevey","dependencies":[{"issue_id":"bd-s00m.1","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:16:56.596584-08:00","created_by":"daemon"}]} {"id":"bd-s00m.2","title":"Blocking logic: Include 'hooked' in blocking statuses","description":"Update the blocked_cache.go SQL to treat 'hooked' as a blocking status.\n\n## Current Logic (line ~163)\n\n```sql\nblocker.status IN ('open', 'in_progress', 'blocked', 'deferred')\n```\n\n## Updated Logic\n\n```sql\nblocker.status IN ('open', 'in_progress', 'blocked', 'deferred', 'hooked')\n```\n\n## Files to Update\n\n- internal/storage/sqlite/blocked_cache.go\n\n## Test Cases\n\n1. Issue A (hooked) blocks Issue B → B should NOT appear in bd ready\n2. Issue A (pinned, type=agent) → B should appear in bd ready\n3. Issue A (hooked) closed → B should appear in bd ready","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T22:16:56.809269-08:00","updated_at":"2025-12-28T22:32:27.742984-08:00","closed_at":"2025-12-28T22:32:27.742984-08:00","created_by":"stevey","dependencies":[{"issue_id":"bd-s00m.2","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:16:56.809716-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.2","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.129513-08:00","created_by":"daemon"}]} {"id":"bd-s00m.3","title":"UI: Style 'hooked' status in bd list output","description":"Add styling for 'hooked' status in bd list and bd show output.\n\n## Semantic\n\n'hooked' means actively being worked by an agent (GUPP). Should be visually prominent.\n\n## Suggested Styling\n\n- Color: Cyan or bright blue (active, in-flight)\n- Distinct from 'in_progress' (which is more passive/cooperative)\n\n## Files to Update\n\n- internal/ui/styles.go - Add case for 'hooked' status","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-28T22:16:57.019828-08:00","updated_at":"2025-12-28T22:34:31.132171-08:00","closed_at":"2025-12-28T22:34:31.132171-08:00","created_by":"stevey","dependencies":[{"issue_id":"bd-s00m.3","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.148918-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.3","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:16:57.020313-08:00","created_by":"daemon"}]} -{"id":"bd-s00m.4","title":"Migration: Convert pinned work items to hooked","description":"Migrate existing pinned beads that represent work-on-hook to use 'hooked' status.\n\n## Migration Logic\n\n```sql\nUPDATE issues \nSET status = 'hooked'\nWHERE status = 'pinned' \n AND issue_type NOT IN ('agent', 'role')\n```\n\n## What Stays Pinned\n\n- Agent identity beads (gt-mayor, gt-witness-gastown, etc.)\n- Role definition beads (gt-mayor-role, etc.)\n\n## What Becomes Hooked\n\n- Molecules on hooks (mol_type field set)\n- Regular issues/tasks that were pinned to hooks\n\n## Verification\n\nAfter migration:\n- bd list --status=pinned should only show agents/roles\n- bd list --status=hooked should show work on hooks","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T22:17:13.872171-08:00","updated_at":"2025-12-28T22:36:09.039612-08:00","closed_at":"2025-12-28T22:36:09.039612-08:00","created_by":"stevey","dependencies":[{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:17:13.872786-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.168228-08:00","created_by":"daemon"}]} +{"id":"bd-s00m.4","title":"Migration: Convert pinned work items to hooked","description":"Migrate existing pinned beads that represent work-on-hook to use 'hooked' status.\n\n## Migration Logic\n\n```sql\nUPDATE issues \nSET status = 'hooked'\nWHERE status = 'pinned' \n AND issue_type NOT IN ('agent', 'role')\n```\n\n## What Stays Pinned\n\n- Agent identity beads (gt-mayor, gt-witness-gastown, etc.)\n- Role definition beads (gt-mayor-role, etc.)\n\n## What Becomes Hooked\n\n- Molecules on hooks (mol_type field set)\n- Regular issues/tasks that were pinned to hooks\n\n## Verification\n\nAfter migration:\n- bd list --status=pinned should only show agents/roles\n- bd list --status=hooked should show work on hooks","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T22:17:13.872171-08:00","updated_at":"2025-12-28T22:36:09.039612-08:00","closed_at":"2025-12-28T22:36:09.039612-08:00","created_by":"stevey","dependencies":[{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m.1","type":"blocks","created_at":"2025-12-28T22:17:22.168228-08:00","created_by":"daemon"},{"issue_id":"bd-s00m.4","depends_on_id":"bd-s00m","type":"parent-child","created_at":"2025-12-28T22:17:13.872786-08:00","created_by":"daemon"}]} {"id":"bd-s0qf","title":"GH#405: Fix prefix parsing with hyphens - multi-hyphen prefixes parsed incorrectly","description":"Fixed: ExtractIssuePrefix was falling back to first-hyphen for word-like suffixes, breaking multi-hyphen prefixes like 'hacker-news' and 'me-py-toolkit'.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:13:56.951359-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"bd-s1pz","title":"Merge: bd-u2sc.4","description":"branch: polecat/Logger\ntarget: main\nsource_issue: bd-u2sc.4\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:45:52.412757-08:00","updated_at":"2025-12-23T19:12:08.356689-08:00","closed_at":"2025-12-23T19:12:08.356689-08:00"} {"id":"bd-s2t","title":"wish: a 'continue' or similar cmd/flag which means alter last issue","description":"so many time I create an issue and then have another thought: 'oh, before I did X and it crashed there was ZZZ happening' or 'actually that is P4 not P2'. It would be nice if when `bd {cmd}` is used without a {title} or {id} it just adds or updates the most recently touched issue.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-30T18:12:30.971727-08:00","closed_at":"2025-12-30T16:57:07.001784-08:00","close_reason":"Implemented last-touched tracking for update/close without ID"} @@ -881,15 +881,15 @@ {"id":"bd-t3en","title":"Merge: bd-d28c","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-d28c\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:43:16.997802-08:00","updated_at":"2025-12-23T21:21:57.694201-08:00","closed_at":"2025-12-23T21:21:57.694201-08:00"} {"id":"bd-t4sb","title":"Work on beads-d8h: Fix prefix mismatch false positive wit...","description":"Work on beads-d8h: Fix prefix mismatch false positive with multi-hyphen prefixes like 'asianops-audit-' (GH#422). When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:19.545069-08:00","updated_at":"2025-12-19T23:28:32.429127-08:00","closed_at":"2025-12-19T23:21:45.471711-08:00"} {"id":"bd-t4u1","title":"False positive detection by Kaspersky Antivirus (Trojan)","description":"Kaspersky Antivirus falsely detects beads (bd.exe v0.23.1) as a Trojan (PDM:Trojan.Win32.Generic) and removes it.\nEvent: Malicious object detected\nComponent: System Watcher\nObject name: bd.exe\n","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-20T18:56:12.498187-05:00","updated_at":"2025-12-23T23:47:23.182018-08:00","closed_at":"2025-12-23T23:47:23.182018-08:00"} -{"id":"bd-t7jq","title":"Add validation config support","description":"Future: Add .beads/config.json support for validation settings (on_create, on_sync: warn|error|none).","status":"closed","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:09.96198-08:00","updated_at":"2026-01-04T15:22:08.70688-08:00","closed_at":"2026-01-01T19:33:42.078778-08:00","close_reason":"Validation config support merged","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-t7jq","depends_on_id":"bd-gn5r","type":"blocks","created_at":"2026-01-01T11:19:23.985574-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-t7jq","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.7728-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-t7jq","title":"Add validation config support","description":"Future: Add .beads/config.json support for validation settings (on_create, on_sync: warn|error|none).","status":"closed","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:09.96198-08:00","updated_at":"2026-01-04T15:22:08.70688-08:00","closed_at":"2026-01-01T19:33:42.078778-08:00","close_reason":"Validation config support merged","created_by":"beads/crew/grip","dependencies":[{"issue_id":"bd-t7jq","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.7728-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-t7jq","depends_on_id":"bd-gn5r","type":"blocks","created_at":"2026-01-01T11:19:23.985574-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-ta4r","title":"Wisp operations should auto-bypass daemon","description":"During the v0.39.1 release, every wisp operation required --no-daemon flag:\n\nbd --no-daemon mol wisp create beads-release --var version=0.39.1\nbd --no-daemon close bd-eph-xxx\nbd --no-daemon mol burn bd-eph-bv2\n\nSince wisps are ephemeral (Ephemeral=true) and never exported to JSONL, they are inherently local-only. The daemon cannot help with them anyway.\n\nProposal: When operating on bd-eph-* issues or wisp subcommands, auto-detect and bypass the daemon. This would:\n- Reduce friction in wisp workflows\n- Prevent accidental daemon use that would fail anyway\n- Make the ephemeral nature more obvious","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-27T22:51:24.409066-08:00","updated_at":"2025-12-28T02:10:30.123755-08:00","closed_at":"2025-12-28T02:10:30.123755-08:00","created_by":"beads/crew/emma"} {"id":"bd-tbz3","title":"bd init UX Improvements","description":"bd init leaves users with incomplete setup, requiring manual bd doctor --fix. Issues found: (1) git hooks not installed if user declines prompt, (2) no auto-migration when CLI is upgraded, (3) stale merge driver configs from old versions. Fix by making bd init more robust with better defaults and auto-migration.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-21T23:16:00.333543-08:00","updated_at":"2025-12-23T04:20:51.88847-08:00","closed_at":"2025-12-23T04:20:51.88847-08:00"} {"id":"bd-tcvh","title":"Test prefix beads","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-27T14:24:41.707092-08:00","updated_at":"2025-12-27T14:24:50.421598-08:00","created_by":"stevey","deleted_at":"2025-12-27T14:24:50.421598-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} -{"id":"bd-tggf","title":"Code Health Review Dec 2025: Technical Debt Cleanup","description":"Epic grouping technical debt identified in the Dec 16, 2025 code health review.\n\n## Overall Health Grade: B (Solid foundation, needs cleanup)\n\n### P1 (High Priority):\n- bd-74w1: Consolidate duplicate path-finding utilities\n- [deleted:bd-b6xo]: Remove/fix ClearDirtyIssues() race condition\n- [deleted:bd-b3og]: Fix TestImportBugIntegration deadlock\n\n### P2 (Medium Priority):\n- bd-05a8: Split large files (doctor.go, sync.go)\n- bd-qioh: Standardize error handling patterns\n- bd-rgyd: Split queries.go (1586 lines)\n- bd-9g1z: Fix/remove TestFindJSONLPathDefault\n\n### P3 (Low Priority):\n- bd-ork0: Add comments to 30+ ignored errors\n- bd-4nqq: Remove dead test code in info_test.go\n- bd-dhza: Reduce global state in main.go\n\n## Key Areas:\n1. Code duplication in path utilities\n2. Large monolithic files (5 files \u003e1000 lines)\n3. Global state (25+ variables, 3 deprecated)\n4. Silent error suppression (30+ instances)\n5. Test gaps and dead test code\n6. Atomicity risks in batch operations","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-12-16T18:18:58.115507-08:00","updated_at":"2025-12-30T18:12:30.962234-08:00","closed_at":"2025-12-30T16:59:51.322347-08:00","close_reason":"All technical debt cleanup tasks completed: path utilities consolidated, large files split, error handling standardized, dead test code removed, global state reduced, ignored errors documented","dependencies":[{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-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-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-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-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-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-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"}]} {"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-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-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-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"} @@ -968,7 +968,7 @@ {"id":"bd-x2ht","title":"Add BD_AGENT_MODE for ultra-compact output","description":"Optional agent-optimized output mode triggered by BD_AGENT_MODE=1 env var:\n\n- Compact format: just ID and title per line\n- Default to open/in_progress only\n- No colors, no emojis\n- Lower default limit (~20)\n- One-line summaries\n\nThis is independent but benefits from TTY detection infrastructure.\n\nConsider auto-detecting agent context via CLAUDE_CODE or similar env vars.","notes":"## Implementation Plan\n\n### Trigger\n```bash\nBD_AGENT_MODE=1 bd list\n```\n\nOr auto-detect common agent environments:\n```go\nfunc IsAgentMode() bool {\n if os.Getenv(\"BD_AGENT_MODE\") != \"\" {\n return true\n }\n // Auto-detect known agent contexts\n if os.Getenv(\"CLAUDE_CODE\") != \"\" {\n return true\n }\n // Add other agent env vars as discovered\n return false\n}\n```\n\n### Code Changes\n\n1. **Add agent output format** (cmd/bd/list.go):\n```go\nif ui.IsAgentMode() {\n // Ultra-compact: just ID and title\n for _, issue := range issues {\n fmt.Printf(\"%s: %s\\n\", issue.ID, issue.Title)\n }\n return\n}\n```\n\n2. **Agent mode defaults**:\n```go\nif ui.IsAgentMode() {\n if limit == 0 {\n limit = 20 // Lower default for agents\n }\n if status == \"\" {\n // Only actionable work\n filter.Status = []types.Status{\"open\", \"in_progress\"}\n }\n}\n```\n\n### Output Format (Agent Mode)\n```\nbd-mypl: Default bd list to non-closed issues\nbd-v5fn: Add default limit to bd list (50 issues)\nbd-jdz3: Add pager support to bd list\n```\n\nNo colors, no emojis, no brackets, no priority display.\nJust ID + title for maximum context efficiency.\n\n### Testing\n- `BD_AGENT_MODE=1 bd list` outputs compact format\n- Verify no ANSI codes in output\n- Verify default limit is 20\n- Verify only open/in_progress shown by default","status":"closed","priority":4,"issue_type":"feature","created_at":"2025-12-29T15:25:11.057467-08:00","updated_at":"2025-12-30T18:12:30.979385-08:00","closed_at":"2025-12-30T15:59:24.474412-08:00","close_reason":"Implemented: BD_AGENT_MODE=1 triggers ultra-compact output format","created_by":"stevey"} {"id":"bd-x36g","title":"Thread Test 2","description":"Testing direct mode","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:21:16.470631-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"message"} {"id":"bd-x3hi","title":"Support redirect files in .beads/ directory","description":"Gas Town creates polecat worktrees with .beads/redirect files that point to a shared beads database. The bd CLI should:\n\n1. When finding a .beads/ directory, check if it contains a 'redirect' file\n2. If redirect exists, read the relative path and use that as the beads directory\n3. This allows multiple git worktrees to share a single beads database\n\nExample:\n- polecats/alpha/.beads/redirect contains '../../mayor/rig/.beads'\n- bd commands from alpha should use mayor/rig/.beads\n\nCurrently bd ignores redirect files and either uses the local .beads/ or walks up to find a parent .beads/.\n\nRelated: gt-nriy (test message that can't be retrieved due to missing redirect support)","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-20T21:46:23.415172-08:00","updated_at":"2025-12-20T21:59:25.759664-08:00","closed_at":"2025-12-20T21:59:25.759664-08:00"} -{"id":"bd-x3j8","title":"Update info.go versionChanges","description":"Add 0.32.1 entry to versionChanges map in cmd/bd/info.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:17.344841-08:00","updated_at":"2025-12-20T21:54:31.906761-08:00","closed_at":"2025-12-20T21:54:31.906761-08:00","dependencies":[{"issue_id":"bd-x3j8","depends_on_id":"bd-rgd7","type":"blocks","created_at":"2025-12-20T21:53:29.62309-08:00","created_by":"daemon"},{"issue_id":"bd-x3j8","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:17.346736-08:00","created_by":"daemon"}]} +{"id":"bd-x3j8","title":"Update info.go versionChanges","description":"Add 0.32.1 entry to versionChanges map in cmd/bd/info.go","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:17.344841-08:00","updated_at":"2025-12-20T21:54:31.906761-08:00","closed_at":"2025-12-20T21:54:31.906761-08:00","dependencies":[{"issue_id":"bd-x3j8","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:17.346736-08:00","created_by":"daemon"},{"issue_id":"bd-x3j8","depends_on_id":"bd-rgd7","type":"blocks","created_at":"2025-12-20T21:53:29.62309-08:00","created_by":"daemon"}]} {"id":"bd-x5wg","title":"Create and push git tag v0.33.2","description":"Create the release tag and push it:\n\n```bash\ngit tag v0.33.2\ngit push origin v0.33.2\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.76223-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-x6kv","title":"Merge: jade-mjtlsejo","description":"branch: polecat/jade-mjtlsejo\ntarget: main\nsource_issue: jade-mjtlsejo\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T22:06:59.327455-08:00","updated_at":"2026-01-01T10:43:18.62673-08:00","closed_at":"2026-01-01T10:43:18.62673-08:00","close_reason":"Stale MR - branch no longer exists on remote","created_by":"beads/polecats/jade"} {"id":"bd-xctp","title":"GH#519: bd sync fails when sync.branch is currently checked-out branch","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:06:05.319281-08:00","updated_at":"2025-12-17T16:11:17.070763-08:00","deleted_at":"2025-12-17T16:11:17.070763-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -997,7 +997,7 @@ {"id":"bd-yck","title":"Fix checkExistingBeadsData to be worktree-aware","description":"The checkExistingBeadsData function in cmd/bd/init.go checks for .beads in the current working directory, but for worktrees it should check the main repository root instead. This prevents proper worktree compatibility.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-07T16:48:32.082776345-07:00","updated_at":"2025-12-23T22:33:32.412338-08:00","closed_at":"2025-12-23T22:33:32.412338-08:00"} {"id":"bd-ycrq","title":"Consolidate daemon/daemons commands","description":"Merge daemons functionality into daemon command with subcommands. Currently have both 'daemon' and 'daemons' at top level.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:11.393637-08:00","updated_at":"2025-12-28T13:05:28.776344-08:00","closed_at":"2025-12-28T13:05:28.776344-08:00","created_by":"stevey"} {"id":"bd-ykd9","title":"Add bd doctor --fix flag to automatically repair issues","description":"Add bd doctor --fix flag to automatically repair detected issues.\n\n## Current State\n- Doctor checks return issues with \"Fix\" field containing fix instructions\n- No automatic fix execution\n- User must manually follow fix instructions\n\n## Implementation\n\n### 1. Add --fix flag to doctor.go\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().Bool(\"fix\", false, \"Automatically fix detected issues\")\ndoctorCmd.Flags().Bool(\"yes\", false, \"Skip confirmation prompts (use with --fix)\")\n```\n\n### 2. Create fix registry (cmd/bd/doctor/fix/registry.go)\n```go\npackage fix\n\n// Fixer can automatically repair an issue\ntype Fixer interface {\n // CanFix returns true if this fixer handles the given check name\n CanFix(checkName string) bool\n // Fix attempts to repair the issue, returns error if failed\n Fix(ctx context.Context, issue *CheckResult) error\n // Description returns human-readable description of what will be fixed\n Description() string\n}\n\nvar registry []Fixer\n\nfunc Register(f Fixer) {\n registry = append(registry, f)\n}\n\nfunc GetFixer(checkName string) Fixer {\n for _, f := range registry {\n if f.CanFix(checkName) {\n return f\n }\n }\n return nil\n}\n```\n\n### 3. Implement fixers (one per file)\n\n**cmd/bd/doctor/fix/hooks.go**\n```go\ntype HooksFixer struct{}\n\nfunc (f *HooksFixer) CanFix(name string) bool {\n return name == \"git-hooks\" || name == \"hooks-outdated\"\n}\n\nfunc (f *HooksFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return hooks.Install(\".\", true) // force reinstall\n}\n\nfunc (f *HooksFixer) Description() string {\n return \"Reinstall git hooks\"\n}\n\nfunc init() {\n Register(\u0026HooksFixer{})\n}\n```\n\n**cmd/bd/doctor/fix/sync_branch.go**\n```go\ntype SyncBranchFixer struct{}\n\nfunc (f *SyncBranchFixer) CanFix(name string) bool {\n return name == \"sync-branch-missing\" || name == \"sync-branch-diverged\"\n}\n\nfunc (f *SyncBranchFixer) Fix(ctx context.Context, issue *CheckResult) error {\n // Reset to remote or create branch\n return syncbranch.ResetToRemote(ctx, repoRoot, branch, jsonlPath)\n}\n```\n\n**cmd/bd/doctor/fix/merge_driver.go**\n```go\ntype MergeDriverFixer struct{}\n\nfunc (f *MergeDriverFixer) CanFix(name string) bool {\n return name == \"merge-driver-missing\" || name == \"merge-driver-outdated\"\n}\n\nfunc (f *MergeDriverFixer) Fix(ctx context.Context, issue *CheckResult) error {\n return setupMergeDriver()\n}\n```\n\n### 4. Update doctor run logic\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n issues := runAllChecks()\n \n if \\!fixFlag {\n // Existing behavior - just display issues\n displayIssues(issues)\n return\n }\n \n // Collect fixable issues\n var fixable []FixableIssue\n for _, issue := range issues {\n if fixer := fix.GetFixer(issue.CheckName); fixer \\!= nil {\n fixable = append(fixable, FixableIssue{issue, fixer})\n }\n }\n \n if len(fixable) == 0 {\n fmt.Println(\"No automatically fixable issues found\")\n return\n }\n \n // Show what will be fixed\n fmt.Printf(\"Found %d fixable issues:\\n\", len(fixable))\n for i, f := range fixable {\n fmt.Printf(\" %d. [%s] %s\\n\", i+1, f.Issue.CheckName, f.Fixer.Description())\n }\n \n // Confirm unless --yes\n if \\!yesFlag {\n fmt.Print(\"\\nProceed with fixes? [Y/n] \")\n // ... read confirmation\n }\n \n // Apply fixes\n for _, f := range fixable {\n fmt.Printf(\"Fixing %s... \", f.Issue.CheckName)\n if err := f.Fixer.Fix(ctx, f.Issue); err \\!= nil {\n fmt.Printf(\"FAILED: %v\\n\", err)\n } else {\n fmt.Println(\"OK\")\n }\n }\n}\n```\n\n## Fixable Checks (Initial Set)\n\n| Check | Fixer | Action |\n|-------|-------|--------|\n| git-hooks | HooksFixer | Reinstall hooks |\n| hooks-outdated | HooksFixer | Update hooks |\n| merge-driver-missing | MergeDriverFixer | Configure merge driver |\n| sync-branch-diverged | SyncBranchFixer | Reset to remote |\n| daemon-version-mismatch | DaemonFixer | Restart daemon |\n\n## Testing\n```bash\n# Test with broken hooks\nrm .git/hooks/pre-commit\nbd doctor --fix --yes\n\n# Verify fix applied\nbd doctor # Should pass now\n```\n\n## Success Criteria\n- --fix flag triggers automatic repair\n- User prompted for confirmation (unless --yes)\n- Clear output showing what was fixed\n- Graceful handling of fix failures\n- At least 5 common issues auto-fixable","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-11-14T18:17:48.411264-08:00","updated_at":"2025-12-23T13:34:05.646445-08:00","closed_at":"2025-12-23T13:34:05.646445-08:00","dependencies":[{"issue_id":"bd-ykd9","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.732505-08:00","created_by":"daemon"}]} -{"id":"bd-ykqu","title":"Add gate timeout tracking and notification","description":"Implement timeout and notification logic for gates.\n\n## Timeout Behavior\n1. Gate created with timeout (e.g., 30m)\n2. Deacon tracks elapsed time during patrol\n3. If timeout reached:\n - Notify all waiters: \"Gate timed out\"\n - Close gate with timeout reason\n - Waiter can retry, escalate, or fail gracefully\n\n## Notification\n- Use gt mail send to notify waiters\n- Include gate ID, await type, and reason in message\n- Support multiple waiters notification\n\n## Escalation Path\n- Witness sees stuck worker, nudges them\n- Worker can escalate to human if needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:40.1825-08:00","updated_at":"2025-12-23T12:19:44.362527-08:00","closed_at":"2025-12-23T12:19:44.362527-08:00","dependencies":[{"issue_id":"bd-ykqu","depends_on_id":"bd-is6m","type":"blocks","created_at":"2025-12-23T11:44:56.595085-08:00","created_by":"daemon"},{"issue_id":"bd-ykqu","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.072862-08:00","created_by":"daemon"}]} +{"id":"bd-ykqu","title":"Add gate timeout tracking and notification","description":"Implement timeout and notification logic for gates.\n\n## Timeout Behavior\n1. Gate created with timeout (e.g., 30m)\n2. Deacon tracks elapsed time during patrol\n3. If timeout reached:\n - Notify all waiters: \"Gate timed out\"\n - Close gate with timeout reason\n - Waiter can retry, escalate, or fail gracefully\n\n## Notification\n- Use gt mail send to notify waiters\n- Include gate ID, await type, and reason in message\n- Support multiple waiters notification\n\n## Escalation Path\n- Witness sees stuck worker, nudges them\n- Worker can escalate to human if needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:40.1825-08:00","updated_at":"2025-12-23T12:19:44.362527-08:00","closed_at":"2025-12-23T12:19:44.362527-08:00","dependencies":[{"issue_id":"bd-ykqu","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.072862-08:00","created_by":"daemon"},{"issue_id":"bd-ykqu","depends_on_id":"bd-is6m","type":"blocks","created_at":"2025-12-23T11:44:56.595085-08:00","created_by":"daemon"}]} {"id":"bd-ymqn","title":"Code review: bd mol bond --ref and bd activity (bd-xo1o work)","description":"Review dave's recent commits for bd-xo1o (Dynamic Molecule Bonding):\n\n## Commits to Review\n- ee04b1ea: feat: add dynamic molecule bonding with --ref flag (bd-xo1o.1)\n- be520d90: feat: add bd activity command for real-time state feed (bd-xo1o.3)\n\n## Review Focus\n1. Code quality and correctness\n2. Error handling\n3. Edge cases\n4. Test coverage\n5. Documentation\n\n## Deliverables\n- File beads for any issues found\n- Note any concerns or suggestions\n- Verify the implementation matches the bd-xo1o epic requirements","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T03:47:55.217363-08:00","updated_at":"2025-12-23T04:11:00.226326-08:00","closed_at":"2025-12-23T04:11:00.226326-08:00"} {"id":"bd-ypvj","title":"Fix sync.remote config not being respected (GH#872)","description":"bd config set sync.remote \u003cname\u003e sets the value but bd sync still tries to use 'origin'. Need to check where the sync code reads the remote name and ensure it uses the configured value.","status":"closed","priority":1,"issue_type":"bug","created_at":"2026-01-03T13:12:50.777534-08:00","updated_at":"2026-01-03T13:24:46.723563-08:00","closed_at":"2026-01-03T13:24:46.723563-08:00","close_reason":"Fixed: gitPull/gitPush now respect sync.remote config (GH#872)","created_by":"beads/crew/grip"} {"id":"bd-yqhh","title":"bd list --parent: filter by parent issue","description":"Add --parent flag to bd list to filter issues by parent.\n\nExample:\n```bash\nbd list --parent=gt-h5n --status=open\n```\n\nWould show all open children of gt-h5n.\n\nUseful for:\n- Checking epic progress\n- Finding swarmable work within an epic\n- Molecule step listing","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T01:51:26.830952-08:00","updated_at":"2025-12-23T02:10:12.909803-08:00","closed_at":"2025-12-23T02:10:12.909803-08:00"}