From b4627e651fa6029529fce8b4e63996823b1d09b0 Mon Sep 17 00:00:00 2001 From: mayor Date: Wed, 7 Jan 2026 17:42:01 -0800 Subject: [PATCH] bd daemon sync: 2026-01-07 17:42:01 --- .beads/issues.jsonl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 50a1da2d..20293425 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -325,7 +325,7 @@ {"id":"bd-5bj","title":"Registry has cross-process race condition","description":"The global daemon registry (~/.beads/registry.json) can be corrupted when multiple daemons from different workspaces write simultaneously.\n\n**Root cause:**\n- Registry uses an in-process mutex but no file-level locking\n- Register() and Unregister() release the mutex between read and write\n- Multiple daemon processes can interleave their read-modify-write cycles\n\n**Evidence:**\nFound registry.json with double closing bracket: `]]` instead of `]`\n\n**Fix options:**\n1. Use file locking (flock/fcntl) around the entire read-modify-write cycle\n2. Use atomic write pattern (write to temp file, rename)\n3. Both (belt and suspenders)\n\n**Files:**\n- internal/daemon/registry.go:46-64 (readEntries)\n- internal/daemon/registry.go:67-87 (writeEntries)\n- internal/daemon/registry.go:90-108 (Register - the race window)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-27T13:55:50.426188-08:00","updated_at":"2025-11-27T14:07:06.22622-08:00","closed_at":"2025-11-27T14:07:06.22622-08:00"} {"id":"bd-5c4","title":"VCS-agnostic sync support","description":"Make bd sync work with multiple VCS types (git, jujutsu, mercurial, sapling) by detecting VCS per repo and using appropriate sync commands, supporting mixed-VCS multi-repo configs.","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-11-04T11:22:00.837527-08:00","updated_at":"2025-11-05T14:30:10.417479-08:00","closed_at":"2025-11-05T14:26:17.942832-08:00","dependencies":[{"issue_id":"bd-5c4","depends_on_id":"bd-4ms","type":"parent-child","created_at":"2025-11-04T11:22:21.817849-08:00","created_by":"daemon"}]} {"id":"bd-5ce8","title":"Document protected branch workflow","description":"Create comprehensive documentation for protected branch workflow.\n\nTasks:\n- Add \"Protected Branch Workflow\" section to AGENTS.md\n- Create docs/PROTECTED_BRANCHES.md guide\n- Update README.md quick start\n- Add examples to examples/protected-branch/\n- Update bd init --help documentation\n- Add troubleshooting guide\n- Add migration guide for existing users\n- Record demo video (optional)\n\nEstimated effort: 2-3 days","notes":"Completed protected branch workflow documentation. Created comprehensive guide (docs/PROTECTED_BRANCHES.md), updated AGENTS.md with workflow section, added feature to README.md, and created working example (examples/protected-branch/). All commands verified working (bd init --branch, bd sync --status, bd sync --merge, bd config get/set sync.branch).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.59013-08:00","updated_at":"2025-12-14T12:12:46.530569-08:00","closed_at":"2025-11-04T11:10:23.530621-08:00","dependencies":[{"issue_id":"bd-5ce8","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.379767-08:00","created_by":"stevey"}]} -{"id":"bd-5cnq","title":"Add build-from-source option to local-install step","description":"The local-install step currently only offers Homebrew and curl install script options.\n\nAdd Option 3 for developers releasing from this clone:\n\n```bash\n# Build from source\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n\n# macOS ONLY: Codesign to prevent SIGKILL (Killed: 9)\n# Without this, macOS kills unsigned binaries from unknown developers\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n## Why codesigning matters\nOn macOS, unsigned binaries built locally can be killed by Gatekeeper with \"Killed: 9\" (SIGKILL). The ad-hoc codesign (`-s -`) marks the binary as locally trusted.\n\n## Acceptance Criteria\n- [ ] local-install step has Option 3 with build commands\n- [ ] macOS codesigning is documented with explanation\n- [ ] Commands can be copy-pasted and work\n","status":"open","priority":1,"issue_type":"task","created_at":"2026-01-07T00:45:30.577889-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:45:30.577889-08:00","dependencies":[{"issue_id":"bd-5cnq","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.493442-08:00","created_by":"beads/crew/emma"}]} +{"id":"bd-5cnq","title":"Add build-from-source option to local-install step","description":"dispatched_by: mayor\n\nThe local-install step currently only offers Homebrew and curl install script options.\n\nAdd Option 3 for developers releasing from this clone:\n\n```bash\n# Build from source\ngo build -o bd ./cmd/bd\ncp bd ~/.local/bin/bd\n\n# macOS ONLY: Codesign to prevent SIGKILL (Killed: 9)\n# Without this, macOS kills unsigned binaries from unknown developers\n[[ $(uname) == \"Darwin\" ]] \u0026\u0026 codesign --force --sign - ~/.local/bin/bd\n```\n\n## Why codesigning matters\nOn macOS, unsigned binaries built locally can be killed by Gatekeeper with \"Killed: 9\" (SIGKILL). The ad-hoc codesign (`-s -`) marks the binary as locally trusted.\n\n## Acceptance Criteria\n- [ ] local-install step has Option 3 with build commands\n- [ ] macOS codesigning is documented with explanation\n- [ ] Commands can be copy-pasted and work","status":"hooked","priority":1,"issue_type":"task","assignee":"beads/polecats/obsidian","created_at":"2026-01-07T00:45:30.577889-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T17:41:23.052869-08:00","dependencies":[{"issue_id":"bd-5cnq","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.493442-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-5dae5504","title":"Export deduplication breaks when JSONL and export_hashes table diverge","description":"## Problem\n\nThe export deduplication feature (timestamp-only skipping) breaks when the JSONL file and export_hashes table get out of sync, causing exports to skip issues that aren't actually in the file.\n\n## Symptoms\n\n- `bd export` reports \"Skipped 128 issue(s) with timestamp-only changes\"\n- JSONL file only has 38 lines but DB has 149 issues\n- export_hashes table has 149 entries\n- Auto-import doesn't trigger (hash matches despite missing data)\n- Two repos on same commit show different issue counts\n\n## Root Cause\n\nshouldSkipExport() in autoflush.go compares current issue hash with stored export_hashes entry. If they match, it skips export assuming the issue is already in the JSONL.\n\nThis assumption fails when:\n1. Git operations (pull, reset, checkout) change JSONL without clearing export_hashes\n2. Manual JSONL edits or corruption\n3. Import operations that modify DB but don't update export_hashes\n4. Partial exports that update export_hashes but don't complete\n\n## Impact\n\n- **Critical data loss risk**: Issues appear to be tracked but aren't persisted to git\n- Breaks multi-repo sync (root cause of today's debugging session)\n- Auto-import fails to detect staleness (hash matches despite missing data)\n- Silent data corruption (no error messages, just missing issues)\n\n## Reproduction\n\n1. Have DB with 149 issues, all in export_hashes table\n2. Truncate JSONL to 38 lines (simulate git reset or corruption)\n3. Run `bd export` - it skips 128 issues\n4. JSONL still has only 38 lines but export thinks it succeeded\n\n## Current Workaround\n\n```bash\nsqlite3 .beads/beads.db \"DELETE FROM export_hashes\"\nbd export -o .beads/beads.jsonl\n```\n\n## Proposed Solutions\n\n**Option 1: Verify JSONL integrity before skipping**\n- Count lines in JSONL, compare with export_hashes count\n- If mismatch, clear export_hashes and force full export\n- Safe but adds I/O overhead\n\n**Option 2: Hash-based JSONL validation**\n- Store hash of entire JSONL file in metadata\n- Before export, check if JSONL hash matches\n- If mismatch, clear export_hashes\n- More efficient, detects any JSONL corruption\n\n**Option 3: Disable timestamp-only deduplication**\n- Remove the feature entirely\n- Always export all issues\n- Simplest and safest, but creates larger git commits\n\n**Option 4: Clear export_hashes on git operations**\n- Add post-merge hook to clear export_hashes\n- Clear on any import operation\n- Defensive approach but may over-clear\n\n## Recommended Fix\n\nCombination of Options 2 + 4:\n1. Store JSONL file hash in metadata after export\n2. Check hash before export, clear export_hashes if mismatch \n3. Clear export_hashes on import operations\n4. Add `bd validate` check for JSONL/export_hashes sync\n\n## Files Involved\n\n- cmd/bd/autoflush.go (shouldSkipExport)\n- cmd/bd/export.go (export with deduplication)\n- internal/storage/sqlite/metadata.go (export_hashes table)","notes":"## Recovery Session (2025-10-29 21:30)\n\n### What Happened\n- Created 14 new hash ID issues (bd-f8b764c9 through bd-f8b764c9.1) \n- bd sync appeared to succeed\n- Canonical repo (~/src/beads): 162 issues in DB + JSONL ✓\n- Secondary repo (fred/beads): Only 145 issues vs 162 in canonical ✗\n- Both repos on same git commit but different issue counts!\n\n### Bug Manifestation During Recovery\n\n1. **Initial state**: fred/beads had 145 issues, 145 lines in JSONL, 145 export_hashes entries\n\n2. **After git reset --hard origin/main**: \n - JSONL: 162 lines (from git)\n - DB: 150 issues (auto-import partially worked)\n - Auto-import failed with UNIQUE constraint error\n\n3. **After manual import --resolve-collisions**:\n - DB: 160 issues\n - JSONL: Still 162 lines\n - export_hashes: 159 entries\n\n4. **After bd export**: \n - **JSONL reduced to 17 lines!** ← The bug in action\n - export_hashes: 159 entries (skipped exporting 142 issues)\n - Silent data loss - no error message\n\n5. **After clearing export_hashes and re-export**:\n - JSONL: 159 lines (missing 3 issues still)\n - DB: 159 issues\n - Still diverged from canonical\n\n### The Bug Loop\nOnce export_hashes and JSONL diverge:\n- Export skips issues already in export_hashes\n- But those issues aren't actually in JSONL\n- This creates corrupt JSONL with missing issues\n- Auto-import can't detect the problem (file hash matches what was exported)\n- Data is lost with no error messages\n\n### Recovery Solution\nCouldn't break the loop with export alone. Had to:\n1. Copy .beads/beads.db from canonical repo\n2. Clear export_hashes\n3. Full re-export\n4. Finally converged to 162 issues\n\n### Key Learnings\n\n1. **The bug is worse than we thought**: It can create corrupt exports (17 lines instead of 162!)\n\n2. **Auto-import can't save you**: Once export is corrupt, auto-import just imports the corrupt data\n\n3. **Silent failure**: No warnings, no errors, just missing issues\n\n4. **Git operations trigger it**: git reset, git pull, etc. change JSONL without clearing export_hashes\n\n5. **Import operations populate export_hashes**: Even manual imports update export_hashes, setting up future export failures\n\n### Immediate Action Required\n\n**DISABLE EXPORT DEDUPLICATION NOW**\n\nThis feature is fundamentally broken and causes data loss. Should be disabled until properly fixed.\n\nQuick fix options:\n- Set environment variable to disable feature\n- Comment out shouldSkipExport check\n- Always clear export_hashes before export\n- Add validation that DB count == JSONL line count before allowing export\n\n### Long-term Fix\n\nNeed Option 2 + 4 from proposed solutions:\n1. Store JSONL file hash after every successful export\n2. Before export, verify JSONL hash matches expected\n3. If mismatch, log WARNING and clear export_hashes\n4. Clear export_hashes on every import operation\n5. Add git post-merge hook to clear export_hashes\n6. Add `bd validate` command to detect divergence\n","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-10-29T23:05:13.959435-07:00","updated_at":"2025-10-30T17:12:58.207148-07:00","closed_at":"2025-10-29T21:57:03.06641-07:00"} {"id":"bd-5dlz","title":"GHI #889: postinstall fails on Windows - zip being used by another process","description":"GitHub Issue #889: postinstall fails on Windows: zip 'being used by another process'\n\nhttps://github.com/steveyegge/beads/issues/889","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-04T11:22:13.880052-08:00","created_by":"mayor","updated_at":"2026-01-04T15:22:08.708256-08:00","closed_at":"2026-01-04T11:26:35.696283-08:00","close_reason":"Fixed: Added retry logic with exponential backoff for Windows zip extraction to handle file lock delays from antivirus/Node.js"} {"id":"bd-5dmb","title":"Test Agent","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2025-12-28T00:04:29.811433-08:00","created_by":"beads/crew/emma","updated_at":"2025-12-28T00:11:48.074239-08:00","deleted_at":"2025-12-28T00:11:48.074239-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} @@ -678,7 +678,7 @@ {"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":"closed","priority":2,"issue_type":"agent","created_at":"2026-01-04T15:12:49.812132-08:00","created_by":"mayor","updated_at":"2026-01-05T19:45:45.484195-08:00","closed_at":"2026-01-05T19:45:45.484195-08:00","close_reason":"Polecat cleaned up"} {"id":"bd-beads-polecat-jasper","title":"bd-beads-polecat-jasper","description":"bd-beads-polecat-jasper\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-oos3\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-srhu\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-02T12:41:56.3782-08:00","created_by":"mayor","updated_at":"2026-01-04T11:27:04.41339-08:00","deleted_at":"2026-01-02T16:57:50.038825-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} {"id":"bd-beads-polecat-newbot","title":"Agent: bd-beads-polecat-newbot","status":"tombstone","priority":0,"issue_type":"agent","created_at":"2026-01-02T12:25:10.273273-08:00","created_by":"beads/polecats/obsidian","updated_at":"2026-01-02T12:25:42.678762-08:00","labels":["rig:beads","role_type:polecat"],"deleted_at":"2026-01-02T12:25:42.678762-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"agent"} -{"id":"bd-beads-polecat-obsidian","title":"bd-beads-polecat-obsidian","description":"bd-beads-polecat-obsidian\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: null\nrole_bead: gt-polecat-role\ncleanup_status: has_stash\nactive_mr: bd-xntk\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-01T11:10:14.972102-08:00","created_by":"mayor","updated_at":"2026-01-07T17:39:43.705208-08:00","deleted_at":"2026-01-02T16:57:50.357825-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} +{"id":"bd-beads-polecat-obsidian","title":"bd-beads-polecat-obsidian","description":"bd-beads-polecat-obsidian\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: null\nrole_bead: gt-polecat-role\ncleanup_status: has_stash\nactive_mr: bd-xntk\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-01T11:10:14.972102-08:00","created_by":"mayor","updated_at":"2026-01-07T17:41:22.909127-08:00","deleted_at":"2026-01-02T16:57:50.357825-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} {"id":"bd-beads-polecat-onyx","title":"bd-beads-polecat-onyx","description":"bd-beads-polecat-onyx\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-w3rh\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-xv0k\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-02T12:55:29.132464-08:00","created_by":"mayor","updated_at":"2026-01-04T11:30:16.253989-08:00","deleted_at":"2026-01-02T16:57:50.672016-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} {"id":"bd-beads-polecat-opal","title":"bd-beads-polecat-opal","description":"bd-beads-polecat-opal\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-r24e\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-do8v\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-02T16:47:13.940237-08:00","created_by":"mayor","updated_at":"2026-01-04T11:23:36.170275-08:00","deleted_at":"2026-01-02T16:57:50.994035-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} {"id":"bd-beads-polecat-quartz","title":"bd-beads-polecat-quartz","description":"bd-beads-polecat-quartz\n\nrole_type: polecat\nrig: beads\nagent_state: spawning\nhook_bead: bd-kbfn\nrole_bead: gt-polecat-role\ncleanup_status: null\nactive_mr: bd-kc6v\nnotification_level: null","status":"tombstone","priority":2,"issue_type":"agent","created_at":"2026-01-02T12:41:40.403065-08:00","created_by":"mayor","updated_at":"2026-01-04T11:29:18.874891-08:00","deleted_at":"2026-01-02T16:57:51.341713-08:00","deleted_by":"mayor","delete_reason":"delete","original_type":"agent"} @@ -1626,6 +1626,7 @@ {"id":"bd-vd8e","title":"Detect uncommitted JSONL changes before sync operations","description":"Part of GH#885 fix: pre-flight safety check.\n\nAdd detection at sync start:\n1. Check if .beads/issues.jsonl has uncommitted changes in git\n2. If so, this indicates a previous sync failed after export but before commit\n3. Force a fresh export cycle to reconcile state\n\nImplementation:\n- Add gitHasUnstagedBeadsChanges() helper\n- Call in sync pre-flight checks (sync.go ~line 159)\n- If detected, warn user and force re-export\n\nThis catches the failure mode early before it compounds.","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/fang","created_at":"2026-01-04T13:53:24.808788-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-04T15:10:56.883507-08:00","closed_at":"2026-01-04T15:10:56.883507-08:00","close_reason":"Implemented: gitHasUncommittedBeadsChanges() helper + pre-flight check in sync.go","dependencies":[{"issue_id":"bd-vd8e","depends_on_id":"bd-pnx2","type":"parent-child","created_at":"2026-01-04T13:53:55.823237-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vdw4","title":"Enhancement: bd swarm status accepts swarm molecule ID","description":"Currently `bd swarm status` only accepts an epic ID.\n\nWould be more intuitive to also accept the swarm molecule ID and follow the relates-to link to find the epic:\n\n```bash\nbd swarm status bd-swarm-xyz # Follow link to epic, show status\nbd swarm status bd-epic-123 # Direct epic lookup (current behavior)\n```\n\nDetect by checking if the issue has mol_type=swarm.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-28T21:38:20.692476-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T22:05:10.112717-08:00","closed_at":"2025-12-28T22:05:10.112717-08:00","dependencies":[{"issue_id":"bd-vdw4","depends_on_id":"bd-2ubv","type":"parent-child","created_at":"2025-12-28T21:38:44.809594-08:00","created_by":"daemon"}]} {"id":"bd-vgi5","title":"Push version bump to GitHub","description":"git push origin main - triggers CI but no release yet.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-18T22:43:05.363604-08:00","updated_at":"2025-12-24T16:25:30.019895-08:00","dependencies":[{"issue_id":"bd-vgi5","depends_on_id":"bd-qqc","type":"parent-child","created_at":"2025-12-18T22:43:16.87736-08:00","created_by":"daemon"},{"issue_id":"bd-vgi5","depends_on_id":"bd-3ggb","type":"blocks","created_at":"2025-12-18T22:43:21.078208-08:00","created_by":"daemon"}],"deleted_at":"2025-12-24T16:25:30.019895-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} +{"id":"bd-vh2q0","title":"Session ended: gt-beads-witness","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-07T17:42:00.417039-08:00","created_by":"beads/witness","updated_at":"2026-01-07T17:42:00.464622-08:00","closed_at":"2026-01-07T17:42:00.464622-08:00","close_reason":"auto-closed session event"} {"id":"bd-vii9","title":"bd agent state fails when agent bead doesn't exist","description":"## Bug\n\n`bd agent state \u003cagent\u003e \u003cstate\u003e` fails if the agent doesn't already exist as a bead.\n\n## Reproduction\n\n```\ngt sling gt-nrpiq gastown\n...\nWarning: couldn't update agent gt-gastown-polecat-toast hook to gt-nrpiq: \n updating agent state: bd agent state gt-gastown-polecat-toast running: \n Error: failed to resolve agent gt-gastown-polecat-toast: \n no issue found matching \"gt-gastown-polecat-toast\"\n```\n\n## Context from HOP Design\n\nFrom **docs/hop/CONTEXT.md**:\n\u003e \"Each polecat should have a chain: What work have they done? What's their success rate? What skills have they demonstrated?\"\n\nFrom **docs/PRIMING.md**:\n\u003e \"Polecats are ephemeral executors. Like K8s pods. They have names (for debugging, logs) but no persistent identity.\"\n\n**Resolution**: Polecat *sessions* are ephemeral, but polecat *names* (toast, nux, furiosa, etc.) are recycled and SHOULD have persistent identity beads. The name is the identity - sessions come and go.\n\nThink of it like K8s:\n- **Pod** = polecat session (ephemeral, killed after task)\n- **ServiceAccount** = polecat identity bead (persistent, accumulates history)\n\n## Solution\n\n`bd agent state` should **auto-create** the agent bead on first use:\n\n```go\n// If agent bead doesn't exist, create it\nif errors.Is(err, ErrNotFound) {\n // Create identity bead for this agent\n _, err = CreateIssue(Issue{\n Title: fmt.Sprintf(\"Agent: %s\", agentName),\n Type: \"agent\",\n Status: state,\n Metadata: map[string]string{\n \"role\": parseRole(agentName), // polecat, witness, etc.\n \"rig\": parseRig(agentName), // gastown, beads, etc.\n },\n })\n}\n```\n\nThis enables:\n1. Work history accumulation per polecat name\n2. Skill/success tracking over time\n3. CV chain for the polecat identity\n4. `bd list --type=agent` to see all agents\n\n## Non-goals\n\n- Session tracking (ephemeral, don't persist)\n- Work attribution to polecat (credits human owner)\n- Agent scheduling (Gas Town handles that)","status":"closed","priority":3,"issue_type":"bug","assignee":"beads/polecats/obsidian","created_at":"2026-01-02T12:16:39.116652-08:00","created_by":"mayor","updated_at":"2026-01-02T12:27:05.679183-08:00","closed_at":"2026-01-02T12:27:05.679183-08:00","close_reason":"Implemented auto-create logic in runAgentState to create agent beads on first use"} {"id":"bd-vizy","title":"Deprecate bump-version.sh script","description":"The bump-version.sh script is now legacy. The formula is the authority for release mechanics.\n\n## Options\n\n1. **Add deprecation notice** (minimal change)\n - Add warning at top of script pointing to formula\n - Keep script working for quick manual releases\n\n2. **Convert to formula wrapper** (medium change)\n - Script becomes: `bd mol execute beads-release --var version=$1`\n - Maintains CLI convenience while using formula\n\n3. **Remove entirely** (breaking change)\n - Delete scripts/bump-version.sh\n - Update any docs referencing it\n - Formula is the only way to release\n\n## Recommendation\nOption 2 - keeps convenience of `./scripts/bump-version.sh 0.47.0` but executes via formula, getting all the durability/visibility benefits.\n\n## Acceptance Criteria\n- [ ] Script has deprecation notice or is removed\n- [ ] CLAUDE.md and other docs updated if needed\n- [ ] No duplicate release logic (script vs formula)\n","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-07T00:45:32.586506-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-07T00:45:32.586506-08:00","dependencies":[{"issue_id":"bd-vizy","depends_on_id":"bd-z8xz","type":"parent-child","created_at":"2026-01-07T00:45:40.527149-08:00","created_by":"beads/crew/emma"},{"issue_id":"bd-vizy","depends_on_id":"bd-a854","type":"blocks","created_at":"2026-01-07T00:45:48.380809-08:00","created_by":"beads/crew/emma"}]} {"id":"bd-vjas","title":"Add --pretty flag to bd ready","description":"bd list has --pretty but bd ready doesn't. Should support same tree format with status/priority symbols for consistency.","status":"closed","priority":3,"issue_type":"feature","created_at":"2025-12-31T11:54:59.911409-08:00","created_by":"mayor","updated_at":"2026-01-01T11:16:53.096168-08:00","closed_at":"2026-01-01T11:16:53.096168-08:00","close_reason":"Implemented --pretty flag for bd ready"}