From 9bb293e2e14ab49b1b1a106bf1419d6fa42753f0 Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Sun, 2 Nov 2025 15:37:49 -0800 Subject: [PATCH] bd sync: 2025-11-02 15:37:49 --- .beads/beads.jsonl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.beads/beads.jsonl b/.beads/beads.jsonl index 5462caa7..b72b8d66 100644 --- a/.beads/beads.jsonl +++ b/.beads/beads.jsonl @@ -148,7 +148,7 @@ {"id":"bd-b55e2ac2","content_hash":"44122b61b1dcd06407ecf36f57577ea72c5df6dc8cc2a8c1b173b37d16a10267","title":"Fix autoimport tests for content-hash collision scoring","description":"## Overview\nThree autoimport tests are failing after bd-cbed9619.4 because they expect behavior based on the old reference-counting collision resolution, but the system now uses deterministic content-hash scoring.\n\n## Failing Tests\n1. `TestAutoImportMultipleCollisionsRemapped` - expects local versions preserved\n2. `TestAutoImportAllCollisionsRemapped` - expects local versions preserved \n3. `TestAutoImportCollisionRemapMultipleFields` - expects specific collision resolution behavior\n\n## Root Cause\nThese tests were written when ScoreCollisions used reference counting to determine which version to keep. Now it uses content-hash comparison (introduced in commit 2e87329), which produces different but deterministic results.\n\n## Example\nOld behavior: Issue with more references would be kept\nNew behavior: Issue with lexicographically lower content hash is kept\n\n## Solution\nUpdate each test to:\n1. Verify the new content-hash based behavior is correct\n2. Check that the remapped issue (not necessarily local/remote) has the expected content\n3. Ensure dependencies are preserved on the correct remapped issue\n\n## Acceptance Criteria\n- All three autoimport tests pass\n- Tests verify content-hash determinism (same collision always resolves the same way)\n- Tests check dependency preservation on remapped issues\n- Test documentation explains content-hash scoring expectations\n\n## Files to Modify\n- `cmd/bd/autoimport_collision_test.go`\n\n## Testing\nRun: `go test ./cmd/bd -run \"TestAutoImport.*Collision\" -v`","status":"open","priority":2,"issue_type":"task","created_at":"2025-10-28T19:17:28.358028-07:00","updated_at":"2025-10-30T17:12:58.179059-07:00"} {"id":"bd-b5a3","content_hash":"d58f635721d24b7761782f83df452a67f794080d2c41cb4f6fad2f27ef2cf0b6","title":"Extract Daemon struct and config into internal/daemonrunner","description":"Create internal/daemonrunner with Config struct and Daemon struct. Move daemon runtime logic from cmd/bd/daemon.go Run function into Daemon.Start/Stop methods.","notes":"Refactoring complete! Created internal/daemonrunner package with:\n- Config struct (config.go)\n- Daemon struct with Start/Stop methods (daemon.go)\n- RPC server lifecycle (rpc.go)\n- Sync loop implementation (sync.go)\n- Git operations (git.go)\n- Process management (process.go, flock_*.go)\n- Logger setup (logger.go)\n- Platform-specific signal handling (signals_*.go)\n- Database fingerprint validation (fingerprint.go)\n\nBuild succeeds and most daemon tests pass. Import functionality still delegated to cmd/bd (marked with TODO(bd-b5a3)).","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-01T11:41:14.843103-07:00","updated_at":"2025-11-01T20:23:46.475885-07:00","closed_at":"2025-11-01T20:23:46.475888-07:00"} {"id":"bd-b6b2","content_hash":"c7a641bdb4c98b14816e2d85ec09db6def89aa4918ad59f4c1f8f71c6a42c6d4","title":"Feature with design","description":"This is a description","design":"Use MVC pattern","acceptance_criteria":"All tests pass","status":"open","priority":2,"issue_type":"feature","created_at":"2025-10-31T21:40:34.612465-07:00","updated_at":"2025-10-31T21:40:34.612465-07:00"} -{"id":"bd-b7d2","content_hash":"4bfea1b10633672c20b867de59290faa4368595ba46cffd99d1584b0471e4cfd","title":"Add sync.branch configuration","description":"Add configuration layer to support sync.branch setting via config file, environment variable, or CLI flag.\n\nTasks:\n- Add sync.branch field to config schema\n- Add BEADS_SYNC_BRANCH environment variable\n- Add --branch flag to bd init\n- Add bd config get/set sync.branch commands\n- Validation (branch name format, conflicts)\n- Config migration for existing users\n\nEstimated effort: 1-2 days","acceptance_criteria":"- Can set sync.branch via config file, env var, or CLI\n- bd config get sync.branch returns configured value\n- Invalid branch names rejected with clear error\n- Backward compatible (empty = current branch)","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.560141-08:00","updated_at":"2025-11-02T15:22:35.560141-08:00","dependencies":[{"issue_id":"bd-b7d2","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.356847-08:00","created_by":"stevey"}]} +{"id":"bd-b7d2","content_hash":"103664edc1fbb842bd3891ba6e5b3498f77b085e2614c9356aa33b23d3aeb6ea","title":"Add sync.branch configuration","description":"Add configuration layer to support sync.branch setting via config file, environment variable, or CLI flag.\n\nTasks:\n- Add sync.branch field to config schema\n- Add BEADS_SYNC_BRANCH environment variable\n- Add --branch flag to bd init\n- Add bd config get/set sync.branch commands\n- Validation (branch name format, conflicts)\n- Config migration for existing users\n\nEstimated effort: 1-2 days","acceptance_criteria":"- Can set sync.branch via config file, env var, or CLI\n- bd config get sync.branch returns configured value\n- Invalid branch names rejected with clear error\n- Backward compatible (empty = current branch)","status":"in_progress","priority":1,"issue_type":"task","created_at":"2025-11-02T15:22:35.560141-08:00","updated_at":"2025-11-02T15:27:36.029895-08:00","dependencies":[{"issue_id":"bd-b7d2","depends_on_id":"bd-a101","type":"parent-child","created_at":"2025-11-02T15:22:48.356847-08:00","created_by":"stevey"}]} {"id":"bd-bc2c6191","content_hash":"533e56b8628e24229a4beb52f8683355f6ca699e34a73650bf092003d73c2957","title":"Audit Current Cache Usage","description":"Understand exactly what code depends on the storage cache","acceptance_criteria":"- Document showing all cache dependencies\n- Confirmation that removing cache won't break MCP\n- List of tests that need updating\n\nFiles to examine:\n- internal/rpc/server_cache_storage.go (cache implementation)\n- internal/rpc/client.go (how req.Cwd is set)\n- internal/rpc/server_*.go (all getStorageForRequest calls)\n- integrations/beads-mcp/ (MCP multi-repo logic)\n\nTasks:\n- Document all callers of getStorageForRequest()\n- Verify req.Cwd is only set by RPC client for database discovery\n- Confirm MCP server doesn't rely on multi-repo cache behavior\n- Check if any tests assume multi-repo routing\n- Review environment variables: BEADS_DAEMON_MAX_CACHE_SIZE, BEADS_DAEMON_CACHE_TTL, BEADS_DAEMON_MEMORY_THRESHOLD_MB","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-27T23:02:43.506373-07:00","updated_at":"2025-10-31T20:36:49.334214-07:00"} {"id":"bd-bdaf24d5","content_hash":"6ccdbf2362d22fbbe854fdc666695a7488353799e1a5c49e6095b34178c9bcb4","title":"Final validation test","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-27T18:27:28.310533-07:00","updated_at":"2025-10-31T12:00:43.184995-07:00","closed_at":"2025-10-31T12:00:43.184995-07:00"} {"id":"bd-c01f","content_hash":"b183cc4d99f74e9314f67d927f1bd1255608632b47ce0352af97af5872275fec","title":"Implement bd stale command to find abandoned/forgotten issues","description":"Add bd stale command to surface issues that haven't been updated recently and may need attention.\n\nUse cases:\n- In-progress issues with no recent activity (may be abandoned)\n- Open issues that have been forgotten\n- Issues that might be outdated or no longer relevant\n\nQuery logic should find non-closed issues where updated_at exceeds a time threshold.\n\nShould support:\n- --days N flag (default 30-90 days)\n- --status filter (e.g., only in_progress)\n- --json output for automation\n\nReferences GitHub issue #184 where user expected this command to exist.","design":"Implementation approach:\n1. Add new command in cmd/bd/stale.go\n2. Query issues with: status != 'closed' AND updated_at \u003c (now - N days)\n3. Support filtering by status (open, in_progress, blocked)\n4. Default threshold: 30 days (configurable via --days)\n5. JSON output for agent consumption\n6. Order by updated_at ASC (oldest first)","status":"closed","priority":2,"issue_type":"epic","created_at":"2025-10-31T22:48:46.85435-07:00","updated_at":"2025-10-31T22:54:33.704492-07:00","closed_at":"2025-10-31T22:54:33.704492-07:00"} @@ -183,6 +183,7 @@ {"id":"bd-dcd6f14b","content_hash":"efc3565abad1605a8bc16b151fa067d0584a36e3e86e0baa2fb5e5a470c64444","title":"Batch test 4","description":"","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-29T15:29:02.053523-07:00","updated_at":"2025-10-31T12:00:43.182861-07:00","closed_at":"2025-10-31T12:00:43.182861-07:00"} {"id":"bd-dd6f6d26","content_hash":"dbcecb8b95f9f2939d97c61bd8cbe331bea866f47600bded213d3122e311c356","title":"Fix autoimport tests for content-hash collision scoring","description":"## Overview\nThree autoimport tests are failing after bd-cbed9619.4 because they expect behavior based on the old reference-counting collision resolution, but the system now uses deterministic content-hash scoring.\n\n## Failing Tests\n1. `TestAutoImportMultipleCollisionsRemapped` - expects local versions preserved\n2. `TestAutoImportAllCollisionsRemapped` - expects local versions preserved \n3. `TestAutoImportCollisionRemapMultipleFields` - expects specific collision resolution behavior\n\n## Root Cause\nThese tests were written when ScoreCollisions used reference counting to determine which version to keep. Now it uses content-hash comparison (introduced in commit 2e87329), which produces different but deterministic results.\n\n## Example\nOld behavior: Issue with more references would be kept\nNew behavior: Issue with lexicographically lower content hash is kept\n\n## Solution\nUpdate each test to:\n1. Verify the new content-hash based behavior is correct\n2. Check that the remapped issue (not necessarily local/remote) has the expected content\n3. Ensure dependencies are preserved on the correct remapped issue\n\n## Acceptance Criteria\n- All three autoimport tests pass\n- Tests verify content-hash determinism (same collision always resolves the same way)\n- Tests check dependency preservation on remapped issues\n- Test documentation explains content-hash scoring expectations\n\n## Files to Modify\n- `cmd/bd/autoimport_collision_test.go`\n\n## Testing\nRun: `go test ./cmd/bd -run \"TestAutoImport.*Collision\" -v`","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T19:12:56.344193-07:00","updated_at":"2025-10-30T17:12:58.178703-07:00","closed_at":"2025-10-28T19:18:35.106895-07:00","dependencies":[{"issue_id":"bd-dd6f6d26","depends_on_id":"bd-cbed9619.4","type":"discovered-from","created_at":"2025-10-28T19:12:56.345276-07:00","created_by":"daemon"}]} {"id":"bd-df190564","content_hash":"4f4f22b210c0a5cabd1beebb9c291993adf25843a36ef2ea07227f35de578018","title":"bd repair-deps - Orphaned dependency cleaner","description":"Find and fix orphaned dependency references.\n\nImplementation:\n- Scan all issues for dependencies pointing to non-existent issues\n- Report orphaned refs\n- Auto-fix with --fix flag\n- Interactive mode with --interactive\n\nFiles: cmd/bd/repair_deps.go (new)","status":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T19:42:29.852745-07:00","updated_at":"2025-10-31T18:24:19.418221-07:00","closed_at":"2025-10-31T18:24:19.418221-07:00"} +{"id":"bd-e05d","content_hash":"93b5841456cde535c270311993445985295343e2a625e59afd7004fafed6f14f","title":"Investigate and optimize test suite performance","description":"Test suite is taking very long to run (\u003e45s for cmd/bd tests, full suite timing unknown but was cancelled).\n\nThis impacts development velocity and CI/CD performance.\n\nInvestigation needed:\n- Profile which tests are slowest\n- Identify bottlenecks (disk I/O, network, excessive setup/teardown?)\n- Consider parallelization opportunities\n- Look for redundant test cases\n- Check if integration tests can be optimized","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-02T15:37:44.529955-08:00","updated_at":"2025-11-02T15:37:44.529955-08:00"} {"id":"bd-e1085716","content_hash":"f180247fd30176bb37125a69c1c9361815d52e3437f930b81ec164d4cb92c4dd","title":"bd validate - Comprehensive health check","description":"Run all validation checks in one command.\n\nChecks:\n- Duplicates\n- Orphaned dependencies\n- Test pollution\n- Git conflicts\n\nSupports --fix-all for auto-repair.\n\nDepends on bd-cbed9619.1, bd-0dcea000, bd-31aab707, bd-9826b69a.\n\nFiles: cmd/bd/validate.go (new)","status":"open","priority":1,"issue_type":"task","created_at":"2025-10-29T23:05:13.980679-07:00","updated_at":"2025-10-30T17:12:58.19736-07:00"} {"id":"bd-e1d645e8","content_hash":"38eb74773fec37584ddaeb23f64a7ebbbb94893a2f1ab047740bf9f0cfca88c0","title":"Rapid 4","description":"","status":"open","priority":3,"issue_type":"task","created_at":"2025-10-29T19:11:57.484329-07:00","updated_at":"2025-10-30T17:12:58.189715-07:00"} {"id":"bd-e55c","content_hash":"1204ddc254f51c686f5586fe540d36abe0a225176e0eb8418147e46cbd3aa298","title":"Import overwrites newer local issues with older remote versions","description":"## Problem\n\nDuring git pull + import, local issues with newer updated_at timestamps get overwritten by older versions from remote JSONL.\n\n## What Happened\n\nTimeline:\n1. 17:52 - Closed bd-df190564 and bd-b501fcc1 locally (updated_at: 2025-10-31)\n2. 17:51 - Remote pushed same issues with status=open (updated_at: 2025-10-30)\n3. 17:52 - Local sync pulled remote commit and imported JSONL\n4. Result: Issues reverted to open despite local version being newer\n\n## Root Cause\n\nDetectCollisions (internal/storage/sqlite/collision.go:67-79) compares fields but doesn't check timestamps:\n\n```go\nconflictingFields := compareIssues(existing, incoming)\nif len(conflictingFields) == 0 {\n result.ExactMatches = append(result.ExactMatches, incoming.ID)\n} else {\n // Same ID, different content - treats as UPDATE\n result.Collisions = append(result.Collisions, \u0026CollisionDetail{...})\n}\n```\n\nImport applies incoming version regardless of which is newer.\n\n## Expected Behavior\n\nImport should:\n1. Compare updated_at timestamps when collision detected\n2. Skip update if local version is newer\n3. Apply update only if remote version is newer\n4. Warn on timestamp conflicts\n\n## Solution\n\nAdd timestamp checking to DetectCollisions or importIssues:\n\n```go\nif len(conflictingFields) \u003e 0 {\n // Check timestamps\n if !incoming.UpdatedAt.After(existing.UpdatedAt) {\n // Local is newer or same - skip update\n result.ExactMatches = append(result.ExactMatches, incoming.ID)\n continue\n }\n // Remote is newer - apply update\n result.Collisions = append(result.Collisions, \u0026CollisionDetail{...})\n}\n```\n\n## Files\n- internal/storage/sqlite/collision.go\n- internal/importer/importer.go\n\n## References\n- Discovered during bd-df190564, bd-b501fcc1 re-opening","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-10-31T17:56:43.919306-07:00","updated_at":"2025-10-31T18:05:55.521427-07:00","closed_at":"2025-10-31T18:05:55.521427-07:00"}