diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 5a2f02bb..6168d636 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -80,6 +80,7 @@ {"id":"gt-272b","title":"Work on gt-role-template: Refine witness/CLAUDE.md role t...","description":"Work on gt-role-template: Refine witness/CLAUDE.md role template. Run 'bd show gt-role-template' to see the full issue.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-20T07:44:10.203384-08:00","updated_at":"2025-12-20T07:46:55.666605-08:00","closed_at":"2025-12-20T07:46:55.666605-08:00"} {"id":"gt-29k50","title":"Digest: mol-deacon-patrol","description":"Patrol 17: All agents healthy","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T05:01:26.919989-08:00","updated_at":"2025-12-25T05:01:26.919989-08:00","closed_at":"2025-12-25T05:01:26.919958-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-2b9b","title":"Digest: mol-deacon-patrol","description":"Patrol 19","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T23:11:19.536607-08:00","updated_at":"2025-12-24T23:11:19.536607-08:00","closed_at":"2025-12-24T23:11:19.53657-08:00","close_reason":"Squashed from 8 wisps"} +{"id":"gt-2bisz","title":"Digest: mol-deacon-patrol","description":"Patrol 4: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:34:00.699814-08:00","updated_at":"2025-12-25T17:34:00.699814-08:00","closed_at":"2025-12-25T17:34:00.699767-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-2bisz","depends_on_id":"gt-wisp-5vv","type":"parent-child","created_at":"2025-12-25T17:34:00.700549-08:00","created_by":"deacon"}]} {"id":"gt-2bz","title":"Swarm learning: Refinery merge queue automation","description":"Manually merging 15 polecat branches was painful and error-prone. Refinery should automate: detect completed work, run tests, merge to main, handle conflicts. This is core Refinery value prop.","status":"tombstone","priority":1,"issue_type":"task","created_at":"2025-12-16T01:21:51.137974-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-2c1","title":"Swarm learning: Spawn should auto-notify polecats","description":"town spawn assigns issues but doesn't notify polecats. Required separate 'town session send' to inject prompts. This should be one atomic operation - spawn assigns AND pokes the polecat to start working.","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-16T01:21:47.223608-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} {"id":"gt-2cd7","title":"Self-test","description":"Testing gt mail works","status":"closed","priority":2,"issue_type":"message","created_at":"2025-12-20T17:55:31.928025-08:00","updated_at":"2025-12-20T17:55:37.483125-08:00","closed_at":"2025-12-20T17:55:37.483125-08:00","labels":["from:gastown-crew-max","thread:thread-3a0ea7a99fce"]} @@ -285,6 +286,7 @@ {"id":"gt-6qld","title":"Daemon should auto-start as part of town bootstrap","description":"The Go daemon should be started automatically when the town boots up (mol-gastown-boot). Currently it requires manual 'gt daemon start'.\n\nThe daemon is critical infrastructure - it monitors the Deacon and nudges it when naked. Without it, the Deacon patrol loop doesn't run.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T13:16:52.000929-08:00","updated_at":"2025-12-23T13:16:52.000929-08:00"} {"id":"gt-6t0","title":"gt swarm: Not discovering tasks from epic dependents","description":"gt swarm create/start shows '0 tasks loaded' even when epic has dependents.\n\nRepro:\n1. Create epic gt-hw6\n2. Create tasks and add deps: bd dep add gt-xxx gt-hw6\n3. gt swarm create gastown --epic gt-hw6 --worker Toast\n4. Swarm shows 'Tasks: 0'\n\nExpected: Swarm should discover tasks that depend on the epic.\nActual: Shows '(no tasks loaded)'","status":"tombstone","priority":0,"issue_type":"bug","created_at":"2025-12-17T22:25:41.653628-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"bug"} {"id":"gt-6tf","title":"Implement gt harness create command","description":"Add scaffolding command to create a new harness:\n- gt harness create [path]\n- Creates config/, mayor/, .beads/redirect (optional)\n- Optionally initializes git\n- Generates CLAUDE.md with Mayor role\n- Could also offer a template repo alternative","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-17T17:15:34.342552-08:00","updated_at":"2025-12-25T01:30:41.67682-08:00","dependencies":[{"issue_id":"gt-6tf","depends_on_id":"gt-cr9","type":"blocks","created_at":"2025-12-17T17:15:51.845578-08:00","created_by":"daemon"}],"deleted_at":"2025-12-25T01:30:41.67682-08:00","deleted_by":"batch delete","delete_reason":"batch delete","original_type":"task"} +{"id":"gt-6uu25","title":"Digest: mol-deacon-patrol","description":"Patrol 1: All agents healthy, no messages, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:25:51.369954-08:00","updated_at":"2025-12-25T17:25:51.369954-08:00","closed_at":"2025-12-25T17:25:51.369896-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-6uu25","depends_on_id":"gt-wisp-8ky","type":"parent-child","created_at":"2025-12-25T17:25:51.370709-08:00","created_by":"deacon"}]} {"id":"gt-6vks","title":"Bug: LIFECYCLE messages use literal \u003crig\u003e placeholder","description":"Found stale LIFECYCLE messages addressed to @\u003crig\u003e/witness instead of actual rig names like @gastown/witness. Template substitution not happening.\n\nExamples found:\n- gm-bay: LIFECYCLE: polecat requesting shutdown (to @\u003crig\u003e/witness)\n- gm-7du, gm-94e, gm-u5x, gm-89b: same issue\n\nFix: Ensure rig name is substituted in lifecycle mail templates.","status":"closed","priority":2,"issue_type":"bug","created_at":"2025-12-20T03:12:28.146613-08:00","updated_at":"2025-12-20T13:23:08.002122-08:00","closed_at":"2025-12-20T13:23:08.002122-08:00"} {"id":"gt-6y5b","title":"Polecat mood command and status line display","description":"CLI and status line support for polecat mood.\n\n## CLI Command\n```\ngt polecat mood \u003cname\u003e \u003cemoji\u003e # Set mood\ngt polecat mood \u003cname\u003e # Get mood\n```\n\nSets GT_MOOD environment variable in the polecat's tmux session.\n\n## Status Line Integration\nUpdate runWorkerStatusLine() to read mood:\n```go\nmood, _ := t.GetEnvironment(session, \"GT_MOOD\")\nif mood != \"\" {\n icon = mood // Use mood emoji instead of default\n} else {\n icon = AgentTypeIcons[AgentPolecat] // Fallback to 😺\n}\n```\n\n## Storage\nMood stored in tmux session environment (ephemeral, per-session).\nNo persistence needed - mood is reassessed each patrol cycle.\n\nDepends on: gt-u818 (plugin system)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T16:17:14.111807-08:00","updated_at":"2025-12-21T16:17:14.111807-08:00","dependencies":[{"issue_id":"gt-6y5b","depends_on_id":"gt-u818","type":"blocks","created_at":"2025-12-21T16:17:20.53466-08:00","created_by":"daemon"}]} {"id":"gt-6y8u","title":"Deacon patrol: Janitorial cleanup patterns","description":"Patterns discovered during town cleanup that could be automated in Deacon's patrol step:\n\n## Stale Issue Detection\n\n1. **Stale in_progress issues** - Issues marked in_progress for \u003eN days without activity\n - Example: 9 issues in_progress, some likely complete\n - Action: Report list, optionally nudge assignee\n\n2. **Duplicate issues** - Same title with different IDs\n - Example: gt-87jz and gt-qp2w both 'mol-witness-patrol'\n - Action: Flag for human review\n\n3. **Orphaned issues** - Referenced in commits but still open\n - bd doctor already detects: 'hq-65jk (commit f9e9034d)'\n - Action: Report, suggest closing\n\n4. **Stale test messages** - Messages with 'test' in title older than N days\n - Example: gt-54kn, gt-1ero, gt-nriy, gt-wrw2, gt-pnu4, gt-g1ud, gt-b5sh\n - Action: Auto-close or flag\n\n## File System Cleanup\n\n5. **Log file accumulation** - daemon.log and rotated .log.gz files\n - Found 8+ log files across rigs\n - Action: Rotate, compress, delete old (\u003e7 days)\n\n6. **Beads directory size** - Town .beads/ is 65MB\n - Action: Monitor growth, alert on threshold\n\n## Database Health\n\n7. **Legacy database fingerprints** - Older DBs without fingerprint\n - bd doctor warns about this\n - Action: Report, suggest migration\n\n## Cross-Reference Integrity\n\n8. **Gastown↔Beads issue sync** - Issues filed in wrong project\n - Example: gt-8tmz.* describes Beads work but no bd-* issues\n - Action: Detect cross-references, verify both sides exist\n\n## Implementation Notes\n\nThese could be added to mol-deacon-patrol.formula.yaml as cleanup substeps:\n- Daily: Log rotation, stale issue report\n- Weekly: Duplicate detection, orphan check\n- Monthly: Size monitoring, archive old closed issues","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-24T13:25:03.212307-08:00","updated_at":"2025-12-24T13:25:03.212307-08:00","dependencies":[{"issue_id":"gt-6y8u","depends_on_id":"gt-ingm","type":"relates-to","created_at":"2025-12-24T13:25:18.850583-08:00","created_by":"daemon"}]} @@ -317,6 +319,7 @@ {"id":"gt-7ik","title":"Ephemeral polecats: spawn fresh, delete on completion","description":"## Design Decision\n\nSwitch from pooled/idle polecats to ephemeral model:\n- Spawn creates fresh worktree from main\n- Polecat requests shutdown when done (bottom-up)\n- Witness verifies handoff, kills session, deletes worktree\n- No 'idle' state - polecats exist only while working\n\n## Rationale\n\n1. **Git worktrees are fast** - pooling optimization is obsolete\n2. **Pooling creates maintenance burden:**\n - Git stashes accumulate\n - Untracked artifacts pile up\n - Branches drift from main\n - Beads DB gets stale\n3. **PGT sync problems** came from persistent branches\n4. **Support infrastructure exists** - Witness, Refinery, Mayor handle continuity\n5. **Simpler mental model** - polecat exists = work in progress\n\n## Lifecycle\n\n```\nSpawn:\n gt spawn --issue \u003cid\u003e\n β†’ Creates fresh worktree: git worktree add polecats/\u003cname\u003e -b polecat/\u003cname\u003e\n β†’ Initializes beads in worktree\n β†’ Starts session, assigns work\n\nWorking:\n Polecat does task\n β†’ Pushes to polecat/\u003cname\u003e branch\n β†’ Submits to merge queue when ready\n\nCompletion (POLECAT-INITIATED):\n Polecat runs: gt handoff\n β†’ Verifies git state clean\n β†’ Sends mail to Witness: \"Ready for shutdown\"\n β†’ Marks itself done, waits for termination\n\nCleanup (WITNESS-OWNED):\n Witness receives shutdown request\n β†’ Verifies PR merged or in queue\n β†’ Verifies no uncommitted changes\n β†’ Kills session: gt session stop \u003crig\u003e/\u003cpolecat\u003e\n β†’ Deletes worktree: git worktree remove polecats/\u003cname\u003e\n β†’ Deletes branch: git branch -d polecat/\u003cname\u003e\n β†’ Optionally: Notifies Mayor of completion\n```\n\n## Key Insight: Bottom-Up Shutdown\n\n**Old model (wrong)**: Top-down batch shutdown - \"cancel the swarm\"\n**New model (right)**: Bottom-up individual shutdown - polecat requests, Witness executes\n\nThis enables streaming:\n- Workers come and go continuously\n- No \"swarm end\" to trigger cleanup\n- Each worker manages its own lifecycle\n- Witness is the lifecycle authority\n\n## Implementation\n\n1. Add `gt handoff` command for polecats to request shutdown\n2. Modify gt spawn to always create fresh worktree\n3. Run bd init in new worktree (beads needs initialization)\n4. Add shutdown request handler to Witness\n5. Witness verifies handoff, then cleans up:\n - Kill session\n - Remove worktree\n - Delete branch\n6. Remove 'idle' state from polecat state machine\n7. Simplify gt polecat list (only shows active)\n\n## Impact on Other Tasks\n\n- gt-17r (Zombie cleanup): Becomes trivial - orphan worktrees\n- gt-4my (Worker health): Simpler - no idle/stuck ambiguity\n- gt-f9x.5/f9x.6 (Doctor): Fewer states to validate\n- gt-eu9 (Witness handoff): Witness receives polecat shutdown requests","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-17T15:44:31.139964-08:00","updated_at":"2025-12-19T01:57:17.033547-08:00","closed_at":"2025-12-19T01:57:17.033547-08:00"} {"id":"gt-7iu4u","title":"Digest: mol-deacon-patrol","description":"Patrol 12: routine","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T10:18:28.987479-08:00","updated_at":"2025-12-25T10:18:28.987479-08:00","closed_at":"2025-12-25T10:18:28.98744-08:00"} {"id":"gt-7lt","title":"gt mail send should tmux-notify recipient","description":"## Problem\n\nWhen mail is sent via gt mail send, the recipient session does not get a tmux notification. In Python Gas Town (PGT), mail delivery triggers a tmux display-message or similar notification so the agent knows mail arrived.\n\n## Expected Behavior\n\nWhen gt mail send \u003caddr\u003e is called:\n1. Mail is delivered to recipient inbox\n2. If recipient has an active tmux session, send notification\n3. Notification should be visible (display-message or bell)\n\n## Current Behavior\n\nMail is delivered but no notification. Agent has to poll inbox to discover new mail.\n\n## Impact\n\n- Agents miss time-sensitive messages\n- Heartbeat pokes from daemon will not wake agents\n- Coordination is slower (polling vs push)\n\n## Implementation Notes\n\nAfter successful mail delivery, check if recipient has active session:\n- gt session list can identify active sessions\n- tmux display-message or send-keys can notify\n- Could inject a visible prompt like \"[MAIL] New message from \u003csender\u003e\"\n\n## Reference\n\nCheck PGT implementation for how it handles this.","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-18T12:28:50.142075-08:00","updated_at":"2025-12-18T20:09:53.112902-08:00","closed_at":"2025-12-18T20:09:53.112902-08:00"} +{"id":"gt-7nb3h","title":"Digest: mol-deacon-patrol","description":"Patrol 5: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:38:56.411245-08:00","updated_at":"2025-12-25T17:38:56.411245-08:00","closed_at":"2025-12-25T17:38:56.411194-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-7nb3h","depends_on_id":"gt-wisp-9to","type":"parent-child","created_at":"2025-12-25T17:38:56.411981-08:00","created_by":"deacon"}]} {"id":"gt-7o7","title":"Session pre-shutdown checks","description":"Session stop should verify clean state before killing, like PGT.\n\n## Pre-Shutdown Checks\n\n### 1. Git Working Tree Clean\n```go\nfunc checkGitClean(clonePath string) error {\n // git status --porcelain\n // Fail if any output\n}\n```\n\n### 2. All Commits Pushed\n```go\nfunc checkCommitsPushed(clonePath string) error {\n // git log origin/HEAD..HEAD\n // Fail if any unpushed commits\n}\n```\n\n### 3. Assigned Issues Handled\n```go\nfunc checkIssuesHandled(polecat *Polecat) error {\n // If polecat.Issue != \"\", check if closed or reassigned\n}\n```\n\n### 4. Beads Synced\n```go\nfunc checkBeadsSynced(clonePath string) error {\n // bd sync --status in clone directory\n}\n```\n\n## Behavior on Failure\n1. First attempt: Nudge worker to fix\n2. Retry up to 3 times with delay\n3. After retries: Escalate to Witness/Mayor\n\n## Integration\nModify internal/session/manager.go Stop():\n```go\nfunc (m *Manager) Stop(polecat string, force bool) error {\n if !force {\n if err := m.runPreShutdownChecks(polecat); err != nil {\n return fmt.Errorf(\"pre-shutdown checks failed: %w\", err)\n }\n }\n // existing stop logic\n}\n```\n\n## Flags\n- --force: Skip checks\n- --grace-period N: Time to wait for fixes\n\n## Dependencies\n- Ties into gt-69l (hook system) - can be hook-based\n- Ties into gt-f8v (Witness pre-kill verification)\n\n## Acceptance Criteria\n- [ ] Stop fails if uncommitted changes (without --force)\n- [ ] Stop fails if unpushed commits\n- [ ] Clear error messages with fix instructions\n- [ ] --force bypasses all checks","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-16T14:47:55.968983-08:00","updated_at":"2025-12-16T16:05:02.795812-08:00"} {"id":"gt-7oow","title":"gt mail: Cross-level routing is broken","description":"**Problem:**\nWhen Mayor (at ~/gt) sends mail to a rig worker (gastown/crew/max), the message lands in town-level beads (~/.beads/) but the recipient checks rig-level beads (crew/max/.beads/).\n\n**Reproduction:**\n```bash\ncd ~/gt\ngt mail send gastown/crew/max -s 'Test' -m 'body'\n# Message goes to ~/gt/.beads/ with prefix hq-*\n\ncd ~/gt/gastown/crew/max \ngt mail inbox\n# Does NOT see the message - it's looking in crew/max/.beads/\n```\n\n**Root cause:**\n`findBeadsWorkDir()` walks up from CWD to find .beads. `Router.Send()` runs `bd create` in that directory. This means messages always go to the sender's beads, not the recipient's.\n\n**Fix options:**\n1. Route based on recipient address - if sending to rig/*, use that rig's .beads\n2. Use a single shared beads database for all mail (simpler but less isolated)\n3. Teach agents to check both levels (workaround, not fix)\n\n**Related:**\n- gt-ngu1: Pinned beads sorting (done but pointless if mail doesn't route)\n- This blocks all cross-level mail functionality","status":"closed","priority":1,"issue_type":"bug","created_at":"2025-12-20T17:57:30.258991-08:00","updated_at":"2025-12-20T18:35:54.390121-08:00","closed_at":"2025-12-20T18:35:54.390121-08:00"} {"id":"gt-7q4","title":"HOP: Skill vectors on work items","description":"Add skill embeddings to work items for capability-based matching. See ~/ai/stevey-gastown/hop/CONTEXT.md. Post-v0.1 work.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-17T01:00:43.251085-08:00","updated_at":"2025-12-17T01:00:43.251085-08:00"} @@ -376,7 +379,7 @@ {"id":"gt-8tmz.24","title":"Document Rig/Cook/Run lifecycle","description":"The rig-cook-run.md spec is written. Propagate terminology to all relevant docs: - molecule-algebra.md (done) - molecular-chemistry.md (done) - vision.md (done) - propulsion-principle.md - sling-design.md - Any agent templates that reference cooking/instantiation","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T19:18:26.167525-08:00","updated_at":"2025-12-25T12:30:00.61514-08:00","closed_at":"2025-12-25T12:30:00.61514-08:00","close_reason":"Updated propulsion-principle.md, sling-design.md, molecules.md, and architecture.md with Rig/Cook/Run lifecycle terminology","dependencies":[{"issue_id":"gt-8tmz.24","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T19:18:26.16795-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.25","title":"Implement bd bond command for artifact-level composition","description":"Implement the artifact-level bond operator distinct from source-level rigging.\n\nBond accepts:\n- Formula names (cooks inline to ephemeral proto, then bonds)\n- Mol IDs (existing liquid work)\n- Wisp IDs (existing vapor work)\n\nSee molecular-chemistry.md for the full bond table semantics.\n\n**Updated 2025-12-25**: With ephemeral protos (gt-4v1eo), bond takes formula names directly and cooks inline. No pre-cooked proto beads.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T19:18:27.245107-08:00","updated_at":"2025-12-25T16:39:37.850809-08:00","closed_at":"2025-12-25T16:39:37.850809-08:00","close_reason":"Implemented formula name support in bd mol bond - formulas are now cooked inline as ephemeral protos","dependencies":[{"issue_id":"gt-8tmz.25","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T19:18:27.246957-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.26","title":"Direct formula-to-wisp instantiation (skip proto)","description":"For massive ephemeral workflows (e.g., million-step Towers of Hanoi), allow:\n\nbd wisp towers-of-hanoi --var disks=20\n\nThis would cook + wisp in one step, never materializing the proto. Useful when:\n- The proto would be huge (1M+ steps)\n- The work is ephemeral (wisp, not mol)\n- You don't need the intermediate artifact\n\nImplementation: streaming cook that emits directly to wisp storage.\n\nRelated: towers-of-hanoi.formula.yaml demonstrates the use case.","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T19:26:53.377902-08:00","updated_at":"2025-12-25T14:28:49.111955-08:00","closed_at":"2025-12-25T14:28:49.111955-08:00","close_reason":"Superseded by gt-4v1eo - ephemeral protos is now the general approach, not a special case for large workflows","dependencies":[{"issue_id":"gt-8tmz.26","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T19:26:53.378307-08:00","created_by":"daemon"}]} -{"id":"gt-8tmz.27","title":"Computed range expansion (for-each over expressions)","description":"Support for-each expansion over computed ranges, not just static lists:\n\nfor-each:\n var: move_num\n range: \"1..2^{disks}\" # Computed at cook time\n\nThis enables formulas like Towers of Hanoi where the step count is a function of input variables. The range expression is evaluated during cooking.\n\nRelated: towers-of-hanoi.formula.yaml demonstrates the need.\nDepends on: gt-8tmz.8 (Runtime dynamic expansion)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T19:27:02.71296-08:00","updated_at":"2025-12-23T19:27:02.71296-08:00","dependencies":[{"issue_id":"gt-8tmz.27","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T19:27:02.713399-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.27","depends_on_id":"gt-8tmz.8","type":"blocks","created_at":"2025-12-23T19:27:08.191351-08:00","created_by":"daemon"}]} +{"id":"gt-8tmz.27","title":"Computed range expansion (for-each over expressions)","description":"Support for-each expansion over computed ranges, not just static lists:\n\nfor-each:\n var: move_num\n range: \"1..2^{disks}\" # Computed at cook time\n\nThis enables formulas like Towers of Hanoi where the step count is a function of input variables. The range expression is evaluated during cooking.\n\nRelated: towers-of-hanoi.formula.yaml demonstrates the need.\nDepends on: gt-8tmz.8 (Runtime dynamic expansion)","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-23T19:27:02.71296-08:00","updated_at":"2025-12-25T17:48:52.307361-08:00","closed_at":"2025-12-25T17:48:52.307361-08:00","close_reason":"Implemented computed range expansion with expression evaluator supporting + - * / ^ operators and variable substitution.","dependencies":[{"issue_id":"gt-8tmz.27","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T19:27:02.713399-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.27","depends_on_id":"gt-8tmz.8","type":"blocks","created_at":"2025-12-23T19:27:08.191351-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.28","title":"Formula error handling and recovery","description":"Specify how cooking errors are reported and recovered:\n- What happens when extends chain is broken (missing formula)?\n- What happens when aspect pointcut matches nothing?\n- What happens when expansion produces invalid structure?\n- Graceful degradation vs fail-fast semantics\n- Error metadata in cooked protos\n\nDeferred: post-launch polish","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-23T20:06:28.452872-08:00","updated_at":"2025-12-23T20:06:28.452872-08:00","dependencies":[{"issue_id":"gt-8tmz.28","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T20:06:28.453346-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.29","title":"Formula versioning and migration strategy","description":"Define how formula versions are managed:\n- What does the version field mean? Semver? Integer?\n- When a formula changes, what happens to existing protos?\n- Do protos track their source formula version?\n- Migration path: old proto + new formula = ?\n- Backwards compatibility guarantees (if any)\n\nDeferred: post-launch polish","status":"open","priority":4,"issue_type":"task","created_at":"2025-12-23T20:06:45.764277-08:00","updated_at":"2025-12-23T20:06:45.764277-08:00","dependencies":[{"issue_id":"gt-8tmz.29","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T20:06:45.764686-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.3","title":"Expansion operators: expand and map (macros)","description":"Implement macro-style expansion operators:\n- expand(target, template) - apply template to single step\n- map(molecule, template) - apply template to all matching steps\n\nTemplates use {target} substitution for step references.\nRule of Five is the canonical example.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T18:04:31.472199-08:00","updated_at":"2025-12-25T11:45:01.290769-08:00","closed_at":"2025-12-25T11:45:01.290769-08:00","close_reason":"Expansion operators working - fixed dependency updates after expansion, fixed formula files schema","dependencies":[{"issue_id":"gt-8tmz.3","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:31.472662-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.3","depends_on_id":"gt-8tmz.1","type":"blocks","created_at":"2025-12-23T18:04:49.809887-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.3","depends_on_id":"gt-8tmz.13","type":"blocks","created_at":"2025-12-23T18:48:18.717567-08:00","created_by":"daemon"}]} @@ -388,7 +391,7 @@ {"id":"gt-8tmz.35","title":"Inline step expansion (Step.Expand field)","description":"Step.Expand and Step.ExpandVars fields exist in schema but are not implemented.\n\n## Current State\n\nSteps can declare inline expansion:\n\n steps:\n - id: design\n expand: rule-of-five\n expand_vars:\n iterations: 3\n\nThis is more convenient than compose.expand for single-step expansions.\n\n## Difference from compose.expand\n\n- compose.expand: Centralized, applies after all steps parsed\n- Step.Expand: Inline, step declares its own expansion\n\n## Implementation\n\n1. During cooking, detect steps with Expand field\n2. Load referenced expansion formula\n3. Replace step with expanded template (like compose.expand)\n4. Pass ExpandVars as variable overrides\n5. Handle recursion depth (reuse DefaultMaxExpansionDepth)\n\n## Files\n\n- internal/formula/types.go: Step.Expand, Step.ExpandVars (already defined)\n- internal/formula/expand.go: Add inline expansion handling\n- internal/formula/expand_test.go: Add test cases\n\n## Depends On\n\n- gt-8tmz.34 (var overrides) should be done first","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-25T11:50:30.099384-08:00","updated_at":"2025-12-25T17:16:48.706185-08:00","dependencies":[{"issue_id":"gt-8tmz.35","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-25T11:50:30.099886-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.35","depends_on_id":"gt-8tmz.34","type":"blocks","created_at":"2025-12-25T17:16:56.841331-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.36","title":"Validate expanded step IDs are unique","status":"open","priority":3,"issue_type":"task","created_at":"2025-12-25T11:50:48.436691-08:00","updated_at":"2025-12-25T11:50:48.436691-08:00","dependencies":[{"issue_id":"gt-8tmz.36","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-25T11:50:48.437167-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.37","title":"Support nested expansion formulas","status":"open","priority":4,"issue_type":"feature","created_at":"2025-12-25T11:50:48.751806-08:00","updated_at":"2025-12-25T11:50:48.751806-08:00","dependencies":[{"issue_id":"gt-8tmz.37","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-25T11:50:48.75222-08:00","created_by":"daemon"}]} -{"id":"gt-8tmz.38","title":"Fanout gate: waits-for children aggregation","description":"Formalize the fanout gate pattern where a step waits for all dynamically-bonded children.\n\n## Current State\n\nFormulas already use this pattern informally:\n\n step: aggregate\n waits_for: \"all-children\"\n\nBut it is not in the algebra spec or implemented in the cooker.\n\n## Proposed Syntax\n\n step: aggregate\n needs: [survey-workers]\n waits-for: children-of(survey-workers)\n\nOr simpler:\n\n step: aggregate\n needs: [survey-workers]\n waits-for: all-children\n\n## Semantics\n\n- Step cannot start until ALL children of the referenced step have completed\n- Children are dynamically bonded via for-each (gt-8tmz.8)\n- This is the \"aggregation\" half of the Christmas Ornament pattern\n- If no children were bonded, the gate passes immediately\n\n## Use Cases\n\n**Witness Patrol:**\n- survey-workers bonds N polecat-arms\n- aggregate waits for all arms to complete\n- Then proceeds to save-state\n\n**Refinery Patrol:**\n- Less common (sequential processing), but useful for parallel test runs\n\n## Relationship to gate\n\nThis is a variant of gate where the condition is \"all children complete\" rather than\nan arbitrary expression. Could be implemented as:\n\n gate:\n condition: \"children-of(survey-workers).all(status == complete)\"\n\nBut dedicated syntax is cleaner for this common pattern.\n\n## Dependencies\n\n- Depends on gt-8tmz.8 (for-each creates the children)\n- Depends on gt-8tmz.4 (gate infrastructure)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-25T14:19:04.255758-08:00","updated_at":"2025-12-25T14:19:04.255758-08:00","dependencies":[{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-25T14:19:04.256284-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz.8","type":"blocks","created_at":"2025-12-25T14:19:11.036957-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz.4","type":"blocks","created_at":"2025-12-25T14:19:11.148842-08:00","created_by":"daemon"}]} +{"id":"gt-8tmz.38","title":"Fanout gate: waits-for children aggregation","description":"Formalize the fanout gate pattern where a step waits for all dynamically-bonded children.\n\n## Current State\n\nFormulas already use this pattern informally:\n\n step: aggregate\n waits_for: \"all-children\"\n\nBut it is not in the algebra spec or implemented in the cooker.\n\n## Proposed Syntax\n\n step: aggregate\n needs: [survey-workers]\n waits-for: children-of(survey-workers)\n\nOr simpler:\n\n step: aggregate\n needs: [survey-workers]\n waits-for: all-children\n\n## Semantics\n\n- Step cannot start until ALL children of the referenced step have completed\n- Children are dynamically bonded via for-each (gt-8tmz.8)\n- This is the \"aggregation\" half of the Christmas Ornament pattern\n- If no children were bonded, the gate passes immediately\n\n## Use Cases\n\n**Witness Patrol:**\n- survey-workers bonds N polecat-arms\n- aggregate waits for all arms to complete\n- Then proceeds to save-state\n\n**Refinery Patrol:**\n- Less common (sequential processing), but useful for parallel test runs\n\n## Relationship to gate\n\nThis is a variant of gate where the condition is \"all children complete\" rather than\nan arbitrary expression. Could be implemented as:\n\n gate:\n condition: \"children-of(survey-workers).all(status == complete)\"\n\nBut dedicated syntax is cleaner for this common pattern.\n\n## Dependencies\n\n- Depends on gt-8tmz.8 (for-each creates the children)\n- Depends on gt-8tmz.4 (gate infrastructure)","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T14:19:04.255758-08:00","updated_at":"2025-12-25T17:41:09.938692-08:00","closed_at":"2025-12-25T17:41:09.938692-08:00","close_reason":"Implemented waits_for handling for both persisted and ephemeral proto paths. Added children-of(step-id) syntax, ParseWaitsFor helper, and DepWaitsFor dependency creation.","dependencies":[{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-25T14:19:04.256284-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz.8","type":"blocks","created_at":"2025-12-25T14:19:11.036957-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.38","depends_on_id":"gt-8tmz.4","type":"blocks","created_at":"2025-12-25T14:19:11.148842-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.4","title":"Control flow: loop, gate, branch","description":"Implement control flow operators for the molecule algebra.\n\n## Core Operators\n\n| Operator | Syntax | Purpose |\n|----------|--------|---------|\n| loop (fixed) | loop: { count: N, body: [steps] } | Fixed iteration |\n| loop (conditional) | loop: { until: COND, max: N, body: [steps] } | Bounded conditional iteration |\n| gate | gate: { before: step, condition: COND } | Wait for condition before proceeding |\n| branch | branch: { from: step, steps: [a,b,c], join: step } | Parallel paths that rejoin |\n\nConditions evaluated mechanically (step status, output fields) per gt-8tmz.7.\n\n## Design Review (2025-12-25)\n\nAnalyzed patrol patterns (witness, deacon, refinery) to verify these constructs\ncan express real Gas Town workflows. Key findings:\n\n### Insight: Patrol Loop is OUTSIDE the Algebra\n\nThe daemon respawns patrols. Each formula describes ONE cycle. This means:\n- Formulas don't need \"infinite loop with burn-and-respawn\"\n- loop is only for **inner loops** (refinery's per-branch processing)\n- \"burn-or-loop\" = complete cycle; daemon decides next action\n- Context cycling is external, not algebraic\n\nThis significantly simplifies the algebra.\n\n### Gap: for-each is Missing\n\nThe current proposal doesn't include for-each, but it's essential for patrol patterns:\n\n| Pattern | Use Case |\n|---------|----------|\n| Witness survey-workers | For each polecat, bond an arm (parallel) |\n| Refinery process-branch | For each branch in queue, run merge pipeline (sequential) |\n| Deacon plugin-run | For each plugin where gate open, execute |\n\nProposed syntax:\n\n for-each:\n collection: \"survey-workers.output.polecats\"\n bond: mol-polecat-arm\n vars:\n polecat_name: \"{item.name}\"\n parallel: true\n\nThis overlaps with gt-8tmz.8 (runtime dynamic expansion). Decision needed:\n- Include for-each here as control flow, OR\n- Ensure gt-8tmz.8 covers these patterns adequately\n\n### Gap: waits-for Gate Variant\n\nThe \"fanout gate\" pattern (aggregate waits for all dynamically-bonded children)\nneeds formalization:\n\n step: aggregate\n waits-for: children-of(survey-workers)\n\nCurrently exists in formulas as waits_for: \"all-children\" but not in the algebra spec.\n\n### What This Covers\n\nWith these operators (plus for-each), patrols become fully expressible:\n\n**Witness Patrol:**\n- for-each polecat -\u003e bond mol-polecat-arm (parallel)\n- gate with waits-for: all-children for aggregation\n\n**Refinery Patrol:**\n- for-each branch -\u003e process pipeline (sequential)\n- gate for test verification before merge\n\n**Deacon Patrol:**\n- for-each plugin -\u003e execute if gate open\n- Simple sequence otherwise\n\n### Scope Decision\n\n**Option A**: Implement loop, gate, branch now. Track for-each and waits-for separately.\n\n**Option B**: Expand scope to include for-each and waits-for formalization.\n\nRecommendation: Option A - implement core constructs, create child issues for gaps.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:33.194896-08:00","updated_at":"2025-12-25T14:52:37.324593-08:00","closed_at":"2025-12-25T14:52:37.324593-08:00","close_reason":"Implemented loop, branch, and gate operators. Added LoopSpec, BranchRule, GateRule types. Created controlflow.go with ApplyLoops, ApplyBranches, ApplyGates. Wired into cook.go. All 11 tests pass.","dependencies":[{"issue_id":"gt-8tmz.4","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:33.196543-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.4","depends_on_id":"gt-8tmz.7","type":"blocks","created_at":"2025-12-23T18:04:49.985527-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.5","title":"Aspects: AOP cross-cutting concerns","description":"Implement aspect-oriented composition:\n- Define aspects with pointcuts and advice\n- Apply aspects at bond time: bd bond mol --with-aspect security\n- Pointcuts use glob patterns to match join points\n\nEnables security-audit, logging, etc. as reusable concerns.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:34.128562-08:00","updated_at":"2025-12-25T12:15:53.16092-08:00","closed_at":"2025-12-25T12:15:53.16092-08:00","close_reason":"Aspect composition implemented: compose.aspects field, applied during cooking. Demo: shiny-secure.formula.json","dependencies":[{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:34.130564-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz.2","type":"blocks","created_at":"2025-12-23T18:04:49.898125-08:00","created_by":"daemon"},{"issue_id":"gt-8tmz.5","depends_on_id":"gt-8tmz.6","type":"blocks","created_at":"2025-12-23T18:48:18.802195-08:00","created_by":"daemon"}]} {"id":"gt-8tmz.6","title":"Selection operators: glob, filter, children","description":"Implement selection operators for targeting:\n- step(id) - specific step\n- glob(pattern) - pattern match (*.implement)\n- filter(predicate) - status/output predicates\n- children(step), descendants(step) - tree traversal\n\nUsed by advice, expansion, and aspects for targeting.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T18:04:35.447482-08:00","updated_at":"2025-12-25T12:10:31.184745-08:00","closed_at":"2025-12-25T12:10:31.184745-08:00","close_reason":"Core selection operators implemented: MatchGlob (glob patterns), MatchPointcut (type, label), MatchAnyPointcut. Advanced operators (filter, children, descendants) can be added as needed.","dependencies":[{"issue_id":"gt-8tmz.6","depends_on_id":"gt-8tmz","type":"parent-child","created_at":"2025-12-23T18:04:35.449213-08:00","created_by":"daemon"}]} @@ -740,6 +743,7 @@ {"id":"gt-h1n5","title":"Witness patrol: Add banners and wisp-based execution","description":"Bring Witness patrol up to Deacon's level of sophistication:\n\n## Current state\n- mol-witness-patrol exists (gt-qflq)\n- Basic step definitions\n\n## Needed\n1. **Banners** - Print step banners like Deacon does:\n ```\n ═══════════════════════════════════════════════════════════════\n πŸ‘οΈ POLECAT-SCAN\n Checking polecat health and nudging stale workers\n ═══════════════════════════════════════════════════════════════\n ```\n\n2. **Wisp-based execution** - Spawn patrol as wisp, squash when complete\n3. **Handoff bead attachment** - Witness needs its own handoff bead with attached_molecule\n4. **Loop-or-exit step** - Context-aware cycling like Deacon\n5. **Patrol summary banner** at end of each cycle\n\n## Reference\nSee Deacon patrol implementation in ~/gt/deacon/CLAUDE.md","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T13:19:40.503122-08:00","updated_at":"2025-12-24T00:18:03.016743-08:00","closed_at":"2025-12-23T19:37:33.432323-08:00","close_reason":"Implemented in witness.md.tmpl: banners, wisp-based execution, handoff bead attachment, loop-or-exit, patrol summary","dependencies":[{"issue_id":"gt-h1n5","depends_on_id":"gt-y481","type":"parent-child","created_at":"2025-12-23T13:20:15.684048-08:00","created_by":"daemon"}]} {"id":"gt-h262","title":"bd ready --blockers: prioritize issues that block other work","description":"bd ready should prioritize issues that are blocking other work.\n\n**From VC**: Blocker-first prioritization in GetReadyWork(). ~100 lines.\nAlgorithm: baseline-failure first, then discovered:blocker, then by priority.\n\n**Gas Town implementation**: CLI flag or default behavior:\n```bash\nbd ready --blockers-first # Or make this default\n```\n\nChecks dependency graph. Issues with many dependents surface first.\n\n**Value**: Unblocks parallelism faster. Critical path gets cleared.\n\n**VC lesson**: Without blocker priority, work can starve on discovered issues.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-20T20:30:18.426957-08:00","updated_at":"2025-12-20T20:30:18.426957-08:00","dependencies":[{"issue_id":"gt-h262","depends_on_id":"gt-zhpa","type":"parent-child","created_at":"2025-12-20T20:30:27.664473-08:00","created_by":"daemon"}]} {"id":"gt-h28m","title":"Deacon patrol banners: visual feedback on atom transitions","description":"Print large ASCII banners when transitioning between patrol atoms.\n\n## Problem\n\nWhen the deacon progresses through patrol atoms (steps), there is no visual feedback.\nThe operator cannot easily see what the deacon is doing without reading the full output.\n\n## Desired Behavior\n\nPrint banners on step start and completion:\n\n INBOX-CHECK - Checking for lifecycle requests, escalations, timers\n INBOX-CHECK COMPLETE - Processed 3 messages, 0 lifecycle requests\n\n## Benefits\n\n1. Scanability: Operator can glance at tmux and see what is happening\n2. Progress tracking: Easy to see where in the patrol loop we are\n3. Debugging: Clear demarcation between steps for troubleshooting\n\n## Implementation Options\n\n1. In deacon CLAUDE.md: Instruct agent to print banners\n2. gt patrol step start/end: Commands that print banners\n3. bd mol step hooks: Automatically on step transitions\n\n## Related\n\n- gt-id36: Deacon Kernel\n- gt-rana: Patrol System","status":"closed","priority":2,"issue_type":"feature","created_at":"2025-12-22T03:04:14.290474-08:00","updated_at":"2025-12-22T14:54:55.972256-08:00","closed_at":"2025-12-22T14:54:55.972256-08:00","close_reason":"Implemented in deacon.md.tmpl - startup banner, step banners with emojis, cycle summary banner. Commit 8f47c92."} +{"id":"gt-h3kqf","title":"Digest: mol-deacon-patrol","description":"Patrol 3: All agents healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:29:05.162519-08:00","updated_at":"2025-12-25T17:29:05.162519-08:00","closed_at":"2025-12-25T17:29:05.162463-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-h3kqf","depends_on_id":"gt-wisp-hxv","type":"parent-child","created_at":"2025-12-25T17:29:05.16328-08:00","created_by":"deacon"}]} {"id":"gt-h5e0","title":"Patrol hygiene: Witness/Refinery/Deacon inbox cleanup","description":"## Summary\nPatrol roles should clean up their inboxes as part of normal operation, not let messages accumulate.\n\n## Witness Patrol Cleanup\n- POLECAT_STARTED: archive after acknowledging\n- POLECAT_DONE: archive after cleanup complete\n- LIFECYCLE requests: archive after processing\n- Keep only: active work, unprocessed requests\n\n## Refinery Patrol Cleanup \n- MR Ready: archive after merge/reject decision\n- Swarm notices: archive after dispatch\n- Keep only: pending MRs in queue\n\n## Deacon Patrol Cleanup\n- Rotate daemon.log when \u003e10MB\n- Prune state.json of dead sessions\n- Archive old daemon logs (gzip, date-suffix)\n\n## Implementation\nEach patrol molecule should have a 'cleanup' phase at end of cycle.\n\n## Related\n- mol-town-shutdown (nuclear cleanup)\n- mol-witness-patrol, mol-refinery-patrol, mol-deacon-patrol","status":"open","priority":1,"issue_type":"feature","created_at":"2025-12-24T17:25:47.860346-08:00","updated_at":"2025-12-24T17:25:47.860346-08:00"} {"id":"gt-h5n","title":"Merge Queue in Beads: Universal chit system for all work","description":"\n\n**Design doc**: docs/merge-queue-design.md","status":"closed","priority":0,"issue_type":"epic","created_at":"2025-12-16T23:01:45.782171-08:00","updated_at":"2025-12-25T02:11:07.534422-08:00","closed_at":"2025-12-25T02:11:07.534422-08:00","close_reason":"Core functionality complete. Remaining P2/P3 children are enhancements that can be tracked independently."} {"id":"gt-h5n.1","title":"MR field parsing: extract structured fields from description","description":"Parse merge-request beads to extract structured fields:\n- branch: source branch name\n- target: target branch (main or integration/xxx)\n- source_issue: the work item being merged\n- worker: who did the work\n- rig: which rig\n- merge_commit: (set on close)\n- close_reason: (set on close)\n\nFields stored in description as YAML block or key: value lines.\nProvide helper functions: ParseMRFields(issue) and SetMRFields(issue, fields).\n\nReference: docs/merge-queue-design.md#merge-request-schema","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-17T13:47:46.682379-08:00","updated_at":"2025-12-18T18:50:42.591901-08:00","closed_at":"2025-12-18T11:46:18.970805-08:00","dependencies":[{"issue_id":"gt-h5n.1","depends_on_id":"gt-h5n","type":"parent-child","created_at":"2025-12-17T13:47:46.682911-08:00","created_by":"daemon"}]} @@ -879,6 +883,7 @@ {"id":"gt-k1lr.7","title":"Update documentation for new config architecture","description":"Update docs to reflect new structure:\n- docs/architecture.md: Directory structure section\n- CLAUDE.md files: Config references\n- Add docs/configuration.md with full reference","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T01:02:27.104869-08:00","updated_at":"2025-12-22T01:32:56.916862-08:00","closed_at":"2025-12-22T01:32:56.916862-08:00","close_reason":"Updated architecture.md and hq.md with three-tier config model","dependencies":[{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:27.106351-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr.1","type":"blocks","created_at":"2025-12-22T01:02:37.609785-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.7","depends_on_id":"gt-k1lr.3","type":"blocks","created_at":"2025-12-22T01:02:37.680026-08:00","created_by":"daemon"}]} {"id":"gt-k1lr.8","title":"Remove .gastown/ after migration complete","description":"Final cleanup:\n- Remove .gastown/ directories at town and rig levels\n- Remove daemon/ and deacon/ directories (replaced by .runtime/)\n- Update .gitignore to remove old patterns\n- Verify all tests pass with new structure","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-22T01:02:28.43634-08:00","updated_at":"2025-12-22T01:30:37.872957-08:00","closed_at":"2025-12-22T01:30:37.872957-08:00","close_reason":"Doctor checks implemented and auto-fixed legacy directories","dependencies":[{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:28.437853-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr.7","type":"blocks","created_at":"2025-12-22T01:02:37.466318-08:00","created_by":"daemon"},{"issue_id":"gt-k1lr.8","depends_on_id":"gt-k1lr.6","type":"blocks","created_at":"2025-12-22T01:02:37.539854-08:00","created_by":"daemon"}]} {"id":"gt-k2aj","title":"Digest: mol-deacon-patrol","description":"Patrol complete: 0 mail, Mayor+2 witnesses+2 refineries healthy, 3 polecats working (gastown), no orphans, gc N/A","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-22T20:40:02.581522-08:00","updated_at":"2025-12-22T20:40:02.581522-08:00","closed_at":"2025-12-22T20:40:02.581496-08:00","close_reason":"Squashed from 5 wisps"} +{"id":"gt-k2ilq","title":"Digest: mol-deacon-patrol","description":"Patrol 7: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:48:55.379716-08:00","updated_at":"2025-12-25T17:48:55.379716-08:00","closed_at":"2025-12-25T17:48:55.379663-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-k2ilq","depends_on_id":"gt-wisp-l0q","type":"parent-child","created_at":"2025-12-25T17:48:55.380465-08:00","created_by":"deacon"}]} {"id":"gt-k7x0","title":"Merge: gt-h5n.5","description":"branch: polecat/Scabrous\ntarget: main\nsource_issue: gt-h5n.5\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-19T14:53:42.318338-08:00","updated_at":"2025-12-19T14:54:35.021214-08:00","closed_at":"2025-12-19T14:54:35.021214-08:00"} {"id":"gt-k8u5t","title":"Digest: mol-deacon-patrol","description":"Patrol 17: All healthy","status":"tombstone","priority":2,"issue_type":"task","created_at":"2025-12-25T13:33:42.064804-08:00","updated_at":"2025-12-25T15:52:58.107047-08:00","close_reason":"Squashed from 8 wisps","deleted_at":"2025-12-25T15:52:58.107047-08:00","deleted_by":"daemon","delete_reason":"delete","original_type":"task"} {"id":"gt-k9185","title":"Digest: mol-deacon-patrol","description":"Patrol cycle 2: quick scan, no changes","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T11:15:18.561034-08:00","updated_at":"2025-12-25T11:15:18.561034-08:00","closed_at":"2025-12-25T11:15:18.561005-08:00","close_reason":"Squashed from 8 wisps"} @@ -1047,6 +1052,7 @@ {"id":"gt-ob0t.1","title":"Test Polecat Arm","description":"Test child for bonding pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T12:46:15.421667-08:00","updated_at":"2025-12-25T01:33:00.68133-08:00","closed_at":"2025-12-25T01:33:00.68133-08:00","close_reason":"Test pollution cleanup","dependencies":[{"issue_id":"gt-ob0t.1","depends_on_id":"gt-ob0t","type":"parent-child","created_at":"2025-12-24T12:46:15.422135-08:00","created_by":"daemon"}]} {"id":"gt-obxz","title":"Digest: mol-deacon-patrol","description":"Patrol #9","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T22:23:37.705161-08:00","updated_at":"2025-12-24T22:23:37.705161-08:00","closed_at":"2025-12-24T22:23:37.705133-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-oc2","title":"Daemon: proper rig discovery","description":"Currently discovers rigs by scanning tmux session names for gt-*-witness pattern. Should instead:\n- Read rigs from mayor/rigs.json\n- Or scan town directory for .gastown subdirs\n- Handle rigs that exist but don't have running witnesses","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-18T13:38:15.825299-08:00","updated_at":"2025-12-19T17:22:52.554474-08:00","closed_at":"2025-12-19T16:28:39.497935-08:00","dependencies":[{"issue_id":"gt-oc2","depends_on_id":"gt-99m","type":"blocks","created_at":"2025-12-18T13:38:26.826697-08:00","created_by":"daemon"}]} +{"id":"gt-occdx","title":"Digest: mol-deacon-patrol","description":"Patrol 6: All healthy, no messages","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:43:56.478866-08:00","updated_at":"2025-12-25T17:43:56.478866-08:00","closed_at":"2025-12-25T17:43:56.47882-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-occdx","depends_on_id":"gt-wisp-xrg","type":"parent-child","created_at":"2025-12-25T17:43:56.479571-08:00","created_by":"deacon"}]} {"id":"gt-od1g","title":"Mail inbox from witness/refinery dirs shows Mayor inbox","description":"When running `gt mail inbox` from the witness or refinery directories, it shows the Mayor's inbox instead of the agent's own inbox.\n\nReproduction:\n```\n$ cd ~/gt/beads/witness \u0026\u0026 gt mail inbox\nπŸ“¬ Inbox: mayor/ (1 messages, 1 unread)\n ● 🀝 HANDOFF: Swarm session complete...\n```\n\nExpected: Should show beads/witness inbox\n\nLikely cause: The cwd-based identity resolution isn't recognizing witness/refinery as valid mail identities, so it falls back to Mayor.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T20:29:58.817388-08:00","updated_at":"2025-12-23T20:29:58.817388-08:00"} {"id":"gt-odfr","title":"Add WaitsFor parsing to molecule steps","description":"Add WaitsFor field to MoleculeStep struct and parse 'WaitsFor: all-children' (and future variants) from molecule descriptions.\n\nThis enables:\n- mol progress to understand fanout patterns\n- Validation that WaitsFor references valid constructs\n- Future automated orchestration\n\nImplementation:\n1. Add WaitsFor []string to MoleculeStep struct\n2. Add waitsForLineRegex to parse 'WaitsFor: ...' lines\n3. Update ParseMoleculeSteps to extract WaitsFor\n4. Update tests","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T21:35:55.004767-08:00","updated_at":"2025-12-23T21:41:27.539959-08:00","closed_at":"2025-12-23T21:41:27.539959-08:00","close_reason":"Implemented WaitsFor parsing with tests"} {"id":"gt-odvf","title":"Document bd mol bond/squash/burn CLI","description":"Create CLI reference documentation for molecule commands:\n\n## bd mol bond\n\nInstantiate a proto into a runnable molecule.\n\n```bash\nbd mol bond \u003cproto-id\u003e [--wisp] [--assignee=\u003caddr\u003e]\n```\n\n- Default: creates a Mol (durable, in main beads)\n- --wisp: creates a Wisp (ephemeral, in .beads-ephemeral/)\n- --assignee: who will execute this molecule\n\n## bd mol squash\n\nComplete a molecule and generate digest.\n\n```bash\nbd mol squash \u003cmol-id\u003e --summary='...'\n```\n\n- For Mol: creates digest in git history\n- For Wisp: evaporates (no permanent record)\n- --summary: required summary of what was accomplished\n\n## bd mol burn\n\nAbandon a molecule without completing.\n\n```bash\nbd mol burn \u003cmol-id\u003e [--reason='...']\n```\n\n- Discards molecule state\n- No digest created\n- Use when molecule is no longer needed","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T16:33:06.462105-08:00","updated_at":"2025-12-23T02:14:23.810794-08:00","closed_at":"2025-12-23T02:14:23.810794-08:00","close_reason":"Already documented in docs/molecules.md lines 70-235","dependencies":[{"issue_id":"gt-odvf","depends_on_id":"gt-62hm","type":"blocks","created_at":"2025-12-21T16:33:17.530156-08:00","created_by":"daemon"}]} @@ -1081,6 +1087,7 @@ {"id":"gt-pedt","title":"Digest: mol-deacon-patrol","description":"Patrol 9: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:58:49.010496-08:00","updated_at":"2025-12-24T20:58:49.010496-08:00","closed_at":"2025-12-24T20:58:49.010457-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-pia6","title":"Merge: gt-h6eq.4","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: gt-h6eq.4\nrig: gastown","status":"closed","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T12:13:07.092756-08:00","updated_at":"2025-12-23T12:22:23.461996-08:00","closed_at":"2025-12-23T12:22:23.461996-08:00","close_reason":"Merged to main in gt-h6eq swarm"} {"id":"gt-pio","title":"Plugin: merge-oracle (merge queue analysis)","description":"Example plugin that analyzes changesets before Refinery processes them. Builds overlap graph, classifies disjointness (parallel-safe vs needs-sequencing), uses LLM for semantic complexity, identifies high-risk patterns. Based on merge-orchestration proposal. See docs/architecture.md.","status":"open","priority":3,"issue_type":"feature","created_at":"2025-12-15T22:53:04.027073-08:00","updated_at":"2025-12-15T23:17:06.507108-08:00","dependencies":[{"issue_id":"gt-pio","depends_on_id":"gt-axz","type":"blocks","created_at":"2025-12-15T22:53:17.507459-08:00","created_by":"daemon"}]} +{"id":"gt-pj222","title":"Digest: mol-deacon-patrol","description":"Patrol 2: All agents healthy, no messages, no orphans","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-25T17:26:34.954324-08:00","updated_at":"2025-12-25T17:26:34.954324-08:00","closed_at":"2025-12-25T17:26:34.954274-08:00","close_reason":"Squashed from 8 wisps","dependencies":[{"issue_id":"gt-pj222","depends_on_id":"gt-wisp-5me","type":"parent-child","created_at":"2025-12-25T17:26:34.95505-08:00","created_by":"deacon"}]} {"id":"gt-plcg","title":"Add --account flag to gt spawn and gt crew attach","description":"Add --account=\u003chandle\u003e flag. Precedence: GT_ACCOUNT env \u003e --account flag \u003e default from config.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:23.832188-08:00","updated_at":"2025-12-23T04:04:18.491584-08:00","closed_at":"2025-12-23T04:04:18.491584-08:00","close_reason":"Added --account flag to gt spawn and gt crew at commands","dependencies":[{"issue_id":"gt-plcg","depends_on_id":"gt-58tu","type":"blocks","created_at":"2025-12-23T03:24:34.984336-08:00","created_by":"daemon"}]} {"id":"gt-pln0","title":"Digest: mol-deacon-patrol","description":"Patrol 6: OK","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-24T20:57:32.057118-08:00","updated_at":"2025-12-24T20:57:32.057118-08:00","closed_at":"2025-12-24T20:57:32.057089-08:00","close_reason":"Squashed from 8 wisps"} {"id":"gt-pmef","title":"Test Patrol Parent","description":"Test parent for Christmas Ornament pattern","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:04:44.376339-08:00","updated_at":"2025-12-25T01:33:01.077971-08:00","closed_at":"2025-12-25T01:33:01.077971-08:00","close_reason":"Test pollution cleanup"}