bd daemon export: 2025-11-23 20:54:53

This commit is contained in:
Steve Yegge
2025-11-23 20:54:53 -08:00
parent 9ba039ce45
commit 7150d02502

View File

@@ -144,7 +144,7 @@
{"id":"bd-4oqu","content_hash":"9d7a6f8fc07220e96e0d1b509579b9d7a292ffc52720b8bc78e5523743a18e38","title":"Test parent issue","description":"","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-05T13:00:39.737739-08:00","updated_at":"2025-11-05T13:01:11.635711-08:00","closed_at":"2025-11-05T13:01:11.635711-08:00","source_repo":"."}
{"id":"bd-4oqu.1","content_hash":"fbeac3089798c66a2c85aa49d5abdc050a38c3c31209599ae1f2117c8ba9f180","title":"Test child direct","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:00:55.992712-08:00","updated_at":"2025-11-05T13:01:11.654435-08:00","closed_at":"2025-11-05T13:01:11.654435-08:00","source_repo":"."}
{"id":"bd-4oqu.2","content_hash":"3dfea0ba8e0bfa2424411e65f9fc549af6edecb1490cee786a08d8ceff4c2ed6","title":"Test child daemon mode","description":"","status":"closed","priority":1,"issue_type":"task","created_at":"2025-11-05T13:01:06.642305-08:00","updated_at":"2025-11-05T13:01:11.669369-08:00","closed_at":"2025-11-05T13:01:11.669369-08:00","source_repo":"."}
{"id":"bd-4owj","content_hash":"74a9ed9b938fd7eb7e4f94eb027bb57ee4d50776a7364e727430deb8c003353c","title":"Fix race condition in client socket cleanup (client.go)","description":"**Location:** internal/rpc/client.go:44-76\n\n**Issue:** TryConnectWithTimeout() has race window between socket existence check and lock file check.\n\n**Problematic Sequence:**\n```go\nsocketExists := endpointExists(socketPath) // line 56\nif !socketExists {\n beadsDir := filepath.Dir(socketPath)\n running, _ := lockfile.TryDaemonLock(beadsDir) // line 61\n // RACE: socket could've been deleted between lines 56 and 61\n}\n```\n\n**Impact:** Could incorrectly report daemon as running when it crashed. Socket gets deleted during cleanup but lock file still held temporarily.\n\n**Fix:** Combine checks atomically or use transactional approach with proper locking.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-11-23T19:46:51.375018-08:00","updated_at":"2025-11-23T19:46:51.375018-08:00","source_repo":"."}
{"id":"bd-4owj","content_hash":"dfe9fb665d2b51a55763759691cb7ca4e5cebfeeb3bf3bacaaa41a4c202a0635","title":"Fix race condition in client socket cleanup (client.go)","description":"**Location:** internal/rpc/client.go:44-76\n\n**Issue:** TryConnectWithTimeout() has race window between socket existence check and lock file check.\n\n**Problematic Sequence:**\n```go\nsocketExists := endpointExists(socketPath) // line 56\nif !socketExists {\n beadsDir := filepath.Dir(socketPath)\n running, _ := lockfile.TryDaemonLock(beadsDir) // line 61\n // RACE: socket could've been deleted between lines 56 and 61\n}\n```\n\n**Impact:** Could incorrectly report daemon as running when it crashed. Socket gets deleted during cleanup but lock file still held temporarily.\n\n**Fix:** Combine checks atomically or use transactional approach with proper locking.","status":"in_progress","priority":2,"issue_type":"bug","created_at":"2025-11-23T19:46:51.375018-08:00","updated_at":"2025-11-23T20:54:52.937354-08:00","source_repo":"."}
{"id":"bd-4ri","content_hash":"ecd7ab50ad20a55a52ce62fca06c31b885918c3ef00d924480967d171ed8ed4a","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-11-23T15:15:00.482016-08:00","closed_at":"2025-11-23T15:15:00.482019-08:00","source_repo":"."}
{"id":"bd-4ry","content_hash":"fc0b5a708c2cbef610437e2bd8dab08712d2b151becbe2080db1bc52ff4c03fa","title":"Clarify JSONL size bounds with multi-repo","description":"The contributor-workflow-analysis.md states (line 226): 'Keep beads.jsonl small enough for agents to read (\u003c25k)'\n\nWith multi-repo hydration, it's unclear whether this bound applies to:\n- Each individual JSONL file (likely intention)\n- The total hydrated size across all repos (unclear)\n- Both (most conservative)\n\nClarification needed because:\n- VC monitors .beads/issues.jsonl size to stay under limit\n- With multi-repo, VC needs to know if each additional repo also has 25k limit\n- Agents reading hydrated data need to know total size bounds\n- Performance characteristics depend on total vs per-repo limits\n\nExample scenario:\n- Primary repo: 20k JSONL\n- Planning repo: 15k JSONL\n- Total hydrated: 35k\nIs this acceptable or does it violate the \u003c25k principle?","acceptance_criteria":"- Documentation explicitly states size bound applies per-repo or total\n- Rationale explained (why that bound matters)\n- Guidance for monitoring size with multi-repo\n- If total bound exists, formula provided (e.g., sum of all repos \u003c25k)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-03T20:24:50.042748-08:00","updated_at":"2025-11-05T14:18:00.550341-08:00","closed_at":"2025-11-05T14:18:00.550341-08:00","source_repo":"."}
{"id":"bd-502e","content_hash":"0f40053f59ff205d858a9ddf0be845df1d52471cc25a812df78cb3d4667efbdd","title":"Add comprehensive tests for sync branch daemon logic","description":"The daemon sync branch functionality (bd-6545) was implemented but needs proper end-to-end testing.\n\nCurrent implementation:\n- daemon_sync_branch.go has syncBranchCommitAndPush() and syncBranchPull()\n- daemon_sync.go has been updated to use these functions when sync.branch is configured\n- All daemon tests pass, but no specific tests for sync branch behavior\n\nTesting needed:\n- Test that daemon commits to sync branch when sync.branch is configured\n- Test that daemon commits to current branch when sync.branch is NOT configured (backward compatibility)\n- Test that daemon pulls from sync branch and syncs JSONL back to main repo\n- Test worktree creation and health checks during daemon operations\n- Test error handling (missing branch, worktree corruption, etc.)\n\nKey challenge: Tests need to run in the context of the git repo (getGitRoot() uses current working directory), so test setup needs to properly change directory or mock the git root detection.\n\nReference existing daemon tests in daemon_test.go and daemon_autoimport_test.go for patterns.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-11-02T15:59:13.341491-08:00","updated_at":"2025-11-02T16:39:53.278313-08:00","closed_at":"2025-11-02T16:39:53.278313-08:00","source_repo":".","dependencies":[{"issue_id":"bd-502e","depends_on_id":"bd-6545","type":"parent-child","created_at":"2025-11-02T15:59:13.342331-08:00","created_by":"daemon"}]}