From b68c1c20c9ad7e616c52fb629d78a48a06037a9b Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Tue, 23 Dec 2025 23:50:10 -0800 Subject: [PATCH] bd sync: close bd-g9eu --- .beads/issues.jsonl | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index d646cda4..af06ce69 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -1,4 +1,4 @@ -{"id":"bd-05a8","title":"Split large cmd/bd files: doctor.go (2948 lines), sync.go (2121 lines)","description":"Code health review found several oversized files:\n\n1. doctor.go - 2948 lines, 48 functions mixed together\n - Should split into doctor/checks/*.go for individual diagnostics\n - applyFixes() and previewFixes() are nearly identical\n\n2. sync.go - 2121 lines\n - ZFC (Zero Flush Check) logic embedded inline (lines 213-247)\n - Multiple mode handlers should be extracted\n\n3. init.go - 1732 lines\n4. compact.go - 1097 lines\n5. show.go - 1069 lines\n\nRecommendation: Extract into focused sub-packages or split into logical files.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/lima","created_at":"2025-12-16T18:17:18.169927-08:00","updated_at":"2025-12-23T22:34:14.296578-08:00","closed_at":"2025-12-23T22:34:14.296578-08:00","close_reason":"Refactoring complete: doctor.go reduced from 2948→1001 lines (66%), sync.go from 2121→1191 lines (44%). Checks extracted to doctor/ package, fixes to doctor/fix/. Sync modes extracted to sync_*.go files."} +{"id":"bd-05a8","title":"Split large cmd/bd files: doctor.go (2948 lines), sync.go (2121 lines)","description":"Code health review found several oversized files:\n\n1. doctor.go - 2948 lines, 48 functions mixed together\n - Should split into doctor/checks/*.go for individual diagnostics\n - applyFixes() and previewFixes() are nearly identical\n\n2. sync.go - 2121 lines\n - ZFC (Zero Flush Check) logic embedded inline (lines 213-247)\n - Multiple mode handlers should be extracted\n\n3. init.go - 1732 lines\n4. compact.go - 1097 lines\n5. show.go - 1069 lines\n\nRecommendation: Extract into focused sub-packages or split into logical files.","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/lima","created_at":"2025-12-16T18:17:18.169927-08:00","updated_at":"2025-12-23T22:31:50.769229-08:00"} {"id":"bd-06px","title":"bd sync --from-main fails: unknown flag --no-git-history","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-17T14:32:02.998106-08:00","updated_at":"2025-12-17T23:13:40.531756-08:00","closed_at":"2025-12-17T17:21:48.506039-08:00"} {"id":"bd-077e","title":"Add close_reason field to CLI schema and documentation","description":"PR #551 persists close_reason, but the CLI documentation may not mention this field as part of the issue schema.\n\n## Current State\n- close_reason is now persisted in database\n- `bd show --json` will return close_reason in JSON output\n- Documentation may not reflect this new field\n\n## What's Missing\n- CLI reference documentation for close_reason field\n- Schema documentation showing close_reason is a top-level issue field\n- Example output showing close_reason in bd show --json\n- bd close command documentation should mention close_reason parameter is optional\n\n## Suggested Action\n1. Update README.md or CLI reference docs to list close_reason as an issue field\n2. Add example to bd close documentation\n3. Update any type definitions or schema specs\n4. Consider adding close_reason to verbose list output (bd list --verbose)","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-14T14:25:28.448654-08:00","updated_at":"2025-12-14T14:25:28.448654-08:00","dependencies":[{"issue_id":"bd-077e","depends_on_id":"bd-z86n","type":"discovered-from","created_at":"2025-12-14T14:25:28.449968-08:00","created_by":"stevey","metadata":"{}"}]} {"id":"bd-0a43","title":"Split monolithic sqlite.go into focused files","description":"internal/storage/sqlite/sqlite.go is 1050 lines containing initialization, 20+ CRUD methods, query building, and schema management.\n\nSplit into:\n- store.go: Store struct \u0026 initialization (150 lines)\n- bead_queries.go: Bead CRUD (300 lines)\n- work_queries.go: Work queries (200 lines) \n- stats_queries.go: Statistics (150 lines)\n- schema.go: Schema \u0026 migrations (150 lines)\n- helpers.go: Common utilities (100 lines)\n\nImpact: Impossible to understand at a glance; hard to find specific functionality; high cognitive load\n\nEffort: 6-8 hours","status":"closed","priority":0,"issue_type":"task","created_at":"2025-11-16T14:51:16.520465-08:00","updated_at":"2025-12-17T23:13:40.533947-08:00","closed_at":"2025-12-17T16:51:30.236012-08:00"} @@ -49,7 +49,7 @@ {"id":"bd-401h","title":"Work on beads-7jl: Fix Windows installer file locking iss...","description":"Work on beads-7jl: Fix Windows installer file locking issue (GH#652). Close file handle before extraction in postinstall.js. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/rictus","created_at":"2025-12-19T22:55:57.873767-08:00","updated_at":"2025-12-19T23:20:05.747664-08:00","closed_at":"2025-12-19T23:20:05.747664-08:00","close_reason":"Fixed file handle closure race condition in postinstall.js"} {"id":"bd-411u","title":"Document BEADS_DIR pattern for multi-agent workspaces (Gas Town)","description":"Gas Town and similar multi-agent systems need to configure separate beads databases per workspace/rig, distinct from any project-level beads.\n\n## Use Case\n\nIn Gas Town:\n- Each 'rig' (managed project) has multiple agents (polecats, refinery, witness)\n- All agents in a rig should share a single beads database at the rig level\n- This should be separate from any .beads/ the project itself uses\n- The BEADS_DIR env var enables this\n\n## Documentation Needed\n\n1. Add a section to docs explaining BEADS_DIR for multi-agent setups\n2. Example: setting BEADS_DIR in agent startup scripts/hooks\n3. Clarify interaction with project-level .beads/ (BEADS_DIR takes precedence)\n\n## Current Support\n\nAlready implemented in internal/beads/beads.go:FindDatabasePath():\n- BEADS_DIR env var is checked first (preferred)\n- BEADS_DB env var still supported (deprecated)\n- Falls back to .beads/ search in tree\n\nJust needs documentation for the multi-agent workspace pattern.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-15T22:08:22.158027-08:00","updated_at":"2025-12-15T22:08:22.158027-08:00"} {"id":"bd-47tn","title":"Add bd daemon --stop-all command to kill all daemon processes","description":"Currently there's no easy way to stop all running bd daemon processes. Users must resort to pkill -f 'bd daemon' or similar shell commands.\n\nAdd a --stop-all flag to bd daemon that:\n1. Finds all running bd daemon processes (not just the current repo's daemon)\n2. Gracefully stops them all\n3. Reports how many were stopped\n\nThis is useful when:\n- Multiple daemons are running and causing race conditions\n- User wants a clean slate before running bd sync\n- Debugging daemon-related issues","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-13T06:34:45.080633-08:00","updated_at":"2025-12-16T01:14:49.501989-08:00","closed_at":"2025-12-14T17:33:03.057089-08:00"} -{"id":"bd-49kw","title":"Workaround for FastMCP outputSchema bug in Claude Code","description":"The beads MCP server (v0.23.1) successfully connects to Claude Code, but all tools fail to load with a schema validation error due to a bug in FastMCP 2.13.1.\n\nError: \"Invalid literal value, expected \\\"object\\\"\" in outputSchema.\n\nRoot Cause: FastMCP generates outputSchema with $ref at root level without \"type\": \"object\" for self-referential models (Issue).\n\nWorkaround: Use slash commands (/beads:ready) or wait for FastMCP fix.\n","status":"in_progress","priority":1,"issue_type":"bug","assignee":"beads/toast","created_at":"2025-11-20T18:55:39.041831-05:00","updated_at":"2025-12-23T23:41:09.842226-08:00"} +{"id":"bd-49kw","title":"Workaround for FastMCP outputSchema bug in Claude Code","description":"The beads MCP server (v0.23.1) successfully connects to Claude Code, but all tools fail to load with a schema validation error due to a bug in FastMCP 2.13.1.\n\nError: \"Invalid literal value, expected \\\"object\\\"\" in outputSchema.\n\nRoot Cause: FastMCP generates outputSchema with $ref at root level without \"type\": \"object\" for self-referential models (Issue).\n\nWorkaround: Use slash commands (/beads:ready) or wait for FastMCP fix.\n","status":"open","priority":1,"issue_type":"bug","created_at":"2025-11-20T18:55:39.041831-05:00","updated_at":"2025-12-23T21:22:15.889295-08:00"} {"id":"bd-4bsb","title":"Code review findings: mol squash deletion bypasses tombstones","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-21T13:57:14.154316-08:00","updated_at":"2025-12-21T18:01:06.811216-08:00","closed_at":"2025-12-21T18:01:06.811216-08:00","close_reason":"Won't fix: Wisps are ephemeral by design. They're local-only, never synced to other clones, so tombstones are unnecessary overhead. Hard delete is intentional.","dependencies":[{"issue_id":"bd-4bsb","depends_on_id":"bd-2vh3.3","type":"discovered-from","created_at":"2025-12-21T13:57:14.155488-08:00","created_by":"daemon"}]} {"id":"bd-4ec8","title":"Widespread double JSON encoding bug in daemon mode RPC calls","description":"Multiple CLI commands had the same double JSON encoding bug found in bd-1048. All commands that called ResolveID via RPC used string(resp.Data) instead of properly unmarshaling the JSON response. This caused IDs to retain JSON quotes (\"bd-1048\" instead of bd-1048), which then got double-encoded when passed to subsequent RPC calls.\n\nAffected commands:\n- bd show (3 instances)\n- bd dep add/remove/tree (5 instances)\n- bd label add/remove/list (3 instances)\n- bd reopen (1 instance)\n\nRoot cause: resp.Data is json.RawMessage (already JSON-encoded), so string() conversion preserves quotes.\n\nFix: Replace all string(resp.Data) with json.Unmarshal(resp.Data, \u0026id) for proper deserialization.\n\nAll commands now tested and working correctly with daemon mode.","status":"closed","priority":0,"issue_type":"bug","created_at":"2025-11-02T22:33:01.632691-08:00","updated_at":"2025-12-17T23:13:40.533631-08:00","closed_at":"2025-12-17T16:26:05.851197-08:00"} {"id":"bd-4hn","title":"wish: list \u0026 ready show issues as hierarchy tree","description":"`bd ready` and `bd list` just show a flat list, and it's up to the reader to parse which ones are dependent or sub-issues of others. It would be much easier to understand if they were shown in a tree format","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-08T06:38:24.016316945-07:00","updated_at":"2025-12-08T06:39:04.065882225-07:00"} @@ -101,7 +101,7 @@ {"id":"bd-7pwh","title":"HOP-compatible schema additions","description":"Add optional fields to Beads schema to enable future HOP integration.\nAll fields are backwards-compatible (optional, omitted if empty).\n\n## Reference\nSee ~/gt/docs/hop/BEADS-SCHEMA-CHANGES.md for full specification.\n\n## P1 Changes (Must Have Before Launch)\n\n### 1. EntityRef type\nStructured entity reference that can become HOP URI:\n```go\ntype EntityRef struct {\n Name string // \"polecat/Nux\"\n Platform string // \"gastown\"\n Org string // \"steveyegge\" \n ID string // \"polecat-nux\"\n}\n```\n\n### 2. creator field\nEvery issue tracks who created it (EntityRef).\n\n### 3. assignee_ref field\nStructured form alongside existing string assignee.\n\n### 4. validations array\nTrack who validated work completion:\n```go\ntype Validation struct {\n Validator *EntityRef\n Outcome string // accepted, rejected, revision_requested\n Timestamp time.Time\n Score *float32 // Future\n}\n```\n\n## P2 Changes (Should Have)\n\n### 5. work_type field\n\"mutex\" (default) or \"open_competition\"\n\n### 6. crystallizes field\nBoolean - does this work compound (true) or evaporate (false)?\n\n### 7. cross_refs field\nArray of URIs to beads in other repos:\n- \"beads://github/anthropics/claude-code/bd-xyz\"\n\n## P3 Changes (Nice to Have)\n\n### 8. skill_vector placeholder\nReserved for future embeddings: []float32\n\n## Implementation Notes\n- All fields optional in JSONL serialization\n- Empty/null fields omit from output\n- No migration needed for existing data\n- CLI additions: --creator, --validated-by filters","notes":"Scope reduced after review. P1 only: EntityRef type, creator field, validations array. Deferred: assignee_ref, work_type, crystallizes, cross_refs, skill_vector (YAGNI - semantics unclear, can add later when needed).","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T02:42:39.267984-08:00","updated_at":"2025-12-22T20:09:09.211821-08:00","closed_at":"2025-12-22T20:09:09.211821-08:00","close_reason":"HOP P1 schema additions complete: EntityRef type, Creator field, Validations array. P2/P3 items deferred to bd-zt59."} {"id":"bd-7tuu","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:02.053382-08:00","updated_at":"2025-12-20T01:23:52.484043-08:00","closed_at":"2025-12-20T01:23:52.484043-08:00","close_reason":"Superseded by 0.30.7 release - already committed and pushed","dependencies":[{"issue_id":"bd-7tuu","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.021087-08:00","created_by":"daemon"},{"issue_id":"bd-7tuu","depends_on_id":"bd-hw3w","type":"blocks","created_at":"2025-12-19T22:56:23.291591-08:00","created_by":"daemon"}]} {"id":"bd-7yg","title":"Git merge driver uses invalid placeholders (%L, %R instead of %A, %B)","description":"## Problem\n\nThe beads git merge driver is configured with invalid Git placeholders:\n\n```\ngit config merge.beads.driver \"bd merge %A %O %L %R\"\n```\n\nGit doesn't recognize `%L` or `%R` as valid merge driver placeholders. The valid placeholders are:\n- `%O` = base (common ancestor)\n- `%A` = current version (ours)\n- `%B` = other version (theirs)\n\n## Impact\n\n- Affects ALL users when they have `.beads/beads.jsonl` merge conflicts\n- Automatic JSONL merge fails with error: \"error reading left file: failed to open file: open 7: no such file or directory\"\n- Users must manually resolve conflicts instead of getting automatic merge\n\n## Root Cause\n\nThe `bd init` command (or wherever the merge driver is configured) is using non-standard placeholders. When Git encounters `%L` and `%R`, it either passes them literally or interprets them incorrectly.\n\n## Fix\n\nUpdate the merge driver configuration to:\n```\ngit config merge.beads.driver \"bd merge %A %O %A %B\"\n```\n\nWhere:\n- 1st `%A` = output file (current file, will be overwritten)\n- `%O` = base (common ancestor)\n- 2nd `%A` = left/current version\n- `%B` = right/other version\n\n## Action Items\n\n1. Fix `bd init` (or equivalent setup command) to use correct placeholders\n2. Add migration/warning for existing users with misconfigured merge driver\n3. Update documentation with correct merge driver setup\n4. Consider adding validation when `bd init` is run","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-11-21T19:51:55.747608-05:00","updated_at":"2025-12-17T23:13:40.532368-08:00","closed_at":"2025-12-17T17:24:52.678668-08:00"} -{"id":"bd-7z4","title":"Add tests for delete operations","description":"Core delete functionality including deleteViaDaemon, createTombstone, and deleteIssue functions have 0% coverage. These are critical for data integrity and need comprehensive test coverage.","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/slit","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-23T23:39:37.407852-08:00","dependencies":[{"issue_id":"bd-7z4","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:34.870254935-07:00","created_by":"matt"}]} +{"id":"bd-7z4","title":"Add tests for delete operations","description":"Core delete functionality including deleteViaDaemon, createTombstone, and deleteIssue functions have 0% coverage. These are critical for data integrity and need comprehensive test coverage.","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-18T07:00:34.867680882-07:00","dependencies":[{"issue_id":"bd-7z4","depends_on_id":"bd-6ss","type":"discovered-from","created_at":"2025-12-18T07:00:34.870254935-07:00","created_by":"matt"}]} {"id":"bd-801b","title":"Merge: bd-bqcc","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-bqcc\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T00:26:04.306756-08:00","updated_at":"2025-12-23T01:33:25.728087-08:00","closed_at":"2025-12-23T01:33:25.728087-08:00","close_reason":"Merged to main"} {"id":"bd-89f89fc0","title":"Remove unreachable RPC methods","description":"Several RPC server and client methods are unreachable and should be removed:\n\nServer methods (internal/rpc/server.go):\n- `Server.GetLastImportTime` (line 2116)\n- `Server.SetLastImportTime` (line 2123)\n- `Server.findJSONLPath` (line 2255)\n\nClient methods (internal/rpc/client.go):\n- `Client.Import` (line 311) - RPC import not used (daemon uses autoimport)\n\nEvidence:\n```bash\ngo run golang.org/x/tools/cmd/deadcode@latest -test ./...\n```\n\nImpact: Removes ~80 LOC of unused RPC code","status":"closed","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-07:00","updated_at":"2025-12-17T22:58:34.564401-08:00","closed_at":"2025-12-17T22:58:34.564401-08:00","close_reason":"Closed"} {"id":"bd-8b0x","title":"Remove molecule.go (simple instantiation)","description":"molecule.go uses is_template field for simple single-issue cloning. This is too simple for what molecules should be - full DAG orchestration. The use case is covered by bd mol bond with a single-issue molecule. Delete molecule.go and its commands.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T23:52:15.041776-08:00","updated_at":"2025-12-21T00:04:32.335849-08:00","closed_at":"2025-12-21T00:04:32.335849-08:00","close_reason":"Removed molecule.go - use bd mol bond instead","dependencies":[{"issue_id":"bd-8b0x","depends_on_id":"bd-ffjt","type":"blocks","created_at":"2025-12-20T23:52:25.807967-08:00","created_by":"daemon"}]} @@ -121,9 +121,9 @@ {"id":"bd-9g1z","title":"Fix or remove TestFindJSONLPathDefault (issue #356)","description":"Code health review found .test-skip permanently skips TestFindJSONLPathDefault.\n\nThe test references issue #356 about wrong JSONL filename expectations (issues.jsonl vs beads.jsonl).\n\nTest file: internal/beads/beads_test.go\n\nThe underlying migration from beads.jsonl to issues.jsonl may be complete, so either:\n1. Fix the test expectations\n2. Remove the test if no longer needed\n3. Document why it remains skipped","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-16T18:17:31.33975-08:00","updated_at":"2025-12-22T21:24:50.357688-08:00","closed_at":"2025-12-22T21:24:50.357688-08:00","close_reason":"Test now passes - removed from .test-skip. Code was fixed in utils.FindJSONLInDir to return issues.jsonl as default."} {"id":"bd-9l0h","title":"Run tests and linting","description":"go test -short ./... \u0026\u0026 golangci-lint run ./...","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T21:53:19.527602-08:00","updated_at":"2025-12-20T21:55:29.660914-08:00","closed_at":"2025-12-20T21:55:29.660914-08:00","close_reason":"Tests passed, go vet clean","dependencies":[{"issue_id":"bd-9l0h","depends_on_id":"bd-an4s","type":"parent-child","created_at":"2025-12-20T21:53:19.529203-08:00","created_by":"daemon"},{"issue_id":"bd-9l0h","depends_on_id":"bd-gocx","type":"blocks","created_at":"2025-12-20T21:53:29.753682-08:00","created_by":"daemon"}]} {"id":"bd-9qj5","title":"Merge: bd-c7y5","description":"branch: polecat/toast\ntarget: main\nsource_issue: bd-c7y5\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:02.626929-08:00","updated_at":"2025-12-23T21:21:57.699742-08:00","closed_at":"2025-12-23T21:21:57.699742-08:00","close_reason":"stale - no code pushed"} -{"id":"bd-9usz","title":"Test suite hangs/never finishes","description":"Running 'go test ./... -count=1' hangs indefinitely. The full test suite never completes, making it difficult to verify changes. Need to investigate which tests are hanging and fix or add timeouts.","status":"in_progress","priority":2,"issue_type":"bug","assignee":"beads/cheedo","created_at":"2025-12-16T21:56:27.80191-08:00","updated_at":"2025-12-23T23:42:01.436692-08:00"} +{"id":"bd-9usz","title":"Test suite hangs/never finishes","description":"Running 'go test ./... -count=1' hangs indefinitely. The full test suite never completes, making it difficult to verify changes. Need to investigate which tests are hanging and fix or add timeouts.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-16T21:56:27.80191-08:00","updated_at":"2025-12-23T21:22:25.810705-08:00"} {"id":"bd-a0cp","title":"Consider using types.Status in merge package for type safety","description":"The merge package uses string for status comparison (e.g., result.Status == closed, issue.Status == StatusTombstone). The types package defines Status as a type alias with validation. While the merge package needs its own Issue struct for JSONL flexibility, it could import and use types.Status for constants to get compile-time type checking. Current code: if left == closed || right == closed. Could be: if left == string(types.StatusClosed). This is low priority since string comparison works correctly. Files: internal/merge/merge.go:44, 488, 501-521","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-05T16:37:10.690424-08:00","updated_at":"2025-12-05T16:37:10.690424-08:00"} -{"id":"bd-a15d","title":"Add test files for internal/storage","description":"The internal/storage package has no test files at all. This package provides the storage interface abstraction.\n\nCurrent coverage: N/A (no test files)\nTarget: Add basic interface tests","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/valkyrie","created_at":"2025-12-13T20:43:11.363017-08:00","updated_at":"2025-12-23T23:42:24.187509-08:00"} +{"id":"bd-a15d","title":"Add test files for internal/storage","description":"The internal/storage package has no test files at all. This package provides the storage interface abstraction.\n\nCurrent coverage: N/A (no test files)\nTarget: Add basic interface tests","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-13T20:43:11.363017-08:00","updated_at":"2025-12-13T21:01:20.925779-08:00"} {"id":"bd-a3sj","title":"RemoveDependency fails on external deps - FK violation in dirty_issues","description":"In dependencies.go:225, RemoveDependency marks BOTH issueID and dependsOnID as dirty. For external refs (e.g., external:project:capability), dependsOnID doesn't exist in the issues table. This causes FK violation since dirty_issues.issue_id has FK constraint to issues.id.\n\nFix: Check if dependsOnID starts with 'external:' and only mark source issue as dirty, matching the logic in AddDependency (lines 162-170).\n\nRepro: bd dep rm \u003cissue\u003e external:project:capability","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T23:44:51.981138-08:00","updated_at":"2025-12-22T17:48:29.062424-08:00","closed_at":"2025-12-22T17:48:29.062424-08:00","close_reason":"Fixed: check for external: prefix before marking dependsOnID as dirty in RemoveDependency. Added test.","dependencies":[{"issue_id":"bd-a3sj","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:44:51.982343-08:00","created_by":"daemon"}]} {"id":"bd-a62m","title":"Update version to 0.33.2 in version.go","description":"Edit cmd/bd/version.go line 17:\n\n```go\nVersion = \"0.33.2\"\n```\n\nVerify with: `grep 'Version =' cmd/bd/version.go`","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760384-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Version already 0.33.2 in version.go","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-a9y3","title":"Add composite index (status, priority) for common list queries","description":"SearchIssues and GetReadyWork frequently filter by status and sort by priority. Currently uses two separate indexes.\n\n**Common query pattern (queries.go:1646-1647):**\n```sql\nWHERE status = ? \nORDER BY priority ASC, created_at DESC\n```\n\n**Problem:** Index merge or full scan when both columns are used.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_issues_status_priority ON issues(status, priority);\n```\n\n**Expected impact:** Faster bd list, bd ready with filters. Particularly noticeable at 10K+ issues.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-22T22:58:50.515275-08:00","updated_at":"2025-12-22T23:15:13.838976-08:00","closed_at":"2025-12-22T23:15:13.838976-08:00","close_reason":"Implemented in migration 026_additional_indexes.go","dependencies":[{"issue_id":"bd-a9y3","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:50.516072-08:00","created_by":"daemon"}]} @@ -141,8 +141,8 @@ {"id":"bd-au0","title":"Command Set Standardization \u0026 Flag Consistency","description":"Comprehensive improvements to bd command set based on 2025 audit findings.\n\n## Background\nSee docs/command-audit-2025.md for detailed analysis.\n\n## Goals\n1. Standardize flag naming and behavior across all commands\n2. Add missing flags for feature parity\n3. Fix naming confusion\n4. Improve consistency in JSON output\n\n## Success Criteria\n- All mutating commands support --dry-run (no --preview variants)\n- bd update supports label operations\n- bd search has filter parity with bd list\n- Priority flags accept both int and P0-P4 format everywhere\n- JSON output is consistent across all commands","status":"open","priority":2,"issue_type":"epic","created_at":"2025-11-21T21:05:55.672749-05:00","updated_at":"2025-11-21T21:05:55.672749-05:00"} {"id":"bd-au0.10","title":"Add global verbosity flags (--verbose, --quiet)","description":"Add consistent verbosity controls across all commands.\n\n**Current state:**\n- bd init has --quiet flag\n- No other commands have verbosity controls\n- Debug output controlled by BD_VERBOSE env var\n\n**Proposal:**\nAdd persistent flags:\n- --verbose / -v: Enable debug output\n- --quiet / -q: Suppress non-essential output\n\n**Implementation:**\n- Add to rootCmd.PersistentFlags()\n- Replace BD_VERBOSE checks with flag checks\n- Standardize output levels:\n * Quiet: Errors only\n * Normal: Errors + success messages\n * Verbose: Errors + success + debug info\n\n**Files to modify:**\n- cmd/bd/main.go (add flags)\n- internal/debug/debug.go (respect flags)\n- Update all commands to respect quiet mode\n\n**Testing:**\n- Verify --verbose shows debug output\n- Verify --quiet suppresses normal output\n- Ensure errors always show regardless of mode","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-21T21:08:21.600209-05:00","updated_at":"2025-11-21T21:08:21.600209-05:00","dependencies":[{"issue_id":"bd-au0.10","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:08:21.602557-05:00","created_by":"daemon","metadata":"{}"}]} {"id":"bd-au0.5","title":"Add date and priority filters to bd search","description":"Add date and priority filters to bd search for parity with bd list.\n\n## Current State\nbd search supports: --status, --type, --assignee, --label, --limit\nbd list supports: all of the above PLUS date ranges and priority filters\n\n## Filters to Add\n\n### Priority Filters\n```bash\nbd search \"query\" --priority 1 # Exact priority\nbd search \"query\" --priority-min 0 # P0 and above (higher priority)\nbd search \"query\" --priority-max 2 # P2 and below (lower priority)\n```\n\n### Date Filters\n```bash\nbd search \"query\" --created-after 2025-01-01\nbd search \"query\" --created-before 2025-12-31\nbd search \"query\" --updated-after 2025-01-01\nbd search \"query\" --closed-after 2025-01-01\n```\n\n### Content Filters\n```bash\nbd search \"query\" --desc-contains \"bug\"\nbd search \"query\" --notes-contains \"todo\"\nbd search \"query\" --empty-description # Issues with no description\nbd search \"query\" --no-assignee # Unassigned issues\nbd search \"query\" --no-labels # Issues without labels\n```\n\n## Files to Modify\n\n### 1. cmd/bd/search.go\nAdd flag definitions in init():\n```go\nsearchCmd.Flags().IntP(\"priority\", \"p\", -1, \"Filter by exact priority (0-4)\")\nsearchCmd.Flags().Int(\"priority-min\", -1, \"Filter by minimum priority\")\nsearchCmd.Flags().Int(\"priority-max\", -1, \"Filter by maximum priority\")\nsearchCmd.Flags().String(\"created-after\", \"\", \"Filter by creation date (YYYY-MM-DD)\")\nsearchCmd.Flags().String(\"created-before\", \"\", \"Filter by creation date\")\nsearchCmd.Flags().String(\"updated-after\", \"\", \"Filter by update date\")\nsearchCmd.Flags().String(\"updated-before\", \"\", \"Filter by update date\")\nsearchCmd.Flags().String(\"closed-after\", \"\", \"Filter by close date\")\nsearchCmd.Flags().String(\"closed-before\", \"\", \"Filter by close date\")\nsearchCmd.Flags().String(\"desc-contains\", \"\", \"Filter by description content\")\nsearchCmd.Flags().String(\"notes-contains\", \"\", \"Filter by notes content\")\nsearchCmd.Flags().Bool(\"empty-description\", false, \"Filter issues with empty description\")\nsearchCmd.Flags().Bool(\"no-assignee\", false, \"Filter unassigned issues\")\nsearchCmd.Flags().Bool(\"no-labels\", false, \"Filter issues without labels\")\n```\n\n### 2. internal/rpc/protocol.go\nUpdate SearchArgs struct:\n```go\ntype SearchArgs struct {\n Query string\n Filter types.IssueFilter\n // Already has most fields via IssueFilter\n}\n```\n\nNote: types.IssueFilter already has these fields - just need to wire them up!\n\n### 3. cmd/bd/search.go Run function\nParse flags and populate filter:\n```go\nif priority, _ := cmd.Flags().GetInt(\"priority\"); priority \u003e= 0 {\n filter.Priority = \u0026priority\n}\nif createdAfter, _ := cmd.Flags().GetString(\"created-after\"); createdAfter != \"\" {\n t, err := time.Parse(\"2006-01-02\", createdAfter)\n if err != nil {\n FatalError(\"invalid date format for --created-after: %v\", err)\n }\n filter.CreatedAfter = \u0026t\n}\n// ... similar for other flags\n```\n\n## Implementation Steps\n\n1. **Check types.IssueFilter** - verify all needed fields exist\n2. **Add flags to search.go** init()\n3. **Parse flags** in Run function\n4. **Pass to SearchIssues** via filter\n5. **Test all combinations**\n\n## Testing\n```bash\n# Create test issues\nbd create \"Test P1\" -p 1\nbd create \"Test P2\" -p 2 --description \"Has description\"\n\n# Test filters\nbd search \"\" --priority 1\nbd search \"\" --priority-min 0 --priority-max 1\nbd search \"\" --empty-description\nbd search \"\" --desc-contains \"description\"\n```\n\n## Success Criteria\n- All filters work in both direct and daemon mode\n- Date parsing handles YYYY-MM-DD format\n- --json output includes filtered results\n- Help text documents all new flags","status":"closed","priority":1,"issue_type":"task","assignee":"beads/Searcher","created_at":"2025-11-21T21:07:05.496726-05:00","updated_at":"2025-12-23T13:38:28.475606-08:00","closed_at":"2025-12-23T13:38:28.475606-08:00","close_reason":"Implemented all date, priority, and content filters for bd search","dependencies":[{"issue_id":"bd-au0.5","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:05.497762-05:00","created_by":"daemon","metadata":"{}"},{"issue_id":"bd-au0.5","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.657303-08:00","created_by":"daemon"}]} -{"id":"bd-au0.6","title":"Add comprehensive filters to bd export","description":"Enhance bd export with filtering options for selective exports.\n\n**Currently only has:**\n- --status\n\n**Add filters:**\n- --label, --label-any\n- --assignee\n- --type\n- --priority, --priority-min, --priority-max\n- --created-after, --created-before\n- --updated-after, --updated-before\n\n**Use case:**\n- Export only open issues: bd export --status open\n- Export high-priority bugs: bd export --type bug --priority-max 1\n- Export recent issues: bd export --created-after 2025-01-01\n\n**Files to modify:**\n- cmd/bd/export.go\n- Reuse filter logic from list.go","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/dementus","created_at":"2025-11-21T21:07:19.431307-05:00","updated_at":"2025-12-23T23:40:26.969314-08:00","dependencies":[{"issue_id":"bd-au0.6","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:19.432983-05:00","created_by":"daemon","metadata":"{}"}]} -{"id":"bd-au0.7","title":"Audit and standardize JSON output across all commands","description":"Ensure consistent JSON format and error handling when --json flag is used.\n\n**Scope:**\n1. Verify all commands respect --json flag\n2. Standardize success response format\n3. Standardize error response format\n4. Document JSON schemas\n\n**Commands to audit:**\n- Core CRUD: create, update, delete, show, list, search ✓\n- Queries: ready, blocked, stale, count, stats, status\n- Deps: dep add/remove/tree/cycles\n- Labels: label commands\n- Comments: comments add/list/delete\n- Epics: epic status/close-eligible\n- Export/import: already support --json ✓\n\n**Testing:**\n- Success cases return valid JSON\n- Error cases return valid JSON (not plain text)\n- Consistent field naming (snake_case vs camelCase)\n- Array vs object wrapping consistency","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/rictus","created_at":"2025-11-21T21:07:35.304424-05:00","updated_at":"2025-12-23T23:39:58.052009-08:00","dependencies":[{"issue_id":"bd-au0.7","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:35.305663-05:00","created_by":"daemon","metadata":"{}"}]} +{"id":"bd-au0.6","title":"Add comprehensive filters to bd export","description":"Enhance bd export with filtering options for selective exports.\n\n**Currently only has:**\n- --status\n\n**Add filters:**\n- --label, --label-any\n- --assignee\n- --type\n- --priority, --priority-min, --priority-max\n- --created-after, --created-before\n- --updated-after, --updated-before\n\n**Use case:**\n- Export only open issues: bd export --status open\n- Export high-priority bugs: bd export --type bug --priority-max 1\n- Export recent issues: bd export --created-after 2025-01-01\n\n**Files to modify:**\n- cmd/bd/export.go\n- Reuse filter logic from list.go","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T21:07:19.431307-05:00","updated_at":"2025-12-23T21:22:14.757819-08:00","dependencies":[{"issue_id":"bd-au0.6","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:19.432983-05:00","created_by":"daemon","metadata":"{}"}]} +{"id":"bd-au0.7","title":"Audit and standardize JSON output across all commands","description":"Ensure consistent JSON format and error handling when --json flag is used.\n\n**Scope:**\n1. Verify all commands respect --json flag\n2. Standardize success response format\n3. Standardize error response format\n4. Document JSON schemas\n\n**Commands to audit:**\n- Core CRUD: create, update, delete, show, list, search ✓\n- Queries: ready, blocked, stale, count, stats, status\n- Deps: dep add/remove/tree/cycles\n- Labels: label commands\n- Comments: comments add/list/delete\n- Epics: epic status/close-eligible\n- Export/import: already support --json ✓\n\n**Testing:**\n- Success cases return valid JSON\n- Error cases return valid JSON (not plain text)\n- Consistent field naming (snake_case vs camelCase)\n- Array vs object wrapping consistency","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-21T21:07:35.304424-05:00","updated_at":"2025-12-23T21:22:13.69621-08:00","dependencies":[{"issue_id":"bd-au0.7","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:35.305663-05:00","created_by":"daemon","metadata":"{}"}]} {"id":"bd-au0.8","title":"Improve clean vs cleanup command naming/documentation","description":"Clarify the difference between bd clean and bd cleanup to reduce user confusion.\n\n**Current state:**\n- bd clean: Remove temporary artifacts (.beads/bd.sock, logs, etc.)\n- bd cleanup: Delete old closed issues from database\n\n**Options:**\n1. Rename for clarity:\n - bd clean → bd clean-temp\n - bd cleanup → bd cleanup-issues\n \n2. Keep names but improve help text and documentation\n\n3. Add prominent warnings in help output\n\n**Preferred approach:** Option 2 (improve documentation)\n- Update short/long descriptions in commands\n- Add examples to help text\n- Update README.md\n- Add cross-references in help output\n\n**Files to modify:**\n- cmd/bd/clean.go\n- cmd/bd/cleanup.go\n- README.md or ADVANCED.md","status":"open","priority":2,"issue_type":"task","created_at":"2025-11-21T21:07:49.960534-05:00","updated_at":"2025-11-21T21:07:49.960534-05:00","dependencies":[{"issue_id":"bd-au0.8","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:07:49.962743-05:00","created_by":"daemon","metadata":"{}"}]} {"id":"bd-au0.9","title":"Review and document rarely-used commands","description":"Document use cases or consider deprecation for infrequently-used commands.\n\n**Commands to review:**\n1. bd rename-prefix - How often is this used? Document use cases\n2. bd detect-pollution - Consider integrating into bd validate\n3. bd migrate-hash-ids - One-time migration, keep but document as legacy\n\n**For each command:**\n- Document typical use cases\n- Add examples to help text\n- Consider if it should be a subcommand instead\n- Add deprecation warning if appropriate\n\n**Not changing:**\n- duplicates ✓ (useful for data quality)\n- repair-deps ✓ (useful for fixing broken refs)\n- restore ✓ (critical for compacted issues)\n- compact ✓ (performance feature)\n\n**Deliverable:**\n- Updated help text\n- Documentation in ADVANCED.md\n- Deprecation plan if needed","status":"open","priority":3,"issue_type":"task","created_at":"2025-11-21T21:08:05.588275-05:00","updated_at":"2025-11-21T21:08:05.588275-05:00","dependencies":[{"issue_id":"bd-au0.9","depends_on_id":"bd-au0","type":"parent-child","created_at":"2025-11-21T21:08:05.59003-05:00","created_by":"daemon","metadata":"{}"}]} {"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","close_reason":"stale - no code pushed"} @@ -173,7 +173,7 @@ {"id":"bd-by0d","title":"Work on beads-ldv: Fix bd graph crashes with nil pointer ...","description":"Work on beads-ldv: Fix bd graph crashes with nil pointer dereference (GH#657). Fix nil pointer in computeDependencyCounts at graph.go:428. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:55:27.829359-08:00","updated_at":"2025-12-19T23:28:32.428314-08:00","closed_at":"2025-12-19T23:20:49.038441-08:00","close_reason":"Fixed nil pointer in computeDependencyCounts by passing subgraph instead of nil"} {"id":"bd-c2xs","title":"Exclude pinned issues from bd blocked","description":"Update bd blocked to exclude pinned issues. Pinned issues are context markers and should not appear in the blocked work list.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T23:33:44.684242-08:00","updated_at":"2025-12-21T11:29:42.179389-08:00","closed_at":"2025-12-21T11:29:42.179389-08:00","close_reason":"Already implemented in SQLite (line 299) and memory (line 1084). Pinned issues excluded from blocked.","dependencies":[{"issue_id":"bd-c2xs","depends_on_id":"bd-0vg","type":"blocks","created_at":"2025-12-18T23:33:56.521323-08:00","created_by":"daemon"},{"issue_id":"bd-c2xs","depends_on_id":"bd-7h5","type":"blocks","created_at":"2025-12-18T23:34:07.736681-08:00","created_by":"daemon"}]} {"id":"bd-c3u","title":"Review PR #512: clarify bd ready docs","description":"Review and merge PR #512 from aspiers. This PR clarifies what bd ready does after git pull in README.md. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/512","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:13.405161+11:00","updated_at":"2025-12-13T07:07:29.641265-08:00","closed_at":"2025-12-13T07:07:29.641265-08:00"} -{"id":"bd-c7y5","title":"Optimization: Tombstones still synced, adding overhead","description":"Tombstoned (deleted) issues are still processed during sync, adding overhead.\n\n## Evidence\n```\nImport complete: 0 created, 0 updated, 407 unchanged, 100 skipped\n```\nThose 100 skipped are tombstones - they're read from JSONL, parsed, then filtered out.\n\n## Current State (Beads repo)\n- 408 total issues\n- 99 tombstones (24% of database)\n- Every sync reads and skips these 99 entries\n\n## Impact\n- Sync time increases with tombstone count\n- JSONL file size grows indefinitely\n- Git history accumulates tombstone churn\n\n## Proposed Solutions\n\n### 1. JSONL Compaction (`bd compact`)\nPeriodically rewrite JSONL without tombstones:\n```bash\nbd compact # Removes tombstones, rewrites issues.jsonl\n```\nTrade-off: Loses delete history, but that's in git anyway.\n\n### 2. Tombstone TTL\nAuto-remove tombstones older than N days during sync:\n```go\nif issue.Deleted \u0026\u0026 time.Since(issue.UpdatedAt) \u003e 7*24*time.Hour {\n // Skip writing to new JSONL\n}\n```\n\n### 3. Archive File\nMove old closed issues to `issues-archive.jsonl`:\n- Not synced regularly\n- Available for historical queries\n- Main JSONL stays small\n\n### 4. Lazy Tombstone Handling \nDon't write tombstones to JSONL at all - just remove the line:\n- Simpler, but loses cross-clone delete propagation\n- Would need different delete propagation mechanism\n\n## Recommendation\nStart with `bd compact` command - simple, explicit, user-controlled.\n\n## Related\n- gt-tnss: Analysis - Beads database size and hygiene strategy\n- gt-ox67: Maintenance - Regular cleanup of closed MR/gate beads","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/dag","created_at":"2025-12-23T14:41:16.925212-08:00","updated_at":"2025-12-23T23:41:31.837865-08:00"} +{"id":"bd-c7y5","title":"Optimization: Tombstones still synced, adding overhead","description":"Tombstoned (deleted) issues are still processed during sync, adding overhead.\n\n## Evidence\n```\nImport complete: 0 created, 0 updated, 407 unchanged, 100 skipped\n```\nThose 100 skipped are tombstones - they're read from JSONL, parsed, then filtered out.\n\n## Current State (Beads repo)\n- 408 total issues\n- 99 tombstones (24% of database)\n- Every sync reads and skips these 99 entries\n\n## Impact\n- Sync time increases with tombstone count\n- JSONL file size grows indefinitely\n- Git history accumulates tombstone churn\n\n## Proposed Solutions\n\n### 1. JSONL Compaction (`bd compact`)\nPeriodically rewrite JSONL without tombstones:\n```bash\nbd compact # Removes tombstones, rewrites issues.jsonl\n```\nTrade-off: Loses delete history, but that's in git anyway.\n\n### 2. Tombstone TTL\nAuto-remove tombstones older than N days during sync:\n```go\nif issue.Deleted \u0026\u0026 time.Since(issue.UpdatedAt) \u003e 7*24*time.Hour {\n // Skip writing to new JSONL\n}\n```\n\n### 3. Archive File\nMove old closed issues to `issues-archive.jsonl`:\n- Not synced regularly\n- Available for historical queries\n- Main JSONL stays small\n\n### 4. Lazy Tombstone Handling \nDon't write tombstones to JSONL at all - just remove the line:\n- Simpler, but loses cross-clone delete propagation\n- Would need different delete propagation mechanism\n\n## Recommendation\nStart with `bd compact` command - simple, explicit, user-controlled.\n\n## Related\n- gt-tnss: Analysis - Beads database size and hygiene strategy\n- gt-ox67: Maintenance - Regular cleanup of closed MR/gate beads","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T14:41:16.925212-08:00","updated_at":"2025-12-23T21:22:26.662604-08:00"} {"id":"bd-c83r","title":"Prevent multiple daemons from running on the same repo","description":"Multiple bd daemons running on the same repo clone causes race conditions and data corruption risks.\n\n**Problem:**\n- Nothing prevents spawning multiple daemons for the same repository\n- Multiple daemons watching the same files can conflict during sync operations\n- Observed: 4 daemons running simultaneously caused sync race condition\n\n**Solution:**\nImplement daemon singleton enforcement per repo:\n1. Use a lock file (e.g., .beads/.daemon.lock) with PID\n2. On daemon start, check if lock exists and process is alive\n3. If stale lock (dead PID), clean up and acquire lock\n4. If active daemon exists, either:\n - Exit with message 'daemon already running (PID xxx)'\n - Or offer --replace flag to kill existing and take over\n5. Release lock on graceful shutdown\n\n**Edge cases to handle:**\n- Daemon crashes without releasing lock (stale PID detection)\n- Multiple repos in same directory tree (each repo gets own lock)\n- Race between two daemons starting simultaneously (atomic lock acquisition)","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-13T06:37:23.377131-08:00","updated_at":"2025-12-16T01:14:49.50347-08:00","closed_at":"2025-12-14T17:34:14.990077-08:00"} {"id":"bd-cb64c226.1","title":"Performance Validation","description":"Confirm no performance regression from cache removal","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-10-28T10:50:15.126019-07:00","updated_at":"2025-12-17T23:18:29.108883-08:00","close_reason":"Closed","deleted_at":"2025-12-17T23:18:29.108883-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-cb64c226.10","title":"Delete server_cache_storage.go","description":"Remove the entire cache implementation file (~286 lines)","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-10-27T22:55:38.729299-07:00","updated_at":"2025-12-17T23:18:29.110716-08:00","close_reason":"Closed","deleted_at":"2025-12-17T23:18:29.110716-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} @@ -201,7 +201,7 @@ {"id":"bd-d9mu","title":"Cross-rig external dependency support","description":"Support dependencies on issues in other rigs/repos.\n\n## Use Case\n\nGas Town issues often depend on Beads issues (and vice versa). Currently we use labels like `external:beads/bd-xxx` as documentation, but:\n- `bd blocked` doesn't recognize external deps\n- `bd ready` doesn't filter them out\n- No way to query cross-rig status\n\n## Proposed UX\n\n### Adding external deps\n```bash\n# New syntax for bd dep add\nbd dep add gt-a07f external:beads:bd-kwjh\n\n# Or maybe cleaner\nbd dep add gt-a07f --external beads:bd-kwjh\n```\n\n### Showing blocked status\n```bash\nbd blocked\n# → gt-a07f blocked by external:beads:bd-kwjh (unverified)\n\n# With optional cross-rig query\nbd blocked --resolve-external\n# → gt-a07f blocked by external:beads:bd-kwjh (closed) ← unblocked!\n```\n\n### Storage\nCould use:\n- Special dependency type: `type: external`\n- Label convention: `external:rig:id`\n- New field: `external_deps: [\"beads:bd-kwjh\"]`\n\n## Implementation Notes\n\nCross-rig queries would need:\n- Known rig locations (config or discovery)\n- Read-only beads access to external rigs\n- Caching to avoid repeated queries\n\nFor MVP, just recognizing external deps and marking them as 'unverified' blockers would be valuable.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T02:27:23.892706-08:00","updated_at":"2025-12-22T22:32:49.261551-08:00","closed_at":"2025-12-22T22:32:49.261551-08:00","close_reason":"Superseded: Cross-rig external dependency support was fully implemented through child issues: bd-om4a (external: prefix syntax), bd-zmmy (bd ready resolution), bd-396j (bd blocked filtering), bd-66w1 (external_projects config), bd-vks2 (dep tree display), bd-mv6h (test coverage). External deps are auto-resolved when external_projects config is set. The --resolve-external flag is not needed."} {"id":"bd-db72","title":"Upgrade local Homebrew installation","description":"Upgrade bd via Homebrew:\n\n```bash\nbrew update\nbrew upgrade bd\n/opt/homebrew/bin/bd version # Verify shows 0.33.2\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760552-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Blocked by macOS 26 CLT issue - local dev build (0.33.2) used instead","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-de6","title":"Fix FindBeadsDir to prioritize main repo .beads for worktrees","description":"The FindBeadsDir function should prioritize finding .beads in the main repository root when accessed from a worktree, rather than finding worktree-local .beads directories. This ensures proper sharing of the database across all worktrees.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/golf","created_at":"2025-12-07T16:48:36.883117467-07:00","updated_at":"2025-12-23T22:33:23.795459-08:00","closed_at":"2025-12-23T22:33:23.795459-08:00","close_reason":"Already implemented - FindBeadsDir prioritizes main repo .beads via IsWorktree() and GetMainRepoRoot(). All tests pass."} -{"id":"bd-dhza","title":"Reduce global state in cmd/bd/main.go (25+ variables)","description":"Code health review found main.go has 25+ global variables (lines 57-112):\n\n- dbPath, actor, store, jsonOutput, daemonClient, noDaemon\n- rootCtx, rootCancel, autoFlushEnabled\n- isDirty (marked 'USED BY LEGACY CODE')\n- needsFullExport (marked 'USED BY LEGACY CODE')\n- flushTimer (marked 'DEPRECATED')\n- flushMutex, storeMutex, storeActive\n- flushFailureCount, lastFlushError, flushManager\n- skipFinalFlush, autoImportEnabled\n- versionUpgradeDetected, previousVersion, upgradeAcknowledged\n\nImpact:\n- Hard to test individual commands\n- Race conditions possible\n- State leakage between commands\n\nFix: Move toward dependency injection. Remove deprecated variables. Consider cmd/bd/internal package.","notes":"COMPLETED: Migration of legacy flush state to FlushManager. The main work (isDirty, needsFullExport, flushTimer) moved to local vars in FlushManager.run() lines 170-173. This fixes the race conditions. Remaining globals are: Cobra flag bindings (standard), runtime state (store, daemonClient - structural), store coordination (storeActive/storeMutex). Future: move error tracking to FlushManager, create cmd/bd/internal for encapsulation.","status":"closed","priority":3,"issue_type":"task","assignee":"beads/kilo","created_at":"2025-12-16T18:17:29.643293-08:00","updated_at":"2025-12-23T22:36:09.600594-08:00","closed_at":"2025-12-23T22:36:09.600594-08:00","close_reason":"Legacy flush globals (isDirty, needsFullExport, flushTimer) already migrated to FlushManager local vars. Race conditions fixed. Remaining globals are Cobra flags (standard) or structural (store, daemonClient). Future work filed separately if needed."} +{"id":"bd-dhza","title":"Reduce global state in cmd/bd/main.go (25+ variables)","description":"Code health review found main.go has 25+ global variables (lines 57-112):\n\n- dbPath, actor, store, jsonOutput, daemonClient, noDaemon\n- rootCtx, rootCancel, autoFlushEnabled\n- isDirty (marked 'USED BY LEGACY CODE')\n- needsFullExport (marked 'USED BY LEGACY CODE')\n- flushTimer (marked 'DEPRECATED')\n- flushMutex, storeMutex, storeActive\n- flushFailureCount, lastFlushError, flushManager\n- skipFinalFlush, autoImportEnabled\n- versionUpgradeDetected, previousVersion, upgradeAcknowledged\n\nImpact:\n- Hard to test individual commands\n- Race conditions possible\n- State leakage between commands\n\nFix: Move toward dependency injection. Remove deprecated variables. Consider cmd/bd/internal package.","notes":"Investigation found flushTimer, isDirty, needsFullExport are actively used by both legacy autoflush.go and new flush_manager.go. Requires coordinated refactor to migrate all callers to FlushManager first. Estimated: significant effort.","status":"in_progress","priority":3,"issue_type":"task","assignee":"beads/kilo","created_at":"2025-12-16T18:17:29.643293-08:00","updated_at":"2025-12-23T22:29:35.811067-08:00"} {"id":"bd-dju6","title":"Commit and push release","description":"git add -A \u0026\u0026 git commit \u0026\u0026 git push to trigger CI","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.065863-08:00","updated_at":"2025-12-21T13:53:49.957804-08:00","deleted_at":"2025-12-21T13:53:49.957804-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task","wisp":true} {"id":"bd-dp4w","title":"Test message","description":"This is a test message body","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-16T18:11:58.467876-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":"message"} {"id":"bd-dqck","title":"Version Bump: test-squash","description":"Release checklist for version test-squash. This molecule ensures all release steps are completed properly.","status":"tombstone","priority":1,"issue_type":"epic","created_at":"2025-12-21T13:52:33.065408-08:00","updated_at":"2025-12-21T13:53:41.946036-08:00","deleted_at":"2025-12-21T13:53:41.946036-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"epic","wisp":true} @@ -209,10 +209,10 @@ {"id":"bd-drxs","title":"Make merge requests ephemeral wisps instead of permanent issues","description":"## Problem\n\nMerge requests (MRs) are currently created as regular beads issues (type: merge-request). This means they:\n- Sync to JSONL and propagate via git\n- Accumulate in the issue database indefinitely\n- Clutter `bd list` output with closed MRs\n- Create permanent records for inherently transient artifacts\n\nMRs are process artifacts, not work products. They exist briefly while code awaits merge, then their purpose is fulfilled. The git merge commit and GitHub PR (if applicable) provide the permanent audit trail - the beads MR is redundant.\n\n## Proposed Solution\n\nMake MRs ephemeral wisps that exist only during the merge process:\n\n1. **Create MRs as wisps**: When a polecat completes work and requests merge, create the MR in `.beads-wisp/` instead of `.beads/`\n\n2. **Refinery visibility**: This works because all clones within a rig share the same database:\n ```\n beads/ ← Rig root\n ├── .beads/ ← Permanent issues (synced to JSONL)\n ├── .beads-wisp/ ← Ephemeral wisps (NOT synced)\n ├── crew/dave/ ← Uses rig's shared DB\n ├── polecats/*/ ← Uses rig's shared DB\n └── refinery/ ← Uses rig's shared DB\n ```\n The refinery can see wisp MRs immediately - same SQLite database.\n\n3. **On merge completion**: Burn the wisp (delete without digest). The git merge commit IS the permanent record. No digest needed since:\n - Digest wouldn't be smaller than the MR itself (~200-300 bytes either way)\n - Git history provides complete audit trail\n - GitHub PR (if used) provides discussion/approval record\n\n4. **On merge rejection/abandonment**: Burn the wisp. Optionally notify the source polecat via mail.\n\n## Benefits\n\n- **Clean JSONL**: MRs never pollute the permanent issue history\n- **No accumulation**: Wisps are burned on completion, no cleanup needed\n- **Correct semantics**: Wisps are for \"operational ephemera\" - MRs fit perfectly\n- **Reduced sync churn**: Fewer JSONL updates, faster `bd sync`\n- **Cleaner queries**: `bd list` shows work items, not process artifacts\n\n## Implementation Notes\n\n### Where MRs are created\n\nCurrently MRs are created by the witness or polecat when work is ready for merge. This code needs to:\n- Set `wisp: true` on the MR issue\n- Or use a dedicated wisp creation path\n\n### Refinery changes\n\nThe refinery queries for pending MRs to process. It needs to:\n- Query wisp storage as well as (or instead of) permanent storage\n- Use `bd mol burn` or equivalent to delete processed MRs\n\n### What about cross-rig MRs?\n\nIf an MR needs to be visible outside the rig (e.g., external collaborators):\n- They would see the GitHub PR anyway\n- Or we could create a permanent \"merge completed\" notification issue\n- But this is likely unnecessary - MRs are internal coordination\n\n### Migration\n\nExisting MRs in permanent storage:\n- Can be cleaned up with `bd cleanup` or manual deletion\n- Or left to age out naturally\n- No migration of open MRs needed (they'll complete under old system\n\n## Alternatives Considered\n\n1. **Auto-cleanup of closed MRs**: Keep MRs as permanent issues but auto-delete after 24h. Simpler but still creates sync churn and temporary JSONL pollution.\n\n2. **MRs as mail only**: Polecat sends mail to refinery with merge details, no MR issue at all. Loses queryability (bd-801b [P2] [merge-request] closed - Merge: bd-bqcc\nbd-pvu0 [P2] [merge-request] closed - Merge: bd-4opy\nbd-i0rx [P2] [merge-request] closed - Merge: bd-ao0s\nbd-u0sb [P2] [merge-request] closed - Merge: bd-uqfn\nbd-8e0q [P2] [merge-request] closed - Merge: beads-ocs\nbd-hvng [P2] [merge-request] closed - Merge: bd-w193\nbd-4sfl [P2] [merge-request] closed - Merge: bd-14ie\nbd-sumr [P2] [merge-request] closed - Merge: bd-t4sb\nbd-3x9o [P2] [merge-request] closed - Merge: bd-by0d\nbd-whgv [P2] [merge-request] closed - Merge: bd-401h\nbd-f3ll [P2] [merge-request] closed - Merge: bd-ot0w\nbd-fmdy [P3] [merge-request] closed - Merge: bd-kzda).\n\n3. **Separate merge queue**: Refinery maintains internal state for pending merges, not in beads at all. Clean but requires new infrastructure.\n\nWisps are the cleanest solution - they already exist, have the right semantics, and require minimal changes.\n\n## Related\n\n- Wisp architecture: \n- Current MR creation: witness/refinery code paths\n- bd-pvu0, bd-801b: Example MRs currently in permanent storage\nEOF\n)","status":"tombstone","priority":0,"issue_type":"feature","created_at":"2025-12-23T01:39:25.4918-08:00","updated_at":"2025-12-23T01:58:23.550668-08:00","deleted_at":"2025-12-23T01:58:23.550668-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"feature"} {"id":"bd-dsdh","title":"Document sync.branch 'always dirty' working tree behavior","description":"## Context\n\nWhen sync.branch is configured, the .beads/issues.jsonl file in main's working tree is ALWAYS dirty. This is by design:\n\n1. bd sync commits to beads-sync branch (via worktree)\n2. bd sync copies JSONL to main's working tree (so CLI commands work)\n3. This copy is NOT committed to main (to reduce commit noise)\n\nContributors who watch main branch history pushed for sync.branch to avoid constant beads commit noise. But users need to understand the trade-off.\n\n## Documentation Needed\n\nUpdate README.md sync.branch section with:\n\n1. **Clear explanation** of why .beads/ is always dirty on main\n2. **\"Be Zen about it\"** - this is expected, not a bug\n3. **Workflow options:**\n - Accept dirty state, use `bd sync --merge` periodically to snapshot to main\n - Or disable sync.branch if clean working tree is more important\n4. **Shell alias tip** to hide beads from git status:\n ```bash\n alias gs='git status -- \":!.beads/\"'\n ```\n5. **When to merge**: releases, milestones, or periodic snapshots\n\n## Related\n\n- bd-7b7h: Fix that allows bd sync --merge to work with dirty .beads/\n- bd-elqd: Investigation that identified this as expected behavior","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T23:16:12.253559-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-dsp","title":"Test stdin body-file","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-17T17:27:32.098806-08:00","updated_at":"2025-12-17T17:28:33.832749-08:00","closed_at":"2025-12-17T17:28:33.832749-08:00"} -{"id":"bd-dtl8","title":"Test deleteViaDaemon RPC client integration","description":"Add comprehensive tests for the deleteViaDaemon function (cmd/bd/delete.go:21) which handles client-side RPC deletion calls.\n\n## Function under test\n- deleteViaDaemon: CLI command handler that sends delete requests to daemon via RPC\n\n## Test scenarios needed\n1. Successful deletion via daemon\n2. Cascade deletion through daemon\n3. Force deletion through daemon\n4. Dry-run mode (no actual deletion)\n5. Error handling:\n - Daemon unavailable\n - Invalid issue IDs\n - Dependency conflicts\n6. JSON output validation\n7. Human-readable output formatting\n\n## Coverage target\nCurrent: 0%\nTarget: \u003e80%\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/nux","created_at":"2025-12-18T13:08:29.805706253-07:00","updated_at":"2025-12-23T23:39:17.304351-08:00","dependencies":[{"issue_id":"bd-dtl8","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:29.807984381-07:00","created_by":"mhwilkie"}]} +{"id":"bd-dtl8","title":"Test deleteViaDaemon RPC client integration","description":"Add comprehensive tests for the deleteViaDaemon function (cmd/bd/delete.go:21) which handles client-side RPC deletion calls.\n\n## Function under test\n- deleteViaDaemon: CLI command handler that sends delete requests to daemon via RPC\n\n## Test scenarios needed\n1. Successful deletion via daemon\n2. Cascade deletion through daemon\n3. Force deletion through daemon\n4. Dry-run mode (no actual deletion)\n5. Error handling:\n - Daemon unavailable\n - Invalid issue IDs\n - Dependency conflicts\n6. JSON output validation\n7. Human-readable output formatting\n\n## Coverage target\nCurrent: 0%\nTarget: \u003e80%\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:29.805706253-07:00","updated_at":"2025-12-23T21:22:12.35566-08:00","dependencies":[{"issue_id":"bd-dtl8","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:29.807984381-07:00","created_by":"mhwilkie"}]} {"id":"bd-du9h","title":"Add Validation type and validations field to Issue","description":"Add Validation struct (Validator *EntityRef, Outcome string, Timestamp time.Time, Score *float32) and Validations []Validation field to Issue. Tracks who validated/approved work completion. Core to HOP proof-of-stake concept - validators stake reputation on approvals.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:37.725701-08:00","updated_at":"2025-12-22T20:08:59.925028-08:00","closed_at":"2025-12-22T20:08:59.925028-08:00","close_reason":"Added Validation type with Validator, Outcome, Timestamp, Score fields. Added Validations []Validation to Issue struct. Included in content hash. Full test coverage.","dependencies":[{"issue_id":"bd-du9h","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.470984-08:00","created_by":"daemon"},{"issue_id":"bd-du9h","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.896552-08:00","created_by":"daemon"}]} {"id":"bd-dwh","title":"Implement or remove ExpectExit/ExpectStdout verification fields","description":"The Verification struct in internal/types/workflow.go has ExpectExit and ExpectStdout fields that are never used by workflowVerifyCmd. Either implement the functionality or remove the dead fields.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-17T22:23:02.708627-08:00","updated_at":"2025-12-17T22:34:07.300348-08:00","closed_at":"2025-12-17T22:34:07.300348-08:00"} -{"id":"bd-dxtc","title":"Test daemon RPC delete handler","description":"Add tests for the daemon-side RPC delete handler that processes delete requests from clients.\n\n## What needs testing\n- Daemon's Delete RPC handler implementation\n- Processing delete requests from RPC clients\n- Cascade deletion at daemon level\n- Force deletion at daemon level\n- Dry-run mode validation\n- Error responses to clients\n- Dependency validation before deletion\n- Tombstone creation via daemon\n\n## Test scenarios\n1. Delete single issue via RPC\n2. Delete multiple issues via RPC\n3. Cascade deletion of dependents\n4. Force delete with orphaned dependents\n5. Dry-run returns what would be deleted without actual deletion\n6. Error: invalid issue IDs\n7. Error: insufficient permissions\n8. Error: dependency blocks deletion (without force/cascade)\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/furiosa","created_at":"2025-12-18T13:08:33.532111042-07:00","updated_at":"2025-12-23T23:38:57.351985-08:00","dependencies":[{"issue_id":"bd-dxtc","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:33.534367367-07:00","created_by":"mhwilkie"}]} +{"id":"bd-dxtc","title":"Test daemon RPC delete handler","description":"Add tests for the daemon-side RPC delete handler that processes delete requests from clients.\n\n## What needs testing\n- Daemon's Delete RPC handler implementation\n- Processing delete requests from RPC clients\n- Cascade deletion at daemon level\n- Force deletion at daemon level\n- Dry-run mode validation\n- Error responses to clients\n- Dependency validation before deletion\n- Tombstone creation via daemon\n\n## Test scenarios\n1. Delete single issue via RPC\n2. Delete multiple issues via RPC\n3. Cascade deletion of dependents\n4. Force delete with orphaned dependents\n5. Dry-run returns what would be deleted without actual deletion\n6. Error: invalid issue IDs\n7. Error: insufficient permissions\n8. Error: dependency blocks deletion (without force/cascade)\n\n## Related\n- Parent epic: bd-kyll\n- Original issue: bd-7z4","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-18T13:08:33.532111042-07:00","updated_at":"2025-12-23T21:22:11.26397-08:00","dependencies":[{"issue_id":"bd-dxtc","depends_on_id":"bd-kyll","type":"parent-child","created_at":"2025-12-18T13:08:33.534367367-07:00","created_by":"mhwilkie"}]} {"id":"bd-dyy","title":"Review PR #513: fix hooks install docs","description":"Review and merge PR #513 from aspiers. This PR fixes incorrect docs for how to install git hooks - updates README to use bd hooks install instead of removed install.sh. Simple 1-line change. URL: https://github.com/anthropics/beads/pull/513","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-13T08:15:14.838772+11:00","updated_at":"2025-12-13T07:07:19.718544-08:00","closed_at":"2025-12-13T07:07:19.718544-08:00"} {"id":"bd-e1085716","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":"closed","priority":1,"issue_type":"task","created_at":"2025-10-29T23:05:13.980679-07:00","updated_at":"2025-12-17T22:58:34.562008-08:00","closed_at":"2025-12-17T22:58:34.562008-08:00","close_reason":"Closed"} {"id":"bd-e7ou","title":"Fix --as flag: uses title instead of ID in mol bond","description":"In bondProtoProto, the --as flag is documented as 'Custom ID for compound proto' but the implementation uses it as the title, not the issue ID.\n\n**Current behavior (mol.go:637-638):**\n```go\nif customID != '' {\n compoundTitle = customID // Used as title, not ID\n}\n```\n\n**Options:**\n1. Change flag description to say 'Custom title' (documentation fix)\n2. Actually use it as a custom ID prefix or full ID (feature change)\n3. Add separate --title flag and make --as actually set ID\n\nRecommend option 1 for simplest fix - change 'Custom ID' to 'Custom title' in the flag description.","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-21T10:22:59.069368-08:00","updated_at":"2025-12-21T21:18:48.514513-08:00","closed_at":"2025-12-21T21:18:48.514513-08:00","close_reason":"Fixed - renamed customID to customTitle and updated dry-run output"} @@ -271,7 +271,7 @@ {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","assignee":"dave","created_at":"2025-12-23T04:43:15.598698-08:00","updated_at":"2025-12-23T04:51:29.438139-08:00","deleted_at":"2025-12-23T04:51:29.438139-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-iic1","title":"Phase 2.2: Switch bdt storage to TOON format","description":"Currently bdt stores issues in JSONL format in issues.toon file. Phase 2.2 must implement actual TOON format storage - this is the fundamental goal of the bdtoon project.\n\n## Current State (Phase 2.1)\n- issues.toon stores JSONL (intermediate format)\n- --toon flag allows output in TOON format for LLM consumption\n- Problem: We're not actually using TOON as the fundamental storage format\n\n## Required Work (Phase 2.2)\n1. Switch issue file I/O to write TOON format instead of JSONL\n - Update cmd/bdt/storage.go to use EncodeTOON for writing\n - Update cmd/bdt/storage.go to decode TOON (currently decodes JSON)\n - Ensure round-trip: write TOON → read TOON → write TOON is byte-identical\n\n2. Update command implementations\n - cmd/bdt/create.go: Write newly created issues to TOON format\n - cmd/bdt/list.go: Read issues from TOON format\n - cmd/bdt/show.go: Read from TOON format\n - cmd/bdt/import.go: Convert imported JSONL to TOON\n - cmd/bdt/export.go: Export TOON to JSONL (for bd compatibility)\n\n3. Implement TOON parser that handles gotoon's encoder-only limitation\n - Since gotoon doesn't decode TOON, need custom TOON→JSON decoder\n - OR continue storing TOON but decoding via intermediate JSON conversion\n\n4. Git merge driver optimization\n - TOON is line-oriented, better for 3-way merges than binary formats\n - Configure git merge driver for .toon files\n\n5. Comprehensive testing\n - Round-trip tests: Issue → TOON → storage → read → Issue\n - Merge conflict resolution tests with TOON format\n - Large issue set performance tests\n\n## Success Criteria\n- issues.toon stores actual TOON format (not JSONL)\n- bdt list reads from TOON file\n- bdt create writes to TOON file\n- Round-trip: create issue → list → show returns identical data\n- All 65+ tests still passing\n- Performance comparable to JSONL storage","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T14:05:41.394964404-07:00","updated_at":"2025-12-19T14:37:17.879612634-07:00","closed_at":"2025-12-19T14:37:17.879612634-07:00"} {"id":"bd-in7","title":"Test message","description":"Hello world","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-17T23:16:13.184946-08:00","updated_at":"2025-12-18T17:42:26.000073-08:00","closed_at":"2025-12-17T23:37:38.563369-08:00"} -{"id":"bd-indn","title":"bd template commands fail with daemon mode","description":"The `bd template show` and `bd template instantiate` commands fail with 'Error loading template: no database connection' when daemon is running.\n\n**Reproduction:**\n```bash\nbd daemon --start\nbd template show bd-qqc # Error: no database connection\nbd template show bd-qqc --no-daemon # Works\n```\n\n**Expected:** Template commands should work with daemon like other commands.\n\n**Workaround:** Use `--no-daemon` flag.\n\n**Location:** Likely in cmd/bd/template.go - daemon RPC path not implemented for template operations.","status":"closed","priority":2,"issue_type":"bug","assignee":"beads/india","created_at":"2025-12-18T22:57:35.16596-08:00","updated_at":"2025-12-23T22:40:32.763595-08:00","closed_at":"2025-12-23T22:40:32.763595-08:00","close_reason":"Fixed: Added daemon-compatible functions for template operations (loadTemplateSubgraphViaDaemon, cloneSubgraphViaDaemon)"} +{"id":"bd-indn","title":"bd template commands fail with daemon mode","description":"The `bd template show` and `bd template instantiate` commands fail with 'Error loading template: no database connection' when daemon is running.\n\n**Reproduction:**\n```bash\nbd daemon --start\nbd template show bd-qqc # Error: no database connection\nbd template show bd-qqc --no-daemon # Works\n```\n\n**Expected:** Template commands should work with daemon like other commands.\n\n**Workaround:** Use `--no-daemon` flag.\n\n**Location:** Likely in cmd/bd/template.go - daemon RPC path not implemented for template operations.","status":"in_progress","priority":2,"issue_type":"bug","assignee":"beads/india","created_at":"2025-12-18T22:57:35.16596-08:00","updated_at":"2025-12-23T22:29:35.689875-08:00"} {"id":"bd-io8c","title":"Improve test coverage for internal/syncbranch (33.0% → 70%)","description":"Improve test coverage for internal/syncbranch package from 27% to 70%.\n\n## Current State\n- Coverage: 27.0%\n- Files: syncbranch.go, worktree.go\n- Tests: syncbranch_test.go (basic tests exist)\n\n## Functions Needing Tests\n\n### syncbranch.go (config management)\n- [x] ValidateBranchName - has tests\n- [ ] Get - needs store mock tests\n- [ ] GetFromYAML - needs YAML parsing tests\n- [ ] IsConfigured - needs file system tests\n- [ ] IsConfiguredWithDB - needs DB path tests\n- [ ] Set - needs store mock tests\n- [ ] Unset - needs store mock tests\n\n### worktree.go (git operations) - PRIORITY\n- [ ] CommitToSyncBranch - needs git repo fixture tests\n- [ ] PullFromSyncBranch - needs merge scenario tests\n- [ ] CheckDivergence - needs ahead/behind tests\n- [ ] ResetToRemote - needs reset scenario tests\n- [ ] performContentMerge - needs 3-way merge tests\n- [ ] extractJSONLFromCommit - needs git show tests\n- [ ] hasChangesInWorktree - needs dirty state tests\n- [ ] commitInWorktree - needs commit scenario tests\n\n## Implementation Guide\n\n1. **Use testutil fixtures:**\n ```go\n import \"github.com/steveyegge/beads/internal/testutil/fixtures\"\n \n func TestCommitToSyncBranch(t *testing.T) {\n repo := fixtures.NewGitRepo(t)\n defer repo.Cleanup()\n // ... test scenarios\n }\n ```\n\n2. **Test scenarios for worktree.go:**\n - Clean commit (no conflicts)\n - Non-fast-forward push (diverged)\n - Merge conflict resolution\n - Empty changes (nothing to commit)\n\n3. **Mock storage for syncbranch.go:**\n ```go\n store := memory.New()\n // Set up test config\n syncbranch.Set(ctx, store, \"beads-sync\")\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- All public functions have at least one test\n- Edge cases covered for git operations\n- Tests pass with `go test -race ./internal/syncbranch`\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/syncbranch\ngo test -race ./internal/syncbranch\n```","status":"closed","priority":1,"issue_type":"task","assignee":"beads/Syncer","created_at":"2025-12-13T20:43:02.079145-08:00","updated_at":"2025-12-23T13:46:10.191435-08:00","closed_at":"2025-12-23T13:46:10.191435-08:00","close_reason":"Improved coverage from 27% to 67% (close to 70% target)","dependencies":[{"issue_id":"bd-io8c","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.213092-08:00","created_by":"daemon"}]} {"id":"bd-ipj7","title":"enhance 'bd status' to show recent activity","description":"It would be nice to be able to quickly view the last N changes in the database, to see wha's recently been worked on. I'm imagining something like 'bd status activity'.","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T11:08:50.996541974-07:00","updated_at":"2025-12-21T17:54:00.279039-08:00","closed_at":"2025-12-21T17:54:00.279039-08:00","close_reason":"Already implemented - bd status includes Recent Activity section"} {"id":"bd-ipva","title":"Update go install bd to 0.33.2","description":"Rebuild and install bd to ~/go/bin:\n\n```bash\ngo install ./cmd/bd\n~/go/bin/bd version # Verify shows 0.33.2\n```\n\nNote: If ~/go/bin is in PATH before /opt/homebrew/bin, this is the version that runs by default.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760715-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Local dev build used instead of go install","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} @@ -321,7 +321,7 @@ {"id":"bd-lfak","title":"bd preflight: PR readiness checks for contributors","description":"## Vision\n\nEncode project-specific institutional knowledge into executable checks. CONTRIBUTING.md is documentation that's read once and forgotten; `bd preflight` is documentation that runs at exactly the right moment.\n\n## Problem Statement\n\nContributors face a \"last mile\" problem - they do the work but stumble on project-specific gotchas at PR time:\n- Nix vendorHash gets stale when go.sum changes\n- Beads artifacts leak into PRs (see bd-umbf for namespace solution)\n- Version mismatches between version.go and default.nix\n- Tests/lint not run locally before pushing\n- Other project-specific checks that only surface when CI fails\n\nThese are too obscure to remember, exist in docs nobody reads end-to-end, and waste CI round-trips.\n\n## Why beads?\n\nBeads already has a foothold in the contributor workflow. It knows:\n- Git state (staged files, branch, dirty status)\n- Project structure\n- The specific issue being worked on\n- Project-specific configuration\n\n## Proposed Interface\n\n### Tier 1: Checklist Mode (v1)\n\n $ bd preflight\n PR Readiness Checklist:\n\n [ ] Tests pass: go test -short ./...\n [ ] Lint passes: golangci-lint run ./...\n [ ] No beads pollution: check .beads/issues.jsonl diff\n [ ] Nix hash current: go.sum unchanged or vendorHash updated\n [ ] Version sync: version.go matches default.nix\n\n Run 'bd preflight --check' to validate automatically.\n\n### Tier 2: Check Mode (v2)\n\n $ bd preflight --check\n ✓ Tests pass\n ✓ Lint passes\n ⚠ Beads pollution: 3 issues in diff - are these project issues or personal?\n ✗ Nix hash stale: go.sum changed, vendorHash needs update\n Fix: sha256-KRR6dXzsSw8OmEHGBEVDBOoIgfoZ2p0541T9ayjGHlI=\n ✓ Version sync\n\n 1 error, 1 warning. Run 'bd preflight --fix' to auto-fix where possible.\n\n### Tier 3: Fix Mode (v3)\n\n $ bd preflight --fix\n ✓ Updated vendorHash in default.nix\n ⚠ Cannot auto-fix beads pollution - manual review needed\n\n## Checks to Implement\n\n| Check | Description | Auto-fixable |\n|-------|-------------|--------------|\n| tests | Run go test -short ./... | No |\n| lint | Run golangci-lint | Partial (gofmt) |\n| beads-pollution | Detect personal issues in diff | No (see bd-umbf) |\n| nix-hash | Detect stale vendorHash | Yes (if nix available) |\n| version-sync | version.go matches default.nix | Yes |\n| no-debug | No TODO/FIXME/console.log | Warn only |\n| clean-stage | No unintended files staged | Warn only |\n\n## Future: Configuration\n\nMake checks configurable per-project via .beads/preflight.yaml:\n\n preflight:\n checks:\n - name: tests\n run: go test -short ./...\n required: true\n - name: no-secrets\n pattern: \"**/*.env\"\n staged: deny\n - name: custom-check\n run: ./scripts/validate.sh\n\nThis lets any project using beads define their own preflight checks.\n\n## Implementation Phases\n\n### Phase 1: Static Checklist\n- Implement bd preflight with hardcoded checklist for beads\n- No execution, just prints what to check\n- Update CONTRIBUTING.md to reference it\n\n### Phase 2: Automated Checks\n- Implement bd preflight --check\n- Run tests, lint, detect stale hashes\n- Clear pass/fail/warn output\n\n### Phase 3: Auto-fix\n- Implement bd preflight --fix\n- Fix vendorHash, version sync\n- Integrate with bd-umbf solution for pollution\n\n### Phase 4: Configuration\n- .beads/preflight.yaml support\n- Make it useful for other projects using beads\n- Plugin/hook system for custom checks\n\n## Dependencies\n\n- bd-umbf: Namespace isolation for beads pollution (blocking for full solution)\n\n## Success Metrics\n\n- Fewer CI failures on first PR push\n- Reduced \"fix nix hash\" commits\n- Contributors report preflight caught issues before CI","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-13T18:01:39.587078-08:00","updated_at":"2025-12-13T18:01:39.587078-08:00","dependencies":[{"issue_id":"bd-lfak","depends_on_id":"bd-umbf","type":"blocks","created_at":"2025-12-13T18:01:46.059901-08:00","created_by":"daemon","metadata":"{}"}]} {"id":"bd-likt","title":"Add daemon RPC support for gate commands","description":"Add daemon RPC support for gate commands.\n\n## Current State\nGate commands require --no-daemon flag because they use direct SQLite access:\n- Gate create needs to write await_type, await_id, timeout_ns, waiters fields\n- Gate wait needs to update waiters JSON array\n- Daemon RPC doesnt have methods for these operations\n\n## Implementation\n\n### 1. Add RPC methods to internal/rpc/protocol.go\n\n```go\n// Gate operations\ntype GateCreateArgs struct {\n Title string \\`json:\"title\"\\`\n AwaitType string \\`json:\"await_type\"\\`\n AwaitID string \\`json:\"await_id\"\\`\n Timeout time.Duration \\`json:\"timeout\"\\`\n Waiters []string \\`json:\"waiters\"\\`\n}\n\ntype GateCreateResult struct {\n Issue *types.Issue \\`json:\"issue\"\\`\n}\n\ntype GateListArgs struct {\n All bool \\`json:\"all\"\\` // Include closed gates\n}\n\ntype GateListResult struct {\n Gates []*types.Issue \\`json:\"gates\"\\`\n}\n\ntype GateWaitArgs struct {\n GateID string \\`json:\"gate_id\"\\`\n Waiters []string \\`json:\"waiters\"\\` // Additional waiters to add\n}\n\ntype GateWaitResult struct {\n Gate *types.Issue \\`json:\"gate\"\\`\n AddedCount int \\`json:\"added_count\"\\`\n}\n```\n\n### 2. Add handler methods to internal/daemon/rpc_handler.go\n\n```go\nfunc (h *RPCHandler) GateCreate(ctx context.Context, args *rpc.GateCreateArgs) (*rpc.GateCreateResult, error) {\n now := time.Now()\n gate := \u0026types.Issue{\n Title: args.Title,\n IssueType: types.TypeGate,\n Status: types.StatusOpen,\n Priority: 1,\n Assignee: \"deacon/\",\n Wisp: true,\n AwaitType: args.AwaitType,\n AwaitID: args.AwaitID,\n Timeout: args.Timeout,\n Waiters: args.Waiters,\n CreatedAt: now,\n UpdatedAt: now,\n }\n gate.ContentHash = gate.ComputeContentHash()\n \n if err := h.store.CreateIssue(ctx, gate, h.actor); err != nil {\n return nil, err\n }\n \n return \u0026rpc.GateCreateResult{Issue: gate}, nil\n}\n\nfunc (h *RPCHandler) GateList(ctx context.Context, args *rpc.GateListArgs) (*rpc.GateListResult, error) {\n gateType := types.TypeGate\n filter := types.IssueFilter{IssueType: \u0026gateType}\n if !args.All {\n openStatus := types.StatusOpen\n filter.Status = \u0026openStatus\n }\n \n gates, err := h.store.SearchIssues(ctx, \"\", filter)\n if err != nil {\n return nil, err\n }\n \n return \u0026rpc.GateListResult{Gates: gates}, nil\n}\n\nfunc (h *RPCHandler) GateWait(ctx context.Context, args *rpc.GateWaitArgs) (*rpc.GateWaitResult, error) {\n gate, err := h.store.GetIssue(ctx, args.GateID)\n if err != nil {\n return nil, err\n }\n if gate.IssueType != types.TypeGate {\n return nil, fmt.Errorf(\"%s is not a gate\", args.GateID)\n }\n \n // Merge waiters (dedupe)\n waiterSet := make(map[string]bool)\n for _, w := range gate.Waiters {\n waiterSet[w] = true\n }\n added := 0\n for _, w := range args.Waiters {\n if !waiterSet[w] {\n gate.Waiters = append(gate.Waiters, w)\n waiterSet[w] = true\n added++\n }\n }\n \n if added \u003e 0 {\n // Update via store\n updates := map[string]interface{}{\n \"waiters\": gate.Waiters,\n }\n if err := h.store.UpdateIssue(ctx, args.GateID, updates, h.actor); err != nil {\n return nil, err\n }\n }\n \n return \u0026rpc.GateWaitResult{Gate: gate, AddedCount: added}, nil\n}\n```\n\n### 3. Register methods in daemon\n\nIn internal/daemon/server.go, register the new methods:\n```go\nrpc.RegisterMethod(\"gate.create\", h.GateCreate)\nrpc.RegisterMethod(\"gate.list\", h.GateList)\nrpc.RegisterMethod(\"gate.wait\", h.GateWait)\n```\n\n### 4. Add client methods to internal/rpc/client.go\n\n```go\nfunc (c *Client) GateCreate(ctx context.Context, args *GateCreateArgs) (*GateCreateResult, error) {\n var result GateCreateResult\n err := c.Call(ctx, \"gate.create\", args, \u0026result)\n return \u0026result, err\n}\n\nfunc (c *Client) GateList(ctx context.Context, args *GateListArgs) (*GateListResult, error) {\n var result GateListResult\n err := c.Call(ctx, \"gate.list\", args, \u0026result)\n return \u0026result, err\n}\n\nfunc (c *Client) GateWait(ctx context.Context, args *GateWaitArgs) (*GateWaitResult, error) {\n var result GateWaitResult\n err := c.Call(ctx, \"gate.wait\", args, \u0026result)\n return \u0026result, err\n}\n```\n\n### 5. Update cmd/bd/gate.go to use daemon\n\n```go\n// In gateCreateCmd Run:\nif daemonClient != nil {\n result, err := daemonClient.GateCreate(ctx, \u0026rpc.GateCreateArgs{\n Title: title,\n AwaitType: awaitType,\n AwaitID: awaitID,\n Timeout: timeout,\n Waiters: notifyAddrs,\n })\n if err != nil {\n FatalError(\"gate create: %v\", err)\n }\n gate = result.Issue\n} else {\n // Existing direct store code\n}\n```\n\n## Files to Modify\n\n1. **internal/rpc/protocol.go** - Add Gate*Args/Result types\n2. **internal/daemon/rpc_handler.go** - Add handler methods\n3. **internal/daemon/server.go** - Register methods\n4. **internal/rpc/client.go** - Add client methods\n5. **cmd/bd/gate.go** - Use daemon client when available\n\n## Testing\n\n```bash\n# Start daemon\nbd daemon start\n\n# Test via daemon (should work without --no-daemon)\nbd gate create --await timer:5m --notify beads/dave\nbd gate list\nbd gate wait \u003cid\u003e --notify beads/alice\n\n# Verify daemon handled it\nbd daemons logs . | grep gate\n```\n\n## Success Criteria\n- All gate commands work without --no-daemon\n- Same behavior in daemon vs direct mode\n- Waiters array updates correctly via RPC\n- Tests pass for RPC gate operations","status":"closed","priority":3,"issue_type":"task","assignee":"beads/Gater","created_at":"2025-12-23T12:13:25.778412-08:00","updated_at":"2025-12-23T13:45:58.398604-08:00","closed_at":"2025-12-23T13:45:58.398604-08:00","close_reason":"Implemented daemon RPC support for all gate commands","dependencies":[{"issue_id":"bd-likt","depends_on_id":"bd-udsi","type":"discovered-from","created_at":"2025-12-23T12:13:36.174822-08:00","created_by":"daemon"},{"issue_id":"bd-likt","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.891992-08:00","created_by":"daemon"}]} {"id":"bd-lk39","title":"Add composite index (issue_id, event_type) on events table","description":"GetCloseReason and GetCloseReasonsForIssues filter by both issue_id and event_type.\n\n**Query (queries.go:355-358):**\n```sql\nSELECT comment FROM events\nWHERE issue_id = ? AND event_type = ?\nORDER BY created_at DESC LIMIT 1\n```\n\n**Problem:** Currently uses idx_events_issue but must filter event_type in memory.\n\n**Solution:** Add migration:\n```sql\nCREATE INDEX IF NOT EXISTS idx_events_issue_type ON events(issue_id, event_type);\n```\n\n**Priority:** Low - events table is typically small relative to issues.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T22:58:54.070587-08:00","updated_at":"2025-12-22T23:15:13.841988-08:00","closed_at":"2025-12-22T23:15:13.841988-08:00","close_reason":"Implemented in migration 026_additional_indexes.go","dependencies":[{"issue_id":"bd-lk39","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:54.071286-08:00","created_by":"daemon"}]} -{"id":"bd-llfl","title":"Improve test coverage for cmd/bd CLI (26.2% → 50%)","description":"The main CLI package (cmd/bd) has only 26.2% test coverage. CLI commands should have at least 50% coverage to ensure reliability.\n\nKey areas with low/no coverage:\n- daemon_autostart.go (multiple 0% functions)\n- compact.go (several 0% functions)\n- Various command handlers\n\nCurrent coverage: 26.2%\nTarget coverage: 50%","notes":"## Progress Update (2025-12-23)\n\n### Tests Added\nAdded 683 lines of new tests across 3 files:\n- cmd/bd/daemon_config_test.go (144 lines)\n- cmd/bd/utils_test.go (484 lines) \n- cmd/bd/autostart_test.go (55 additional lines)\n\n### Functions Now Tested\n- daemon_config.go: ensureBeadsDir, getPIDFilePath, getLogFilePath, getSocketPathForPID\n- daemon_autostart.go: determineSocketPath, isDaemonRunningQuiet\n- activity.go: printEvent\n- cleanup.go: showCleanupDeprecationHint\n- upgrade.go: pluralize\n- wisp.go: formatTimeAgo\n- list.go: pinIndicator, sortIssues\n- hooks.go: FormatHookWarnings, isRebaseInProgress, hasBeadsJSONL\n- template.go: extractIDSuffix\n- thanks.go: getContributorsSorted\n\n### Coverage Results\n- Before: 22.5%\n- After: 23.1%\n- Delta: +0.6%\n\n### Remaining Work\nMost remaining untested code (77%) involves:\n1. Daemon/RPC operations (runDaemonLoop, tryAutoStartDaemon, etc.)\n2. Command handlers that require database/daemon setup\n3. Git operations (runPreCommitHook, runPostMergeHook, etc.)\n\nTo reach 50%, would need to:\n- Add integration tests with mocked daemon\n- Add scripttest tests for command handlers\n- Add more database-dependent tests\n\nCommit: 4f949c19","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/charlie","created_at":"2025-12-13T20:43:03.123341-08:00","updated_at":"2025-12-23T22:45:57.860498-08:00"} +{"id":"bd-llfl","title":"Improve test coverage for cmd/bd CLI (26.2% → 50%)","description":"The main CLI package (cmd/bd) has only 26.2% test coverage. CLI commands should have at least 50% coverage to ensure reliability.\n\nKey areas with low/no coverage:\n- daemon_autostart.go (multiple 0% functions)\n- compact.go (several 0% functions)\n- Various command handlers\n\nCurrent coverage: 26.2%\nTarget coverage: 50%","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/charlie","created_at":"2025-12-13T20:43:03.123341-08:00","updated_at":"2025-12-23T22:31:40.043474-08:00"} {"id":"bd-lo4","title":"Test pinned issue","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-18T21:44:49.031385-08:00","updated_at":"2025-12-18T21:47:25.055109-08:00","deleted_at":"2025-12-18T21:47:25.055109-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"bd-lq2o","title":"Rebuild local binary","description":"Build and verify: go build -o bd ./cmd/bd \u0026\u0026 ./bd version","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.759506-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Binary builds and runs correctly","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-lsv4","title":"GH#444: Fix inconsistent status naming in_progress vs in-progress","description":"Documentation uses in-progress (hyphen) but code expects in_progress (underscore). Update all docs to use canonical in_progress. See GitHub issue #444.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:14.349425-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"} @@ -331,14 +331,14 @@ {"id":"bd-m0tl","title":"bd create -f crashes with nil pointer dereference","description":"GitHub issue #674. The markdown import feature crashes at markdown.go:338 because global variables (store, ctx, actor) aren't initialized when createIssuesFromMarkdown is called. The function uses globals set by cobra command framework but is being called before they're ready. Need to either initialize globals at start of function or pass them as parameters.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T14:35:14.813012-08:00","updated_at":"2025-12-21T15:41:14.600953-08:00","closed_at":"2025-12-21T15:41:14.600953-08:00","close_reason":"Fixed: added nil check for store in createIssuesFromMarkdown"} {"id":"bd-m164","title":"Add 0.33.2 to versionChanges in info.go","description":"Add new entry at the TOP of versionChanges array in cmd/bd/info.go:\n\n```go\n{\n Version: \"0.33.2\",\n Date: \"2025-12-21\",\n Changes: []string{\n // Add notable changes here\n },\n},\n```\n\nCopy changes from CHANGELOG.md [Unreleased] section.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.761218-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-m7ib","title":"Add creator field to Issue struct","description":"Add Creator *EntityRef field to Issue. Tracks who created the issue. Optional, omitted if nil in JSONL. This enables CV chain tracking - every piece of work is attributed to its creator.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T17:53:31.599447-08:00","updated_at":"2025-12-22T20:03:24.264672-08:00","closed_at":"2025-12-22T20:03:24.264672-08:00","close_reason":"Added Creator *EntityRef field to Issue struct. Included in content hash. Test coverage added.","dependencies":[{"issue_id":"bd-m7ib","depends_on_id":"bd-7pwh","type":"parent-child","created_at":"2025-12-22T17:53:43.39957-08:00","created_by":"daemon"},{"issue_id":"bd-m7ib","depends_on_id":"bd-nmch","type":"blocks","created_at":"2025-12-22T17:53:47.826309-08:00","created_by":"daemon"}]} -{"id":"bd-m8ro","title":"Improve test coverage for internal/rpc (47.5% → 60%)","description":"The RPC package has only 47.5% test coverage. RPC is the communication layer for daemon operations.\n\nCurrent coverage: 47.5%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","assignee":"beads/delta","created_at":"2025-12-13T20:43:09.515299-08:00","updated_at":"2025-12-23T22:42:11.921388-08:00","closed_at":"2025-12-23T22:42:11.921388-08:00","close_reason":"Improved test coverage from 44.7% to 61.7% by adding comprehensive tests for Count, ResolveID, Delete, Stale, Comment, Metrics, Gate operations, Export, GetMutations, and MutationChan"} +{"id":"bd-m8ro","title":"Improve test coverage for internal/rpc (47.5% → 60%)","description":"The RPC package has only 47.5% test coverage. RPC is the communication layer for daemon operations.\n\nCurrent coverage: 47.5%\nTarget coverage: 60%","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/delta","created_at":"2025-12-13T20:43:09.515299-08:00","updated_at":"2025-12-23T22:29:35.837758-08:00"} {"id":"bd-m964","title":"Consider FTS5 for text search at scale","description":"SearchIssues uses LIKE patterns for text search which can't use indexes.\n\n**Current query (queries.go:1475-1477):**\n```sql\n(title LIKE ? OR description LIKE ? OR id LIKE ?)\n```\n\n**Problem:** Full table scan on every text search. At 100K+ issues, this becomes slow.\n\n**SQLite FTS5 solution:**\n```sql\nCREATE VIRTUAL TABLE issues_fts USING fts5(\n id, title, description, design, notes,\n content='issues',\n content_rowid='rowid'\n);\n\n-- Triggers to keep FTS in sync\nCREATE TRIGGER issues_ai AFTER INSERT ON issues BEGIN\n INSERT INTO issues_fts(rowid, id, title, description, design, notes)\n VALUES (new.rowid, new.id, new.title, new.description, new.design, new.notes);\nEND;\n-- (similar for UPDATE, DELETE)\n```\n\n**Trade-offs:**\n- Database size increase (~30-50% for text content)\n- Additional write overhead (trigger execution)\n- Better search capabilities (ranking, phrase search)\n\n**Decision needed:** Is full-text search a priority feature? Current LIKE search may be acceptable for most use cases.\n\n**Benchmark first:** Measure SearchIssues at 100K scale before implementing.","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-22T22:58:56.466121-08:00","updated_at":"2025-12-22T22:58:56.466121-08:00","dependencies":[{"issue_id":"bd-m964","depends_on_id":"bd-h0we","type":"discovered-from","created_at":"2025-12-22T22:58:56.466764-08:00","created_by":"daemon"}]} {"id":"bd-mh4w","title":"Rename 'bond' to 'spawn' for instantiation","description":"Rename the bd mol bond command to bd mol spawn for instantiating protos.\n \n- Rename molBondCmd to molSpawnCmd\n- Update command Use/Short/Long descriptions \n- Keep 'bond' available for the new bonding feature\n- Update all documentation references\n- Add 'protomolecule' as easter egg alias for 'proto'","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-21T00:58:44.529026-08:00","updated_at":"2025-12-21T01:19:42.942819-08:00","closed_at":"2025-12-21T01:19:42.942819-08:00","close_reason":"Renamed 'bond' to 'spawn' in mol.go, updated all user-facing messages and help text","dependencies":[{"issue_id":"bd-mh4w","depends_on_id":"bd-o5xe","type":"parent-child","created_at":"2025-12-21T00:59:51.167902-08:00","created_by":"daemon"}]} {"id":"bd-mql4","title":"getLocalSyncBranch silently ignores YAML parse errors","description":"In autoimport.go:170-172, YAML parsing errors are silently ignored. If a user has malformed YAML in config.yaml, sync-branch will just silently be empty with no feedback.\n\nRecommendation: Add debug logging since this function is only called during auto-import, and debugging silent failures is painful.\n\nAdd: debug.Logf(\"Warning: failed to parse config.yaml: %v\", err)","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:44.217728-08:00","updated_at":"2025-12-07T02:03:44.217728-08:00"} {"id":"bd-mrpw","title":"Run tests and verify build","description":"Run the test suite to verify nothing is broken:\n\n```bash\n./scripts/test.sh\n```\n\nOr manually:\n```bash\ngo build ./cmd/bd/...\ngo test ./...\n```\n\nFix any failures before proceeding.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.761563-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Tests passed for release","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-muw","title":"Add empty tasks validation in workflow create","description":"workflow.go:321 will panic if wf.Tasks is empty. Add validation that len(wf.Tasks) \u003e 0 before accessing wf.Tasks[0].","status":"closed","priority":3,"issue_type":"bug","created_at":"2025-12-17T22:23:00.75707-08:00","updated_at":"2025-12-17T22:34:07.281133-08:00","closed_at":"2025-12-17T22:34:07.281133-08:00"} {"id":"bd-mv6h","title":"Add test coverage for external dep edge cases","description":"During code review of bd-zmmy, identified missing test coverage:\n\n1. RemoveDependency with external ref target (will fail - see bd-a3sj)\n2. GetBlockedIssues with mix of local and external blockers\n3. GetDependencyTree with external deps\n4. AddDependency cycle detection with external refs (should be skipped?)\n5. External dep resolution with WAL mode database\n6. External dep resolution when target project has no .beads directory\n7. External dep resolution with invalid external: format variations\n\nPriority 2 because bd-a3sj is a real bug that tests would catch.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T23:45:37.50093-08:00","updated_at":"2025-12-22T22:32:09.515096-08:00","closed_at":"2025-12-22T22:32:09.515096-08:00","close_reason":"Added test coverage: TestGetDependencyTreeExternalDeps (dep tree shows external deps), TestCycleDetectionWithExternalRefs (cycle detection ignores external refs), TestCheckExternalDepNoBeadsDirectory (handles missing .beads dir), TestCheckExternalDepInvalidFormats (handles various invalid formats). All edge cases from bd-mv6h description now covered.","dependencies":[{"issue_id":"bd-mv6h","depends_on_id":"bd-zmmy","type":"discovered-from","created_at":"2025-12-21T23:45:37.501495-08:00","created_by":"daemon"}]} -{"id":"bd-n386","title":"Improve test coverage for internal/daemon (27.3% → 60%)","description":"The daemon package has only 27.3% test coverage. The daemon is critical for background operations and reliability.\n\nKey areas needing tests:\n- Daemon autostart logic\n- Socket handling\n- PID file management\n- Health checks\n\nCurrent coverage: 27.3%\nTarget coverage: 60%","status":"closed","priority":2,"issue_type":"task","assignee":"beads/echo","created_at":"2025-12-13T20:43:00.895238-08:00","updated_at":"2025-12-23T22:36:08.583672-08:00","closed_at":"2025-12-23T22:36:08.583672-08:00","close_reason":"Improved test coverage from 27.3% to 72.0%, exceeding the 60% target. Added discovery_unit_test.go with comprehensive unit tests for walkWithDepth, checkDaemonErrorFile, CleanupStaleSockets, findBeadsDirForWorkspace, StopDaemon, KillAllDaemons, discoverDaemon, DiscoverDaemons, and discoverDaemonsLegacy."} +{"id":"bd-n386","title":"Improve test coverage for internal/daemon (27.3% → 60%)","description":"The daemon package has only 27.3% test coverage. The daemon is critical for background operations and reliability.\n\nKey areas needing tests:\n- Daemon autostart logic\n- Socket handling\n- PID file management\n- Health checks\n\nCurrent coverage: 27.3%\nTarget coverage: 60%","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/echo","created_at":"2025-12-13T20:43:00.895238-08:00","updated_at":"2025-12-23T22:31:55.99167-08:00"} {"id":"bd-n3v","title":"Error committing to sync branch: failed to create worktree","description":"\u003e bd sync --no-daemon\n→ Exporting pending changes to JSONL...\n→ Committing changes to sync branch 'beads-sync'...\nError committing to sync branch: failed to create worktree: failed to create worktree parent directory: mkdir /var/home/matt/dev/beads/fix-ci/.git: not a directory","notes":"**Problem Diagnosed**: The `bd sync` command was failing with \"mkdir /var/home/matt/dev/beads/fix-ci/.git: not a directory\" because it was being executed from the wrong directory.\n\n**Root Cause**: The command was run from `/var/home/matt/dev/beads` (where the `fix-ci` worktree exists) instead of the main repository directory `/var/home/matt/dev/beads/main`. Since `fix-ci` is a git worktree with a `.git` file (not directory), the worktree creation logic failed when trying to create `\u003ccurrent_dir\u003e/.git/beads-worktrees/\u003cbranch\u003e`.\n\n**Solution Verified**: Execute `bd sync` from the main repository directory:\n```bash\ncd main \u0026\u0026 bd sync --dry-run\n```\n","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-05T15:25:24.514998248-07:00","updated_at":"2025-12-05T15:42:32.910166956-07:00"} {"id":"bd-n4td","title":"Add warning when staleness check errors","description":"## Problem\n\nWhen ensureDatabaseFresh() calls CheckStaleness() and it errors (corrupted metadata, permission issues, etc.), we silently proceed with potentially stale data.\n\n**Location:** cmd/bd/staleness.go:27-32\n\n**Scenarios:**\n- Corrupted metadata table\n- Database locked by another process \n- Permission issues reading JSONL file\n- Invalid last_import_time format in DB\n\n## Current Code\n\n```go\nisStale, err := autoimport.CheckStaleness(ctx, store, dbPath)\nif err \\!= nil {\n // If we can't determine staleness, allow operation to proceed\n // (better to show potentially stale data than block user)\n return nil\n}\n```\n\n## Fix\n\n```go\nisStale, err := autoimport.CheckStaleness(ctx, store, dbPath)\nif err \\!= nil {\n fmt.Fprintf(os.Stderr, \"Warning: Could not verify database freshness: %v\\n\", err)\n fmt.Fprintf(os.Stderr, \"Proceeding anyway. Data may be stale.\\n\\n\")\n return nil\n}\n```\n\n## Impact\nMedium - users should know when staleness check fails\n\n## Effort\nEasy - 5 minutes","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:16:34.889997-05:00","updated_at":"2025-12-17T23:13:40.531031-08:00","closed_at":"2025-12-17T19:11:12.950618-08:00","dependencies":[{"issue_id":"bd-n4td","depends_on_id":"bd-2q6d","type":"blocks","created_at":"2025-11-20T20:18:20.154723-05:00","created_by":"stevey","metadata":"{}"}]} {"id":"bd-n5ug","title":"Merge: bd-au0.7","description":"branch: polecat/dementus\ntarget: main\nsource_issue: bd-au0.7\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:43:36.024341-08:00","updated_at":"2025-12-23T21:21:57.692158-08:00","closed_at":"2025-12-23T21:21:57.692158-08:00","close_reason":"stale - no code pushed"} @@ -440,7 +440,7 @@ {"id":"bd-s1pz","title":"Merge: bd-u2sc.4","description":"branch: polecat/Logger\ntarget: main\nsource_issue: bd-u2sc.4\nrig: beads","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T13:45:52.412757-08:00","updated_at":"2025-12-23T19:12:08.356689-08:00","closed_at":"2025-12-23T19:12:08.356689-08:00","close_reason":"Stale merge-requests from orphaned polecat branches - refinery not processing"} {"id":"bd-s2t","title":"wish: a 'continue' or similar cmd/flag which means alter last issue","description":"so many time I create an issue and then have another thought: 'oh, before I did X and it crashed there was ZZZ happening' or 'actually that is P4 not P2'. It would be nice if when `bd {cmd}` is used without a {title} or {id} it just adds or updates the most recently touched issue.","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-08T06:46:37.529160416-07:00","updated_at":"2025-12-08T06:46:37.529160416-07:00"} {"id":"bd-sal9","title":"bd mol current: soft cursor showing current/next step","description":"Add bd mol current command for molecule navigation orientation.\n\n## Usage\n\nbd mol current [mol-id]\n\nIf mol-id given, show status for that molecule.\nIf not given, infer from in_progress issues assigned to current agent.\n\n## Output\n\nYou're working on molecule gt-abc (Feature X)\n\n [done] gt-abc.1: Design\n [done] gt-abc.2: Scaffold \n [done] gt-abc.3: Implement\n [current] gt-abc.4: Write tests [in_progress] \u003c- YOU ARE HERE\n [pending] gt-abc.5: Documentation\n [pending] gt-abc.6: Exit decision\n\nProgress: 3/6 steps complete\n\n## Key behaviors\n- Shows full molecule structure with status indicators\n- Highlights current in_progress step\n- If no in_progress, highlights first ready step\n- Works without explicit cursor tracking (inferred from state)\n\n## Implementation notes\n- Query children of mol-id\n- Sort by dependency order\n- Find first in_progress or first ready\n- Format with status indicators\n\n## Gas Town integration\n- gt-lz13: Update templates with nav workflow\n- gt-um6q: Update docs with nav workflow","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-22T17:03:30.245964-08:00","updated_at":"2025-12-22T17:36:31.936007-08:00","closed_at":"2025-12-22T17:36:31.936007-08:00","close_reason":"Implemented mol current and close --continue"} -{"id":"bd-sh4c","title":"Improve test coverage for cmd/bd/setup (28.4% → 50%)","description":"The setup package has only 28.4% test coverage. Setup commands are critical for first-time user experience.\n\nCurrent coverage: 28.4%\nTarget coverage: 50%","status":"closed","priority":2,"issue_type":"task","assignee":"beads/foxtrot","created_at":"2025-12-13T20:43:04.409346-08:00","updated_at":"2025-12-23T22:37:13.494999-08:00","closed_at":"2025-12-23T22:37:13.494999-08:00","close_reason":"Coverage improved from 21.6% to 53.8%, exceeding 50% target"} +{"id":"bd-sh4c","title":"Improve test coverage for cmd/bd/setup (28.4% → 50%)","description":"The setup package has only 28.4% test coverage. Setup commands are critical for first-time user experience.\n\nCurrent coverage: 28.4%\nTarget coverage: 50%","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/foxtrot","created_at":"2025-12-13T20:43:04.409346-08:00","updated_at":"2025-12-23T22:31:50.472109-08:00"} {"id":"bd-si4g","title":"Verify release artifacts","description":"Check GitHub releases page - binaries for darwin/linux/windows should be available","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T22:56:04.183029-08:00","updated_at":"2025-12-20T00:49:51.92894-08:00","closed_at":"2025-12-20T00:25:52.720816-08:00","dependencies":[{"issue_id":"bd-si4g","depends_on_id":"bd-6s61","type":"parent-child","created_at":"2025-12-19T22:56:15.173619-08:00","created_by":"daemon"},{"issue_id":"bd-si4g","depends_on_id":"bd-otli","type":"blocks","created_at":"2025-12-19T22:56:23.428507-08:00","created_by":"daemon"}]} {"id":"bd-siz1","title":"GH#532: bd sync circular error (suggests running bd sync)","description":"bd sync error message recommends running bd sync to fix the bd sync error. Fix error handling to provide useful guidance. See GitHub issue #532.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:04:00.543573-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-sj5y","title":"Daemon should be singleton and aggressively kill stale instances","description":"Found 2 bd daemons running (PIDs 76868, 77515) during shutdown. The daemon should:\n\n1. Be a singleton - only one instance per rig allowed\n2. On startup, check for existing daemon and kill it before starting\n3. Use a PID file or lock file to enforce this\n\nCurrently stale daemons can accumulate, causing confusion and resource waste.","notes":"**Investigation 2025-12-21:**\n\nThe singleton mechanism is already implemented and working correctly:\n\n1. **daemon.lock** uses flock (exclusive non-blocking) to prevent duplicate daemons\n2. **bd.sock.startlock** coordinates concurrent auto-starts via O_CREATE|O_EXCL\n3. **Registry** tracks all daemons globally in ~/.beads/registry.json\n\nTesting shows:\n- Trying to start a second daemon gives: 'Error: daemon already running (PID X)'\n- Multiple daemons for *different* rigs is expected/correct behavior\n\nThe original report ('Found 2 bd daemons running PIDs 76868, 77515') was likely:\n1. Two daemons for different rigs (expected), OR\n2. An edge case that's since been fixed\n\nConsider closing as RESOLVED or clarifying the original scenario.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-21T01:29:14.778949-08:00","updated_at":"2025-12-21T11:27:34.302585-08:00","closed_at":"2025-12-21T11:27:34.302585-08:00","close_reason":"Singleton mechanism already implemented and verified working. Uses flock-based daemon.lock + O_CREATE|O_EXCL startlock. Testing confirms 'daemon already running' error on duplicate start attempts."} @@ -450,7 +450,7 @@ {"id":"bd-t3cf","title":"Update CHANGELOG.md for 0.33.2","description":"In CHANGELOG.md:\n\n1. Change `## [Unreleased]` section header to `## [0.33.2] - 2025-12-21`\n2. Add new empty `## [Unreleased]` section above it\n3. Review and clean up the changes list\n\nFormat:\n```markdown\n## [Unreleased]\n\n## [0.33.2] - 2025-12-21\n\n### Added\n- ...\n\n### Changed\n- ...\n\n### Fixed\n- ...\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.7614-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"CHANGELOG already updated for 0.33.2","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-t3en","title":"Merge: bd-d28c","description":"branch: polecat/capable\ntarget: main\nsource_issue: bd-d28c\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:43:16.997802-08:00","updated_at":"2025-12-23T21:21:57.694201-08:00","closed_at":"2025-12-23T21:21:57.694201-08:00","close_reason":"stale - no code pushed"} {"id":"bd-t4sb","title":"Work on beads-d8h: Fix prefix mismatch false positive wit...","description":"Work on beads-d8h: Fix prefix mismatch false positive with multi-hyphen prefixes like 'asianops-audit-' (GH#422). When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:19.545069-08:00","updated_at":"2025-12-19T23:28:32.429127-08:00","closed_at":"2025-12-19T23:21:45.471711-08:00","close_reason":"Fixed multi-hyphen prefix false positive in ValidateIDFormat (GH#422)"} -{"id":"bd-t4u1","title":"False positive detection by Kaspersky Antivirus (Trojan)","description":"Kaspersky Antivirus falsely detects beads (bd.exe v0.23.1) as a Trojan (PDM:Trojan.Win32.Generic) and removes it.\nEvent: Malicious object detected\nComponent: System Watcher\nObject name: bd.exe\n","status":"in_progress","priority":1,"issue_type":"task","assignee":"beads/capable","created_at":"2025-11-20T18:56:12.498187-05:00","updated_at":"2025-12-23T23:40:48.294381-08:00"} +{"id":"bd-t4u1","title":"False positive detection by Kaspersky Antivirus (Trojan)","description":"Kaspersky Antivirus falsely detects beads (bd.exe v0.23.1) as a Trojan (PDM:Trojan.Win32.Generic) and removes it.\nEvent: Malicious object detected\nComponent: System Watcher\nObject name: bd.exe\n","status":"open","priority":1,"issue_type":"task","created_at":"2025-11-20T18:56:12.498187-05:00","updated_at":"2025-11-20T18:56:12.498187-05:00"} {"id":"bd-tbz3","title":"bd init UX Improvements","description":"bd init leaves users with incomplete setup, requiring manual bd doctor --fix. Issues found: (1) git hooks not installed if user declines prompt, (2) no auto-migration when CLI is upgraded, (3) stale merge driver configs from old versions. Fix by making bd init more robust with better defaults and auto-migration.","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-11-21T23:16:00.333543-08:00","updated_at":"2025-12-23T04:20:51.88847-08:00","closed_at":"2025-12-23T04:20:51.88847-08:00","close_reason":"Already implemented in commits ec4117d0 and 3a36d0b9 - hooks/merge driver install by default, doctor runs at end of init"} {"id":"bd-tggf","title":"Code Health Review Dec 2025: Technical Debt Cleanup","description":"Epic grouping technical debt identified in the Dec 16, 2025 code health review.\n\n## Overall Health Grade: B (Solid foundation, needs cleanup)\n\n### P1 (High Priority):\n- bd-74w1: Consolidate duplicate path-finding utilities\n- bd-b6xo: Remove/fix ClearDirtyIssues() race condition\n- bd-b3og: Fix TestImportBugIntegration deadlock\n\n### P2 (Medium Priority):\n- bd-05a8: Split large files (doctor.go, sync.go)\n- bd-qioh: Standardize error handling patterns\n- bd-rgyd: Split queries.go (1586 lines)\n- bd-9g1z: Fix/remove TestFindJSONLPathDefault\n\n### P3 (Low Priority):\n- bd-ork0: Add comments to 30+ ignored errors\n- bd-4nqq: Remove dead test code in info_test.go\n- bd-dhza: Reduce global state in main.go\n\n## Key Areas:\n1. Code duplication in path utilities\n2. Large monolithic files (5 files \u003e1000 lines)\n3. Global state (25+ variables, 3 deprecated)\n4. Silent error suppression (30+ instances)\n5. Test gaps and dead test code\n6. Atomicity risks in batch operations","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-16T18:18:58.115507-08:00","updated_at":"2025-12-16T18:21:50.561709-08:00","dependencies":[{"issue_id":"bd-tggf","depends_on_id":"bd-74w1","type":"blocks","created_at":"2025-12-22T21:00:21.429274-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-05a8","type":"blocks","created_at":"2025-12-22T21:00:21.501589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-9g1z","type":"blocks","created_at":"2025-12-22T21:00:21.571116-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-qioh","type":"blocks","created_at":"2025-12-22T21:00:21.640589-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-rgyd","type":"blocks","created_at":"2025-12-22T21:00:21.710912-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-4nqq","type":"blocks","created_at":"2025-12-22T21:00:21.781914-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-dhza","type":"blocks","created_at":"2025-12-22T21:00:21.852-08:00","created_by":"daemon"},{"issue_id":"bd-tggf","depends_on_id":"bd-ork0","type":"blocks","created_at":"2025-12-22T21:00:21.930168-08:00","created_by":"daemon"}]} {"id":"bd-thgk","title":"Improve test coverage for internal/compact (18.2% → 70%)","description":"Improve test coverage for internal/compact package from 17% to 70%.\n\n## Current State\n- Coverage: 17.3%\n- Files: compactor.go, git.go, haiku.go\n- Tests: compactor_test.go (minimal tests)\n\n## Functions Needing Tests\n\n### compactor.go (core compaction)\n- [ ] New - needs config validation tests\n- [ ] CompactTier1 - needs single issue compaction tests\n- [ ] CompactTier1Batch - needs batch processing tests\n- [ ] compactSingleWithResult - internal, test via public API\n\n### git.go\n- [ ] GetCurrentCommitHash - needs git repo fixture tests\n\n### haiku.go (AI summarization) - MOCK REQUIRED\n- [ ] NewHaikuClient - needs API key validation tests\n- [ ] SummarizeTier1 - needs mock API response tests\n- [ ] callWithRetry - needs retry logic tests\n- [ ] isRetryable - needs error classification tests\n- [ ] renderTier1Prompt - needs template rendering tests\n\n## Implementation Guide\n\n1. **Mock the Anthropic API:**\n ```go\n // Create mock HTTP server\n server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n json.NewEncoder(w).Encode(map[string]interface{}{\n \"content\": []map[string]string{{\"text\": \"Summarized content\"}},\n })\n }))\n defer server.Close()\n \n // Point client at mock\n client.baseURL = server.URL\n ```\n\n2. **Test scenarios:**\n - Successful compaction with AI summary\n - API failure with retry\n - Rate limit handling\n - Empty issue handling\n - Large issue truncation\n\n3. **Use test database:**\n ```go\n store, cleanup := testutil.NewTestStore(t)\n defer cleanup()\n ```\n\n## Success Criteria\n- Coverage ≥ 70%\n- AI calls properly mocked (no real API calls in tests)\n- Retry logic verified\n- Error paths covered\n\n## Run Tests\n```bash\ngo test -v -cover ./internal/compact\ngo test -race ./internal/compact\n```","status":"closed","priority":1,"issue_type":"task","assignee":"beads/Compactor","created_at":"2025-12-13T20:42:58.455767-08:00","updated_at":"2025-12-23T13:41:10.80832-08:00","closed_at":"2025-12-23T13:41:10.80832-08:00","close_reason":"Coverage improved from 17.3% to 81.8%, exceeding 70% target","dependencies":[{"issue_id":"bd-thgk","depends_on_id":"bd-iz5t","type":"parent-child","created_at":"2025-12-23T12:44:07.287377-08:00","created_by":"daemon"}]} @@ -503,7 +503,7 @@ {"id":"bd-xsl9","title":"Remove legacy autoflush code paths","description":"## Problem\n\nThe autoflush system has dual code paths - an old timer-based approach and a new FlushManager. Both are actively used based on whether flushManager is nil.\n\n## Locations\n\n- main.go:78-81: isDirty, needsFullExport, flushTimer marked 'used by legacy code'\n- autoflush.go:291-369: Functions with 'Legacy path for backward compatibility with tests'\n\n## Current Behavior\n\n```go\n// In markDirtyAndScheduleFlush():\nif flushManager != nil {\n flushManager.MarkDirty(false)\n return\n}\n// Legacy path for backward compatibility with tests\n```\n\n## Proposed Fix\n\n1. Ensure flushManager is always initialized (even in tests)\n2. Remove the legacy timer-based code paths\n3. Remove isDirty, needsFullExport, flushTimer globals\n4. Update tests to use FlushManager\n\n## Risk\n\nLow - the FlushManager is the production path. Legacy code only runs when flushManager is nil (test scenarios).","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-21T15:49:30.83769-08:00","updated_at":"2025-12-23T01:54:59.09333-08:00","closed_at":"2025-12-23T01:54:59.09333-08:00","close_reason":"Removed legacy autoflush code: isDirty, needsFullExport, flushTimer globals and flushToJSONL() wrapper. FlushManager is now the only code path."} {"id":"bd-xurv","title":"Restart daemon with 0.33.2","description":"Restart the bd daemon to pick up new version:\n\n```bash\nbd daemon --stop\nbd daemon --start\nbd daemon --health # Verify Version: 0.33.2\n```","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.760884-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Daemons running 0.33.2","deleted_at":"2025-12-21T17:29:31.791368-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task","wisp":true} {"id":"bd-y0fj","title":"Issue lifecycle hooks (on-close, on-complete)","description":"Add hooks that fire on issue state transitions, enabling automation like closing linked GitHub issues.\n\n## Problem\n\nWe have `external_ref` to link beads issues to external systems (GitHub, Linear, Jira), but no mechanism to trigger actions when issues close. Currently:\n\n```\nbd-u2sc (external_ref: gh-692) closes → nothing happens\n```\n\n## Proposed Solution\n\n### Phase 1: Shell Hooks\n\nAdd `.beads-hooks/on-close.sh` (and similar lifecycle hooks):\n\n```bash\n# .beads-hooks/on-close.sh\n# Called by bd close with issue JSON on stdin\n#\\!/bin/bash\nissue=$(cat)\nexternal_ref=$(echo \"$issue\" | jq -r '.external_ref // empty')\nif [[ \"$external_ref\" == gh-* ]]; then\n number=\"${external_ref#gh-}\"\n gh issue close \"$number\" --repo steveyegge/beads \\\n --comment \"Completed via beads epic $(echo $issue | jq -r .id)\"\nfi\n```\n\n### Lifecycle Events\n\n| Event | Trigger | Use Cases |\n|-------|---------|-----------|\n| `on-close` | Issue closed | Close external refs, notify, archive |\n| `on-complete` | Epic children all done | Roll-up completion, close parent refs |\n| `on-status-change` | Any status transition | Sync to external systems |\n\n### Phase 2: Molecule Completion Handlers\n\nMolecules could define completion actions:\n\n```yaml\nname: github-issue-tracker\non_complete:\n - action: shell\n command: gh issue close {{external_ref}} --repo {{repo}}\n - action: mail\n to: mayor/\n subject: \"Epic {{id}} completed\"\n```\n\n### Phase 3: Gas Town Integration\n\nFor full Gas Town deployments:\n- Witness observes closures via beads events\n- Routes to integration agents via mail\n- Agents handle external system interactions\n\n## Implementation Notes\n\n- Hooks should be async (don't block bd close)\n- Pass full issue JSON to hook via stdin\n- Support hook timeout and failure handling\n- Consider `--no-hooks` flag for bulk operations\n\n## Related\n\n- `external_ref` field already exists (GH#142)\n- Cross-project deps: bd-h807, bd-d9mu\n- Git hooks: .beads-hooks/ pattern established\n\n## Use Cases\n\n1. **GitHub integration**: Close GH issues when beads epic completes\n2. **Linear sync**: Update Linear status when beads status changes \n3. **Notifications**: Send mail/Slack when high-priority issues close\n4. **Audit**: Log all closures to external system","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T14:46:04.846657-08:00","updated_at":"2025-12-22T14:50:40.35447-08:00","closed_at":"2025-12-22T14:50:40.35447-08:00","close_reason":"Molecules already cover this use case. Completion actions should be encoded as tail steps in molecules rather than lifecycle hooks. This keeps everything in the beads data plane, makes it resumable/auditable, and allows tiered delegation (haiku for simple steps). Hooks would escape the ledger and add a parallel system without clear benefit."} -{"id":"bd-y2v","title":"Refactor duplicate JSONL-from-git parsing code","description":"Both readFirstIssueFromGit() in init.go and importFromGit() in autoimport.go have similar code patterns for:\n1. Running git show \u003cref\u003e:\u003cpath\u003e\n2. Scanning the output with bufio.Scanner\n3. Parsing JSON lines\n\nCould be refactored to share a helper like:\n- readJSONLFromGit(gitRef, path string) ([]byte, error)\n- Or a streaming version: streamJSONLFromGit(gitRef, path string) (io.Reader, error)\n\nFiles:\n- cmd/bd/autoimport.go:225-256 (importFromGit)\n- cmd/bd/init.go:1212-1243 (readFirstIssueFromGit)\n\nPriority is low since code duplication is minimal and both functions work correctly.","status":"closed","priority":2,"issue_type":"task","assignee":"beads/juliet","created_at":"2025-12-05T14:51:18.41124-08:00","updated_at":"2025-12-23T22:37:15.770825-08:00","closed_at":"2025-12-23T22:37:15.770825-08:00","close_reason":"Implemented readFromGitRef helper to eliminate duplicate git show code in autoimport.go and init.go"} +{"id":"bd-y2v","title":"Refactor duplicate JSONL-from-git parsing code","description":"Both readFirstIssueFromGit() in init.go and importFromGit() in autoimport.go have similar code patterns for:\n1. Running git show \u003cref\u003e:\u003cpath\u003e\n2. Scanning the output with bufio.Scanner\n3. Parsing JSON lines\n\nCould be refactored to share a helper like:\n- readJSONLFromGit(gitRef, path string) ([]byte, error)\n- Or a streaming version: streamJSONLFromGit(gitRef, path string) (io.Reader, error)\n\nFiles:\n- cmd/bd/autoimport.go:225-256 (importFromGit)\n- cmd/bd/init.go:1212-1243 (readFirstIssueFromGit)\n\nPriority is low since code duplication is minimal and both functions work correctly.","status":"in_progress","priority":2,"issue_type":"task","assignee":"beads/juliet","created_at":"2025-12-05T14:51:18.41124-08:00","updated_at":"2025-12-23T22:29:35.786445-08:00"} {"id":"bd-y4vz","title":"Work on beads-eub: Consolidated context tool for MCP serv...","description":"Work on beads-eub: Consolidated context tool for MCP server (GH#636). Merge set_context, where_am_i, init into single 'context' tool. When done, submit MR (not PR) to integration branch for Refinery.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-19T22:56:58.527144-08:00","updated_at":"2025-12-20T00:49:51.929597-08:00","closed_at":"2025-12-19T23:31:11.906952-08:00","close_reason":"Completed: Consolidated set_context, where_am_i, init into unified context tool"} {"id":"bd-y7j8","title":"Update info.go versionChanges","description":"Add entry to versionChanges in cmd/bd/info.go with agent-actionable changes for test-squash","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T13:52:33.066625-08:00","updated_at":"2025-12-21T13:53:49.554496-08:00","deleted_at":"2025-12-21T13:53:49.554496-08:00","deleted_by":"stevey","delete_reason":"manual delete","original_type":"task","wisp":true} {"id":"bd-y8bj","title":"Auto-detect identity from directory context for bd mail","description":"Currently bd mail inbox defaults to git user name, requiring --identity flag with exact format.\n\n## Problem\n- Mail sent to `gastown/crew/max`\n- Max runs `bd mail inbox` → defaults to 'Steve Yegge' (git user)\n- Max must know to use `--identity 'gastown/crew/max'` with exact slashes\n\n## Proposed Fix\nAuto-detect identity from directory context when in a Gas Town workspace:\n- In `/Users/stevey/gt/gastown/crew/max`, infer identity = `gastown/crew/max`\n- Pattern: `\u003ctown\u003e/\u003crig\u003e/\u003crole\u003e/\u003cname\u003e` → `\u003crig\u003e/\u003crole\u003e/\u003cname\u003e`\n\n## Additional Improvements\n1. Support GT_IDENTITY env var (set by gt crew at / session spawning)\n2. Support identity in .beads/config.yaml\n3. Normalize format: accept both slashes and dashes as equivalent\n\n## Context\nDiscovered during crew-to-crew work assignment. Max couldn't see mail despite correct nudge because identity defaulted wrong.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T17:22:53.938586-08:00","updated_at":"2025-12-20T18:12:58.472262-08:00","closed_at":"2025-12-20T17:58:51.034201-08:00"}