diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 61fae6e7..488e1aa0 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1354,6 +1354,7 @@ {"id":"bd-j7e2","title":"RPC diagnostics: BD_RPC_DEBUG timing logs","description":"Add lightweight diagnostic logging for RPC connection attempts:\n- BD_RPC_DEBUG=1 prints to stderr:\n - Socket path being dialed\n - Socket exists check result \n - Dial start/stop time\n - Connection outcome\n- Improve bd daemon --status messaging when lock not held\n\nThis helps field triage of connection issues without verbose daemon logs.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-11-07T16:42:12.772364-08:00","updated_at":"2025-11-07T22:07:17.346817-08:00","closed_at":"2025-11-07T21:29:32.243458-08:00","dependencies":[{"issue_id":"bd-j7e2","depends_on_id":"bd-ndyz","type":"discovered-from","created_at":"2025-11-07T16:42:12.773714-08:00","created_by":"daemon"}]} {"id":"bd-j7v7","title":"Merge: ruby-mk0ev0fb","description":"branch: polecat/ruby-mk0ev0fb\ntarget: main\nsource_issue: ruby-mk0ev0fb\nrig: beads\nagent_bead: bd-beads-polecat-ruby\nretry_count: 0\nlast_conflict_sha: null\nconflict_task_id: null","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-04T16:21:31.460826-08:00","created_by":"beads/polecats/ruby","updated_at":"2026-01-05T19:45:43.982501-08:00","closed_at":"2026-01-05T19:45:43.982501-08:00","close_reason":"Branch deleted, already merged"} {"id":"bd-j8tz0","title":"Session ended: gt-beads-crew-emma","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:15:20.491772-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-11T18:15:20.546549-08:00","closed_at":"2026-01-11T18:15:20.546549-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} +{"id":"bd-j9ac9","title":"Update GIT_INTEGRATION.md for Jujutsu (GH#906)","description":"Update the Jujutsu integration section to use 'bd merge' instead of standalone beads-merge binary. Fix provided in issue.","status":"open","priority":2,"issue_type":"task","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:19.464115-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T20:42:19.464115-08:00","external_ref":"gh-906"} {"id":"bd-jbgfb","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T18:34:55.131085-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T18:34:55.199477-08:00","closed_at":"2026-01-11T18:34:55.199477-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-jbqx","title":"Code smell: Repeated validation patterns could be centralized","description":"Similar validation patterns appear in multiple commands (create.go, show.go, update.go, etc.):\n- Check if resource exists\n- Check if resource is in valid state\n- Validate user input\n- Check permissions\n\n**Problem:**\n- Duplicated validation logic\n- Inconsistent validation between commands\n- Hard to add new validation rules consistently\n\n**Acceptance Criteria:**\n- [ ] Create internal/validation package\n- [ ] Centralize common validation logic\n- [ ] Use composition for validation chains\n- [ ] Update commands to use shared validators\n- [ ] Tests pass","status":"closed","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:03.171186-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T18:12:30.979965-08:00","closed_at":"2025-12-30T15:58:50.871474-08:00","close_reason":"Implemented composable validators in internal/validation/issue.go with Chain() composition, migrated show_unit_helpers.go to use centralized validators","dependencies":[{"issue_id":"bd-jbqx","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.84458-08:00","created_by":"daemon"}]} {"id":"bd-jcdrt","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T09:41:07.26351-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T09:41:07.328097-08:00","closed_at":"2026-01-11T09:41:07.328097-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} @@ -2245,6 +2246,7 @@ {"id":"bd-yi824","title":"Digest: mol-refinery-patrol","description":"Patrol: Queue empty, no branches merged, inbox clear","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-10T22:21:14.477633-08:00","updated_at":"2026-01-10T22:21:14.477633-08:00","closed_at":"2026-01-10T22:21:14.477598-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-yi824","depends_on_id":"bd-wisp-3mg","type":"parent-child","created_at":"2026-01-10T22:21:14.47851-08:00","created_by":"beads/refinery"}]} {"id":"bd-yiigv","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","created_at":"2026-01-10T15:34:22.921317-08:00","created_by":"beads/refinery","updated_at":"2026-01-10T15:34:22.959566-08:00","closed_at":"2026-01-10T15:34:22.959566-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-yjer4","title":"Digest: mol-refinery-patrol","description":"Patrol: queue empty, updated main (3 commits), no work processed","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T00:00:07.77986-08:00","updated_at":"2026-01-11T00:00:07.77986-08:00","closed_at":"2026-01-11T00:00:07.779825-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-yjer4","depends_on_id":"bd-wisp-19q","type":"parent-child","created_at":"2026-01-11T00:00:07.780798-08:00","created_by":"beads/refinery"}]} +{"id":"bd-yk9iz","title":"Fix rename-prefix to update blocked_issues_cache (GH#1016)","description":"bd rename-prefix doesn't update blocked_issues_cache table. Add rebuildBlockedCache() call after rename.","status":"open","priority":2,"issue_type":"bug","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T20:42:20.668502-08:00","created_by":"beads/crew/dave","updated_at":"2026-01-11T20:42:20.668502-08:00","external_ref":"gh-1016"} {"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-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-yl6gd","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T08:22:07.455133-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T08:22:07.520023-08:00","closed_at":"2026-01-11T08:22:07.520023-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true}