bd sync: 2025-12-23 12:08:01
This commit is contained in:
@@ -458,6 +458,15 @@
|
||||
{"id":"gt-iep9.7","title":"loop-or-exit","description":"Decision: burn and loop if context low, exit for respawn if context high.","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-21T17:51:04.755716-08:00","updated_at":"2025-12-21T17:51:04.755716-08:00","dependencies":[{"issue_id":"gt-iep9.7","depends_on_id":"gt-iep9","type":"parent-child","created_at":"2025-12-21T17:51:04.75713-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ih0s","title":"Fix blocking bugs (gt-dsfi, gt-n7z7, gm-c6b)","description":"Fix bugs blocking Witness functionality:\n\n1. gt-dsfi: handoff deadlock\n - Polecats hang when trying to exit\n - Blocks shutdown request handler\n\n2. gt-n7z7: refinery foreground race condition \n - Sometimes detects parent as already running\n - Blocks reliable Refinery startup\n\n3. gm-c6b: mail coordination\n - Cross-rig mail should use town-level database\n - Affects Witness \u003c-\u003e Mayor communication\n\nThese should be fixed early as they'll block integration testing.","notes":"Fixed gt-dsfi and gt-n7z7. Issue gm-c6b not found in database.","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-20T03:14:25.803822-08:00","updated_at":"2025-12-20T07:47:50.444171-08:00","closed_at":"2025-12-20T07:47:50.444171-08:00","dependencies":[{"issue_id":"gt-ih0s","depends_on_id":"gt-53w6","type":"parent-child","created_at":"2025-12-20T03:14:37.430142-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-iib","title":"Architecture: Decentralized rig structure with per-rig agents","description":"## Decision\n\nAdopt decentralized architecture where each rig contains all its agents (mayor/, witness/, refinery/, polecats/) rather than centralizing mayor clones at town level.\n\n## Town Level Structure\n\n```\n~/ai/ # Town root\n├── config/ # Town config (VISIBLE, not hidden)\n│ ├── town.json # {\"type\": \"town\"}\n│ ├── rigs.json # Registry of managed rigs\n│ └── federation.json # Wasteland config (future)\n│\n├── mayor/ # Mayor's HOME at town level\n│ ├── CLAUDE.md\n│ ├── mail/inbox.jsonl\n│ └── state.json\n│\n└── \u003crigs\u003e/ # Managed projects\n```\n\n## Rig Level Structure (e.g., wyvern)\n\n```\nwyvern/ # Rig = clone of project repo\n├── .git/info/exclude # Gas Town adds: polecats/ refinery/ witness/ mayor/\n├── .beads/ # Beads (if project uses it)\n├── [project files] # Clean project code on main\n│\n├── polecats/ # Worker clones\n│ └── \u003cname\u003e/ # Each is a git clone\n│\n├── refinery/\n│ ├── rig/ # Refinery's clone\n│ ├── state.json\n│ └── mail/inbox.jsonl\n│\n├── witness/ # NEW: Per-rig pit boss\n│ ├── rig/ # Witness's clone\n│ ├── state.json\n│ └── mail/inbox.jsonl\n│\n└── mayor/\n ├── rig/ # Mayor's clone for this rig\n └── state.json\n```\n\n## Key Decisions\n\n1. **Visible config dir**: `config/` not `.gastown/` (models don't find hidden dirs)\n2. **Witness per-rig**: Each rig has its own Witness (pit boss) with its own clone\n3. **Mayor decentralized**: Mayor's clones live IN each rig at `\u003crig\u003e/mayor/rig/`\n4. **Minimal invasiveness**: Only `.git/info/exclude` modified, no commits to project\n5. **Clone subdir name**: Keep `rig/` for consistency (refinery/rig/, witness/rig/, mayor/rig/)\n\n## Role Detection\n\n- Town root or mayor/ → Mayor (town level)\n- Rig root → Mayor (canonical main)\n- \u003crig\u003e/mayor/rig/ → Mayor (rig-specific)\n- \u003crig\u003e/refinery/rig/ → Refinery\n- \u003crig\u003e/witness/rig/ → Witness\n- \u003crig\u003e/polecats/\u003cname\u003e/ → Polecat\n\n## Migration from PGT\n\n- `mayor/rigs/\u003crig\u003e/` → `\u003crig\u003e/mayor/rig/`\n- `\u003crig\u003e/town/` → eliminated (rig root IS the clone)\n- Add `witness/` to each rig","status":"closed","priority":0,"issue_type":"task","created_at":"2025-12-15T19:21:19.913928-08:00","updated_at":"2025-12-15T19:21:40.461186-08:00","closed_at":"2025-12-15T19:21:40.461186-08:00","dependencies":[{"issue_id":"gt-iib","depends_on_id":"gt-u1j","type":"blocks","created_at":"2025-12-15T19:21:40.374551-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav","title":"Polecat Lifecycle Events: Refinery-Witness Coordination","description":"## Problem\n\nPolecat work completion is currently treated as a single event (MR submission), but the true completion is when the Refinery merges the work. This creates a lifecycle gap:\n\n1. Polecat submits MR → considered \"done\" by Witness\n2. But MR might fail to merge (conflicts, test failures)\n3. No one notifies anyone when merge actually succeeds\n\n## Solution: Two-Event Lifecycle\n\n**Event 1: MR Submitted**\n- `gt mq submit` notifies Witness\n- Witness verifies submission was clean\n- Polecat can go idle (but worktree retained)\n- If submission had issues, Witness can help\n\n**Event 2: MR Merged**\n- Refinery sends `LIFECYCLE: work merged` to Witness\n- Witness updates polecat state to `merged`\n- Worktree now eligible for full cleanup/recycling\n\n## Village Sibling Watch\n\nFor robustness, patrol roles check on their siblings:\n- Refinery checks Witness via `gt peek`\n- Witness checks Refinery via `gt peek`\n- Creates defense in depth - if primary notification fails, someone catches it\n\n## Recovery\n\nIf Refinery misses sending lifecycle notification:\n- Witness polecat-scan can detect: polecat in mr_submitted but MR shows merged\n- Deacon orphan-check can detect: merged MRs with stale polecats","status":"open","priority":2,"issue_type":"epic","created_at":"2025-12-23T12:06:56.746185-08:00","updated_at":"2025-12-23T12:07:07.719057-08:00"}
|
||||
{"id":"gt-ilav.1","title":"Refinery: Add lifecycle-notify step to patrol","description":"After successful merge in handleSuccess(), send lifecycle notification to Witness.\n\n## Implementation\n\n1. Add new mail type: `LIFECYCLE: work merged`\n2. In engineer.go handleSuccess(), after closing MR and source issue:\n ```\n gt mail send \u003crig\u003e/witness -s \"LIFECYCLE: work merged\" -m \"\n Worker: \u003cpolecat\u003e\n MR: \u003cmr-id\u003e\n Issue: \u003csource-issue\u003e\n Commit: \u003cmerge-commit\u003e\n Action: Polecat work merged. Worktree eligible for recycling.\n \"\n ```\n\n3. Update mol-refinery-patrol to include lifecycle-notify step between merge-push and loop-check\n\n## Acceptance\n- Successful merges send mail to Witness\n- Mail includes worker name, MR id, source issue, commit SHA","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:46.715807-08:00","updated_at":"2025-12-23T12:07:46.715807-08:00","dependencies":[{"issue_id":"gt-ilav.1","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:46.716238-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.2","title":"Witness: Handle LIFECYCLE work-merged mail","description":"Witness should process the `LIFECYCLE: work merged` notification from Refinery.\n\n## Implementation\n\n1. In Witness mail processing, add handler for subject containing \"LIFECYCLE: work merged\"\n2. Parse worker name from mail body\n3. Update polecat state to `merged` (new state - see sibling task)\n4. Log completion for metrics\n5. Worktree is now eligible for cleanup on next gc cycle\n\n## Acceptance\n- Witness correctly parses and handles work-merged mail\n- Polecat state updated to merged\n- No action taken if polecat already cleaned up (idempotent)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:47.878019-08:00","updated_at":"2025-12-23T12:07:47.878019-08:00","dependencies":[{"issue_id":"gt-ilav.2","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:47.880327-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.3","title":"MQ Submit: Notify Witness on MR submission","description":"When `gt mq submit` is run, notify the Witness so it can verify the submission.\n\n## Implementation\n\n1. In mq_submit.go after successful MR creation:\n ```\n gt mail send \u003crig\u003e/witness -s \"LIFECYCLE: mr submitted\" -m \"\n Worker: \u003cpolecat\u003e\n MR: \u003cmr-id\u003e\n Branch: \u003cbranch-name\u003e\n Target: \u003ctarget-branch\u003e\n Action: Verify MR submission, help polecat if needed.\n \"\n ```\n\n2. This happens BEFORE the existing polecat auto-cleanup logic\n\n## Acceptance\n- MR submission sends notification to Witness\n- Witness receives mail with all relevant details\n- Works for both polecat and crew submissions","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:49.07255-08:00","updated_at":"2025-12-23T12:07:49.07255-08:00","dependencies":[{"issue_id":"gt-ilav.3","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:49.07304-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.4","title":"Witness: Verify MR submission on notification","description":"When Witness receives `LIFECYCLE: mr submitted`, verify the submission was clean.\n\n## Implementation\n\n1. Add handler for \"LIFECYCLE: mr submitted\" mail\n2. Check MR status: `gt mq status \u003cmr-id\u003e`\n3. If MR looks good (status=open, no errors): log success, allow polecat to idle\n4. If MR has issues:\n - Check polecat git state\n - Nudge polecat to fix if session still alive\n - Log issue for monitoring\n\n## Acceptance\n- Witness verifies MR after submission notification\n- Can detect problematic submissions\n- Provides early intervention opportunity","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:50.607753-08:00","updated_at":"2025-12-23T12:07:50.607753-08:00","dependencies":[{"issue_id":"gt-ilav.4","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:50.60974-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.5","title":"Polecat state tracking: Add mr_submitted and merged states","description":"Track polecat lifecycle state separate from session state.\n\n## New States\n\n| State | Meaning |\n|-------|---------|\n| active | Working on assigned issue |\n| mr_submitted | MR submitted, waiting for merge |\n| idle | No current work, session may be alive |\n| merged | Work successfully merged by Refinery |\n| retired | Session killed, worktree removed |\n\n## Implementation\n\n1. Add state field to polecat tracking (state.json or beads)\n2. `gt polecat update \u003cname\u003e --state=\u003cstate\u003e`\n3. `gt polecat list` shows state column\n4. State transitions:\n - active → mr_submitted (on gt mq submit)\n - mr_submitted → merged (on Refinery notification)\n - merged → retired (on worktree cleanup)\n\n## Acceptance\n- Polecat state tracked and queryable\n- State transitions happen at correct lifecycle points\n- `gt polecat list` shows current state","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:51.968117-08:00","updated_at":"2025-12-23T12:07:51.968117-08:00","dependencies":[{"issue_id":"gt-ilav.5","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:51.970044-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.6","title":"Refinery patrol: Add sibling-check step","description":"Refinery should check on Witness health as part of patrol (village sibling watch).\n\n## Implementation\n\n1. Add `sibling-check` step to mol-refinery-patrol (early in cycle)\n2. Use `gt peek \u003crig\u003e/witness 20` to check Witness output\n3. Look for signs of health:\n - Recent activity (tool calls, log messages)\n - No error stack traces\n - Responsive to pings\n4. If Witness seems stuck:\n - Send status request mail\n - Note for potential escalation\n - Don't block Refinery work\n\n## Acceptance\n- Refinery checks Witness each patrol cycle\n- Anomalies logged\n- Non-blocking (Refinery continues even if Witness is down)","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:54.005132-08:00","updated_at":"2025-12-23T12:07:54.005132-08:00","dependencies":[{"issue_id":"gt-ilav.6","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:54.006928-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.7","title":"Witness patrol: Add sibling-check for Refinery","description":"Witness should check on Refinery health as part of patrol (village sibling watch).\n\n## Implementation\n\n1. Add `sibling-check` step to mol-witness-patrol\n2. Use `gt peek \u003crig\u003e/refinery 20` to check Refinery output\n3. Check Refinery queue status: `gt mq list \u003crig\u003e`\n4. Look for:\n - Refinery session alive\n - Queue processing (if items present)\n - No stuck MRs (same MR in_progress for too long)\n5. If Refinery seems stuck:\n - Send nudge or status request\n - Consider escalation to Deacon\n\n## Acceptance\n- Witness checks Refinery each patrol cycle\n- Can detect stuck Refinery\n- Provides backup oversight for merge queue","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:55.760705-08:00","updated_at":"2025-12-23T12:07:55.760705-08:00","dependencies":[{"issue_id":"gt-ilav.7","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:55.762415-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-ilav.8","title":"Recovery: Detect orphaned merged polecats","description":"Safety net for when Refinery misses sending lifecycle notification.\n\n## Detection Points\n\n**Witness polecat-scan**:\n- For each polecat in `mr_submitted` state:\n - Check MR status: `gt mq status \u003cmr-id\u003e`\n - If MR is closed/merged but polecat state is still mr_submitted:\n - Update polecat state to `merged`\n - Log recovery action\n\n**Deacon orphan-check**:\n- Query all closed MRs\n- Cross-reference with polecat states\n- If merged MR but polecat not in merged/retired state:\n - Send correction to Witness\n - Log for metrics (indicates Refinery notification missed)\n\n## Acceptance\n- Orphaned polecats detected and corrected\n- Recovery is logged for monitoring\n- No work lost due to missed notifications","status":"open","priority":2,"issue_type":"task","created_at":"2025-12-23T12:07:56.821259-08:00","updated_at":"2025-12-23T12:07:56.821259-08:00","dependencies":[{"issue_id":"gt-ilav.8","depends_on_id":"gt-ilav","type":"parent-child","created_at":"2025-12-23T12:07:56.823191-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-in3x","title":"gt spawn --continue for resuming parked molecules","description":"Add `--continue` flag to gt spawn for resuming parked molecules:\n\n```bash\ngt spawn --continue gt-mol-root\n```\n\nThis:\n1. Finds molecule root\n2. Verifies molecule is in \"parked\" state (in_progress, no assignee)\n3. Checks external deps are now satisfied\n4. Spawns polecat with molecule context\n5. Polecat reads handoff mail and continues from blocked step\n\nPart of cross-project dependency system.\nSee: docs/cross-project-deps.md\n\nDepends on: gt-zniu (gt park)\nDepends on Beads: bd-zmmy (bd ready resolution)","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T22:39:13.154462-08:00","updated_at":"2025-12-21T22:39:13.154462-08:00","dependencies":[{"issue_id":"gt-in3x","depends_on_id":"gt-zniu","type":"blocks","created_at":"2025-12-21T22:39:44.707231-08:00","created_by":"daemon"}]}
|
||||
{"id":"gt-is3e","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-21T22:04:43.421121-08:00","updated_at":"2025-12-21T22:05:10.502518-08:00","closed_at":"2025-12-21T22:05:10.502518-08:00","close_reason":"test cleanup","dependencies":[{"issue_id":"gt-is3e","depends_on_id":"gt-jvr3","type":"parent-child","created_at":"2025-12-21T22:04:43.423812-08:00","created_by":"stevey"},{"issue_id":"gt-is3e","depends_on_id":"gt-16rv","type":"blocks","created_at":"2025-12-21T22:04:43.424395-08:00","created_by":"stevey"}],"wisp":true}
|
||||
{"id":"gt-it0e","title":"Merge: gt-oiv0","description":"branch: polecat/furiosa\ntarget: main\nsource_issue: gt-oiv0\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-22T22:09:36.611121-08:00","updated_at":"2025-12-22T22:21:03.024596-08:00","closed_at":"2025-12-22T22:21:03.024596-08:00","close_reason":"Merged to main"}
|
||||
|
||||
Reference in New Issue
Block a user