bd sync: 2025-11-28 18:36:54

This commit is contained in:
Steve Yegge
2025-11-28 18:36:54 -08:00
parent e395b45e0a
commit c0d7f0974f

View File

@@ -52,11 +52,11 @@
{"id":"bd-mdw","title":"Add integration test for cross-clone deletion propagation","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-25T14:56:38.997009-08:00","updated_at":"2025-11-25T16:35:59.052914-08:00","closed_at":"2025-11-25T16:35:59.052914-08:00"}
{"id":"bd-mnap","title":"Investigate performance issues in VS Code Copilot (Windows)","description":"Beads unusable in Windows 11 VS Code Copilot chat with Sonnet 4.5.\nSummary event happens every 3-4 turns, taking 3 minutes.\nCopilot summarizes after ~125k tokens despite model supporting 1M.\nLarge context size of beads might be triggering aggressive summarization.\nNeed workaround or optimization for context size.\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-20T18:56:30.124918-05:00","updated_at":"2025-11-20T18:56:30.124918-05:00"}
{"id":"bd-nq41","title":"Fix Homebrew warning about Ruby file location","description":"Homebrew warning: Found Ruby file outside steveyegge/beads tap formula directory.\nWarning points to: /opt/homebrew/Library/Taps/steveyegge/homebrew-beads/bd.rb\nIt should likely be inside a Formula/ directory or similar structure expected by Homebrew taps.\n","status":"closed","priority":2,"issue_type":"chore","created_at":"2025-11-20T18:56:21.226579-05:00","updated_at":"2025-11-26T22:25:37.362928-08:00","closed_at":"2025-11-26T22:25:37.362928-08:00"}
{"id":"bd-nsb","title":"Doctor should exclude merge artifacts from 'multiple JSONL' warning","description":"Doctor command warns about 'multiple JSONL files' when .base.jsonl and .left.jsonl merge artifacts exist. These are expected during/after merge operations and should be excluded from the warning.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.988178-08:00","updated_at":"2025-11-28T18:22:16.903917-08:00","closed_at":"2025-11-28T17:41:50.700658-08:00"}
{"id":"bd-nsb","title":"Doctor should exclude merge artifacts from 'multiple JSONL' warning","description":"Doctor command warns about 'multiple JSONL files' when .base.jsonl and .left.jsonl merge artifacts exist. These are expected during/after merge operations and should be excluded from the warning.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.988178-08:00","updated_at":"2025-11-28T18:36:52.087768-08:00","closed_at":"2025-11-28T17:41:50.700658-08:00"}
{"id":"bd-o2e","title":"bd sync --squash: batch multiple syncs into single commit","description":"For solo developers who don't need real-time multi-agent coordination, add a --squash option to bd sync that accumulates changes and commits them in a single commit rather than one commit per sync.\n\nThis addresses the git history pollution concern (many 'bd sync: timestamp' commits) while preserving the default behavior needed for orchestration.\n\n**Proposed behavior:**\n- `bd sync --squash` accumulates pending exports\n- Only commits when explicitly requested or on session end\n- Default behavior unchanged (immediate commits for orchestration)\n\n**Use case:** Solo developers who want cleaner git history but don't need real-time coordination between agents.\n\n**Related:** PR #411 (docs: reduce bd sync commit pollution)\n**See also:** Multi-repo support as alternative solution (docs/MULTI_REPO_AGENTS.md)","status":"open","priority":3,"issue_type":"feature","created_at":"2025-11-28T17:59:37.918686-08:00","updated_at":"2025-11-28T17:59:37.918686-08:00"}
{"id":"bd-ov1","title":"Doctor: exclude merge artifacts from 'multiple JSONL' warning","description":"## Problem\n`bd doctor` warns about 'Multiple JSONL files found' when merge artifact files exist:\n```\nJSONL Files: Multiple JSONL files found: beads.base.jsonl, beads.left.jsonl, issues.jsonl ⚠\n```\n\nThis is confusing because these aren't real issue JSONL files - they're temporary snapshots for deletion tracking.\n\n## Fix\nExclude known merge artifact patterns from the multiple-JSONL warning:\n\n```go\n// In doctor JSONL check\nskipPatterns := map[string]bool{\n \"beads.base.jsonl\": true,\n \"beads.left.jsonl\": true, \n \"beads.right.jsonl\": true,\n}\n```\n\n## Files\n- cmd/bd/doctor/ (JSONL check logic)","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-28T17:06:26.266097-08:00","updated_at":"2025-11-28T17:06:26.266097-08:00"}
{"id":"bd-p6vp","title":"Clarify .beads/.gitattributes handling in Protected Branches docs","description":"Protected Branches docs quick start leaves untracked `.beads` directory and `.gitattributes`.\nQuestion: Are these changes meant to be checked into the protected branch?\nNeed to clarify if these should be ignored or committed, or if the instructions are missing a step.\n","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-20T18:56:25.79407-05:00","updated_at":"2025-11-26T22:25:47.574326-08:00","closed_at":"2025-11-26T22:25:47.574326-08:00"}
{"id":"bd-pg1","title":"[CRITICAL] Sync validation false positive - legitimate deletions trigger 'data loss detected'","description":"Sync preflight validation incorrectly detects 'data loss' when legitimate deletions occur. This blocks all syncs and is the highest priority fix.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-28T17:27:42.179281-08:00","updated_at":"2025-11-28T18:22:16.903409-08:00","closed_at":"2025-11-28T17:42:49.92251-08:00"}
{"id":"bd-pg1","title":"[CRITICAL] Sync validation false positive - legitimate deletions trigger 'data loss detected'","description":"Sync preflight validation incorrectly detects 'data loss' when legitimate deletions occur. This blocks all syncs and is the highest priority fix.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-28T17:27:42.179281-08:00","updated_at":"2025-11-28T18:36:52.088427-08:00","closed_at":"2025-11-28T17:42:49.92251-08:00"}
{"id":"bd-qsm","title":"Auto-compact deletions during bd sync","description":"Parent: bd-imj\n\n## Task\nOptionally prune deletions manifest during sync when threshold exceeded.\n\n**Note: Opt-in feature** - disabled by default to avoid sync latency.\n\n## Implementation\n\nIn `bd sync`:\n```go\nfunc (s *Syncer) Sync() error {\n // ... existing sync logic ...\n \n // Auto-compact only if enabled\n if s.config.GetBool(\"deletions.auto_compact\", false) {\n deletionCount := deletions.Count(\".beads/deletions.jsonl\")\n threshold := s.config.GetInt(\"deletions.auto_compact_threshold\", 1000)\n \n if deletionCount \u003e threshold {\n retentionDays := s.config.GetInt(\"deletions.retention_days\", 7)\n if err := s.compactor.PruneDeletions(retentionDays); err != nil {\n log.Warnf(\"Failed to auto-compact deletions: %v\", err)\n // Non-fatal, continue sync\n }\n }\n }\n \n // ... rest of sync ...\n}\n```\n\n## Configuration\n```yaml\ndeletions:\n retention_days: 7\n auto_compact: false # Opt-in, disabled by default\n auto_compact_threshold: 1000 # Trigger when \u003e N entries (if enabled)\n```\n\n## Acceptance Criteria\n- [ ] Auto-compact disabled by default\n- [ ] Enabled via config `deletions.auto_compact: true`\n- [ ] Sync checks deletion count only when enabled\n- [ ] Auto-prunes when threshold exceeded\n- [ ] Failure is non-fatal (logged warning)\n- [ ] Test: no compaction when disabled\n- [ ] Test: compaction triggers when enabled and threshold exceeded","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-25T09:57:04.522795-08:00","updated_at":"2025-11-25T15:03:01.469629-08:00","closed_at":"2025-11-25T15:03:01.469629-08:00"}
{"id":"bd-s0z","title":"Consider extracting error handling helpers","description":"Evaluate creating FatalError() and WarnError() helpers as suggested in ERROR_HANDLING.md to reduce boilerplate and enforce consistency. Prototype in a few files first to validate the approach.","status":"open","priority":4,"issue_type":"task","created_at":"2025-11-24T00:28:57.248959-08:00","updated_at":"2025-11-24T00:28:57.248959-08:00"}
{"id":"bd-t3b","title":"Add test coverage for internal/config package","description":"","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-20T21:21:22.91657-05:00","updated_at":"2025-11-20T21:21:22.91657-05:00","dependencies":[{"issue_id":"bd-t3b","depends_on_id":"bd-ge7","type":"blocks","created_at":"2025-11-20T21:21:31.201036-05:00","created_by":"daemon"}]}
@@ -65,7 +65,7 @@
{"id":"bd-tru","title":"Update documentation for bd prime and Claude integration","description":"Update AGENTS.md, README.md, and QUICKSTART.md to document the new `bd prime` command, `bd setup claude` command, and tip system.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-11T23:30:22.77349-08:00","updated_at":"2025-11-25T17:47:30.807069-08:00","closed_at":"2025-11-25T17:47:30.807069-08:00"}
{"id":"bd-tt0","title":"Sync validation false positive: legitimate deletions trigger 'data loss detected'","description":"## Problem\n`bd sync` fails with false positive data loss detection when legitimate deletions occur:\n```\nPost-import validation failed: import reduced issue count: 26 → 25 (data loss detected!)\n```\n\n## Root Cause\nThe validation in `sync.go:329-340` counts DB issues BEFORE import, but `purgeDeletedIssues()` in `importer.go:159` legitimately removes issues DURING import. The validation doesn't account for expected deletions.\n\n**The Flow:**\n```\nsync.go:293 → beforeCount = countDBIssues() = 26\nsync.go:310-319 → sanitizeJSONL removes deleted issues from JSONL (RemovedCount=N)\nsync.go:323 → importFromJSONL() runs subprocess\n └→ importer.go:159 purgeDeletedIssues() removes issues from DB\nsync.go:331 → afterCount = countDBIssues() = 25\nsync.go:335 → validatePostImport(26, 25) → ERROR\n```\n\n## Fix\nPass `sanitizeResult.RemovedCount` to validation and account for expected deletions:\n\n```go\n// sync.go around line 335\nexpectedDecrease := 0\nif sanitizeResult != nil {\n expectedDecrease = sanitizeResult.RemovedCount\n}\nif err := validatePostImportWithDeletions(beforeCount, afterCount, expectedDecrease); err != nil {\n // ...\n}\n```\n\n```go\n// integrity.go - new or modified function\nfunc validatePostImportWithDeletions(before, after, expectedDeletions int) error {\n if after \u003c before - expectedDeletions {\n return fmt.Errorf(\"unexpected data loss: %d → %d (expected max decrease: %d)\", \n before, after, expectedDeletions)\n }\n // ...\n}\n```\n\n## Files\n- cmd/bd/sync.go:329-340\n- cmd/bd/integrity.go:289-301","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-28T17:06:15.515768-08:00","updated_at":"2025-11-28T17:06:15.515768-08:00"}
{"id":"bd-tys","title":"Git history fallback has incorrect logic for detecting deletions","description":"## Problem\n\nThe `wasInGitHistory` function in `internal/importer/importer.go:891` returns true if the ID is found **anywhere** in git history. But finding an ID in history doesn't necessarily mean it was deleted - it could mean:\n\n1. The issue was added (appears in a commit adding it)\n2. The issue was modified (appears in commits updating it)\n3. The issue was deleted (appears in a commit removing it)\n\nThe current logic incorrectly treats all three cases as 'deleted'.\n\n## Correct Logic\n\n`git log -S` with `--oneline` shows commits where the string was added OR removed. To detect deletion specifically:\n\n1. ID appears in git history (was once in JSONL)\n2. ID is NOT currently in JSONL\n\nThe second condition is already checked by the caller (`purgeDeletedIssues`), so technically the logic is correct in context. But the function name and doc comment are misleading.\n\n## Fix Options\n\n1. **Rename function** to `wasEverInJSONL` and update doc comment to clarify\n2. **Add explicit check** for current JSONL state in the function itself\n\nOption 1 is simpler and correct since caller already filters.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-11-25T12:46:16.073661-08:00","updated_at":"2025-11-25T15:11:54.426093-08:00","closed_at":"2025-11-25T15:11:54.426093-08:00"}
{"id":"bd-upd","title":"Sync should cleanup snapshot files after completion","description":"After sync completion, orphan .base.jsonl and .left.jsonl snapshot files remain in .beads/ directory. These should be cleaned up on successful sync.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.727246-08:00","updated_at":"2025-11-28T18:22:16.904307-08:00","closed_at":"2025-11-28T17:42:14.57165-08:00"}
{"id":"bd-upd","title":"Sync should cleanup snapshot files after completion","description":"After sync completion, orphan .base.jsonl and .left.jsonl snapshot files remain in .beads/ directory. These should be cleaned up on successful sync.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-28T17:27:36.727246-08:00","updated_at":"2025-11-28T18:36:52.088915-08:00","closed_at":"2025-11-28T17:42:14.57165-08:00"}
{"id":"bd-v0x","title":"Auto-detect issue prefix from existing JSONL in 'bd init'","description":"When running `bd init` in a fresh clone with existing JSONL, it should auto-detect the issue prefix from the JSONL file instead of requiring `--prefix`.\n\nCurrently you must specify `--prefix ef` manually. But the JSONL file already contains issues like `ef-1it`, `ef-1jp` etc., so the prefix is known.\n\n**Ideal UX**:\n```\n$ bd init\nDetected issue prefix 'ef' from existing JSONL (38 issues).\n✓ Database initialized...\n```\n\nThis would make fresh clone hydration a single command: `bd init` with no flags.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-11-27T20:21:21.049215-08:00","updated_at":"2025-11-27T20:21:21.049215-08:00"}
{"id":"bd-v29","title":"Deletions pruning doesn't include results in JSON output","description":"## Problem\n\nWhen `bd compact --json` runs with deletions pruning, the prune results are silently discarded:\n\n```go\n// Only report if there were deletions to prune\nif result.PrunedCount \u003e 0 {\n if jsonOutput {\n // JSON output will be included in the main response\n return // \u003c-- BUG: results are NOT included anywhere\n }\n ...\n}\n```\n\n## Location\n`cmd/bd/compact.go:925-929`\n\n## Impact\n- JSON consumers don't know deletions were pruned\n- No way to audit pruning via automation\n\n## Fix\nReturn prune results and include in JSON output structure:\n\n```json\n{\n \"success\": true,\n \"compacted\": {...},\n \"deletions_pruned\": {\n \"count\": 5,\n \"retention_days\": 7\n }\n}\n```","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-25T12:48:59.730979-08:00","updated_at":"2025-11-25T15:11:54.363653-08:00","closed_at":"2025-11-25T15:11:54.363653-08:00"}
{"id":"bd-wcl","title":"Document CLI + hooks as recommended approach over MCP","description":"Update documentation to position CLI + bd prime hooks as the primary recommended approach over MCP server, explaining why minimizing context matters even with large context windows (compute cost, energy, environment, latency).","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-12T00:15:25.923025-08:00","updated_at":"2025-11-26T20:13:52.891053-08:00","closed_at":"2025-11-26T18:06:51.020351-08:00"}