diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index d134ee73..c516cb9f 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -56,7 +56,7 @@ {"id":"bd-4or","title":"Add tests for daemon functionality","description":"Critical daemon functions have 0% test coverage including daemon lifecycle, health checks, and RPC server functionality. These are essential for system reliability and need comprehensive test coverage.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:26.916050465-07:00","updated_at":"2025-12-19T09:54:57.017114822-07:00","closed_at":"2025-12-18T12:29:06.134014366-07:00","dependencies":[{"issue_id":"bd-4or","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:26.919347253-07:00","created_by":"matt"}]} {"id":"bd-4p3k","title":"Release v0.34.0","description":"Minor version release for beads v0.34.0. This bead serves as my persistent work assignment; the actual release steps are tracked in an attached wisp.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-22T03:03:20.73092-08:00","updated_at":"2025-12-22T03:05:03.168622-08:00","deleted_at":"2025-12-22T03:05:03.168622-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-4q8","title":"bd cleanup --hard should skip tombstone creation for true permanent deletion","description":"## Problem\n\nWhen using bd cleanup --hard --older-than N --force, the command:\n1. Deletes closed issues older than N days (converting them to tombstones with NOW timestamp)\n2. Then tries to prune tombstones older than N days (finds none because they were just created)\n\nThis leaves the database bloated with fresh tombstones that will not be pruned.\n\n## Expected Behavior\n\nIn --hard mode, the deletion should be permanent without creating tombstones, since the user explicitly requested bypassing sync safety.\n\n## Workaround\n\nManually delete from database: sqlite3 .beads/beads.db 'DELETE FROM issues WHERE status=tombstone'\n\n## Fix Options\n\n1. In --hard mode, use a different delete path that does not create tombstones\n2. After deleting, immediately prune the just-created tombstones regardless of age\n3. Pass a skip_tombstone flag to the delete operation\n\nOption 1 is cleanest - --hard should mean permanent delete without tombstone.","status":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-12-16T01:33:36.580657-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-4qfb","title":"Improve bd doctor output formatting for better readability","description":"Improve bd doctor output formatting for better readability.\n\n## Current State\nDoctor output is a wall of text with:\n- All checks shown (even passing ones)\n- No visual hierarchy\n- Hard to spot failures in long output\n\n## Target Output\n\n```\n$ bd doctor\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n Current version: 0.34.0\n Latest version: 0.35.0\n Fix: bd hooks install\n\n─────────────────────────────────────────────────\n✓ Passed (24) [use --verbose to show details]\n─────────────────────────────────────────────────\n```\n\nWith --verbose:\n```\n$ bd doctor --verbose\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n ...\n\n─────────────────────────────────────────────────\n✓ Passed (24)\n─────────────────────────────────────────────────\n\n Database\n ✓ Database exists\n ✓ Database readable\n ✓ Schema up to date\n \n Git Hooks\n ✓ Pre-commit hook installed\n ✓ Post-merge hook installed\n ⚠ Hooks version mismatch (see above)\n \n Sync\n ✓ Sync branch configured\n ✓ Remote accessible\n ...\n```\n\n## Implementation\n\n### 1. Add check categories (cmd/bd/doctor/categories.go)\n\n```go\ntype Category string\n\nconst (\n CatDatabase Category = \"Database\"\n CatHooks Category = \"Git Hooks\"\n CatSync Category = \"Sync\"\n CatDaemon Category = \"Daemon\"\n CatConfig Category = \"Configuration\"\n CatIntegrity Category = \"Data Integrity\"\n)\n\n// Assign categories to checks\nvar checkCategories = map[string]Category{\n \"database-exists\": CatDatabase,\n \"database-readable\": CatDatabase,\n \"schema-version\": CatDatabase,\n \"pre-commit-hook\": CatHooks,\n \"post-merge-hook\": CatHooks,\n \"hooks-version\": CatHooks,\n \"sync-branch\": CatSync,\n \"remote-access\": CatSync,\n // ... etc\n}\n```\n\n### 2. Add --verbose flag\n\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().BoolP(\"verbose\", \"v\", false, \"Show all checks including passed\")\n```\n\n### 3. Create formatter (cmd/bd/doctor/format.go)\n\n```go\ntype Formatter struct {\n verbose bool\n noColor bool\n}\n\nfunc (f *Formatter) Format(results []CheckResult) string {\n var buf strings.Builder\n \n // Count by status\n passed, warnings, errors := countByStatus(results)\n \n // Header\n buf.WriteString(fmt.Sprintf(\"bd doctor v%s\\n\\n\", version.Version))\n buf.WriteString(fmt.Sprintf(\"Summary: %d passed, %d warnings, %d errors\\n\\n\", \n passed, warnings, errors))\n \n // Errors section (always show)\n if errors \u003e 0 {\n f.writeSection(\u0026buf, \"✗ Errors\", filterByStatus(results, StatusError))\n }\n \n // Warnings section (always show)\n if warnings \u003e 0 {\n f.writeSection(\u0026buf, \"⚠ Warnings\", filterByStatus(results, StatusWarning))\n }\n \n // Passed section (only with --verbose)\n if f.verbose \u0026\u0026 passed \u003e 0 {\n f.writePassedSection(\u0026buf, filterByStatus(results, StatusPassed))\n } else if passed \u003e 0 {\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d) [use --verbose to show details]\\n\", passed))\n }\n \n return buf.String()\n}\n\nfunc (f *Formatter) writeSection(buf *strings.Builder, title string, results []CheckResult) {\n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(title + \"\\n\")\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, r := range results {\n buf.WriteString(fmt.Sprintf(\"[%s] %s\\n\", r.CheckName, r.Message))\n if r.Details != \"\" {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", r.Details))\n }\n if r.Fix != \"\" {\n buf.WriteString(fmt.Sprintf(\" Fix: %s\\n\", r.Fix))\n }\n buf.WriteString(\"\\n\")\n }\n}\n\nfunc (f *Formatter) writePassedSection(buf *strings.Builder, results []CheckResult) {\n // Group by category\n byCategory := groupByCategory(results)\n \n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d)\\n\", len(results)))\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, cat := range categoryOrder {\n if checks, ok := byCategory[cat]; ok {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", cat))\n for _, r := range checks {\n buf.WriteString(fmt.Sprintf(\" ✓ %s\\n\", r.Message))\n }\n buf.WriteString(\"\\n\")\n }\n }\n}\n```\n\n### 4. Update run function\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n verbose, _ := cmd.Flags().GetBool(\"verbose\")\n noColor, _ := cmd.Flags().GetBool(\"no-color\")\n \n results := runAllChecks()\n \n formatter := \u0026Formatter{verbose: verbose, noColor: noColor}\n fmt.Print(formatter.Format(results))\n \n // Exit code based on results\n if hasErrors(results) {\n os.Exit(1)\n }\n}\n```\n\n## Files to Modify\n\n1. **cmd/bd/doctor.go** - Add --verbose flag, update run function\n2. **cmd/bd/doctor/format.go** - New file for formatting logic\n3. **cmd/bd/doctor/categories.go** - New file for check categorization\n4. **cmd/bd/doctor/common.go** - Add Status field to CheckResult if missing\n\n## Testing\n\n```bash\n# Default output (concise)\nbd doctor\n\n# Verbose output\nbd doctor --verbose\n\n# JSON output (should still work)\nbd doctor --json\n```\n\n## Success Criteria\n- Summary line at top with counts\n- Only failures/warnings shown by default\n- --verbose shows grouped passed checks\n- Visual separators between sections\n- Exit code 1 if errors, 0 otherwise","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T09:29:27.557578+11:00","updated_at":"2025-12-23T12:35:55.008696-08:00","dependencies":[{"issue_id":"bd-4qfb","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.972517-08:00","created_by":"daemon"}]} +{"id":"bd-4qfb","title":"Improve bd doctor output formatting for better readability","description":"Improve bd doctor output formatting for better readability.\n\n## Current State\nDoctor output is a wall of text with:\n- All checks shown (even passing ones)\n- No visual hierarchy\n- Hard to spot failures in long output\n\n## Target Output\n\n```\n$ bd doctor\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n Current version: 0.34.0\n Latest version: 0.35.0\n Fix: bd hooks install\n\n─────────────────────────────────────────────────\n✓ Passed (24) [use --verbose to show details]\n─────────────────────────────────────────────────\n```\n\nWith --verbose:\n```\n$ bd doctor --verbose\n\nbd doctor v0.35.0\n\nSummary: 24 checks passed, 1 warning, 0 errors\n\n─────────────────────────────────────────────────\n⚠ Warnings (1)\n─────────────────────────────────────────────────\n\n[hooks] Git hooks outdated\n ...\n\n─────────────────────────────────────────────────\n✓ Passed (24)\n─────────────────────────────────────────────────\n\n Database\n ✓ Database exists\n ✓ Database readable\n ✓ Schema up to date\n \n Git Hooks\n ✓ Pre-commit hook installed\n ✓ Post-merge hook installed\n ⚠ Hooks version mismatch (see above)\n \n Sync\n ✓ Sync branch configured\n ✓ Remote accessible\n ...\n```\n\n## Implementation\n\n### 1. Add check categories (cmd/bd/doctor/categories.go)\n\n```go\ntype Category string\n\nconst (\n CatDatabase Category = \"Database\"\n CatHooks Category = \"Git Hooks\"\n CatSync Category = \"Sync\"\n CatDaemon Category = \"Daemon\"\n CatConfig Category = \"Configuration\"\n CatIntegrity Category = \"Data Integrity\"\n)\n\n// Assign categories to checks\nvar checkCategories = map[string]Category{\n \"database-exists\": CatDatabase,\n \"database-readable\": CatDatabase,\n \"schema-version\": CatDatabase,\n \"pre-commit-hook\": CatHooks,\n \"post-merge-hook\": CatHooks,\n \"hooks-version\": CatHooks,\n \"sync-branch\": CatSync,\n \"remote-access\": CatSync,\n // ... etc\n}\n```\n\n### 2. Add --verbose flag\n\n```go\n// In cmd/bd/doctor.go init()\ndoctorCmd.Flags().BoolP(\"verbose\", \"v\", false, \"Show all checks including passed\")\n```\n\n### 3. Create formatter (cmd/bd/doctor/format.go)\n\n```go\ntype Formatter struct {\n verbose bool\n noColor bool\n}\n\nfunc (f *Formatter) Format(results []CheckResult) string {\n var buf strings.Builder\n \n // Count by status\n passed, warnings, errors := countByStatus(results)\n \n // Header\n buf.WriteString(fmt.Sprintf(\"bd doctor v%s\\n\\n\", version.Version))\n buf.WriteString(fmt.Sprintf(\"Summary: %d passed, %d warnings, %d errors\\n\\n\", \n passed, warnings, errors))\n \n // Errors section (always show)\n if errors \u003e 0 {\n f.writeSection(\u0026buf, \"✗ Errors\", filterByStatus(results, StatusError))\n }\n \n // Warnings section (always show)\n if warnings \u003e 0 {\n f.writeSection(\u0026buf, \"⚠ Warnings\", filterByStatus(results, StatusWarning))\n }\n \n // Passed section (only with --verbose)\n if f.verbose \u0026\u0026 passed \u003e 0 {\n f.writePassedSection(\u0026buf, filterByStatus(results, StatusPassed))\n } else if passed \u003e 0 {\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d) [use --verbose to show details]\\n\", passed))\n }\n \n return buf.String()\n}\n\nfunc (f *Formatter) writeSection(buf *strings.Builder, title string, results []CheckResult) {\n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(title + \"\\n\")\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, r := range results {\n buf.WriteString(fmt.Sprintf(\"[%s] %s\\n\", r.CheckName, r.Message))\n if r.Details != \"\" {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", r.Details))\n }\n if r.Fix != \"\" {\n buf.WriteString(fmt.Sprintf(\" Fix: %s\\n\", r.Fix))\n }\n buf.WriteString(\"\\n\")\n }\n}\n\nfunc (f *Formatter) writePassedSection(buf *strings.Builder, results []CheckResult) {\n // Group by category\n byCategory := groupByCategory(results)\n \n buf.WriteString(\"─────────────────────────────────────────────────\\n\")\n buf.WriteString(fmt.Sprintf(\"✓ Passed (%d)\\n\", len(results)))\n buf.WriteString(\"─────────────────────────────────────────────────\\n\\n\")\n \n for _, cat := range categoryOrder {\n if checks, ok := byCategory[cat]; ok {\n buf.WriteString(fmt.Sprintf(\" %s\\n\", cat))\n for _, r := range checks {\n buf.WriteString(fmt.Sprintf(\" ✓ %s\\n\", r.Message))\n }\n buf.WriteString(\"\\n\")\n }\n }\n}\n```\n\n### 4. Update run function\n\n```go\nfunc runDoctor(cmd *cobra.Command, args []string) {\n verbose, _ := cmd.Flags().GetBool(\"verbose\")\n noColor, _ := cmd.Flags().GetBool(\"no-color\")\n \n results := runAllChecks()\n \n formatter := \u0026Formatter{verbose: verbose, noColor: noColor}\n fmt.Print(formatter.Format(results))\n \n // Exit code based on results\n if hasErrors(results) {\n os.Exit(1)\n }\n}\n```\n\n## Files to Modify\n\n1. **cmd/bd/doctor.go** - Add --verbose flag, update run function\n2. **cmd/bd/doctor/format.go** - New file for formatting logic\n3. **cmd/bd/doctor/categories.go** - New file for check categorization\n4. **cmd/bd/doctor/common.go** - Add Status field to CheckResult if missing\n\n## Testing\n\n```bash\n# Default output (concise)\nbd doctor\n\n# Verbose output\nbd doctor --verbose\n\n# JSON output (should still work)\nbd doctor --json\n```\n\n## Success Criteria\n- Summary line at top with counts\n- Only failures/warnings shown by default\n- --verbose shows grouped passed checks\n- Visual separators between sections\n- Exit code 1 if errors, 0 otherwise","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/Polish","created_at":"2025-12-13T09:29:27.557578+11:00","updated_at":"2025-12-23T13:07:46.783728-08:00","dependencies":[{"issue_id":"bd-4qfb","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.972517-08:00","created_by":"daemon"}]} {"id":"bd-4ri","title":"Fix TestFallbackToDirectModeEnablesFlush deadlock causing 10min test timeout","description":"## Problem\n\nTestFallbackToDirectModeEnablesFlush in direct_mode_test.go deadlocks for 9m59s before timing out, causing the entire test suite to take 10+ minutes instead of \u003c10 seconds.\n\n## Root Cause\n\nDatabase lock contention between test cleanup and flushToJSONL():\n- Test cleanup (line 36) tries to close DB via defer\n- flushToJSONL() (line 132) is still accessing DB\n- Results in deadlock: database/sql.(*DB).Close() waits for mutex while GetJSONLFileHash() holds it\n\n## Stack Trace Evidence\n\n```\ngoroutine 512 [sync.Mutex.Lock, 9 minutes]:\ndatabase/sql.(*DB).Close(0x14000643790)\n .../database/sql/sql.go:927 +0x84\ngithub.com/steveyegge/beads/cmd/bd.TestFallbackToDirectModeEnablesFlush.func1()\n .../direct_mode_test.go:36 +0xf4\n\nWhile goroutine running flushToJSONL() holds DB connection via GetJSONLFileHash()\n```\n\n## Impact\n\n- Test suite: 10+ minutes → should be \u003c10 seconds\n- ALL other tests pass in ~4 seconds\n- This ONE test accounts for 99.9% of test runtime\n\n## Related\n\nThis is the EXACT same issue documented in MAIN_TEST_REFACTOR_NOTES.md for why main_test.go refactoring was deferred - global state manipulation + DB cleanup = deadlock.\n\n## Fix Approaches\n\n1. **Add proper cleanup sequencing** - stop flush goroutines BEFORE closing DB\n2. **Use test-specific DB lifecycle** - ensure flush completes before cleanup\n3. **Mock the flush mechanism** - avoid real DB for testing this code path \n4. **Add explicit timeout handling** - fail fast with clear error instead of hanging\n\n## Files\n\n- cmd/bd/direct_mode_test.go:36-132\n- cmd/bd/autoflush.go:353 (validateJSONLIntegrity)\n- cmd/bd/autoflush.go:508 (flushToJSONLWithState)\n\n## Acceptance\n\n- Test passes without timeout\n- Test suite completes in \u003c10 seconds\n- No deadlock between cleanup and flush operations","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T20:09:00.794372-05:00","updated_at":"2025-12-17T23:13:40.533279-08:00","closed_at":"2025-12-17T17:25:07.626617-08:00"} {"id":"bd-4sfl","title":"Merge: bd-14ie","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-14ie\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-19T23:23:37.360782-08:00","updated_at":"2025-12-20T23:17:26.997276-08:00","closed_at":"2025-12-20T23:17:26.997276-08:00","close_reason":"Branches nuked, MRs obsolete"} {"id":"bd-4uoc","title":"Code Review Followup Summary: PR #481 + PR #551","description":"## Merged PRs Summary\n\n### PR #551: Persist close_reason to issues table\n- ✅ Merged successfully\n- ✅ Bug fix: close_reason now persisted in database column (not just events table)\n- ✅ Comprehensive test coverage added\n- ✅ Handles reopen case (clearing close_reason)\n\n**Followup Issues Filed:**\n- bd-lxzx: Document close_reason in JSONL export format\n- bd-077e: Update CLI documentation for close_reason field\n\n---\n\n### PR #481: Context Engineering Optimizations (80-90% context reduction)\n- ✅ Merged successfully \n- ✅ Lazy tool discovery: discover_tools() + get_tool_info()\n- ✅ Minimal issue models: IssueMinimal (~80% smaller than full Issue)\n- ✅ Result compaction: Auto-compacts results \u003e20 items\n- ✅ All 28 tests passing\n- ⚠️ Breaking change: ready() and list() return type changed\n\n**Followup Issues Filed:**\n- bd-b318: Add integration tests for CompactedResult\n- bd-4u2b: Make compaction settings configurable (THRESHOLD, PREVIEW_COUNT)\n- bd-2kf8: Document CompactedResult response format in CONTEXT_ENGINEERING.md\n- bd-pdr2: Document backwards compatibility considerations\n\n---\n\n## Overall Assessment\n\nBoth PRs are production-ready with solid implementations. All critical functionality works and tests pass. Followup issues focus on:\n1. Documentation improvements (5 issues)\n2. Integration test coverage (1 issue)\n3. Configuration flexibility (1 issue)\n4. Backwards compatibility guidance (1 issue)\n\nNo critical bugs or design issues found.\n\n## Review Completed By\nCode review process completed. Issues auto-created for tracking improvements.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-14T14:25:59.214886-08:00","updated_at":"2025-12-14T14:25:59.214886-08:00","dependencies":[{"issue_id":"bd-4uoc","depends_on_id":"bd-otf4","type":"discovered-from","created_at":"2025-12-14T14:25:59.216884-08:00","created_by":"stevey","metadata":"{}"},{"issue_id":"bd-4uoc","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:59.217296-08:00","created_by":"stevey","metadata":"{}"}]}