From 1a76029b36e6fd04932cd63870ddcf1e6a9329ef Mon Sep 17 00:00:00 2001 From: beads/refinery Date: Sun, 11 Jan 2026 05:44:39 -0800 Subject: [PATCH] bd daemon sync: 2026-01-11 05:44:39 --- .beads/issues.jsonl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 4a731098..8f105291 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -740,6 +740,7 @@ {"id":"bd-auf1","title":"Clean up snapshot files after successful merge","description":"After a successful 3-way merge and import during 'bd sync', the snapshot files (beads.base.jsonl, beads.left.jsonl, and their .meta.json files) are left in the .beads/ directory indefinitely.\n\nThese files are only needed temporarily during the merge process:\n- beads.base.jsonl: snapshot from last successful import\n- beads.left.jsonl: snapshot before git pull\n\nOnce the merge succeeds and the new JSONL is imported, these files serve no purpose and should be cleaned up.\n\nCurrent behavior:\n- sync.go:269 calls updateBaseSnapshot() after successful import\n- UpdateBase() updates beads.base.jsonl to the new state\n- beads.left.jsonl is never removed\n- Both files accumulate in .beads/ directory\n\nExpected behavior:\n- After successful merge and import, clean up both snapshot files\n- Only retain snapshots between sync operations (create on export, use during merge, clean up after import)\n\nThe cleanup logic exists (SnapshotManager.Cleanup()) but is only called on validation failures (deletion_tracking.go:48), not on success.\n\nDiscovered in vc project where stale snapshot files from Nov 8 merge were still present.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-08T22:39:56.460778-08:00","updated_at":"2025-11-08T22:45:40.5809-08:00","closed_at":"2025-11-08T22:45:40.5809-08:00"} {"id":"bd-avxi","title":"Merge: opal-mjwb5yov","description":"branch: polecat/opal-mjwb5yov\ntarget: main\nsource_issue: opal-mjwb5yov\nrig: beads\nagent_bead: gt-beads-polecat-opal","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2026-01-01T19:25:41.421501-08:00","created_by":"beads/polecats/opal","updated_at":"2026-01-01T19:27:07.580453-08:00","closed_at":"2026-01-01T19:27:07.580453-08:00","close_reason":"No branch pushed - verification task with no code changes"} {"id":"bd-awmf","title":"Merge: bd-dtl8","description":"branch: polecat/dag\ntarget: main\nsource_issue: bd-dtl8\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:47:15.147476-08:00","updated_at":"2025-12-23T21:21:57.690692-08:00","closed_at":"2025-12-23T21:21:57.690692-08:00"} +{"id":"bd-ay5fl","title":"Session ended: gt-beads-refinery","status":"closed","priority":2,"issue_type":"event","owner":"steve.yegge@gmail.com","created_at":"2026-01-11T05:44:38.411568-08:00","created_by":"beads/refinery","updated_at":"2026-01-11T05:44:38.474273-08:00","closed_at":"2026-01-11T05:44:38.474273-08:00","close_reason":"auto-closed session cost wisp","ephemeral":true} {"id":"bd-aydr","title":"Add bd reset command for clean slate restart","description":"Implement a `bd reset` command to reset beads to a clean starting state.\n\n## Context\nGitHub issue #479 - users sometimes get beads into an invalid state after updates, and there's no clean way to start fresh. The git backup/restore mechanism that protects against accidental deletion also makes it hard to intentionally reset.\n\n## Design\n\n### Command Interface\n```\nbd reset [--hard] [--force] [--backup] [--dry-run] [--no-init]\n```\n\n| Flag | Effect |\n|------|--------|\n| `--hard` | Also remove from git index and commit |\n| `--force` | Skip confirmation prompt |\n| `--backup` | Create `.beads-backup-{timestamp}/` first |\n| `--dry-run` | Preview what would happen |\n| `--no-init` | Don't re-initialize after clearing |\n\n### Reset Levels\n1. **Soft Reset (default)** - Kill daemons, clear .beads/, re-init. Git history unchanged.\n2. **Hard Reset (`--hard`)** - Also git rm and commit the removal, then commit fresh state.\n\n### Implementation Flow\n1. Validate .beads/ exists\n2. If not --force: show impact summary, prompt confirmation\n3. If --backup: copy .beads/ to .beads-backup-{timestamp}/\n4. Kill daemons\n5. If --hard: git rm + commit\n6. rm -rf .beads/*\n7. If not --no-init: bd init (and git add+commit if --hard)\n8. Print summary\n\n### Safety Mechanisms\n- Confirmation prompt (skip with --force)\n- Impact summary (issue/tombstone counts)\n- Backup option\n- Dry-run preview\n- Git dirty check warning\n\n### Code Structure\n- `cmd/bd/reset.go` - CLI command\n- `internal/reset/` - Core logic package","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-13T08:44:01.38379+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":"epic"} {"id":"bd-aydr.1","title":"Implement core reset package (internal/reset)","description":"Create the core reset logic in internal/reset/ package.\n\n## Responsibilities\n- ResetOptions struct with all flag options\n- CountImpact() - count issues/tombstones that will be deleted\n- ValidateState() - check .beads/ exists, check git dirty state\n- ExecuteReset() - main reset logic (without CLI concerns)\n- Integrate with daemon killall\n\n## Interface Design\n```go\ntype ResetOptions struct {\n Hard bool // Include git operations (git rm, commit)\n Backup bool // Create backup before reset\n DryRun bool // Preview only, don't execute\n SkipInit bool // Don't re-initialize after reset\n}\n\ntype ResetResult struct {\n IssuesDeleted int\n TombstonesDeleted int\n BackupPath string // if backup was created\n DaemonsKilled int\n}\n\ntype ImpactSummary struct {\n IssueCount int\n OpenCount int\n ClosedCount int\n TombstoneCount int\n HasUncommitted bool // git dirty state\n}\n\nfunc Reset(opts ResetOptions) (*ResetResult, error)\nfunc CountImpact() (*ImpactSummary, error)\nfunc ValidateState() error\n```\n\n## IMPORTANT: CLI vs Core Separation\n- `Force` (skip confirmation) is NOT in ResetOptions - that's a CLI concern\n- Core always executes when called; CLI decides whether to prompt first\n- Keep CLI-agnostic: no prompts, no colored output, no user interaction\n- Return errors for CLI to handle with user-friendly messages\n- Unit testable in isolation\n\n## Dependencies\n- Uses daemon.KillAllDaemons() from internal/daemon/\n- Calls bd init logic after reset (unless SkipInit)","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:50.145364+11:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-aydr.1","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:50.145775+11:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"bd-aydr.2","title":"Implement backup functionality for reset","description":"Add backup capability that can be used by reset command.\n\n## Functionality\n- Copy .beads/ to .beads-backup-{timestamp}/\n- Timestamp format: YYYYMMDD-HHMMSS\n- Preserve file permissions\n- Return backup path for user feedback\n\n## Location\n`internal/reset/backup.go` - keep with reset package for now (YAGNI)\n\n## Interface\n```go\nfunc CreateBackup(beadsDir string) (backupPath string, err error)\n```\n\n## Notes\n- Simple recursive file copy, no compression needed\n- Error if backup dir already exists (unlikely with timestamp)\n- Backup directories SHOULD be gitignored\n- Add `.beads-backup-*/` pattern to .beads/.gitignore template in doctor package\n- Consider: ListBackups() for future `bd backup list` command (not for this PR)","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-13T08:44:51.306103+11:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-aydr.2","depends_on_id":"bd-aydr","type":"parent-child","created_at":"2025-12-13T08:44:51.306474+11:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -1857,7 +1858,7 @@ {"id":"bd-tmdx","title":"Investigate database pollution - unexpected issue count increases","description":"Two repositories showing unexpected issue counts:\n- ~/src/beads: 280 issues (expected ~209-220)\n- ~/src/dave/beads: 895 issues (675 open, 149 closed)\n\nThis suggests database pollution - issues from one repository leaking into another. Need to investigate:\n1. Run bd detect-pollution on both repos\n2. Check for cross-repo contamination\n3. Identify source of pollution (daemon? multi-repo config? import issues?)\n4. Clean up polluted databases\n5. Prevent future pollution","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-06T22:50:16.957689-08:00","updated_at":"2025-11-07T00:05:38.994405-08:00","closed_at":"2025-11-07T00:05:38.994405-08:00"} {"id":"bd-tne","title":"Add Claude setup tip with dynamic priority","description":"Add a predefined tip that suggests running `bd setup claude` when Claude Code is detected but not configured. This tip should have higher priority (shown more frequently) until the setup is complete.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-11T23:29:29.871324-08:00","updated_at":"2025-12-09T18:38:37.705574372-05:00","closed_at":"2025-11-25T17:52:35.044989-08:00","dependencies":[{"issue_id":"bd-tne","depends_on_id":"bd-d4i","type":"blocks","created_at":"2025-11-11T23:29:29.872081-08:00","created_by":"daemon"},{"issue_id":"bd-tne","depends_on_id":"bd-br8","type":"blocks","created_at":"2025-11-11T23:29:29.87252-08:00","created_by":"daemon"}]} {"id":"bd-tnsq","title":"bd cleanup fails with CHECK constraint on status/closed_at mismatch","description":"## Problem\n\nRunning bd cleanup --force fails with:\n\nError: failed to create tombstone for bd-okh: sqlite3: constraint failed: CHECK constraint failed: (status = 'closed') = (closed_at IS NOT NULL)\n\n## Root Cause\n\nThe database has a CHECK constraint ensuring closed issues have closed_at set and non-closed issues do not. When bd cleanup tries to convert a closed issue to a tombstone, this constraint fails.\n\n## Impact\n\n- bd cleanup --force cannot complete\n- 722 closed issues cannot be cleaned up\n- Blocks routine maintenance\n\n## Investigation Needed\n\n1. Check the bd-okh record in the database\n2. Determine if this is data corruption or a bug in tombstone creation\n\n## Proposed Solutions\n\n1. If data corruption: Add a bd doctor --fix check that repairs status/closed_at mismatches\n2. If code bug: Fix the tombstone creation to properly handle the constraint\n\n## Files to Investigate\n\n- internal/storage/sqlite/sqlite.go - DeleteIssue / tombstone creation\n- Schema CHECK constraint definition\n\n## Acceptance Criteria\n\n- Identify root cause (data vs code bug)\n- bd cleanup --force completes successfully\n- bd doctor detects status/closed_at mismatches","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-14T00:27:46.359724-08:00","updated_at":"2025-12-14T00:41:54.584366-08:00","closed_at":"2025-12-14T00:34:59.658781-08:00"} -{"id":"bd-tnxc1","title":"Digest: mol-refinery-patrol","description":"Patrol: empty queue, 0 branches merged","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T05:39:35.549441-08:00","updated_at":"2026-01-11T05:39:35.549441-08:00","closed_at":"2026-01-11T05:39:35.549392-08:00","close_reason":"Squashed from 11 wisps","dependencies":[{"issue_id":"bd-tnxc1","depends_on_id":"bd-wisp-at2","type":"parent-child","created_at":"2026-01-11T05:39:35.55036-08:00","created_by":"beads/refinery"}]} +{"id":"bd-tnxc1","title":"Digest: mol-refinery-patrol","description":"Patrol: empty queue, 0 branches merged","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-11T05:39:35.549441-08:00","updated_at":"2026-01-11T05:39:35.549441-08:00","closed_at":"2026-01-11T05:39:35.549392-08:00","close_reason":"Squashed from 11 wisps"} {"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"} {"id":"bd-toy3","title":"Test hook","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T18:33:39.717036-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-tq3gx","title":"Review PR #16459: Fix broken doc link","description":"dispatched_by: beads/crew/emma\n\nReview and verify PR #16459 (anthropics/claude-code)\n\nPR: https://github.com/anthropics/claude-code/pull/16459\nAuthor: nelsonauner\nStatus: APPROVED by sarahdeaton\n\nTask: Verify the doc link fix is correct and merge if appropriate.\n- gh pr view 16459 --repo anthropics/claude-code\n- gh pr diff 16459 --repo anthropics/claude-code\n- If good: gh pr merge 16459 --repo anthropics/claude-code --squash","status":"closed","priority":2,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2026-01-08T14:20:03.669242-08:00","created_by":"beads/crew/emma","updated_at":"2026-01-08T14:29:35.595569-08:00","closed_at":"2026-01-08T14:29:35.595569-08:00","close_reason":"Wrong repo - these were for anthropics/claude-code, not steveyegge/beads"} @@ -2008,7 +2009,6 @@ {"id":"bd-wisp-9kb","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go.\n\nThis powers `bd info --whats-new` for agents.\n\n```go\n\"0.45.0\": {\n \"summary\": \"Brief description\",\n \"changes\": []string{\n \"Key change 1\",\n \"Key change 2\",\n },\n},\n```\n\nFocus on workflow-impacting changes agents need to know.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.256963-08:00","updated_at":"2026-01-06T20:10:31.456687-08:00","closed_at":"2026-01-06T20:10:31.456687-08:00","close_reason":"info.go versionChanges updated for 0.45.0","dependencies":[{"issue_id":"bd-wisp-9kb","depends_on_id":"bd-wisp-540","type":"blocks","created_at":"2026-01-06T20:07:32.27459-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-9kj","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"closed","priority":2,"issue_type":"epic","assignee":"beads/refinery","created_at":"2026-01-11T04:25:29.889621-08:00","updated_at":"2026-01-11T04:32:12.444333-08:00","closed_at":"2026-01-11T04:32:12.444333-08:00","close_reason":"Closed","ephemeral":true} {"id":"bd-wisp-9sq","title":"Release complete","description":"Release v0.45.0 is complete!\n\nSummary:\n- All version files updated\n- Git tag pushed\n- CI artifacts built (via gate)\n- npm and PyPI packages verified\n- Local installation updated\n- Daemons restarted\n\nOptional next steps:\n- Announce on social media\n- Update documentation site\n- Close related milestone\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259643-08:00","updated_at":"2026-01-06T20:18:20.109063-08:00","closed_at":"2026-01-06T20:18:20.109063-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-9sq","depends_on_id":"bd-wisp-bkf","type":"blocks","created_at":"2026-01-06T20:07:32.292316-08:00","created_by":"beads/crew/dave"}]} -{"id":"bd-wisp-at2","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-11T05:37:48.669888-08:00","updated_at":"2026-01-11T05:37:48.669889-08:00","ephemeral":true} {"id":"bd-wisp-bkf","title":"Restart daemons","description":"Restart bd daemons to pick up new version.\n\n```bash\nbd daemons killall\n```\n\nDaemons will auto-restart with new version on next bd command.\n\nVerify:\n```bash\nbd daemons list\n```\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.259461-08:00","updated_at":"2026-01-06T20:18:20.108169-08:00","closed_at":"2026-01-06T20:18:20.108169-08:00","close_reason":"Release v0.45.0 complete","dependencies":[{"issue_id":"bd-wisp-bkf","depends_on_id":"bd-wisp-fm4","type":"blocks","created_at":"2026-01-06T20:07:32.290802-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-bye","title":"Run bump-version.sh","description":"Update all component versions atomically.\n\n```bash\n./scripts/bump-version.sh 0.45.0\n```\n\nThis updates:\n- cmd/bd/version.go\n- .claude-plugin/*.json\n- integrations/beads-mcp/pyproject.toml\n- integrations/beads-mcp/src/beads_mcp/__init__.py\n- npm-package/package.json\n- Hook templates\n- README.md\n- CHANGELOG.md (adds date)\n","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-06T20:07:32.257161-08:00","updated_at":"2026-01-06T20:11:24.896526-08:00","closed_at":"2026-01-06T20:11:24.896526-08:00","close_reason":"Version bumped and verified: 0.45.0","dependencies":[{"issue_id":"bd-wisp-bye","depends_on_id":"bd-wisp-9kb","type":"blocks","created_at":"2026-01-06T20:07:32.275432-08:00","created_by":"beads/crew/dave"}]} {"id":"bd-wisp-c3g","title":"mol-refinery-patrol","description":"Merge queue processor patrol loop.\n\nThe Refinery is the Engineer in the engine room. You process polecat branches, merging them to main one at a time with sequential rebasing.\n\n**The Scotty Test**: Before proceeding past any failure, ask yourself: \"Would Scotty walk past a warp core leak because it existed before his shift?\"\n\n## Merge Flow\n\nThe Refinery receives MERGE_READY mail from Witnesses when polecats complete work:\n\n```\nWitness Refinery Git\n │ │ │\n │ MERGE_READY │ │\n │─────────────────────────\u003e│ │\n │ │ │\n │ (verify branch) │\n │ │ fetch \u0026 rebase │\n │ │──────────────────────────\u003e│\n │ │ │\n │ (run tests) │\n │ │ │\n │ (if pass) │\n │ │ merge \u0026 push │\n │ │──────────────────────────\u003e│\n │ │ │\n │ MERGED │ │\n │\u003c─────────────────────────│ │\n │ │ │\n```\n\nAfter successful merge, Refinery sends MERGED mail back to Witness so it can\ncomplete cleanup (nuke the polecat worktree).","status":"open","priority":2,"issue_type":"epic","created_at":"2026-01-10T22:51:49.272262-08:00","updated_at":"2026-01-10T22:51:49.272262-08:00","ephemeral":true}