diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index ea5d9f49..e74d6a5c 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -441,6 +441,11 @@ {"id":"bd-x5wg","title":"Create and push git tag v0.33.2","description":"Create the release tag and push it:\n\n```bash\ngit tag v0.33.2\ngit push origin v0.33.2\n```\n\nThis triggers the GoReleaser GitHub Action to build release binaries.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-21T16:10:13.76223-08:00","updated_at":"2025-12-21T17:29:31.791368-08:00","close_reason":"Duplicate of bd-vzds, tag exists","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-xctp","title":"GH#519: bd sync fails when sync.branch is currently checked-out branch","status":"tombstone","priority":2,"issue_type":"bug","created_at":"2025-12-16T01:06:05.319281-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-xj2e","title":"GH#522: Add --type flag to bd update command","description":"Add --type flag to bd update for changing issue type (task/epic/bug/feature). Storage layer already supports it. See GitHub issue #522.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:03:12.506583-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-xo1o","title":"Dynamic Molecule Bonding: Fanout patterns for patrol molecules","description":"## Vision\n\nEnable molecules to dynamically spawn child molecules at runtime based on discovered\nwork. This is the foundation for the \"Christmas Ornament\" pattern where a patrol\nmolecule grows arms per-polecat.\n\n## The Activity Feed Vision\n\nInstead of parsing agent logs, users see structured work state:\n\n```\n[14:32:08] + patrol-x7k.arm-ace bonded (5 steps)\n[14:32:08] + patrol-x7k.arm-nux 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```\n\nThis requires beads to track molecule step state transitions in real-time.\n\n## Key Primitives Needed\n\n### 1. Dynamic Bond with Variables\n```bash\nbd mol bond mol-polecat-arm \u003cparent-wisp-id\u003e \\\n --var polecat_name=ace \\\n --var rig=gastown\n```\n\nCreates wisp children under the parent:\n- parent-id.arm-ace\n- parent-id.arm-ace.capture\n- parent-id.arm-ace.assess\n- etc.\n\n### 2. WaitsFor Directive\n```markdown\n## Step: aggregate\nCollect outcomes from all dynamically-bonded children.\nWaitsFor: all-children\nNeeds: survey-workers\n```\n\nThe `WaitsFor: all-children` directive makes this a fanout gate - it can't\nproceed until ALL dynamically-bonded children complete.\n\n### 3. Activity Feed Query\n```bash\nbd activity --follow # Real-time state stream\nbd activity --mol \u003cid\u003e # Activity for specific molecule\nbd activity --since 5m # Last 5 minutes\n```\n\n### 4. Parallel Step Detection\nSteps with no inter-dependencies should be flagged as parallelizable.\nWhen arms are bonded, their steps can run in parallel across arms.\n\n## Use Case: mol-witness-patrol\n\nThe Witness monitors N polecats where N varies at runtime:\n\n```\nsurvey-workers discovers: [ace, nux, toast]\nFor each polecat:\n bd mol bond mol-polecat-arm \u003cpatrol-id\u003e --var polecat_name=\u003cname\u003e\naggregate step waits for all arms to complete\n```\n\nThis creates the Christmas Ornament shape:\n- Trunk: preflight steps\n- Arms: per-polecat inspection molecules\n- Base: cleanup after all arms complete\n\n## Design Docs\n\nSee Gas Town docs:\n- docs/molecular-chemistry.md (updated with Christmas Ornament pattern)\n- docs/architecture.md (activity feed section)\n\n## Dependencies\n\nThis epic may depend on:\n- Wisp storage (.beads-wisp/) - already implemented\n- Variable substitution in molecules - may need enhancement","status":"in_progress","priority":1,"issue_type":"epic","created_at":"2025-12-23T02:32:43.173305-08:00","updated_at":"2025-12-23T02:37:17.760387-08:00"} +{"id":"bd-xo1o.1","title":"bd mol bond: Dynamic bond with variable substitution","description":"Implement dynamic molecule bonding with runtime variable substitution.\n\n## Command\n```bash\nbd mol bond \u003cproto-id\u003e \u003cparent-wisp-id\u003e --var key=value --var key2=value2\n```\n\n## Behavior\n1. Parse proto molecule template\n2. Substitute {{key}} placeholders with provided values\n3. Create wisp children under the parent molecule\n4. Child IDs follow pattern: parent-id.child-ref (e.g., patrol-x7k.arm-ace)\n5. Nested children: parent-id.child-ref.step-ref (e.g., patrol-x7k.arm-ace.capture)\n\n## Variable Substitution\n- In step titles: \"Inspect {{polecat_name}}\" -\u003e \"Inspect ace\"\n- In descriptions: Full template substitution\n- In Needs directives: Allow referencing parent steps\n\n## Output\n```\n✓ Bonded mol-polecat-arm to patrol-x7k\n Created: patrol-x7k.arm-ace (5 steps)\n```","status":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T02:33:13.878996-08:00","updated_at":"2025-12-23T02:33:13.878996-08:00","dependencies":[{"issue_id":"bd-xo1o.1","depends_on_id":"bd-xo1o","type":"parent-child","created_at":"2025-12-23T02:33:13.879419-08:00","created_by":"daemon"}]} +{"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":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T02:33:14.946475-08:00","updated_at":"2025-12-23T02:33:14.946475-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":"open","priority":1,"issue_type":"task","created_at":"2025-12-23T02:33:16.298764-08:00","updated_at":"2025-12-23T02:33:16.298764-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":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T02:33:17.660368-08:00","updated_at":"2025-12-23T02:33:17.660368-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-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."}