bd sync: 2025-12-23 12:14:58

This commit is contained in:
Steve Yegge
2025-12-23 12:14:58 -08:00
parent 5bd6d3cb6f
commit 0683981d31

View File

@@ -482,6 +482,7 @@
{"id":"gt-jq0f","title":"Merge: gt-yd98","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: gt-yd98\nrig: gastown","status":"closed","priority":1,"issue_type":"merge-request","created_at":"2025-12-23T00:23:57.718716-08:00","updated_at":"2025-12-23T01:16:15.694749-08:00","closed_at":"2025-12-23T01:16:15.694749-08:00","close_reason":"Merged to main"}
{"id":"gt-jvr3","title":"mol-polecat-work","description":"Full polecat lifecycle from assignment to decommission.\n\nThis proto enables nondeterministic idempotence for polecat work.\nA polecat that crashes after any step can restart, read its molecule state,\nand continue from the last completed step. No work is lost.\n\nVariables:\n- gt-test - The source issue ID being worked on","status":"closed","priority":2,"issue_type":"epic","assignee":"gastown/test-polecat","created_at":"2025-12-21T22:04:43.420231-08:00","updated_at":"2025-12-21T22:05:10.498762-08:00","closed_at":"2025-12-21T22:05:10.498762-08:00","close_reason":"test cleanup","wisp":true}
{"id":"gt-jzot","title":"gt done: Notify Witness with exit outcome","description":"When polecat runs gt done, it should send mail to Witness:\n\n```\ngt mail send \u003crig\u003e/witness -s 'POLECAT_DONE \u003cname\u003e' -m 'Exit: COMPLETED\nIssue: \u003cissue-id\u003e\nMR: \u003cmr-id\u003e\nBranch: \u003cbranch\u003e'\n```\n\nExit types:\n- COMPLETED: Work done, MR submitted\n- ESCALATED: Hit blocker, needs human\n- DEFERRED: Work paused, issue still open\n\nThis enables Witness patrol to:\n1. See completion in inbox-check step\n2. Verify git state is clean\n3. Kill session and prune worktree\n4. Close the polecat lease in its patrol wisp\n\nPaired with gt-r6td (spawn notification) - together they bracket polecat lifecycle.","status":"closed","priority":1,"issue_type":"task","assignee":"gastown/nux","created_at":"2025-12-22T22:31:31.266716-08:00","updated_at":"2025-12-22T22:55:15.215207-08:00","closed_at":"2025-12-22T22:55:15.215207-08:00","close_reason":"Closed"}
{"id":"gt-k08o","title":"test pin fix","status":"open","priority":2,"issue_type":"task","assignee":"max","created_at":"2025-12-23T12:14:47.293815-08:00","updated_at":"2025-12-23T12:14:57.596813-08:00"}
{"id":"gt-k1lr","title":"Consolidate configuration architecture: three-tier model","description":"Rationalize Gas Town's scattered configuration into a clean three-tier model:\n\n## Current Problems\n- Config split across mayor/, .gastown/, and rig/config.json\n- Runtime state mixed with configuration\n- Hidden directories (.gastown/) are missed by agents\n- Category confusion: identity vs config vs runtime state\n\n## Proposed Architecture\n\n### Tier 1: Town Config (mayor/)\n```\nmayor/\n├── town.json # Town identity (unchanged)\n├── rigs.json # Rig registry (unchanged)\n└── config.json # NEW: Town-level configuration\n # theme defaults, daemon settings, etc.\n```\n\n### Tier 2: Town Runtime (.runtime/)\n```\n~/gt/.runtime/ # NEW: Gitignored\n├── daemon.json # {pid, started_at, heartbeat}\n├── deacon.json # {cycle, last_action}\n└── agent-requests.json # Lifecycle requests\n```\n\n### Tier 3: Rig Config (settings/)\n```\n\u003crig\u003e/\n├── config.json # Rig identity only (type, git_url, beads.prefix)\n├── settings/ # NEW: Visible, git-tracked\n│ ├── config.json # theme, merge_queue, max_workers\n│ ├── namepool.json # pool settings (style, max)\n│ └── roles/ # Per-role overrides (optional)\n└── .runtime/ # NEW: Gitignored\n ├── witness.json # {state, started_at, stats}\n ├── refinery.json # {state, started_at, stats}\n └── namepool-state.json # {in_use, overflow_next}\n```\n\n## Key Principles\n1. **Visible \u003e Hidden** for config agents need to find\n2. **Git-tracked** for identity and config; **gitignored** for runtime\n3. **Separation of concerns**: identity, config, runtime are distinct\n4. **Locality**: town config at town root, rig config at rig root\n\n## Migration\n- Move .gastown/ contents to appropriate new locations\n- Update all code that reads/writes these files\n- Update .gitignore patterns\n- Update documentation (architecture.md, CLAUDE.md)\n","status":"closed","priority":1,"issue_type":"epic","created_at":"2025-12-22T01:01:48.96788-08:00","updated_at":"2025-12-22T01:33:05.853643-08:00","closed_at":"2025-12-22T01:33:05.853643-08:00","close_reason":"All 8 tasks complete: config architecture migrated to three-tier model"}
{"id":"gt-k1lr.1","title":"Add mayor/config.json for town-level configuration","description":"Create new town-level config file:\n- Add TownConfig.Config field to types.go\n- Create mayor/config.json with theme defaults, daemon settings\n- Update loader to read/write mayor/config.json\n- Migrate any town-level config from .gastown/ to here","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:20.091293-08:00","updated_at":"2025-12-22T01:21:50.158814-08:00","closed_at":"2025-12-22T01:21:50.158814-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.1","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:20.09177-08:00","created_by":"daemon"}]}
{"id":"gt-k1lr.2","title":"Create .runtime/ for town-level runtime state","description":"Move ephemeral town state to .runtime/:\n- Create ~/gt/.runtime/ directory structure\n- Move daemon/state.json → .runtime/daemon.json\n- Move deacon/heartbeat.json → .runtime/deacon.json \n- Move .gastown/agent-state.json → .runtime/agent-requests.json\n- Move .gastown/keepalive.json → .runtime/keepalive.json\n- Update .gitignore to ignore .runtime/\n- Update all code references","status":"closed","priority":1,"issue_type":"task","created_at":"2025-12-22T01:02:21.166304-08:00","updated_at":"2025-12-22T01:21:50.160964-08:00","closed_at":"2025-12-22T01:21:50.160964-08:00","close_reason":"Implemented three-tier config architecture","dependencies":[{"issue_id":"gt-k1lr.2","depends_on_id":"gt-k1lr","type":"parent-child","created_at":"2025-12-22T01:02:21.166715-08:00","created_by":"daemon"}]}
@@ -583,7 +584,7 @@
{"id":"gt-nriy","title":"Test: Alpha to Beta","description":"Sibling communication test","status":"open","priority":2,"issue_type":"message","assignee":"gastown-beta","created_at":"2025-12-20T21:44:00.731578-08:00","updated_at":"2025-12-20T21:44:00.731578-08:00","labels":["thread:thread-d94865313b74"],"sender":"Steve Yegge","wisp":true}
{"id":"gt-nsyy","title":"Merge: gt-h6eq.7","description":"branch: polecat/dag\ntarget: main\nsource_issue: gt-h6eq.7\nrig: gastown","status":"open","priority":2,"issue_type":"merge-request","created_at":"2025-12-23T11:42:39.260767-08:00","updated_at":"2025-12-23T11:42:39.260767-08:00"}
{"id":"gt-nti8","title":"Polecats should not push branches to remote","description":"## Current Behavior\n\nPolecats push their branches to origin (e.g., `polecat/furiosa`), which pollutes the remote with many short-lived branches.\n\n## Desired Behavior\n\nPolecats should only commit locally. The Refinery handles all remote pushes:\n1. Polecat works on local `polecat/\u003cname\u003e` branch\n2. Polecat signals done (state → idle)\n3. Refinery pulls from local polecat branch\n4. Refinery runs tests, merges to main\n5. Refinery pushes main to remote\n6. If PR review needed, Refinery creates the PR\n\n## Benefits\n\n- Clean remote (no branch pollution)\n- Clear responsibility (Refinery is the quality gate)\n- Simpler cleanup (local branches deleted with worktree)\n- Less noise in GitHub UI\n\n## Trade-offs\n\n- If polecat crashes before Refinery merges, code is lost locally\n- But beads issue remains open, another polecat can redo the work\n- This is acceptable for ephemeral workers\n\n## Implementation\n\nIn polecat CLAUDE.md or landing protocol:\n- Remove `git push origin HEAD` from workflow\n- Replace with just `git commit` + signal done\n- Refinery handles the rest","status":"open","priority":2,"issue_type":"feature","created_at":"2025-12-21T14:13:48.804954-08:00","updated_at":"2025-12-21T14:13:48.804954-08:00"}
{"id":"gt-nvql","title":"max Handoff","description":"attached_molecule: gt-wvyi\nattached_at: 2025-12-23T20:01:30Z","status":"pinned","priority":2,"issue_type":"task","created_at":"2025-12-23T11:47:59.020501-08:00","updated_at":"2025-12-23T12:01:30.729698-08:00"}
{"id":"gt-nvql","title":"max Handoff","description":"attached_molecule: gt-k08o\nattached_at: 2025-12-23T20:14:57Z","status":"pinned","priority":2,"issue_type":"task","created_at":"2025-12-23T11:47:59.020501-08:00","updated_at":"2025-12-23T12:14:57.390281-08:00"}
{"id":"gt-nz6t","title":"Remove unused style helper functions","description":"internal/style/style.go defines RenderSuccess, RenderWarning, RenderError, and RenderInfo helper functions that are never used. Code uses style.Success.Render() directly instead. Either use the helpers consistently or remove them.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:34:43.822193-08:00","updated_at":"2025-12-21T21:50:45.224202-08:00","closed_at":"2025-12-21T21:50:45.224202-08:00","close_reason":"Removed 4 unused style helper functions (RenderSuccess, RenderWarning, RenderError, RenderInfo)"}
{"id":"gt-o29j","title":"inspect-workers","description":"Capture output for each working polecat.\n\n```bash\ngt peek \u003crig\u003e/\u003cpolecat\u003e\n```\n\nNeeds: survey-workers","status":"closed","priority":2,"issue_type":"task","created_at":"2025-12-23T01:41:54.506324-08:00","updated_at":"2025-12-23T04:39:39.684381-08:00","closed_at":"2025-12-23T04:39:39.684381-08:00","close_reason":"Parent gt-751s superseded by Christmas Ornament pattern","dependencies":[{"issue_id":"gt-o29j","depends_on_id":"gt-751s","type":"parent-child","created_at":"2025-12-23T01:41:54.56996-08:00","created_by":"stevey"},{"issue_id":"gt-o29j","depends_on_id":"gt-ep7f","type":"blocks","created_at":"2025-12-23T01:41:54.577076-08:00","created_by":"stevey"}]}
{"id":"gt-o3is","title":"gt sling pinToHook doesn't set pinned boolean field","description":"## Bug\n\nWhen `gt sling` pins work to an agent's hook via subprocess, `bd pin` reports success but the `pinned` boolean field is NOT persisted.\n\n## Root Cause (Found 2025-12-23)\n\nThe issue is a sync/flush timing problem:\n\n1. `gt sling` calls `pinToHook()` which runs `bd --no-daemon pin`\n2. `bd pin` updates the SQLite database with `pinned=1`\n3. `bd pin` schedules a flush to JSONL (via FlushManager)\n4. Subprocess exits BEFORE flush completes\n5. `gt sling` then calls `syncBeads()` which runs `bd sync`\n6. `bd sync` imports from JSONL which DOESN'T have pinned field\n7. Import overwrites SQLite, resetting `pinned=0`\n\nThe assignee field IS set correctly because it's also in the database before sync, but sync imports the JSONL which doesn't have the pinned field (due to omitempty on false value).\n\n## Reproduction\n\n```bash\n# Create issue\nbd create \"test\" --json\n\n# Sling it\ngt sling \u003cid\u003e gastown/crew/max\n\n# Check - pinned is null!\nbd show \u003cid\u003e --json | jq '.[0].pinned'\n```\n\n## Fix Options\n\n1. **Make bd pin synchronous**: Force flush before subprocess exit\n2. **Skip sync after pin**: Don't call syncBeads after pinToHook\n3. **Use direct DB update in gt**: Call UpdateIssue directly instead of bd subprocess\n4. **Fix flush-on-exit**: Ensure PersistentPostRun waits for flush completion\n\n## Workaround\n\nThe handoff bead attachment (`AttachMolecule`) is the primary mechanism for tracking what's on an agent's hook. The pinned field is cosmetic for `bd hook` visibility.\n\n## Files\n\n- gastown: internal/cmd/sling.go (slingToCrew, pinToHook, syncBeads)\n- gastown: internal/beads/beads.go (Pin method)\n- beads: cmd/bd/pin.go (bd pin command)\n- beads: cmd/bd/flush_manager.go (async flush)","status":"open","priority":1,"issue_type":"bug","created_at":"2025-12-23T04:41:12.668958-08:00","updated_at":"2025-12-23T12:03:22.343937-08:00"}
@@ -604,6 +605,7 @@
{"id":"gt-pbr3","title":"Add godoc comments to exported functions","description":"Several exported functions lack godoc comments. While not critical, adding documentation would improve code maintainability. Focus on:\n\n- Public API functions in each package\n- Exported types and their methods\n- Functions that have non-obvious behavior\n\nCan be addressed incrementally as code is touched.","status":"closed","priority":4,"issue_type":"task","created_at":"2025-12-21T21:35:26.732436-08:00","updated_at":"2025-12-21T22:20:01.785697-08:00","closed_at":"2025-12-21T22:20:01.785697-08:00","close_reason":"Deferred to post-launch. Documentation comments are nice-to-have for launch. Core functionality is documented; additional godoc can be added incrementally."}
{"id":"gt-pc5d","title":"Recover stale polecat work: 4 branches with unpushed commits","description":"During observation of polecat workflow, found 4 polecats with unpushed work:\n\n## Branches Pushed (preserved)\n- polecat/capable: 3 commits (molecule catalog, doctor orphan detection, gt done)\n- polecat/dementus: 4 commits (Witness MVP, handoff fixes)\n- polecat/furiosa: 2 commits (bulk polecat removal, spawn handoff)\n- polecat/rictus: 1 commit (molecule docs)\n\n## Action Required\n1. Review each branch for merge-worthiness\n2. Either:\n a. Create PRs for valuable work\n b. OR discard if superseded\n3. After decision, clean up polecats properly\n\n## Root Cause\nPolecats were not cleaned up after previous work sessions. This is exactly why we need:\n- gt-u1k: gt shutdown should fully cleanup polecats\n- gt-8v8: Refuse to lose uncommitted work\n- gt-9nf: Always create fresh polecats","status":"closed","priority":1,"issue_type":"chore","created_at":"2025-12-20T15:24:29.232772-08:00","updated_at":"2025-12-21T11:24:55.194579-08:00","closed_at":"2025-12-21T11:24:55.194579-08:00","close_reason":"Cleaned up via gt orphans"}
{"id":"gt-pdqc","title":"gt spawn: beads sync warnings on fresh worktree","description":"When spawning fresh polecats, seeing 'Warning: beads sync: exit status 1' and 'Warning: beads push: exit status 1'. Worktrees are created but beads state may not be properly synced.","status":"open","priority":2,"issue_type":"bug","created_at":"2025-12-23T00:19:09.375303-08:00","updated_at":"2025-12-23T00:19:09.375303-08:00"}
{"id":"gt-pia6","title":"Merge: gt-h6eq.4","description":"branch: polecat/valkyrie\ntarget: main\nsource_issue: gt-h6eq.4\nrig: gastown","status":"open","priority":3,"issue_type":"merge-request","created_at":"2025-12-23T12:13:07.092756-08:00","updated_at":"2025-12-23T12:13:07.092756-08:00"}
{"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-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-pnu4","title":"Test","description":"Body","status":"open","priority":2,"issue_type":"message","assignee":"gastown/alpha","created_at":"2025-12-20T21:38:39.019559-08:00","updated_at":"2025-12-20T21:38:39.019559-08:00","sender":"Steve Yegge","wisp":true}