From 962c9e1fdaf3dd6c50691a3715211354a5bf846f Mon Sep 17 00:00:00 2001 From: beads/crew/dave Date: Thu, 1 Jan 2026 23:55:53 -0800 Subject: [PATCH] bd sync: 2026-01-01 23:55:53 --- .beads/issues.jsonl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 7ee74466..910906ef 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -462,7 +462,7 @@ {"id":"bd-ifuw","title":"test hook pin fix","status":"tombstone","priority":2,"issue_type":"task","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-ik1b","title":"Add --validate flag to bd create","description":"Opt-in strict mode that fails creation if required sections are missing. Uses ValidateTemplate() under the hood.","status":"closed","priority":3,"issue_type":"task","assignee":"beads/crew/emma","created_at":"2026-01-01T11:19:09.036754-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T14:20:06.932309-08:00","closed_at":"2026-01-01T14:20:06.932309-08:00","close_reason":"Implemented --validate flag for bd create command","dependencies":[{"issue_id":"bd-ik1b","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.754415-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-ik1b","depends_on_id":"bd-615z","type":"blocks","created_at":"2026-01-01T11:19:23.964595-08:00","created_by":"beads/crew/grip"}]} -{"id":"bd-imxi","title":"Add bd setup gemini for Gemini CLI integration","description":"## Summary\n\nAdd `bd setup gemini` command to install beads hooks for Gemini CLI, similar to existing `bd setup claude`.\n\nRef: GitHub #845\n\n## Research Findings\n\n### Gemini CLI Has Compatible Hooks\n\nGemini CLI (https://geminicli.com/docs/hooks/) supports nearly identical hook events:\n\n| Gemini CLI Event | Claude Code Equivalent | Purpose |\n|------------------|----------------------|---------|\n| **SessionStart** | SessionStart | Initialize resources, load context |\n| **SessionEnd** | - | Clean up, save state |\n| **PreCompress** | PreCompact | Before context compression |\n| **BeforeAgent** | - | Add context before planning |\n\nConfiguration format is almost identical to Claude:\n```json\n{\n \"hooks\": {\n \"SessionStart\": [{\n \"matcher\": \"\",\n \"hooks\": [{\n \"type\": \"command\",\n \"command\": \"bd prime\"\n }]\n }]\n }\n}\n```\n\n### GEMINI.md Support\n\n- Hierarchical loading: ~/.gemini/GEMINI.md → project root → subdirectories\n- Concatenated into system prompt automatically\n- Gemini CLI also reads AGENTS.md (already supported via `bd setup factory`)\n\n### Antigravity\n\nGoogle's IDE-based agentic platform (released Nov 2025):\n- Uses Gemini 3 with 1M token context\n- Has \"knowledge base\" for saved context\n- Less documented - may share Gemini CLI infrastructure\n- Needs separate research for dedicated support\n\n## Implementation Plan\n\n### Phase 1: Core Gemini CLI Support\n\n1. **Create `cmd/bd/setup/gemini.go`**\n - Mirror structure from `claude.go`\n - Target: `~/.gemini/settings.json`\n - Install SessionStart and PreCompress hooks\n - Support --project flag for local settings\n - Support --stealth flag\n\n2. **Add doctor check in `cmd/bd/doctor/gemini.go`**\n - Check if hooks installed\n - Verify settings.json structure\n\n3. **Update `cmd/bd/setup.go`**\n - Add gemini subcommand\n - Wire up to setup/gemini.go\n\n### Phase 2: Optional Enhancements\n\n4. **GEMINI.md generation** (optional)\n - Could generate project-level GEMINI.md\n - Or document that AGENTS.md already works\n\n5. **Antigravity support** (separate issue)\n - Needs research on Antigravity's configuration system\n - May be able to share Gemini CLI hooks\n - May need IDE-specific integration\n\n## Open Questions\n\n1. Where does Gemini CLI store settings? Need to verify `~/.gemini/settings.json` path\n2. Does Gemini CLI use same JSON structure as Claude for hooks?\n3. Can one implementation cover both Gemini CLI and Antigravity?\n4. Should we generate GEMINI.md or rely on AGENTS.md?\n\n## Acceptance Criteria\n\n- [ ] `bd setup gemini` installs hooks to Gemini CLI settings\n- [ ] `bd setup gemini --check` verifies installation\n- [ ] `bd doctor` reports Gemini CLI integration status\n- [ ] Documentation updated in docs/SETUP.md","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:47:07.399783-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-01T23:47:07.399783-08:00"} +{"id":"bd-imxi","title":"Add bd setup gemini for Gemini CLI integration","description":"## Summary\n\nAdd `bd setup gemini` command to install beads hooks for Gemini CLI, similar to existing `bd setup claude`.\n\nRef: GitHub #845\n\n## Research Findings\n\n### Gemini CLI Has Compatible Hooks\n\nGemini CLI (https://geminicli.com/docs/hooks/) supports nearly identical hook events:\n\n| Gemini CLI Event | Claude Code Equivalent | Purpose |\n|------------------|----------------------|---------|\n| **SessionStart** | SessionStart | Initialize resources, load context |\n| **SessionEnd** | - | Clean up, save state |\n| **PreCompress** | PreCompact | Before context compression |\n| **BeforeAgent** | - | Add context before planning |\n\nConfiguration format is almost identical to Claude:\n```json\n{\n \"hooks\": {\n \"SessionStart\": [{\n \"matcher\": \"\",\n \"hooks\": [{\n \"type\": \"command\",\n \"command\": \"bd prime\"\n }]\n }]\n }\n}\n```\n\n### GEMINI.md Support\n\n- Hierarchical loading: ~/.gemini/GEMINI.md → project root → subdirectories\n- Concatenated into system prompt automatically\n- Gemini CLI also reads AGENTS.md (already supported via `bd setup factory`)\n\n### Antigravity\n\nGoogle's IDE-based agentic platform (released Nov 2025):\n- Uses Gemini 3 with 1M token context\n- Has \"knowledge base\" for saved context\n- Less documented - may share Gemini CLI infrastructure\n- Needs separate research for dedicated support\n\n## Implementation Plan\n\n### Phase 1: Core Gemini CLI Support\n\n1. **Create `cmd/bd/setup/gemini.go`**\n - Mirror structure from `claude.go`\n - Target: `~/.gemini/settings.json`\n - Install SessionStart and PreCompress hooks\n - Support --project flag for local settings\n - Support --stealth flag\n\n2. **Add doctor check in `cmd/bd/doctor/gemini.go`**\n - Check if hooks installed\n - Verify settings.json structure\n\n3. **Update `cmd/bd/setup.go`**\n - Add gemini subcommand\n - Wire up to setup/gemini.go\n\n### Phase 2: Optional Enhancements\n\n4. **GEMINI.md generation** (optional)\n - Could generate project-level GEMINI.md\n - Or document that AGENTS.md already works\n\n5. **Antigravity support** (separate issue)\n - Needs research on Antigravity's configuration system\n - May be able to share Gemini CLI hooks\n - May need IDE-specific integration\n\n## Open Questions\n\n1. Where does Gemini CLI store settings? Need to verify `~/.gemini/settings.json` path\n2. Does Gemini CLI use same JSON structure as Claude for hooks?\n3. Can one implementation cover both Gemini CLI and Antigravity?\n4. Should we generate GEMINI.md or rely on AGENTS.md?\n\n## Acceptance Criteria\n\n- [ ] `bd setup gemini` installs hooks to Gemini CLI settings\n- [ ] `bd setup gemini --check` verifies installation\n- [ ] `bd doctor` reports Gemini CLI integration status\n- [ ] Documentation updated in docs/SETUP.md","status":"in_progress","priority":2,"issue_type":"feature","created_at":"2026-01-01T23:47:07.399783-08:00","created_by":"beads/crew/wolf","updated_at":"2026-01-01T23:55:12.69739-08:00","comments":[{"id":9,"issue_id":"bd-imxi","author":"beads/crew/wolf","text":"Deprioritizing Antigravity - focusing on Gemini CLI only. Antigravity may share the same hook infrastructure anyway, so Gemini CLI support might just work. Will revisit if there's demand.","created_at":"2026-01-02T07:55:13Z"}]} {"id":"bd-in7","title":"Test message","description":"Hello world","status":"tombstone","priority":2,"issue_type":"message","created_at":"2025-12-17T23:16:13.184946-08: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":"message"} {"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","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"} {"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","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","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"}]} @@ -654,7 +654,7 @@ {"id":"bd-nqyp","title":"mol-beads-release","description":"Release checklist for beads version {{version}}.\n\nThis molecule ensures all release steps are completed properly.\nVariable: {{version}} - target version (e.g., 0.35.0)\n\n## Step: update-release-notes\nUpdate cmd/bd/info.go with release notes for {{version}}.\n\nAdd a new VersionChange entry at the top of versionChanges slice:\n```go\n{\n Version: \"{{version}}\",\n Date: \"YYYY-MM-DD\",\n Changes: []string{\n \"NEW: Feature description\",\n \"FIX: Bug fix description\",\n \"IMPROVED: Enhancement description\",\n },\n},\n```\n\nRun `git log --oneline v\u003cprevious\u003e..HEAD` to see what changed.\n\n## Step: update-changelog\nUpdate CHANGELOG.md with detailed release notes.\n\nAdd a new section after [Unreleased]:\n```markdown\n## [{{version}}] - YYYY-MM-DD\n\n### Added\n- **Feature name** (issue-id) - Description\n\n### Changed\n- **Change description** (issue-id)\n\n### Fixed\n- **Bug fix** (issue-id) - Description\n```\n\nSort by importance, not chronologically.\nNeeds: update-release-notes\n\n## Step: bump-version\nRun the version bump script.\n\n```bash\n./scripts/bump-version.sh {{version}}\n```\n\nThis updates version in all files:\n- cmd/bd/version.go\n- .claude-plugin/*.json\n- integrations/beads-mcp/pyproject.toml\n- npm-package/package.json\n- Hook templates\n\nNeeds: update-changelog\n\n## Step: run-tests\nRun tests and verify lint passes.\n\n```bash\ngo test -short ./...\n```\n\nCI will run full lint, but fix any obvious issues first.\nNeeds: bump-version\n\n## Step: commit-release\nCommit the release changes.\n\n```bash\ngit add -A\ngit commit -m \"chore: bump version to v{{version}}\"\n```\n\nNeeds: run-tests\n\n## Step: push-and-tag\nPush commit and create release tag.\n\n```bash\ngit push origin main\ngit tag v{{version}}\ngit push origin v{{version}}\n```\n\nThis triggers GitHub Actions release workflow.\nNeeds: commit-release\n\n## Step: wait-for-ci\nWait for GitHub Actions to complete.\n\nMonitor: https://github.com/steveyegge/beads/actions\n\nCI will:\n- Build binaries via GoReleaser\n- Create GitHub Release with assets\n- Publish to npm (@beads/bd)\n- Publish to PyPI (beads-mcp)\n- Update Homebrew tap\n\nWait until all jobs succeed (~5-10 min).\nNeeds: push-and-tag\n\n## Step: verify-release\nVerify the release is complete.\n\n```bash\n# Check GitHub release\ngh release view v{{version}}\n\n# Check Homebrew\nbrew update \u0026\u0026 brew info steveyegge/beads/bd\n\n# Check npm\nnpm view @beads/bd version\n\n# Check PyPI\npip index versions beads-mcp\n```\n\nNeeds: wait-for-ci\n\n## Step: update-local\nUpdate local installations with proper codesigning (macOS).\n\n```bash\n# Build from source in mayor/rig (canonical build location)\ncd ~/gt/beads/mayor/rig\ngit pull\ngo build -o bd ./cmd/bd\n\n# Sign and install (macOS requires codesigning to avoid \"Killed: 9\")\n# Uses fix-gt script which handles both gt and bd binaries\nfix-gt\n\n# Or manually sign if fix-gt not available:\n# xattr -cr bd \u0026\u0026 codesign -f -s - bd\n# cp bd ~/go/bin/bd \u0026\u0026 codesign -f -s - ~/go/bin/bd\n# cp bd ~/.local/bin/bd \u0026\u0026 codesign -f -s - ~/.local/bin/bd\n\n# Install MCP locally\npip install -e integrations/beads-mcp\n\n# Restart daemons\npkill -f \"bd daemon\" || true\n```\n\nVerify: `bd --version` shows {{version}}\nNeeds: verify-release\n\n## Step: manual-publish\n(Optional) Manual publish if CI failed.\n\n```bash\n# npm (requires npm login)\n./scripts/bump-version.sh {{version}} --publish-npm\n\n# PyPI (requires TWINE credentials)\n./scripts/bump-version.sh {{version}} --publish-pypi\n\n# Or both\n./scripts/bump-version.sh {{version}} --publish-all\n```\n\nOnly needed if CI publishing failed.\nNeeds: wait-for-ci","status":"tombstone","priority":2,"issue_type":"molecule","created_at":"2025-12-23T11:29:39.087936-08:00","updated_at":"2025-12-28T01:26:51.06645-08:00","labels":["template"],"deleted_at":"2025-12-28T01:26:51.06645-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"molecule"} {"id":"bd-nuh1","title":"GH#403: bd doctor --fix circular error message","description":"bd doctor --fix suggests running bd doctor --fix for deletions manifest issue. Fix to provide actual resolution. See GitHub issue #403.","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:03:16.290018-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-nurq","title":"Implement bd mol current command","description":"Show what molecule the agent should currently be working on. Referenced by gt-um6q, gt-lz13. Needed for molecule navigation workflow in templates.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-23T00:17:54.069983-08:00","updated_at":"2025-12-23T01:23:59.523404-08:00","closed_at":"2025-12-23T01:23:59.523404-08:00"} -{"id":"bd-nv4g","title":"Add pre-sync validation hook","description":"Future: Hook integration to run bd lint before sync, respecting config settings.","status":"open","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:11.00402-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T11:19:11.00402-08:00","dependencies":[{"issue_id":"bd-nv4g","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.791249-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-nv4g","depends_on_id":"bd-t7jq","type":"blocks","created_at":"2026-01-01T11:19:24.008812-08:00","created_by":"beads/crew/grip"}]} +{"id":"bd-nv4g","title":"Add pre-sync validation hook","description":"Future: Hook integration to run bd lint before sync, respecting config settings.","status":"in_progress","priority":4,"issue_type":"task","created_at":"2026-01-01T11:19:11.00402-08:00","created_by":"beads/crew/grip","updated_at":"2026-01-01T23:55:39.13577-08:00","dependencies":[{"issue_id":"bd-nv4g","depends_on_id":"bd-ou35","type":"parent-child","created_at":"2026-01-01T11:19:22.791249-08:00","created_by":"beads/crew/grip"},{"issue_id":"bd-nv4g","depends_on_id":"bd-t7jq","type":"blocks","created_at":"2026-01-01T11:19:24.008812-08:00","created_by":"beads/crew/grip"}]} {"id":"bd-o18s","title":"Rename 'wisp' back to 'ephemeral' in beads API","description":"The beads API uses 'wisp' terminology (Wisp field, bd wisp command) but the underlying SQLite column is 'ephemeral'. \n\nThis creates cognitive overhead since wisp is a Gas Town concept.\n\nRename to use 'ephemeral' consistently:\n- types.Issue.Wisp → types.Issue.Ephemeral\n- JSON field: wisp → ephemeral \n- CLI: bd wisp → bd ephemeral (or just use flags on existing commands)\n\nThe SQLite column already uses 'ephemeral' so no schema migration needed.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-26T20:16:36.627876-08:00","updated_at":"2025-12-26T21:04:10.212439-08:00","closed_at":"2025-12-26T21:04:10.212439-08:00"} {"id":"bd-o34a","title":"Design auto-squash behavior for wisps","description":"Explore the design space for automatic wisp squashing.\n\n**Context:**\nWisps are ephemeral molecules that should be squashed (digest) or burned (no trace)\nwhen complete. Currently this is manual. Should it be automatic?\n\n**Questions to answer:**\n1. When should auto-squash trigger?\n - On molecule completion?\n - On session end/handoff?\n - On patrol detection?\n \n2. What's the default summary for auto-squash?\n - Generic: 'Auto-squashed on completion'\n - Step-based: List closed steps\n - AI-generated: Require agent to provide\n\n3. Should this be configurable?\n - Per-molecule setting in formula?\n - Global config: auto_squash: true/false\n - Per-wisp flag at creation time?\n\n4. Who decides - Beads or Gas Town?\n - Beads: Provides operators (squash, burn)\n - Gas Town: Makes policy decisions\n - Proposal: GT patrol molecules call bd mol squash\n\n**Constraints:**\n- Don't lose important context (summary matters)\n- Don't create noise in digest history\n- Respect agent's intent (some wisps should burn, not squash)\n\n**Recommendation:**\nGas Town patrol molecules should have explicit squash/burn steps.\nBeads provides primitives, GT makes policy decisions.\nAuto-squash at Beads level is probably wrong layer.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-24T18:23:24.833877-08:00","updated_at":"2025-12-25T22:56:59.210809-08:00","closed_at":"2025-12-25T22:56:59.210809-08:00"} {"id":"bd-o4qy","title":"Improve CheckStaleness error handling","description":"## Problem\n\nCheckStaleness returns 'false' (not stale) for multiple error conditions instead of returning errors. This masks problems.\n\n**Location:** internal/autoimport/autoimport.go:253-285\n\n## Edge Cases That Return False\n\n1. **Invalid last_import_time format** (line 259-262)\n2. **No JSONL file found** (line 267-277) \n3. **JSONL stat fails** (line 279-282)\n\n## Fix\n\nReturn errors for abnormal conditions:\n\n```go\nlastImportTime, err := time.Parse(time.RFC3339, lastImportStr)\nif err != nil {\n return false, fmt.Errorf(\"corrupted last_import_time: %w\", err)\n}\n\nif jsonlPath == \"\" {\n return false, fmt.Errorf(\"no JSONL file found\")\n}\n\nstat, err := os.Stat(jsonlPath)\nif err != nil {\n return false, fmt.Errorf(\"cannot stat JSONL: %w\", err)\n}\n```\n\n## Impact\nMedium - edge cases are rare but should be handled\n\n## Effort \n30 minutes - requires updating callers in RPC server","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-11-20T20:17:27.606219-05:00","updated_at":"2025-12-25T01:21:01.952723-08:00","dependencies":[{"issue_id":"bd-o4qy","depends_on_id":"bd-2q6d","type":"blocks","created_at":"2025-11-20T20:18:26.81065-05:00","created_by":"stevey"}],"deleted_at":"2025-12-25T01:21:01.952723-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} @@ -826,7 +826,7 @@ {"id":"bd-u66e","title":"Implement bd gate create/show/list/close/wait commands","description":"Implement the gate CLI commands.\n\n## Commands\n```bash\n# Create gate (returns gate ID)\nbd gate create --await \u003ctype\u003e:\u003cid\u003e --timeout \u003cduration\u003e --notify \u003caddr\u003e\n\n# Check gate status\nbd gate show \u003cid\u003e\n\n# List open gates\nbd gate list\n\n# Close gate (usually done by Deacon)\nbd gate close \u003cid\u003e --reason \"completed\"\n\n# Add waiter to existing gate\nbd gate wait \u003cid\u003e --notify \u003caddr\u003e\n```\n\n## Implementation\n- Add cmd/bd/gate.go with subcommands\n- Gate create creates wisp issue of type gate\n- Gate list filters for open gates\n- Gate wait adds to waiters[] array\n- All support --json output","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T11:44:34.022464-08:00","updated_at":"2025-12-23T12:06:18.550673-08:00","closed_at":"2025-12-23T12:06:18.550673-08:00","dependencies":[{"issue_id":"bd-u66e","depends_on_id":"bd-udsi","type":"parent-child","created_at":"2025-12-23T11:44:52.823353-08:00","created_by":"daemon"},{"issue_id":"bd-u66e","depends_on_id":"bd-lz49","type":"blocks","created_at":"2025-12-23T11:44:56.349662-08:00","created_by":"daemon"}]} {"id":"bd-u8g4","title":"Merge: bd-dxtc","description":"branch: polecat/cheedo\ntarget: main\nsource_issue: bd-dxtc\nrig: beads","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T20:42:17.222567-08:00","updated_at":"2025-12-23T21:21:57.696047-08:00","closed_at":"2025-12-23T21:21:57.696047-08:00"} {"id":"bd-ucgz","title":"Migration invariants should exclude external dependencies from orphan check","description":"## Summary\n\nThe `checkForeignKeys` function in `migration_invariants.go` flags external dependencies as orphaned because they dont exist in the local issues table.\n\n## Location\n\n`internal/storage/sqlite/migration_invariants.go` around line 150-162\n\n## Current Code (buggy)\n\n```go\n// Check for orphaned dependencies\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n\\`).Scan(\u0026orphanCount)\n```\n\n## Fix\n\nExclude external references (format: `external:\u003cproject\u003e:\u003ccapability\u003e`):\n\n```go\n// Check for orphaned dependencies (excluding external refs)\nvar orphanCount int\nerr = db.QueryRowContext(ctx, \\`\n SELECT COUNT(*)\n FROM dependencies d\n WHERE NOT EXISTS (SELECT 1 FROM issues WHERE id = d.depends_on_id)\n AND d.depends_on_id NOT LIKE 'external:%'\n\\`).Scan(\u0026orphanCount)\n```\n\n## Reproduction\n\n```bash\n# Add external dependency\nbd dep add bd-xxx external:other-project:some-capability\n\n# Try to sync - fails\nbd sync\n# Error: found 1 orphaned dependencies\n```\n\n## Files to Modify\n\n1. **internal/storage/sqlite/migration_invariants.go** - Add WHERE clause\n\n## Testing\n\n```bash\n# Create issue with external dep\nbd create \"Test external deps\" -t task\nbd dep add bd-xxx external:beads:release-workflow\n\n# Sync should succeed\nbd sync\n\n# Verify dep exists\nbd show bd-xxx --json | jq .dependencies\n```\n\n## Success Criteria\n- External dependencies dont trigger orphan check\n- `bd sync` succeeds with external deps\n- Regular orphan detection still works for internal deps","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-23T12:37:08.99387-08:00","updated_at":"2025-12-23T12:42:03.722691-08:00","closed_at":"2025-12-23T12:42:03.722691-08:00"} -{"id":"bd-ucj8","title":"Rename wisp prefix from 'eph' to 'wisp'","description":"The wisp system uses 'eph' as the ID prefix segment (e.g., gt-eph-xxx) but should use 'wisp' (e.g., gt-wisp-xxx) for consistency with terminology.\n\n**Location:** cmd/bd/wisp.go:260-261\n```go\n// Use \"eph\" prefix for distinct visual recognition\nresult, err := spawnMolecule(ctx, store, subgraph, vars, \"\", actor, true, \"eph\")\n```\n\n**Fix:** Change \"eph\" to \"wisp\"\n\n**Also update:**\n- main_errors.go:100,107 - detection patterns for ephemeral IDs\n- Any tests expecting '-eph-' pattern\n- Documentation if it references the prefix\n\n**Migration:** Existing gt-eph-* wisps in databases will continue to work (they have ephemeral=true flag). New wisps will use gt-wisp-* prefix.","status":"in_progress","priority":2,"issue_type":"bug","created_at":"2026-01-01T20:10:54.323196-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T20:13:11.552746-08:00"} +{"id":"bd-ucj8","title":"Rename wisp prefix from 'eph' to 'wisp'","description":"The wisp system uses 'eph' as the ID prefix segment (e.g., gt-eph-xxx) but should use 'wisp' (e.g., gt-wisp-xxx) for consistency with terminology.\n\n**Location:** cmd/bd/wisp.go:260-261\n```go\n// Use \"eph\" prefix for distinct visual recognition\nresult, err := spawnMolecule(ctx, store, subgraph, vars, \"\", actor, true, \"eph\")\n```\n\n**Fix:** Change \"eph\" to \"wisp\"\n\n**Also update:**\n- main_errors.go:100,107 - detection patterns for ephemeral IDs\n- Any tests expecting '-eph-' pattern\n- Documentation if it references the prefix\n\n**Migration:** Existing gt-eph-* wisps in databases will continue to work (they have ephemeral=true flag). New wisps will use gt-wisp-* prefix.","status":"closed","priority":2,"issue_type":"bug","created_at":"2026-01-01T20:10:54.323196-08:00","created_by":"gastown/crew/gus","updated_at":"2026-01-01T23:55:44.286924-08:00","closed_at":"2026-01-01T23:55:44.286924-08:00","close_reason":"Renamed wisp prefix from 'eph' to 'wisp'. Legacy eph-* pattern still supported for backwards compatibility."} {"id":"bd-udsi","title":"Async Gates for Agent Coordination","description":"Agents need an async primitive for waiting on external events (CI completion, API responses, human approval). Gates are wisp issues that block until external conditions are met, managed by the Deacon.\n\n## Core Concepts\n\n**Gate** = wisp issue that blocks until external condition is met\n- Type: gate\n- Phase: wisp (never synced, ephemeral)\n- Assignee: deacon/ (Deacon monitors it)\n- Fields: await_type, await_id, timeout, waiters[]\n\n**Await Types:**\n- gh:run:\u003cid\u003e - GitHub Actions run completion\n- gh:pr:\u003cid\u003e - PR merged/closed\n- timer:\u003cduration\u003e - Simple delay\n- human:\u003cprompt\u003e - Human approval required\n- mail:\u003cpattern\u003e - Wait for mail matching pattern\n\n## Open Questions\n- Should gates live in wisp storage or main storage with wisp flag?\n- Do we need a gate catalog (like molecule catalog)?\n- Should waits-for dep type work with gates?","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T11:44:02.711062-08:00","updated_at":"2025-12-23T12:24:43.537615-08:00","closed_at":"2025-12-23T12:24:43.537615-08:00"} {"id":"bd-ujz5","title":"Explore wiki-style documentation structure","description":"Our docs are growing into a book. Evaluate options for wiki-like structure:\n\n**Options to evaluate:**\n- GitHub Wiki (built-in, limited features)\n- mdBook (Rust, CLI-friendly, produces HTML/PDF/ePub)\n- MkDocs / Material for MkDocs (Python, beautiful themes)\n- Docusaurus (React, powerful but complex)\n- Plain markdown with good structure (current approach)\n\n**Requirements:**\n- Git-backed (version control)\n- Markdown-native (agents can edit)\n- Table of contents / navigation\n- Cross-linking between pages\n- Searchable\n- Can be hosted on GitHub Pages\n\n**Deliverables:**\n- Recommendation with pros/cons\n- If switching: migration plan\n- If staying with markdown: structure guidelines for wiki-like organization\n\nReferences:\n- https://squidfunk.github.io/mkdocs-material/alternatives/\n- https://www.archbee.com/blog/gitbook-alternatives","status":"closed","priority":3,"issue_type":"task","created_at":"2025-12-24T18:23:23.665509-08:00","updated_at":"2025-12-25T22:55:41.578876-08:00","closed_at":"2025-12-25T22:55:41.578876-08:00"} {"id":"bd-ul59","title":"Update molecular chemistry docs with discoveries","description":"Document recent discoveries about molecule/epic relationship and lifecycle:\n\n**Layer Cake (corrected order):**\n```\nFormulas (YAML compile-time macros)\n ↓\nProtos (template label, read-only)\n ↓\nMolecules (pour, bond, squash, burn)\n ↓\nEpics (parent-child, dependencies) ← DATA PLANE\n ↓\nIssues (JSONL, git-backed) ← STORAGE\n```\n\n**Key insight:** Molecules work without protos - you can create ad-hoc molecules.\nProtos are templates FOR molecules, not the other way around.\n\n**New concepts to document:**\n1. Orphan vs Stale matrix (blocking × assigned dimensions)\n2. Graph pressure as staleness indicator (not time)\n3. Parallelism via absence of depends_on (default parallel, opt-in sequential)\n4. progress.Completed/Total are computed, not stored\n5. WaitsFor: all-children for dynamic fanout gates\n\n**Common pitfalls for agents:**\n- Thinking phases/steps imply sequence (NO - deps do)\n- Confusing protos with molecules\n- Temporal language inverting dependencies\n- Forgetting to squash/burn wisps\n\n**Consider splitting docs:**\n- molecules.md → conceptual overview\n- formulas.md → YAML syntax reference\n- lifecycle.md → pour/squash/burn/bond operations\n- patterns.md → Christmas Ornament, factory assembly, etc.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T18:23:23.968937-08:00","updated_at":"2025-12-24T19:30:49.011831-08:00","closed_at":"2025-12-24T19:30:49.011831-08:00"}