From 169f23258bc95a2be0b0e3c7963d3bee22ea9736 Mon Sep 17 00:00:00 2001 From: Steve Yegge Date: Tue, 23 Dec 2025 22:43:46 -0800 Subject: [PATCH] bd sync: 2025-12-23 22:43:46 --- .beads/issues.jsonl | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 543fb8e8..692b030f 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -142,13 +142,13 @@ {"id":"gt-58it","title":"bd sync --from-main: fresh sync from main branch","description":"## Summary\n\nAdd `--from-main` flag to `bd sync` to pull fresh beads state from main branch.\n\n## Use Case\n\nWhen starting a patrol or fresh session, agent wants clean beads state:\n```bash\nbd sync --from-main # Pull latest from origin/main, ignore local changes\n```\n\n## Behavior\n\n1. Fetch origin/main\n2. Reset local .beads/ to match origin/main\n3. Rebuild SQLite DB from fresh JSONL\n\nUseful for polecats/crew starting work to avoid stale state.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-23T01:19:14.352299-08:00","updated_at":"2025-12-23T01:19:14.352299-08:00"} {"id":"gt-58tu","title":"Add accounts.yaml config parsing to gt","description":"Parse ~/gt/mayor/accounts.yaml with structure: accounts map (handle -\u003e email, config_dir) and default field. This is the foundational config that other account features depend on. Location follows existing town-level config pattern in mayor/.","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T03:24:16.934245-08:00","updated_at":"2025-12-23T03:57:04.069364-08:00","closed_at":"2025-12-23T03:57:04.069364-08:00","close_reason":"Implemented accounts.json config parsing with types, loader, validation, and tests"} {"id":"gt-59p","title":"Design GGT prompt architecture","description":"Audit PGT prompts and design canonical prompt system for GGT. Create docs/prompts.md with inventory, gap analysis, and Witness prompt design.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-16T00:46:16.916031-08:00","updated_at":"2025-12-16T00:47:38.105395-08:00","closed_at":"2025-12-16T00:47:38.105395-08:00"} -{"id":"gt-59zd","title":"Molecule-based Witness Patrol","description":"Wire up mol-witness-patrol as a tracking ledger for the Go-based witness.\n\n## Key Insight\n\nThe molecule is NOT an executor - it's a **tracking structure**. The existing\nGo code in internal/witness/manager.go continues to run the patrol loop.\nThe molecule instance provides visibility, audit trail, and polecat tracking.\n\n## Current State\n\n- Witness runs as Go code with direct patrol logic\n- mol-witness-patrol and mol-polecat-arm exist as molecule definitions\n- gt mol bond creates dynamic children\n- No molecule tracking of actual witness operations\n\n## Target State\n\n1. When witness starts → instantiate mol-witness-patrol on its hook\n2. When Go code discovers polecat → bond mol-polecat-arm child\n3. When polecat completes/dies → close that arm issue\n4. gt mol progress shows current patrol state\n5. Molecule survives wisp burns via handoff bead\n\n## Benefits\n\n- Visibility: gt mol status gastown/witness shows active arms\n- Audit: Each polecat inspection is a trackable issue\n- Consistency: Same tracking model as polecats with molecules\n- Progress: gt mol progress works for witness too\n\n## Non-Goals\n\n- NOT replacing Go code with Claude session\n- NOT running molecule steps as prompts\n- NOT requiring Claude for witness operation","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-23T22:19:33.06695-08:00","updated_at":"2025-12-23T22:21:33.83291-08:00"} -{"id":"gt-59zd.1","title":"mol sling command: attach molecule to agent hook","description":"Add `gt mol sling \u003cmolecule-id\u003e` command to attach a molecule to the current agent's hook.\n\n## Behavior\n\n```bash\ngt mol sling mol-witness-patrol\n```\n\n1. Find agent identity from cwd (witness, polecat, crew, etc.)\n2. Find or create agent's handoff bead\n3. Attach molecule to handoff bead (attached_molecule field)\n4. Create root issue for this molecule instance\n5. Instantiate molecule steps under the root\n\n## Difference from mol attach\n\n- `mol attach` attaches to an existing pinned bead\n- `mol sling` creates a fresh instance for execution\n\n## Output\n\n```\n🧬 Slung mol-witness-patrol on gastown/witness\n Instance: gt-xyz (9 steps)\n First step: inbox-check\n```\n\n## Implementation\n\n- Reuse InstantiateMolecule from molecule.go\n- Create wrapper issue for the instance\n- Set attached_molecule on handoff bead","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:45.161282-08:00","updated_at":"2025-12-23T22:21:44.041626-08:00","closed_at":"2025-12-23T22:21:44.041626-08:00","close_reason":"Superseded by simpler design - mol sling not needed, witness instantiates patrol directly","dependencies":[{"issue_id":"gt-59zd.1","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:45.161784-08:00","created_by":"daemon"}]} -{"id":"gt-59zd.2","title":"mol progress: track dynamically bonded children","description":"Extend `gt mol progress` to show dynamically bonded children.\n\n## Current Behavior\n\n```\ngt mol progress gt-abc\n```\n\nShows progress through pre-defined steps from InstantiateMolecule.\n\n## New Behavior\n\nAlso show dynamically bonded children:\n\n```\nšŸ“Š Progress: mol-witness-patrol (gt-abc)\n\n Steps (9):\n āœ“ inbox-check\n āœ“ check-refinery\n āœ“ load-state\n ◐ survey-workers (bonded 3 children)\n ā—‹ aggregate (WaitsFor: all-children)\n ā—‹ save-state\n ā—‹ generate-summary\n ā—‹ context-check\n ā—‹ burn-or-loop\n\n Bonded Children (3):\n āœ“ arm-toast (5/5 steps)\n ◐ arm-nux (3/5 steps)\n ā—‹ arm-furiosa (0/5 steps)\n\n Progress: 4/9 steps, 3 arms (1 complete, 1 in-progress, 1 pending)\n```\n\n## Implementation\n\n1. Find children with bonded_to: \u003cparent-id\u003e in description\n2. Recursively get progress for each bonded child\n3. Aggregate into parent progress display","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:58.346108-08:00","updated_at":"2025-12-23T22:21:45.06843-08:00","closed_at":"2025-12-23T22:21:45.06843-08:00","close_reason":"Will be part of witness integration, not separate task","dependencies":[{"issue_id":"gt-59zd.2","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:58.346575-08:00","created_by":"daemon"}]} -{"id":"gt-59zd.3","title":"Witness: instantiate mol-witness-patrol on start","description":"When witness starts, create a mol-witness-patrol instance and pin it to the witness hook.\n\n## Changes to witness/manager.go\n\nIn Start() or run():\n1. Check if patrol instance exists on hook\n2. If not, call beads.InstantiateMolecule(mol-witness-patrol, handoffBead)\n3. Store instance ID for later reference\n\n## Hook Structure\n\nThe witness handoff bead gets:\n- attached_molecule: gt-patrol-xyz\n- attached_at: timestamp\n\n## Idempotency\n\nIf patrol already exists (from previous session), reuse it.\nDon't create duplicate instances on restart.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:21:55.247815-08:00","updated_at":"2025-12-23T22:28:08.650718-08:00","closed_at":"2025-12-23T22:28:08.650718-08:00","close_reason":"Implemented ensurePatrolInstance in witness manager. Creates mol-witness-patrol tracking instance on start, reuses existing if present.","dependencies":[{"issue_id":"gt-59zd.3","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:21:55.248279-08:00","created_by":"daemon"}]} -{"id":"gt-59zd.4","title":"Witness: bond mol-polecat-arm when discovering polecat","description":"When witness discovers a polecat during healthCheck(), bond a mol-polecat-arm child.\n\n## Changes to witness/manager.go\n\nIn healthCheck() when iterating polecats:\n1. Check if arm already exists for this polecat (arm-{name})\n2. If not, call: gt mol bond mol-polecat-arm --parent=$PATROL_ID --ref=arm-{name} --var polecat_name={name} --var rig={rig}\n3. Track arm issue ID in handoff state\n\n## Arm Lifecycle\n\n- Created when polecat first seen\n- Updated as inspection happens (nudges, state changes)\n- Closed when polecat cleaned up\n\n## Deduplication\n\nCheck handoffState.WorkerStates[name].ArmID before creating.\nNeeds: gt-59zd.3","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:22:05.718229-08:00","updated_at":"2025-12-23T22:31:02.073573-08:00","closed_at":"2025-12-23T22:31:02.073573-08:00","close_reason":"Implemented ensurePolecatArm in witness manager. Bonds mol-polecat-arm to patrol instance for each discovered polecat, stores ArmID in handoff state.","dependencies":[{"issue_id":"gt-59zd.4","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:05.718706-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.4","depends_on_id":"gt-59zd.3","type":"blocks","created_at":"2025-12-23T22:22:33.154977-08:00","created_by":"daemon"}]} -{"id":"gt-59zd.5","title":"Witness: close arm when polecat completes","description":"When witness cleans up a polecat, close its mol-polecat-arm issue.\n\n## Changes to witness/manager.go\n\nIn cleanupPolecat():\n1. Get arm ID from handoffState.WorkerStates[name].ArmID\n2. If exists, call: bd close {armID} --reason='polecat cleaned up'\n3. Clear ArmID from handoff state\n\n## Arm Close Reasons\n\n- 'polecat cleaned up' - normal completion\n- 'polecat killed - stuck' - killed due to inactivity\n- 'polecat killed - escalated' - killed after Mayor escalation\n\n## State Update\n\nThe arm's description could be updated with final outcome before closing.\nNeeds: gt-59zd.4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:22:15.542735-08:00","updated_at":"2025-12-23T22:32:11.617111-08:00","closed_at":"2025-12-23T22:32:11.617111-08:00","close_reason":"Implemented closePolecatArm in witness manager. Closes mol-polecat-arm tracking issue when polecat is cleaned up.","dependencies":[{"issue_id":"gt-59zd.5","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:15.543212-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.5","depends_on_id":"gt-59zd.4","type":"blocks","created_at":"2025-12-23T22:22:33.241115-08:00","created_by":"daemon"}]} -{"id":"gt-59zd.6","title":"mol progress: display bonded children in output","description":"Extend gt mol progress to show dynamically bonded children.\n\n## Current Output\n\nShows steps from original instantiation only.\n\n## New Output\n\nAlso show bonded children:\n\n Bonded Children (3):\n āœ“ arm-toast (closed)\n ◐ arm-nux (open)\n ā—‹ arm-furiosa (open)\n\n## Implementation\n\n1. Query for children with bonded_to: {parent-id} in description\n2. For each bonded child, show status (open/closed)\n3. Optionally show progress through child's steps\nNeeds: gt-59zd.5","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T22:22:28.008426-08:00","updated_at":"2025-12-23T22:22:28.008426-08:00","dependencies":[{"issue_id":"gt-59zd.6","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:28.008932-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.6","depends_on_id":"gt-59zd.5","type":"blocks","created_at":"2025-12-23T22:22:33.32542-08:00","created_by":"daemon"}]} +{"id":"gt-59zd","title":"Molecule-based Witness Patrol","description":"Wire up mol-witness-patrol as a tracking ledger for the Go-based witness.\n\n## Key Insight\n\nThe molecule is NOT an executor - it's a **tracking structure**. The existing\nGo code in internal/witness/manager.go continues to run the patrol loop.\nThe molecule instance provides visibility, audit trail, and polecat tracking.\n\n## Current State\n\n- Witness runs as Go code with direct patrol logic\n- mol-witness-patrol and mol-polecat-arm exist as molecule definitions\n- gt mol bond creates dynamic children\n- No molecule tracking of actual witness operations\n\n## Target State\n\n1. When witness starts → instantiate mol-witness-patrol on its hook\n2. When Go code discovers polecat → bond mol-polecat-arm child\n3. When polecat completes/dies → close that arm issue\n4. gt mol progress shows current patrol state\n5. Molecule survives wisp burns via handoff bead\n\n## Benefits\n\n- Visibility: gt mol status gastown/witness shows active arms\n- Audit: Each polecat inspection is a trackable issue\n- Consistency: Same tracking model as polecats with molecules\n- Progress: gt mol progress works for witness too\n\n## Non-Goals\n\n- NOT replacing Go code with Claude session\n- NOT running molecule steps as prompts\n- NOT requiring Claude for witness operation","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-23T22:19:33.06695-08:00","updated_at":"2025-12-23T22:36:17.494482-08:00","closed_at":"2025-12-23T22:36:17.494482-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits."} +{"id":"gt-59zd.1","title":"mol sling command: attach molecule to agent hook","description":"Add `gt mol sling \u003cmolecule-id\u003e` command to attach a molecule to the current agent's hook.\n\n## Behavior\n\n```bash\ngt mol sling mol-witness-patrol\n```\n\n1. Find agent identity from cwd (witness, polecat, crew, etc.)\n2. Find or create agent's handoff bead\n3. Attach molecule to handoff bead (attached_molecule field)\n4. Create root issue for this molecule instance\n5. Instantiate molecule steps under the root\n\n## Difference from mol attach\n\n- `mol attach` attaches to an existing pinned bead\n- `mol sling` creates a fresh instance for execution\n\n## Output\n\n```\n🧬 Slung mol-witness-patrol on gastown/witness\n Instance: gt-xyz (9 steps)\n First step: inbox-check\n```\n\n## Implementation\n\n- Reuse InstantiateMolecule from molecule.go\n- Create wrapper issue for the instance\n- Set attached_molecule on handoff bead","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:45.161282-08:00","updated_at":"2025-12-23T22:36:17.505507-08:00","closed_at":"2025-12-23T22:36:17.505507-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.1","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:45.161784-08:00","created_by":"daemon"}]} +{"id":"gt-59zd.2","title":"mol progress: track dynamically bonded children","description":"Extend `gt mol progress` to show dynamically bonded children.\n\n## Current Behavior\n\n```\ngt mol progress gt-abc\n```\n\nShows progress through pre-defined steps from InstantiateMolecule.\n\n## New Behavior\n\nAlso show dynamically bonded children:\n\n```\nšŸ“Š Progress: mol-witness-patrol (gt-abc)\n\n Steps (9):\n āœ“ inbox-check\n āœ“ check-refinery\n āœ“ load-state\n ◐ survey-workers (bonded 3 children)\n ā—‹ aggregate (WaitsFor: all-children)\n ā—‹ save-state\n ā—‹ generate-summary\n ā—‹ context-check\n ā—‹ burn-or-loop\n\n Bonded Children (3):\n āœ“ arm-toast (5/5 steps)\n ◐ arm-nux (3/5 steps)\n ā—‹ arm-furiosa (0/5 steps)\n\n Progress: 4/9 steps, 3 arms (1 complete, 1 in-progress, 1 pending)\n```\n\n## Implementation\n\n1. Find children with bonded_to: \u003cparent-id\u003e in description\n2. Recursively get progress for each bonded child\n3. Aggregate into parent progress display","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:19:58.346108-08:00","updated_at":"2025-12-23T22:36:17.515471-08:00","closed_at":"2025-12-23T22:36:17.515471-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.2","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:19:58.346575-08:00","created_by":"daemon"}]} +{"id":"gt-59zd.3","title":"Witness: instantiate mol-witness-patrol on start","description":"When witness starts, create a mol-witness-patrol instance and pin it to the witness hook.\n\n## Changes to witness/manager.go\n\nIn Start() or run():\n1. Check if patrol instance exists on hook\n2. If not, call beads.InstantiateMolecule(mol-witness-patrol, handoffBead)\n3. Store instance ID for later reference\n\n## Hook Structure\n\nThe witness handoff bead gets:\n- attached_molecule: gt-patrol-xyz\n- attached_at: timestamp\n\n## Idempotency\n\nIf patrol already exists (from previous session), reuse it.\nDon't create duplicate instances on restart.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:21:55.247815-08:00","updated_at":"2025-12-23T22:36:17.525535-08:00","closed_at":"2025-12-23T22:36:17.525535-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.3","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:21:55.248279-08:00","created_by":"daemon"}]} +{"id":"gt-59zd.4","title":"Witness: bond mol-polecat-arm when discovering polecat","description":"When witness discovers a polecat during healthCheck(), bond a mol-polecat-arm child.\n\n## Changes to witness/manager.go\n\nIn healthCheck() when iterating polecats:\n1. Check if arm already exists for this polecat (arm-{name})\n2. If not, call: gt mol bond mol-polecat-arm --parent=$PATROL_ID --ref=arm-{name} --var polecat_name={name} --var rig={rig}\n3. Track arm issue ID in handoff state\n\n## Arm Lifecycle\n\n- Created when polecat first seen\n- Updated as inspection happens (nudges, state changes)\n- Closed when polecat cleaned up\n\n## Deduplication\n\nCheck handoffState.WorkerStates[name].ArmID before creating.\nNeeds: gt-59zd.3","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:22:05.718229-08:00","updated_at":"2025-12-23T22:36:17.535641-08:00","closed_at":"2025-12-23T22:36:17.535641-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.4","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:05.718706-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.4","depends_on_id":"gt-59zd.3","type":"blocks","created_at":"2025-12-23T22:22:33.154977-08:00","created_by":"daemon"}]} +{"id":"gt-59zd.5","title":"Witness: close arm when polecat completes","description":"When witness cleans up a polecat, close its mol-polecat-arm issue.\n\n## Changes to witness/manager.go\n\nIn cleanupPolecat():\n1. Get arm ID from handoffState.WorkerStates[name].ArmID\n2. If exists, call: bd close {armID} --reason='polecat cleaned up'\n3. Clear ArmID from handoff state\n\n## Arm Close Reasons\n\n- 'polecat cleaned up' - normal completion\n- 'polecat killed - stuck' - killed due to inactivity\n- 'polecat killed - escalated' - killed after Mayor escalation\n\n## State Update\n\nThe arm's description could be updated with final outcome before closing.\nNeeds: gt-59zd.4","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-23T22:22:15.542735-08:00","updated_at":"2025-12-23T22:36:17.545922-08:00","closed_at":"2025-12-23T22:36:17.545922-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.5","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:15.543212-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.5","depends_on_id":"gt-59zd.4","type":"blocks","created_at":"2025-12-23T22:22:33.241115-08:00","created_by":"daemon"}]} +{"id":"gt-59zd.6","title":"mol progress: display bonded children in output","description":"Extend gt mol progress to show dynamically bonded children.\n\n## Current Output\n\nShows steps from original instantiation only.\n\n## New Output\n\nAlso show bonded children:\n\n Bonded Children (3):\n āœ“ arm-toast (closed)\n ◐ arm-nux (open)\n ā—‹ arm-furiosa (open)\n\n## Implementation\n\n1. Query for children with bonded_to: {parent-id} in description\n2. For each bonded child, show status (open/closed)\n3. Optionally show progress through child's steps\nNeeds: gt-59zd.5","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T22:22:28.008426-08:00","updated_at":"2025-12-23T22:36:17.55625-08:00","closed_at":"2025-12-23T22:36:17.55625-08:00","close_reason":"CANCELLED: Wrong architecture. Go-based witness patrol with molecule-as-tracking-ledger is backwards. Claude session executes mol steps directly - the mol IS the executor, not bookkeeping. Also: subtasks were hallucinated as 'done' without actual code commits.","dependencies":[{"issue_id":"gt-59zd.6","depends_on_id":"gt-59zd","type":"parent-child","created_at":"2025-12-23T22:22:28.008932-08:00","created_by":"daemon"},{"issue_id":"gt-59zd.6","depends_on_id":"gt-59zd.5","type":"blocks","created_at":"2025-12-23T22:22:33.32542-08:00","created_by":"daemon"}]} {"id":"gt-5af","title":"Deacon: Hierarchical health-check orchestrator","description":"Replace daemon heartbeats with Deacon - an AI agent that keeps Gas Town running.\n\n## Core Concept\n\nThe Deacon is a **Claude agent** (not just a Go process) that:\n- Lives at town root in gt-deacon session\n- Has its own mailbox (deacon/ identity in town beads)\n- Is poked by a minimal Go daemon every ~60s (if idle)\n- Monitors Mayor and Witnesses proactively\n- Handles lifecycle requests (restart/cycle) from Mayor, Witnesses, AND Crew\n\n## Architecture\n\n```\nMinimal Go Daemon (just watches Deacon)\n |\n v\n Deacon (Claude agent)\n |\n +----+----+\n v v\n Mayor Witnesses --\u003e Polecats (Witness-managed)\n | |\n +----+----+\n |\n Crew (lifecycle only, not monitored)\n```\n\n## Deacon Responsibilities\n\n**Proactive monitoring:**\n- Mayor health (tmux session, keepalive freshness)\n- Witness health (tmux sessions, keepalive freshness)\n\n**Reactive lifecycle:**\n- Process restart/cycle requests from Mayor, Witnesses, Crew\n- Kill session, create new, prime, verify startup\n\n**Escalation:**\n- Mail human (configurable) if issues can't be resolved\n\n## Key Files\n\n- ~/gt/DEACON.md - Role context\n- ~/gt/deacon/ - State directory\n - heartbeat.json - Written each wake cycle (daemon checks this)\n - state.json - Health tracking, last scan results\n- ~/gt/.beads/ - Town beads with deacon/ mail identity\n\n## Wake Cycle\n\n1. Write heartbeat (prevents daemon from poking)\n2. Check mail (lifecycle requests)\n3. Quick health scan (Mayor, Witnesses)\n4. Process lifecycle requests\n5. Remediate unhealthy agents\n6. Update state\n\n## Session Patterns\n\n- Deacon: gt-deacon\n- Mayor: gt-mayor\n- Witness: gt-\u003crig\u003e-witness\n- Crew: gt-\u003crig\u003e-\u003cname\u003e (e.g., gt-gastown-max)\n\n## Relation to Policy Beads\n\nFuture: Deacon behavior configurable via policy beads (gt-3zw).\nInitial implementation uses sensible defaults.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-18T18:32:28.083305-08:00","updated_at":"2025-12-20T21:00:03.948543-08:00","closed_at":"2025-12-20T20:40:28.64361-08:00","dependencies":[{"issue_id":"gt-5af","depends_on_id":"gt-3zw","type":"blocks","created_at":"2025-12-18T18:32:36.617594-08:00","created_by":"daemon"}]} {"id":"gt-5af.1","title":"Create DEACON.md role context","description":"Create ~/gt/DEACON.md with the Deacon's role context, wake cycle instructions, and command reference. Model after existing CLAUDE.md for Mayor.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T17:13:22.602567-08:00","updated_at":"2025-12-19T17:30:27.897108-08:00","closed_at":"2025-12-19T17:30:27.897108-08:00","dependencies":[{"issue_id":"gt-5af.1","depends_on_id":"gt-5af","type":"parent-child","created_at":"2025-12-19T17:13:22.605373-08:00","created_by":"daemon"}]} {"id":"gt-5af.2","title":"Add gt deacon start/stop/status commands","description":"Add CLI commands: gt deacon start (spawn gt-deacon session), gt deacon stop (kill session), gt deacon status (show health state). Similar to gt mayor commands.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-19T17:13:26.617077-08:00","updated_at":"2025-12-19T17:25:12.114616-08:00","closed_at":"2025-12-19T17:25:12.114616-08:00","dependencies":[{"issue_id":"gt-5af.2","depends_on_id":"gt-5af","type":"parent-child","created_at":"2025-12-19T17:13:26.618912-08:00","created_by":"daemon"}]} @@ -603,6 +603,7 @@ {"id":"gt-kabx","title":"Build context self-check into patrol molecules","description":"Patrol molecules (witness-patrol, refinery-patrol, deacon-patrol) should have\nexplicit context self-check as part of each cycle:\n\nAfter each patrol cycle step:\n- Self-assess context pressure\n- If high: complete current step, then initiate handoff\n- If OK: continue to next cycle\n\nThis could be:\n1. Explicit step in molecule: 'context-check'\n2. Guidance in step instructions: 'Before continuing, assess context...'\n3. Protocol baked into the patrol loop description\n\nThe key is making it unavoidable - not optional guidance that gets ignored.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T01:46:57.067465-08:00","updated_at":"2025-12-23T01:46:57.067465-08:00"} {"id":"gt-kcee","title":"Witness commands: gt witness start/stop/status needed","description":"## Summary\n\nNo `gt witness` command exists. The witness should:\n- Monitor polecats for stuck/idle state\n- Nudge polecats that seem blocked\n- Report status to mayor\n- Handle polecat lifecycle\n\n## Expected Commands\n\n```bash\ngt witness start gastown # Start witness for rig\ngt witness stop gastown # Stop witness\ngt witness status # Show witness status\n```\n\n## Current State\n\n- Witness directory exists: /Users/stevey/gt/gastown/witness/\n- Has state.json but no active process\n- gt status shows 'Witnesses: 0'\n\n## Context\n\nFull polecat flow needs witness monitoring for production use.","status":"closed","priority":1,"issue_type":"feature","created_at":"2025-12-18T21:55:24.079671-08:00","updated_at":"2025-12-19T01:33:49.856942-08:00","closed_at":"2025-12-19T01:33:49.856942-08:00"} {"id":"gt-keqh","title":"self-review","description":"Review your own changes. Look for:\n- Bugs and edge cases\n- Style issues\n- Missing error handling\n- Security concerns\n\nFix any issues found before proceeding.\n\nDepends: implement","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-21T21:56:18.535003-08:00","updated_at":"2025-12-21T21:56:27.51043-08:00","closed_at":"2025-12-21T21:56:27.51043-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-keqh","depends_on_id":"gt-zjqs","type":"parent-child","created_at":"2025-12-21T21:56:18.537323-08:00","created_by":"stevey"},{"issue_id":"gt-keqh","depends_on_id":"gt-pwep","type":"blocks","created_at":"2025-12-21T21:56:18.537857-08:00","created_by":"stevey"}],"wisp":true} +{"id":"gt-kh6q","title":"Remove Go-based witness patrol - Claude session is the executor","description":"## Problem\n\nThe witness has 1370 lines of Go code in internal/witness/manager.go that reimplements what mol-witness-patrol does:\n- healthCheck() - polls polecats\n- autoSpawnForReadyWork() - spawns polecats for ready issues \n- handleStuckPolecat() - nudge logic\n- processShutdownRequests() - cleanup logic\n- verifyPolecatState() - git state checks\n\nThis is backwards. The molecule should drive the work, Claude should execute it.\n\n## The Wrong Architecture (gt-59zd, now cancelled)\n\nThe cancelled gt-59zd tried to use molecules as 'tracking ledgers' for Go code:\n- Go code runs patrol logic\n- Molecule just records what Go did\n- Duplicates work, adds complexity\n\n## The Right Architecture\n\n1. Witness runs as Claude session (via gt sling witness or tmux)\n2. Claude executes mol-witness-patrol steps directly\n3. No Go patrol loop needed\n4. Molecule IS the executor, not bookkeeping\n\n## Scope\n\n1. Remove patrol-related functions from manager.go:\n - run(), checkAndProcess(), healthCheck()\n - handleStuckPolecat(), getNudgeCount(), recordNudge()\n - processShutdownRequests(), verifyPolecatState()\n - autoSpawnForReadyWork(), etc.\n\n2. Keep session management functions:\n - Start(), Stop(), Status() - for starting/stopping Claude session\n - State persistence for session identity\n\n3. Update gt witness commands to use Claude session model\n\n4. Test that mol-witness-patrol executes correctly in Claude session\n\n## Related\n\n- gt-zde4: Fixed Witness CLAUDE.md to emphasize mol-following\n- gt-59zd: Cancelled - wrong architecture\n- witness.md.tmpl: Already rewritten with ZFC principle","status":"open","priority":1,"issue_type":"epic","created_at":"2025-12-23T22:42:13.02343-08:00","updated_at":"2025-12-23T22:42:13.02343-08:00"} {"id":"gt-kjnt","title":"Polecat Mood Plugin (standard)","description":"Standard witness plugin molecule that assesses polecat emotional state.\n\n## Molecule Definition\n\n```json\n{\n \"id\": \"mol-polecat-mood\",\n \"title\": \"Assess mood for {{polecat_name}}\",\n \"description\": \"Analyze captured output and determine emotional state.\\n\\nVars:\\n- {{polecat_name}} - The polecat to assess\\n- {{captured_output}} - Recent tmux capture\\n\\nOutput: gt polecat mood {{polecat_name}} \u003cemoji\u003e\",\n \"labels\": [\"template\", \"plugin\", \"witness\", \"tier:haiku\"],\n \"issue_type\": \"task\"\n}\n```\n\n## Mood Emojis\n\n```\n😺 working Active tool calls, making progress\n😸 productive Completing tasks, tests passing\n🐱 idle Waiting at prompt, no recent activity\n😼 confident Self-reviewing, about to submit\n😿 struggling Repeated errors, test failures\nšŸ™€ stuck No progress for 10+ min\n😽 done Work complete, requesting shutdown\n😾 blocked Explicitly waiting on dependency\n```\n\n## Bonding\n\nDuring witness patrol plugin-run step:\n\n```bash\nbd mol bond mol-polecat-mood $PATROL_WISP \\\n --ref mood-{{polecat_name}} \\\n --var polecat_name=ace \\\n --var captured_output=\"$TMUX_CAPTURE\"\n```\n\n## Installation\n\n```bash\nbd mol install mol-polecat-mood # From Mol Mall\n```\n\n## Customization\n\nFork the molecule and modify description to change assessment criteria or add custom moods. Install your fork to override.","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T16:17:12.841134-08:00","updated_at":"2025-12-23T05:07:39.495061-08:00","dependencies":[{"issue_id":"gt-kjnt","depends_on_id":"gt-u818","type":"blocks","created_at":"2025-12-21T16:17:20.444775-08:00","created_by":"daemon"}]} {"id":"gt-kktj","title":"Patrol agent state.json not updated on activity","description":"Witness and Refinery state.json files show last_active from Dec 19 even though sessions have been running. The state should update each patrol cycle.\n\nEvidence:\n```\n$ cat beads/witness/state.json\n{\"role\": \"witness\", \"last_active\": \"2025-12-19T17:50:00Z\"}\n\n$ cat beads/refinery/state.json \n{\"role\": \"refinery\", \"last_active\": \"2025-12-19T17:50:00Z\"}\n```\n\nExpected: last_active should update each time the agent runs a patrol cycle.\n\nImpact: Can't tell if patrol agents are actually active vs just having an open tmux session.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T20:29:58.515591-08:00","updated_at":"2025-12-23T20:29:58.515591-08:00"} {"id":"gt-kmn","title":"Batch Work System: Integration branch, merge queue, landing","description":"## Overview\n\nThis epic tracks batch work coordination in GGT. Key insight: **work is a stream, not discrete swarms**.\n\nThere are no \"swarm IDs\" - the epic IS the grouping, the merge queue IS the coordination. \"Swarming an epic\" is colloquial for spawning multiple workers on its children.\n\n## Architecture\n\n- **Epics** group related work\n- **Issues** are individual tasks \n- **Dependencies** encode ordering (multi-wave emerges automatically)\n- **Merge queue** coordinates completed work\n- **Workers** process issues independently\n\nSee Key Decision #11 in docs/architecture.md: \"Work is a Stream (No Swarm IDs)\"\n\n## What This Epic Covers\n\n1. Integration branch management for batch merges\n2. Refinery semantic merge processing\n3. Witness landing protocol (cleanup)\n4. Report generation (epic-based, not swarm-ID-based)\n5. Git safety auditing\n6. Work reconciliation\n\n## What Was Removed\n\n- Swarm IDs (sw-1, sw-2, etc.)\n- Per-swarm directories (.gastown/swarms/\u003cid\u003e/)\n- Swarm manifest/state/events files\n- swarm-started/swarm-landed beads\n\nThese were redundant - beads already provides hierarchy, status, dependencies, and history.\n\n## References\n\n- Architecture: docs/architecture.md (Key Decision #11, Multi-Wave Work Processing)\n- PGT: swarm/manager.py, swarm/landing.py (behavioral reference, but ignore swarm ID patterns)","status":"open","priority":0,"issue_type":"epic","created_at":"2025-12-16T00:08:15.339127-08:00","updated_at":"2025-12-16T17:25:33.208338-08:00"}