diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 153fc69c..38361fb2 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -178,7 +178,7 @@ {"id":"bd-7xrg","title":"Refinery Patrol","description":"Merge queue processor patrol loop with verification gates.","status":"open","priority":2,"issue_type":"molecule","created_at":"2025-12-27T18:14:31.190713-08:00","updated_at":"2025-12-27T18:14:31.190713-08:00"} {"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":"tombstone","priority":1,"issue_type":"bug","created_at":"2025-11-21T19:51:55.747608-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"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":"closed","priority":1,"issue_type":"task","created_at":"2025-12-18T07:00:34.867680882-07:00","updated_at":"2025-12-23T23:48:50.087306-08:00","closed_at":"2025-12-23T23:48:50.087306-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-7zka","title":"Implement formula features: repeat, for_each, branch, gate, compose.split","description":"Multiple formula features in internal/formula/types.go are marked as \"Not yet implemented\":\n\nIMPLEMENTED (TODOs removed):\n- Step.Expand: Inline expansion - implemented in ApplyInlineExpansions (expand.go)\n- Step.ExpandVars: Variable overrides for expansion - implemented alongside Expand\n\nSTILL NOT IMPLEMENTED (TODOs remain):\n- Step.Condition: Make step optional based on variable (types.go:177-180)\n- Step.Gate: Async wait condition for step (types.go:185-187)\n- Gate struct: Schema defined but not processed in bd cook (types.go:209-210)\n\nFile: internal/formula/types.go","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2025-12-30T00:35:12.769129-08:00"} +{"id":"bd-7zka","title":"Implement formula features: repeat, for_each, branch, gate, compose.split","description":"Multiple formula features in internal/formula/types.go are marked as \"Not yet implemented\":\n\nIMPLEMENTED (TODOs removed):\n- Step.Expand: Inline expansion - implemented in ApplyInlineExpansions (expand.go)\n- Step.ExpandVars: Variable overrides for expansion - implemented alongside Expand\n\nSTILL NOT IMPLEMENTED (TODOs remain):\n- Step.Condition: Make step optional based on variable (types.go:177-180)\n- Step.Gate: Async wait condition for step (types.go:185-187)\n- Gate struct: Schema defined but not processed in bd cook (types.go:209-210)\n\nFile: internal/formula/types.go","status":"hooked","priority":3,"issue_type":"feature","assignee":"beads/polecats/quartz","created_at":"2025-12-28T16:32:54.493002-08:00","created_by":"stevey","updated_at":"2025-12-30T06:50:49.143351-08:00"} {"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"} {"id":"bd-83f5","title":"Remove top-level comment alias","description":"Remove 'comment' as top-level command. Users should use 'comments add' instead. Reduces command surface area.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-28T12:59:12.33579-08:00","created_by":"stevey","updated_at":"2025-12-28T13:06:53.335122-08:00","closed_at":"2025-12-28T13:06:53.335122-08:00"} {"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":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-28T16:20:02.432202-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} @@ -219,7 +219,7 @@ {"id":"bd-abjw","title":"Consider consolidating config.yaml parsing into shared utility","description":"Multiple places parse config.yaml with custom structs:\n\n1. **autoimport.go:148** - `localConfig{SyncBranch}`\n2. **main.go:310** - strings.Contains for no-db (fragile, see bd-r6k2)\n3. **doctor.go:863** - strings.Contains for no-db (fragile, see bd-r6k2)\n4. **internal/config/config.go** - Uses viper (but caches at startup, problematic for tests)\n\nConsider creating a shared utility in `internal/configfile/` or extending the viper config:\n\n```go\n// internal/configfile/yaml.go\ntype YAMLConfig struct {\n SyncBranch string `yaml:\"sync-branch\"`\n NoDb bool `yaml:\"no-db\"`\n IssuePrefix string `yaml:\"issue-prefix\"`\n Author string `yaml:\"author\"`\n}\n\nfunc LoadYAML(beadsDir string) (*YAMLConfig, error) {\n // Parse config.yaml with proper YAML library\n}\n```\n\nBenefits:\n- Single source of truth for config.yaml structure\n- Proper YAML parsing everywhere\n- Easier to add new config fields\n\nTrade-off: May add complexity for simple one-off reads.","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-07T02:03:26.067311-08:00","updated_at":"2025-12-07T02:03:26.067311-08:00"} {"id":"bd-adoe","title":"Add --hard flag to bd cleanup to permanently cull tombstones before cutoff date","description":"Currently tombstones persist for 30 days before cleanup prunes them. Need an official way to force-cull tombstones earlier than the default TTL, for scenarios like cleaning house after extended absence where resurrection from old clones is not a concern. Proposed: bd cleanup --hard --older-than N to bypass the 30-day tombstone TTL.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:17:31.064914-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":"feature"} {"id":"bd-aec5439f","title":"Update LINTING.md with current baseline","description":"After cleanup, document the remaining acceptable baseline in LINTING.md so we can track regression.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-10-27T18:53:10.38679-07:00","updated_at":"2025-12-25T01:21:01.952723-08:00","deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} -{"id":"bd-ag35","title":"Add daemon RPC endpoints for config and stale check","description":"Two TODOs request daemon RPC endpoints:\n\n1. cmd/bd/create.go:208 - Add RPC method to get config in daemon mode\n2. cmd/bd/mol_stale.go:67 - Add RPC endpoint for stale check\n\nThese would allow the CLI to query the daemon for configuration and staleness checks instead of reading directly.\n\nFiles:\n- cmd/bd/create.go:208\n- cmd/bd/mol_stale.go:67","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-28T16:32:38.113203-08:00","created_by":"stevey","updated_at":"2025-12-28T16:32:38.113203-08:00"} +{"id":"bd-ag35","title":"Add daemon RPC endpoints for config and stale check","description":"Two TODOs request daemon RPC endpoints:\n\n1. cmd/bd/create.go:208 - Add RPC method to get config in daemon mode\n2. cmd/bd/mol_stale.go:67 - Add RPC endpoint for stale check\n\nThese would allow the CLI to query the daemon for configuration and staleness checks instead of reading directly.\n\nFiles:\n- cmd/bd/create.go:208\n- cmd/bd/mol_stale.go:67","status":"hooked","priority":3,"issue_type":"feature","assignee":"beads/polecats/obsidian","created_at":"2025-12-28T16:32:38.113203-08:00","created_by":"stevey","updated_at":"2025-12-30T06:50:45.505886-08:00"} {"id":"bd-agye","title":"Merge: quartz-1767083470444","description":"branch: polecat/quartz-1767083470444\ntarget: main\nsource_issue: quartz-1767083470444\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-30T00:36:39.737365-08:00","created_by":"beads/polecats/quartz","updated_at":"2025-12-30T00:54:59.2694-08:00","closed_at":"2025-12-30T00:54:59.2694-08:00","close_reason":"Branch polecat/quartz-1767083470444 no longer exists on remote"} {"id":"bd-ahot","title":"HANDOFF: Molecule bonding - spawn done, bond next","description":"## Context\n\nContinuing work on bd-o5xe (Molecule bonding epic).\n\n## Completed This Session\n\n- bd-mh4w: Renamed bond to spawn in mol.go\n- bd-rnnr: Added BondRef data model to types.go\n\n## Now Unblocked\n\n1. bd-o91r: Polymorphic bond command [P1]\n2. bd-iw4z: Compound visualization [P2] \n3. bd-iq19: Distill command [P2]\n\n## Key Files\n\n- cmd/bd/mol.go\n- internal/types/types.go\n\n## Next Step\n\nStart with bd-o91r. Run bd show bd-o5xe for context.","status":"closed","priority":1,"issue_type":"message","created_at":"2025-12-21T01:32:13.940757-08:00","updated_at":"2025-12-21T11:24:30.171048-08:00","closed_at":"2025-12-21T11:24:30.171048-08:00"} {"id":"bd-air9","title":"bd create --parent allocates colliding child IDs when child_counters not backfilled","description":"GH#728: When explicit child IDs are created (--id bd-test.1) or imported from JSONL, child_counters table isn't updated. Then --parent auto-allocation starts at 1 and collides.\n\nFix approach: Update child_counters when creating issues with explicit hierarchical IDs that match \u003cparent\u003e.\u003cn\u003e pattern.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-24T14:27:11.990171-08:00","updated_at":"2025-12-24T14:28:40.154864-08:00","closed_at":"2025-12-24T14:28:40.154864-08:00"} @@ -385,8 +385,8 @@ {"id":"bd-hj0s","title":"Add 'convoy' issue type with reactive completion","description":"Add convoy as a new issue type with reactive completion semantics.\n\nBehavior:\n- Convoy has list of tracked issues (via 'tracks' relation)\n- When all tracked issues close (including wontfix), convoy auto-closes\n- Supports cross-prefix tracking (convoy in hq-* tracks gt-*, bd-*)\n\nImplementation:\n- New type: convoy\n- Reactive completion trigger on tracked issue closure\n- Query support: 'bd list --type=convoy'\n\nRelated: hq-7h8jx (Convoy System epic in town beads)","status":"closed","priority":1,"issue_type":"task","assignee":"beads/crew/dave","created_at":"2025-12-29T18:47:02.011011-08:00","created_by":"mayor","updated_at":"2025-12-30T00:05:13.515078-08:00","closed_at":"2025-12-30T00:05:13.515078-08:00","close_reason":"Implemented convoy type with reactive completion","dependencies":[{"issue_id":"bd-hj0s","depends_on_id":"bd-3roq","type":"blocks","created_at":"2025-12-29T18:47:10.59211-08:00","created_by":"daemon"}]} {"id":"bd-hkr6","title":"GH#518: Document bd setup command","description":"bd setup is undiscoverable. Add to README/docs. Currently only findable by grepping source. See GitHub issue #518.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:03:54.664668-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-hlsw","title":"Add sync resilience guardrails for forced pushes and prefix mismatches","description":"Beads can get into unrecoverable sync states when remote forces pushes occur (e.g., rebases) combined with prefix mismatches from multi-worker scenarios. Add detection, prevention, and auto-recovery features to handle this gracefully.","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-14T10:40:14.872875259-07:00","updated_at":"2025-12-14T10:40:14.872875259-07:00"} -{"id":"bd-hlsw.3","title":"Auto-recovery mode (bd sync --auto-recover)","description":"Add bd sync --auto-recover flag that: detects problematic sync state, backs up .beads/issues.db with timestamp, rebuilds DB from JSONL atomically, verifies consistency, reports what was fixed. Provides safety valve when sync integrity fails.","status":"open","priority":3,"issue_type":"task","assignee":"beads/polecats/opal","created_at":"2025-12-14T10:40:20.599836875-07:00","updated_at":"2025-12-30T00:42:12.768964-08:00","dependencies":[{"issue_id":"bd-hlsw.3","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.600435888-07:00","created_by":"daemon"}]} -{"id":"bd-hlsw.4","title":"Sync branch integrity guards","description":"Track sync branch parent commit. If sync branch was force-pushed, warn user and require confirmation before proceeding. Add option to reset to remote if user accepts rebase. Prevents silent corruption from forced pushes.","status":"open","priority":3,"issue_type":"task","assignee":"beads/polecats/onyx","created_at":"2025-12-14T10:40:20.645402352-07:00","updated_at":"2025-12-30T00:42:12.790866-08:00","dependencies":[{"issue_id":"bd-hlsw.4","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.646425761-07:00","created_by":"daemon"}]} +{"id":"bd-hlsw.3","title":"Auto-recovery mode (bd sync --auto-recover)","description":"Add bd sync --auto-recover flag that: detects problematic sync state, backs up .beads/issues.db with timestamp, rebuilds DB from JSONL atomically, verifies consistency, reports what was fixed. Provides safety valve when sync integrity fails.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/opal","created_at":"2025-12-14T10:40:20.599836875-07:00","updated_at":"2025-12-30T06:51:07.918872-08:00","dependencies":[{"issue_id":"bd-hlsw.3","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.600435888-07:00","created_by":"daemon"}]} +{"id":"bd-hlsw.4","title":"Sync branch integrity guards","description":"Track sync branch parent commit. If sync branch was force-pushed, warn user and require confirmation before proceeding. Add option to reset to remote if user accepts rebase. Prevents silent corruption from forced pushes.","status":"hooked","priority":3,"issue_type":"task","assignee":"beads/polecats/topaz","created_at":"2025-12-14T10:40:20.645402352-07:00","updated_at":"2025-12-30T06:51:11.328392-08:00","dependencies":[{"issue_id":"bd-hlsw.4","depends_on_id":"bd-hlsw","type":"parent-child","created_at":"2025-12-14T10:40:20.646425761-07:00","created_by":"daemon"}]} {"id":"bd-hlyr","title":"Merge: bd-m8ro","description":"branch: polecat/max\ntarget: main\nsource_issue: bd-m8ro\nrig: beads","status":"closed","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T20:45:40.218445-08:00","updated_at":"2025-12-23T21:21:57.69886-08:00","closed_at":"2025-12-23T21:21:57.69886-08:00"} {"id":"bd-hnkg","title":"GH#540: Add silent quick-capture mode (bd q)","description":"Add bd q alias for quick capture that outputs only issue ID. Useful for piping/scripting. See GitHub issue #540.","status":"tombstone","priority":2,"issue_type":"feature","created_at":"2025-12-16T01:03:38.260135-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":"feature"} {"id":"bd-hobo","title":"Distinct prefixes for protos, molecules, wisps","description":"Template/workflow entities should have visually distinct prefixes from regular issues.\n\n**Problem:**\n- Protos (bd-7bs4) look like regular issues - invites squashing\n- Molecules (poured instances) also use bd- prefix\n- Wisps are in separate DB but still use bd- when referenced\n\n**Proposed Prefixes:**\n- `proto-` for templates (e.g., proto-release, proto-review)\n- `mol-` for active molecules (poured from protos)\n- `wisp-` for ephemeral wisps (vapor phase)\n\n**Benefits:**\n- Instant visual recognition of entity type\n- Prevents accidental modification of templates\n- Clear lifecycle: proto → mol → wisp → digest\n\n**Implementation options:**\n1. Separate databases with different prefixes\n2. Issue type determines prefix generation\n3. Naming convention enforced by bd pour/wisp commands","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-24T16:45:24.940809-08:00","updated_at":"2025-12-25T02:04:52.459233-08:00","closed_at":"2025-12-25T02:04:52.459233-08:00","labels":["workflow"]} @@ -791,7 +791,7 @@ {"id":"bd-xo1o.2","title":"WaitsFor directive: Fanout gate for dynamic children","description":"Implement WaitsFor directive for molecules that spawn dynamic children.\n\n## Syntax\n```markdown\n## Step: aggregate\nCollect outcomes from all dynamically-bonded children.\nWaitsFor: all-children\nNeeds: survey-workers\n```\n\n## Behavior\n1. Parse WaitsFor directive during molecule step parsing\n2. Track which steps spawn dynamic children (the spawner)\n3. Gate step waits until ALL children of the spawner complete\n4. Works with bd ready - gate step not ready until children done\n\n## Gate Types\n- `WaitsFor: all-children` - Wait for all dynamic children\n- `WaitsFor: any-children` - Proceed when first child completes (future)\n- `WaitsFor: \u003cstep-ref\u003e.children` - Wait for specific spawner's children\n\n## Integration\n- bd ready should skip gate steps until children complete\n- bd show \u003cmol\u003e should display gate status and child count","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T02:33:14.946475-08:00","updated_at":"2025-12-23T04:00:09.443106-08:00","closed_at":"2025-12-23T04:00:09.443106-08:00","dependencies":[{"issue_id":"bd-xo1o.2","depends_on_id":"bd-xo1o","type":"parent-child","created_at":"2025-12-23T02:33:14.950008-08:00","created_by":"daemon"}]} {"id":"bd-xo1o.3","title":"bd activity: Real-time molecule state feed","description":"Implement activity feed command for watching molecule state transitions.\n\n## Commands\n```bash\nbd activity --follow # Real-time streaming\nbd activity --mol \u003cid\u003e # Activity for specific molecule\nbd activity --since 5m # Last 5 minutes\nbd activity --type step # Only step transitions\n```\n\n## Output Format\n```\n[14:32:01] ✓ patrol-x7k.inbox-check completed\n[14:32:03] ✓ patrol-x7k.check-refinery completed\n[14:32:08] + patrol-x7k.arm-ace bonded (5 steps)\n[14:32:09] → patrol-x7k.arm-ace.capture in_progress\n[14:32:10] ✓ patrol-x7k.arm-ace.capture completed\n[14:32:14] ✓ patrol-x7k.arm-ace.decide completed (action: nudge-1)\n[14:32:17] ✓ patrol-x7k.arm-ace COMPLETE\n[14:32:23] ✓ patrol-x7k SQUASHED → digest-x7k\n```\n\n## Event Types\n- `+` bonded - New molecule/step created\n- `→` in_progress - Step started\n- `✓` completed - Step/molecule finished\n- `✗` failed - Step failed\n- `⊘` burned - Wisp discarded\n- `◉` squashed - Wisp condensed to digest\n\n## Implementation\n- Could use SQLite triggers or polling\n- --follow uses OS file watching or polling\n- Filter by mol ID, type, time range","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T02:33:16.298764-08:00","updated_at":"2025-12-23T03:18:33.434079-08:00","closed_at":"2025-12-23T03:18:33.434079-08:00","dependencies":[{"issue_id":"bd-xo1o.3","depends_on_id":"bd-xo1o","type":"parent-child","created_at":"2025-12-23T02:33:16.301522-08:00","created_by":"daemon"}]} {"id":"bd-xo1o.4","title":"Parallel step detection in molecules","description":"Detect and flag parallelizable steps in molecules.\n\n## Detection Rules\nSteps can run in parallel when:\n1. No Needs dependencies between them\n2. Not in same sequential chain\n3. Across dynamic arms (arm-ace and arm-nux can parallelize)\n\n## Output in bd mol show\n```\npatrol-x7k (mol-witness-patrol)\n├── inbox-check [completed]\n├── survey-workers [completed]\n│ ├── arm-ace [parallel group A]\n│ │ ├── capture [can parallelize]\n│ │ ├── assess [needs: capture]\n│ │ └── execute [needs: assess]\n│ └── arm-nux [parallel group A]\n│ ├── capture [can parallelize]\n│ └── ...\n├── aggregate [gate: waits for all-children]\n```\n\n## Flags\n- `bd mol show \u003cid\u003e --parallel` - Highlight parallel opportunities\n- `bd ready --mol \u003cid\u003e` - List all steps that can run now\n\n## Future: Parallel Execution Hints\nFor agents using Task tool subagents:\n- Identify independent arms that can run simultaneously\n- Suggest parallelization strategy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T02:33:17.660368-08:00","updated_at":"2025-12-23T03:56:39.653982-08:00","closed_at":"2025-12-23T03:56:39.653982-08:00","dependencies":[{"issue_id":"bd-xo1o.4","depends_on_id":"bd-xo1o","type":"parent-child","created_at":"2025-12-23T02:33:17.662232-08:00","created_by":"daemon"}]} -{"id":"bd-xrwy","title":"Auto-detect non-TTY and adjust output","description":"Detect when stdout is not a TTY (piped, redirected, or agent context) and adjust output:\n\n- Disable ANSI colors\n- Disable pager\n- Disable emoji decorations\n- Use plain text format\n\nUses golang.org/x/term or similar for TTY detection.\n\nNeeds pager support to be meaningful (otherwise nothing to disable).","notes":"## Implementation Plan\n\n### Dependencies\n```go\nimport \"golang.org/x/term\"\n// or: github.com/mattn/go-isatty\n```\n\n### Code Changes\n\n1. **Add TTY detection helper** (internal/ui/terminal.go):\n```go\nfunc IsTerminal() bool {\n return term.IsTerminal(int(os.Stdout.Fd()))\n}\n\nfunc ShouldUseColor() bool {\n // Respect NO_COLOR standard\n if os.Getenv(\"NO_COLOR\") \\!= \"\" {\n return false\n }\n // Respect CLICOLOR=0\n if os.Getenv(\"CLICOLOR\") == \"0\" {\n return false\n }\n // Force color with CLICOLOR_FORCE\n if os.Getenv(\"CLICOLOR_FORCE\") \\!= \"\" {\n return true\n }\n return IsTerminal()\n}\n```\n\n2. **Apply in lipgloss setup** (internal/ui/styles.go):\n```go\nfunc init() {\n if \\!ShouldUseColor() {\n lipgloss.SetColorProfile(termenv.Ascii)\n }\n}\n```\n\n3. **Disable pager for non-TTY** (uses bd-jdz3 infrastructure):\n```go\n// In pager.go ToPager():\nif \\!IsTerminal() {\n fmt.Print(content)\n return nil\n}\n```\n\n### Standards Followed\n- NO_COLOR: https://no-color.org/\n- CLICOLOR/CLICOLOR_FORCE: de facto BSD standard\n- gh cli uses same conventions\n\n### Testing\n- `bd list | cat` outputs no ANSI codes\n- `NO_COLOR=1 bd list` outputs no colors\n- `CLICOLOR_FORCE=1 bd list | cat` keeps colors\n- Verify emoji handling in non-TTY mode","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-29T15:25:10.112313-08:00","created_by":"stevey","updated_at":"2025-12-29T15:26:50.288486-08:00","dependencies":[{"issue_id":"bd-xrwy","depends_on_id":"bd-jdz3","type":"blocks","created_at":"2025-12-29T15:25:22.084746-08:00","created_by":"daemon"}]} +{"id":"bd-xrwy","title":"Auto-detect non-TTY and adjust output","description":"Detect when stdout is not a TTY (piped, redirected, or agent context) and adjust output:\n\n- Disable ANSI colors\n- Disable pager\n- Disable emoji decorations\n- Use plain text format\n\nUses golang.org/x/term or similar for TTY detection.\n\nNeeds pager support to be meaningful (otherwise nothing to disable).","notes":"## Implementation Plan\n\n### Dependencies\n```go\nimport \"golang.org/x/term\"\n// or: github.com/mattn/go-isatty\n```\n\n### Code Changes\n\n1. **Add TTY detection helper** (internal/ui/terminal.go):\n```go\nfunc IsTerminal() bool {\n return term.IsTerminal(int(os.Stdout.Fd()))\n}\n\nfunc ShouldUseColor() bool {\n // Respect NO_COLOR standard\n if os.Getenv(\"NO_COLOR\") \\!= \"\" {\n return false\n }\n // Respect CLICOLOR=0\n if os.Getenv(\"CLICOLOR\") == \"0\" {\n return false\n }\n // Force color with CLICOLOR_FORCE\n if os.Getenv(\"CLICOLOR_FORCE\") \\!= \"\" {\n return true\n }\n return IsTerminal()\n}\n```\n\n2. **Apply in lipgloss setup** (internal/ui/styles.go):\n```go\nfunc init() {\n if \\!ShouldUseColor() {\n lipgloss.SetColorProfile(termenv.Ascii)\n }\n}\n```\n\n3. **Disable pager for non-TTY** (uses bd-jdz3 infrastructure):\n```go\n// In pager.go ToPager():\nif \\!IsTerminal() {\n fmt.Print(content)\n return nil\n}\n```\n\n### Standards Followed\n- NO_COLOR: https://no-color.org/\n- CLICOLOR/CLICOLOR_FORCE: de facto BSD standard\n- gh cli uses same conventions\n\n### Testing\n- `bd list | cat` outputs no ANSI codes\n- `NO_COLOR=1 bd list` outputs no colors\n- `CLICOLOR_FORCE=1 bd list | cat` keeps colors\n- Verify emoji handling in non-TTY mode","status":"in_progress","priority":3,"issue_type":"feature","assignee":"beads/polecats/onyx","created_at":"2025-12-29T15:25:10.112313-08:00","created_by":"stevey","updated_at":"2025-12-30T06:53:28.197853-08:00","dependencies":[{"issue_id":"bd-xrwy","depends_on_id":"bd-jdz3","type":"blocks","created_at":"2025-12-29T15:25:22.084746-08:00","created_by":"daemon"}]} {"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"} {"id":"bd-xtf5","title":"Code smell: Multiple CLI command files exceed 1000 lines","description":"Several CLI command files are very large and could benefit from splitting:\n\n| File | Lines | Notes |\n|------|-------|-------|\n| init.go | 1928 | Multiple init modes, contributor/team setup |\n| show.go | 1592 | Display formatting, tree views, output modes |\n| doctor.go | 1295 | Many health checks |\n| sync.go | 1201 | Sync branch operations |\n| compact.go | 1199 | Compaction logic |\n| linear.go | 1190 | Linear integration |\n| main.go | 1148 | Entry point and globals |\n\nConsider:\n1. Splitting init.go into init_core.go, init_contributor.go (already exists), init_team.go (already exists)\n2. Moving show.go formatters to internal/ui package\n3. Doctor checks could be individual files under doctor/ subpackage (already started)\n\nLocation: cmd/bd/*.go","status":"closed","priority":4,"issue_type":"chore","created_at":"2025-12-28T15:32:23.233091-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-28T18:05:09.921186-08:00","closed_at":"2025-12-28T18:05:09.921186-08:00","dependencies":[{"issue_id":"bd-xtf5","depends_on_id":"bd-784c","type":"parent-child","created_at":"2025-12-28T15:38:04.278433-08:00","created_by":"daemon"}],"comments":[{"id":7,"issue_id":"bd-xtf5","author":"stevey","text":"Completed init.go refactoring:\n\n- Split from 1928 → 705 lines (under 800 target)\n- Extracted 4 new files:\n - init_git_hooks.go (~480 lines): Git hooks and merge driver\n - init_stealth.go (~310 lines): Stealth mode, fork detection\n - init_agent.go (~170 lines): AGENTS.md and Claude settings\n - init_templates.go (~180 lines): config.yaml and README templates\n\nRemaining files still over 800 lines:\n- show.go (1592)\n- doctor.go (1295)\n- sync.go (1201)\n- compact.go (1199)\n- linear.go (1190)\n- main.go (1148)\n- list.go (1052)\n- template.go (1051)\n- gate.go (1048)\n\nCommit: c5f03b7b","created_at":"2025-12-29T01:27:43Z"}]} {"id":"bd-xtl9","title":"Test Second Parent","status":"tombstone","priority":2,"issue_type":"epic","created_at":"2025-12-27T22:16:14.971605-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-27T22:16:35.925357-08:00","deleted_at":"2025-12-27T22:16:35.925357-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"epic"} @@ -809,7 +809,7 @@ {"id":"bd-ykqu","title":"Add gate timeout tracking and notification","description":"Implement timeout and notification logic for gates.\n\n## Timeout Behavior\n1. Gate created with timeout (e.g., 30m)\n2. Deacon tracks elapsed time during patrol\n3. If timeout reached:\n - Notify all waiters: \"Gate timed out\"\n - Close gate with timeout reason\n - Waiter can retry, escalate, or fail gracefully\n\n## Notification\n- Use gt mail send to notify waiters\n- Include gate ID, await type, and reason in message\n- Support multiple waiters notification\n\n## Escalation Path\n- Witness sees stuck worker, nudges them\n- Worker can escalate to human if needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T11:44:40.1825-08:00","updated_at":"2025-12-23T12:19:44.362527-08:00","closed_at":"2025-12-23T12:19:44.362527-08:00","dependencies":[{"issue_id":"bd-ykqu","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:53.072862-08:00","created_by":"daemon"},{"issue_id":"bd-ykqu","depends_on_id":"bd-is6m","type":"blocks","created_at":"2025-12-23T11:44:56.595085-08:00","created_by":"daemon"}]} {"id":"bd-ymqn","title":"Code review: bd mol bond --ref and bd activity (bd-xo1o work)","description":"Review dave's recent commits for bd-xo1o (Dynamic Molecule Bonding):\n\n## Commits to Review\n- ee04b1ea: feat: add dynamic molecule bonding with --ref flag (bd-xo1o.1)\n- be520d90: feat: add bd activity command for real-time state feed (bd-xo1o.3)\n\n## Review Focus\n1. Code quality and correctness\n2. Error handling\n3. Edge cases\n4. Test coverage\n5. Documentation\n\n## Deliverables\n- File beads for any issues found\n- Note any concerns or suggestions\n- Verify the implementation matches the bd-xo1o epic requirements","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T03:47:55.217363-08:00","updated_at":"2025-12-23T04:11:00.226326-08:00","closed_at":"2025-12-23T04:11:00.226326-08:00"} {"id":"bd-yqhh","title":"bd list --parent: filter by parent issue","description":"Add --parent flag to bd list to filter issues by parent.\n\nExample:\n```bash\nbd list --parent=gt-h5n --status=open\n```\n\nWould show all open children of gt-h5n.\n\nUseful for:\n- Checking epic progress\n- Finding swarmable work within an epic\n- Molecule step listing","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T01:51:26.830952-08:00","updated_at":"2025-12-23T02:10:12.909803-08:00","closed_at":"2025-12-23T02:10:12.909803-08:00"} -{"id":"bd-yuxq","title":"Code smell: 262 uses of interface{} reduce type safety","description":"Heavy use of interface{} across 92 files (262 occurrences) in:\n- RPC update arguments: updatesFromArgs() returns map[string]interface{}\n- JSON unmarshaling and formatting\n- Storage query helpers\n\n**Example in internal/rpc/server_issues_epics.go:45:**\n```go\nfunc updatesFromArgs(a UpdateArgs) map[string]interface{} {\n // Returns map with interface{} values - types must be asserted at use sites\n}\n```\n\n**Problem:**\n- Loss of type safety\n- Runtime type assertions required\n- Harder to catch errors at compile time\n\n**Acceptance Criteria:**\n- [ ] Define typed update structs for specific field groups\n- [ ] Use generics where possible (Go 1.18+)\n- [ ] Reduce interface{} count by at least 50%\n- [ ] Document expected types where interface{} remains necessary\n- [ ] Tests pass","status":"open","priority":3,"issue_type":"chore","created_at":"2025-12-28T19:00:01.896147-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T00:42:12.539958-08:00","dependencies":[{"issue_id":"bd-yuxq","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.812412-08:00","created_by":"daemon"}]} +{"id":"bd-yuxq","title":"Code smell: 262 uses of interface{} reduce type safety","description":"Heavy use of interface{} across 92 files (262 occurrences) in:\n- RPC update arguments: updatesFromArgs() returns map[string]interface{}\n- JSON unmarshaling and formatting\n- Storage query helpers\n\n**Example in internal/rpc/server_issues_epics.go:45:**\n```go\nfunc updatesFromArgs(a UpdateArgs) map[string]interface{} {\n // Returns map with interface{} values - types must be asserted at use sites\n}\n```\n\n**Problem:**\n- Loss of type safety\n- Runtime type assertions required\n- Harder to catch errors at compile time\n\n**Acceptance Criteria:**\n- [ ] Define typed update structs for specific field groups\n- [ ] Use generics where possible (Go 1.18+)\n- [ ] Reduce interface{} count by at least 50%\n- [ ] Document expected types where interface{} remains necessary\n- [ ] Tests pass","status":"in_progress","priority":3,"issue_type":"chore","assignee":"beads/polecats/jasper","created_at":"2025-12-28T19:00:01.896147-08:00","created_by":"beads/crew/dave","updated_at":"2025-12-30T06:53:09.142097-08:00","dependencies":[{"issue_id":"bd-yuxq","depends_on_id":"bd-ox1o","type":"blocks","created_at":"2025-12-28T19:00:23.812412-08:00","created_by":"daemon"}]} {"id":"bd-yx22","title":"Merge: bd-d28c","description":"branch: polecat/testcat\ntarget: main\nsource_issue: bd-d28c\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T21:33:15.490412-08:00","updated_at":"2025-12-23T21:36:38.584933-08:00","closed_at":"2025-12-23T21:36:38.584933-08:00"} {"id":"bd-yy1h","title":"Witness Patrol","description":"Per-rig worker monitor patrol loop with progressive nudging.","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-26T13:08:21.271692-08:00","updated_at":"2025-12-27T00:10:54.178645-08:00","deleted_at":"2025-12-27T00:10:54.178645-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} {"id":"bd-z3rf","title":"dave Handoff","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-23T04:33:42.874554-08:00","updated_at":"2025-12-29T12:41:09.335754-08:00","deleted_at":"2025-12-29T12:41:09.335754-08:00","deleted_by":"daemon","delete_reason":"orphaned handoff stubs from crash","original_type":"task"} diff --git a/cmd/bd/main.go b/cmd/bd/main.go index be7d3257..b4f9c371 100644 --- a/cmd/bd/main.go +++ b/cmd/bd/main.go @@ -522,6 +522,7 @@ var rootCmd = &cobra.Command{ } health, healthErr = client.Health() if healthErr == nil && health.Status == statusHealthy { + client.SetActor(actor) daemonClient = client daemonStatus.Mode = cmdDaemon daemonStatus.Connected = true @@ -539,6 +540,7 @@ var rootCmd = &cobra.Command{ health.Version, Version) } else { // Daemon is healthy and compatible - use it + client.SetActor(actor) daemonClient = client daemonStatus.Mode = cmdDaemon daemonStatus.Connected = true @@ -589,6 +591,7 @@ var rootCmd = &cobra.Command{ // Check health of auto-started daemon health, healthErr := client.Health() if healthErr == nil && health.Status == statusHealthy { + client.SetActor(actor) daemonClient = client daemonStatus.Mode = cmdDaemon daemonStatus.Connected = true diff --git a/internal/rpc/client.go b/internal/rpc/client.go index 8ec12150..5d9330bc 100644 --- a/internal/rpc/client.go +++ b/internal/rpc/client.go @@ -37,6 +37,7 @@ type Client struct { socketPath string timeout time.Duration dbPath string // Expected database path for validation + actor string // Actor for audit trail (who is performing operations) } // TryConnect attempts to connect to the daemon socket @@ -157,6 +158,11 @@ func (c *Client) SetDatabasePath(dbPath string) { c.dbPath = dbPath } +// SetActor sets the actor for audit trail (who is performing operations) +func (c *Client) SetActor(actor string) { + c.actor = actor +} + // Execute sends an RPC request and waits for a response func (c *Client) Execute(operation string, args interface{}) (*Response, error) { return c.ExecuteWithCwd(operation, args, "") @@ -177,6 +183,7 @@ func (c *Client) ExecuteWithCwd(operation string, args interface{}, cwd string) req := Request{ Operation: operation, Args: argsJSON, + Actor: c.actor, // Who is performing this operation ClientVersion: ClientVersion, Cwd: cwd, ExpectedDB: c.dbPath, // Send expected database path for validation