Gas Town v0.12.0
Pre-compiled binaries for Linux, macOS (Intel & Apple Silicon), and Windows.
Installation
Homebrew (macOS/Linux):
brew install gastownnpm (Node.js):
npm install -g @gastown/gtManual Install:
Download the appropriate binary for your platform below, extract it, and place it in your PATH.
Changelog
Features
- 98a2d06 Merge PR #2370: feat(daemon): opt-in pressure checks before agent spawns
- 4ba154a Merge PR #2398: feat(convoy): add --base-branch support to convoy create
- 92ab22d Merge PR #2466: feat: add gt plugin sync to auto-deploy plugins after build
- 43ead39 Merge PR #2580: feat: add Witness dispatch message types
- 207f1a5 Merge PR #2609: feat: add merge_strategy config to refinery (direct vs PR mode)
- 5dc606f Merge PR #2633: feat: event-driven polecat lifecycle with FIX_NEEDED feedback loop
- 2eebe50 Merge PR #2674: feat(mail): auto-nudge agents to reply via mail rather than in chat
- 74f19f8 Merge PR #2676: feat: use --reference for submodule init in worktrees
- efb1661 feat(config): add configurable reply_reminder_delay to MailThresholds
- 7307240 feat(convoy): add --base-branch support to convoy create
- ae72e8e feat(daemon): add opt-in pressure checks before spawning non-infrastructure agents
- 94cd895 feat(dog): add wait-for-slung guard to dog worker dispatch
- 22a1630 feat(dogs): hardcode formula CLI paths and lookup order in dog priming
- 7fcfe8e feat(formula): implement extends and compose/expand support
- 7f3a813 feat(mail): enqueue deferred reply-reminder nudge after mail delivery
- 3d5c721 feat(nudge): add DeliverAfter field for deferred queue delivery
- 8da798b feat(sling): add --crew flag for targeting crew members by rig
- 2fc2bab feat: add /reaper, /backup, and /patrol custom skills (gt-pv3k)
- 77c6683 feat: add /review command with A-F grading and refinery integration (#2636)
- 2e69cdf feat: add FIX_NEEDED protocol message for event-driven polecat lifecycle (gt-k0h)
- 7ec0de9 feat: add Witness dispatch message types (te-l0o)
- 44fe386 feat: add executable run.sh for compactor-dog plugin
- 380fc9c feat: add git-hygiene dog plugin for automated repo cleanup (gt-cdm)
- 7a4ac8f feat: add gt plugin sync to auto-deploy plugins after build (hq-o9gna)
- 07a89fc feat: add merge_strategy config to refinery patrol formula (gt-fln)
- 7b32203 feat: add run.sh for dolt-archive plugin, fix DB name beads to bd
- 43c2253 feat: add town-level crew_agents for per-crew agent assignment
- 7228d54 feat: background nudge-queue poller for non-Claude agents
- 5978367 feat: github-sheriff v2 — single API call, PR categorization
- 2c33d11 feat: implement escalation notification channels (email, slack, sms, log)
- 3300480 feat: new doctor checks + agent bead creation on rig add/adopt
- 716302d feat: redesign mol-polecat-work for event-driven lifecycle (gt-k0h)
- 58fcf69 feat: refinery sends FIX_NEEDED to polecat on merge failure (gt-k0h)
- d2ac284 feat: support partial clones and sparse checkout for gt rig add
- 93c36e5 feat: surface DND in gt status and auto-reset muted mode on gt up
- 63ebe64 feat: upgrade Copilot CLI from informational to executable hooks
- 6d1276e feat: use --reference for submodule init in worktrees
- 6bdd92f feat: wire --files flag in formula run command
- 4b11810 feat: witness handles awaiting_verdict polecat state (gt-k0h)
Bug Fixes
- b163dd9 Merge PR #2399: fix: guard against bd v0.58.0 non-JSON output in list/hook/mail parsing
- a4117e9 Merge PR #2403: fix: agent-beads-exist check now verifies polecat beads
- 3627f03 Merge PR #2406: fix: sweep orphaned wisp_dependencies after compact
- 3bfdcb4 Merge PR #2413: fix: inject Dolt server port into agent tmux sessions (GH #2412)
- ecc00df Merge PR #2421: fix: convert session-hygiene from plugin.md to deterministic run.sh
- f0fb859 Merge PR #2442: fix: prevent tmux socket split-brain causing nudge failures
- adfdb02 Merge PR #2459: fix: auto-purge closed ephemeral beads on session end
- d39fb36 Merge PR #2467: fix: check rig-level metadata before town-level beads redirect
- c44fd7e Merge PR #2469: fix: reaper Sprintf bugs and missing schema guard
- 04df506 Merge PR #2477: fix: include beads_prefix in gt rig list --json output
- 814e083 Merge PR #2479: fix: EnsureMetadata repairs stale dolt_server_port
- 46b6f8e Merge PR #2487: fix: add --rig flag to gt crew start for consistency with stop
- 3b8bf75 Merge PR #2494: fix: prevent TOML env from overwriting AgentEnv identity vars
- 07570b9 Merge PR #2511: fix: DEFERRED exit incorrectly closing work bead
- f86ff9f Merge PR #2515: fix(beads): add --flat flag to bd list for valid JSON output
- 04e79ef Merge PR #2533: fix: restore hook_bead slot write on agent bead creation
- cba8ac1 Merge PR #2542: fix: replace fixed 200ms daemon startup check with polling loop
- 3cb14ce Merge PR #2547: fix: add warning log to DatabasePrefixCheck.Fix() (GH#2455)
- 169278a Merge PR #2548: fix(docker): detect arch dynamically and add gt to PATH
- cb4675b Merge PR #2550: fix: remove nonexistent --global flag from gt enable output (GH#2543)
- 67d3523 Merge PR #2551: fix: use CommandContext in dog done to prevent Cancel panic (GH#2528)
- 01983a8 Merge PR #2552: fix: add StripBeadsDir to convoy dep add/remove for rig-prefixed beads
- 5d9bf02 Merge PR #2554: fix: reject path separators in rig names (GH#2544)
- 12ebee1 Merge PR #2586: fix: prevent bd from spawning orphan embedded Dolt servers
- b865fb1 Merge PR #2587: fix: make PrefixRegistry resilient to missing rigs.json
- ef49140 Merge PR #2589: fix: FormatMailBody detects run.sh and dispatches script instead of markdown
- c5c273f Merge PR #2591: fix: read rig beads prefix from rigs.json instead of missing config.json
- 9adb420 Merge PR #2595: fix: persist formula --var context for assignees
- 374222f Merge PR #2611: fix: render hooked formula wisps as workflow work
- 39ff68d Merge PR #2613: fix: avoid race condition in Dolt startup readiness check
- cedce11 Merge PR #2616: fix: add dog role to identity resolution and sling target
- 58e32f0 Merge PR #2622: fix: clean worktree state before branch switch in ReuseIdlePolecat
- a6b0da4 Merge PR #2625: fix(convoy): cross-database dependency resolution for multi-rig towns
- 63914b7 Merge PR #2626: fix: gt prime --hook compact path too slow for non-Claude runtimes
- ef1d4ad Merge PR #2627: fix(convoy): CLI-side cross-database dependency resolution
- 5e39bab Merge PR #2629: fix: add RoleDog to session identity for quota rotation restart
- 37d1055 Merge PR #2639: fix: add scope guardrails to stuck-agent-dog plugin
- 36887a2 Merge PR #2643: fix(dolt): normalize backslashes in config.yaml on Windows
- f68b77e Merge PR #2658: fix(ci): restore cross-platform harness drift and deterministic convoy ID tests
- 0347391 Merge PR #2661: fix: use Beads wrapper in scheduler dispatch
- 76311d6 Merge PR #2663: fix: back-link source issue to MR bead on creation
- 6c68457 Merge PR #2668: fix: use rig name and correct DB prefix in EnsureAllMetadata
- 8935a8e Merge PR #2670: fix: restrict remote branch deletion to polecat branches only
- 2b5316b Merge PR #2671: fix: remove unused dbName parameter in batchDeleteRows (lint)
- eb2f5ec Merge PR #2672: fix: move --flat fallback into Beads.run to prevent re-injection
- a3de309 Merge PR #2677: fix: degrade wait-idle to queue for agents without prompt detection
- 1efc1ec fix(backup): add spike baseline recovery to prevent permanent export blocking
- cf565d0 fix(beads): add --flat flag to bd list for valid JSON output
- 4eba9d7 fix(ci): extract shared convoy compatibility foundation
- 476b1a5 fix(ci): restore shared main-red failures
- 87ed492 fix(ci): restore shared main-red failures
- 7801bb5 fix(convoy): CLI-side cross-database dependency resolution
- afe2abb fix(convoy): count tracked externals in status and list
- aaa4670 fix(convoy): cross-database dependency resolution for multi-rig towns
- 3530483 fix(convoy): route HQ convoy reads via town root
- 2721ca2 fix(convoy): share allow-stale tracked-issue reads
- 5b7a378 fix(deps): update go x/ packages
- 5cb8a41 fix(deps): update module github.com/go-sql-driver/mysql to v1.9.3
- 9a547ff fix(deps): update opentelemetry-go monorepo
- ac4b65d fix(docker): detect arch dynamically and add gt to PATH
- 01e4df5 fix(dolt): normalize backslashes in config.yaml data_dir on Windows
- deb8a52 fix(dolt): use TCP fallback for IsRunning on Windows
- f09a1dd fix(formulas): persist merge failure context to bead instead of losing it
- fcb8f0e fix(hook): route gt hook show to rig DB for remote rig-level targets
- 4d35143 fix(hooks): background gt costs record in Stop hook to prevent SIGKILL
- 2abc36d fix(nudge): deliver queued nudges via hook trigger, not raw tmux send-keys
- a358ef4 fix(refinery): skip MRs with missing branches instead of fatal exit (rc-d46) (#2539)
- a6e349b fix(sling): load default_branch from rig config as base_branch formula var
- 48aeff9 fix(witness): emit MERGE_READY channel event to wake refinery await-event
- b965060 fix: CI sling tests tolerate --allow-stale cache and WithAutoCommit
- 6202ffc fix: EnsureAllMetadata maps database names to rig names via routes.jsonl
- a1ddecd fix: EnsureMetadata repairs stale dolt_server_port in metadata.json
- 7c40de0 fix: FormatMailBody detects run.sh and dispatches script instead of markdown
- 77092bb fix: add --rig flag to gt crew start for consistency with stop
- 1a568fb fix: add RoleDog case to resolveSelfTarget for gt hook (gt-t2zf)
- 6c24586 fix: add RoleDog to session identity parsing for quota rotation restart
- 3bf8a66 fix: add StripBeadsDir to convoy dep add/remove for rig-prefixed beads
- db0b976 fix: add diagnostic logging to daemon env skip path
- 014bb42 fix: add dog role to mail identity resolution and env setup
- c3810c4 fix: add dolt.idle-timeout default for Gas Town centralized Dolt
- 37346f3 fix: add explicit scope guardrails to stuck-agent-dog plugin
- b734d53 fix: add nil guard on rigCfg and read boolean MQ vars from bead labels
- f568c27 fix: add pressure stubs for Windows/FreeBSD (release build fix)
- adee1fa fix: add state.json to crew workspace gitignore patterns
- 35a2697 fix: add state.json to required gitignore patterns for crew workspaces
- 7a202c4 fix: add timeout protection to gt handoff blocking operations (gt-s9ib)
- db32280 fix: add warning log to DatabasePrefixCheck.Fix() before prefix changes (GH#2455)
- 62d4519 fix: address PR #2430 review feedback
- 4a69240 fix: address PR #2495 review — atomic writes, tests, style.PrintWarning
- 7478fd2 fix: address review feedback on plugin sync
- f587f7a fix: agent-beads-exist check now verifies polecat beads (gt-5f1skfj)
- 3c3cbd3 fix: apply same TOML env guard to daemon lifecycle path + add tests
- bcc7ac1 fix: auto-purge closed ephemeral beads on session end (hq-6161m)
- 6a0f498 fix: auto-start nudge-poller when degrading to queue for non-Claude agents
- b017a47 fix: avoid race condition in Dolt startup readiness check
- 8a509bb fix: back-link source issue to MR bead on creation (GH#2599)
- 209e427 fix: check rig-level metadata before town-level beads redirect (hq-x1ucu)
- db23a43 fix: clean stale dolt-server.port files on server start (gt-t642)
- 25535b8 fix: clean up IsResolvedAgentClaude godoc and add nil guard
- 13ad1a8 fix: clean worktree state before branch switch in ReuseIdlePolecat
- 61b88b0 fix: commit town-level config changes after rig add/adopt (gt-n2kn)
- d5b5d20 fix: compactor-dog use DOLT_FETCH instead of DOLT_PULL for live servers
- 879ea53 fix: convert session-hygiene from plugin.md to deterministic run.sh (gt-rpkc)
- b82a378 fix: correct comment example rig name and normalize issue references
- d852cd4 fix: correct default database name in compactor-dog (gastown → gt)
- a40c358 fix: create wisps tables on gt Dolt server, not just bd's instance
- cf3bdbe fix: daemon fail-safe when Dolt unavailable, suppress docked-rig warnings
- daad4c9 fix: degrade wait-idle to queue for agents without prompt detection
- d9a72a5 fix: display mail timestamps in local timezone instead of UTC
- d7ef2d6 fix: doctor --fix reopens closed agent beads instead of recreating
- ab71b3d fix: exclude agent beads from wisp reaper
- 551582a fix: forward dashboard port in Docker and bind to all interfaces in sandbox
- 5265043 fix: gt dolt sync pushes via SQL to avoid stopping server (hq-qo8ma)
- de81883 fix: gt prime --hook blocks forever on non-Claude runtimes
- 6b68f90 fix: gt prime skips patrol wisps on parked/docked rigs (gt-eqa9)
- 4db877a fix: guard against bd v0.58.0 non-JSON output in list parsers (gt-sl4)
- 53567e6 fix: guard against bd v0.58.0 non-JSON output in list/hook/mail parsing
- 32298c6 fix: handle --model=value equals form in runtime label parsing
- 309e0b0 fix: handle non-JSON bd output in ListOpenSlingContexts
- fdff3cb fix: harden AutoClose and doctor against destroying protected beads
- 44452cc fix: hide docked rigs from Mayor tmux status line
- 64fc8cc fix: honor --base-branch in formula rendering and MR targeting
- 67af59b fix: hook show shorthand normalization and stale hook_bead lookup
- 2660def fix: include beads_prefix in gt rig list --json output (hq-jz80q)
- d8f6467 fix: initialize tmux registry in nudge for non-agent contexts
- a871bf2 fix: inject Dolt server port into agent tmux sessions (GH #2412)
- da38046 fix: make PrefixRegistry resilient to missing rigs.json
- f379e3b fix: make SyncPortFiles idempotent — skip writes when port matches
- 08c22cd fix: mount FOLDER to /gt with runtime workspace initialization
- 19b224c fix: move --flat fallback into Beads.run to prevent re-injection
- 1be905b fix: move compact/resume check before Dolt-heavy operations in prime
- 847ee6b fix: mq list returns empty for merge-request wisps
- 86d3c77 fix: namespace tmux sockets by town path hash
- 0fbc53e fix: notify mayor after refinery merge, always delete polecat branches
- 4a8cfa6 fix: pass rig beads prefix when reading layered config in patrol vars
- e9c4c65 fix: persist formula --var context for assignees
- 8137131 fix: persist home directory in a managed Docker volume
- e940b2e fix: pre-validate command binary in tmux session creation
- d5713ee fix: prefer structured agent_state in GetAgentBead
- f1fea77 fix: prevent CLAUDECODE env var from blocking agent session creation
- 58d0d0c fix: prevent TOML env from overwriting AgentEnv identity vars
- e55e3f2 fix: prevent rebuild-gt from downgrading binary (crash loop fix)
- d09dc33 fix: prevent tmux socket split-brain causing nudge failures
- f786430 fix: propagate BEADS_DOLT_PORT to agent sessions
- 0dacd71 fix: protect standing-order beads from AutoClose reaper
- d51f997 fix: protect standing-order beads from polecat removal status reset
- 8280d79 fix: qualify GT_ROLE in role TOMLs and prevent TOML env clobbering AgentEnv
- d06966a fix: query wisps table for ephemeral MRs and mail messages (#2450)
- 039f8da fix: re-probe bd --allow-stale support by binary path (#2570)
- 98b748d fix: read rig beads prefix from rigs.json instead of missing config.json
- ff43fa7 fix: reap idle polecat sessions to prevent API slot burn
- e78cad1 fix: refinery patrol reads command vars from layered rig config
- e26cc40 fix: reject path separators in rig names and harden prefix derivation (GH#2544)
- dc1d11d fix: remove WithAutoCommit from hookBeadWithRetry
- e9c2929 fix: remove dead homebrew tap job, make npm best-effort in release workflow
- f6935ac fix: remove hardcoded go test default from formula and config
- c710279 fix: remove nonexistent --global flag from gt enable output (GH#2543)
- 3343495 fix: remove orphaned RoleLabelCheck doctor check (gt-324)
- 35ea953 fix: remove stray dbName args from reaper Sprintf calls, add schema guard
- 6645565 fix: remove unused dbName parameter in batchDeleteRows (lint)
- 85b6309 fix: render hooked formula wisps as workflow work
- f6e17f4 fix: replace fixed 200ms daemon startup check with polling loop
- f9ce9fc fix: replace grep -P with literal tab for macOS compatibility
- a0d5945 fix: resolve CI lint and test failures on main
- 9de066d fix: resolve mayor dashboard runtime from agent config
- 56e6ddf fix: respect no_merge flag in polecat zero-commit check
- 5e0d1c3 fix: restore WithAutoCommit in hookBeadWithRetry
- de2d886 fix: restore gastown beads backup clobbered by PR #2324
- 630e879 fix: restore hook_bead slot write on agent bead creation
- c2e21d1 fix: restrict remote branch deletion to polecat branches only (GH#2669)
- a3fb88a fix: retry hook lookup in polecat context to eliminate race condition (#2389) (#2510)
- 48ed998 fix: review command followups — robust test lookups, wording, base branch detection
- ab1d955 fix: route agent bead creation to wisps (ephemeral)
- aac5cfc fix: route mail/delivery ops to correct beadsDir by bead ID prefix
- d3a3df1 fix: set GT_HOOK_SOURCE and GT_SESSION_ID in Gemini hook templates
- 6819afa fix: set beads.role to maintainer during gt install (gt-xnqf)
- 18e04cc fix: skip --reference for shallow clones
- 0f94976 fix: skip findAgentWork retries on compact/resume path
- 45b3f19 fix: skip hardcoded Claude start_command for non-Claude agents
- db851a5 fix: skip redirecting rigs in DatabasePrefixCheck to prevent shared DB corruption
- 70126b4 fix: start Dolt before agents to prevent boot race (gt-t2zf)
- 3164aad fix: strip bd stdout warnings to prevent JSON parse corruption
- 8278b1d fix: substitute rig vars into patrol formula steps at prime time
- 554f4e9 fix: surface JSON parse errors in ListAgentBeads
- dd4f810 fix: sweep orphaned wisp_dependencies after compact (gt-7y37lsv)
- 4eaca22 fix: sync dolt-server.port files to prevent orphan bd servers (gt-t2zf)
- b97a04e fix: sync port files to deacon and dog .beads dirs (gt-9t6y)
- 41e50cc fix: sync with DoltHub remote before/after compaction (gt-mkd1)
- 3fc2014 fix: update stale TODO comment on polecat spawn cap
- ce5a6a0 fix: update stale database names (beads→bd, gastown→gt) causing backup failures
- 2f8c55d fix: use Beads wrapper in scheduler dispatch instead of raw exec.Command
- 54b9eb2 fix: use CommandContext in dog done to prevent Cancel panic (GH#2528)
- 8eea55b fix: use Labels (plural) in hook_slot_integration_test CreateOptions
- 8358ade fix: use default tmux socket and disarm respawn hooks before kill
- 252f12a fix: use native bd routing to read rig bead labels in patrol vars
- 068b1dd fix: use qualified GT_ROLE patterns in rig-scoped role TOMLs
- 274f83b fix: use rig beads dir in prime_session hook detection
- 444a6fb fix: use rig name and correct DB prefix in EnsureAllMetadata
- c1b25f9 fix: use rig root for beads queries in prime hook lookup
- 0f33903 fix: use test fixture in TestParsePluginMD_SessionHygiene instead of local filesystem
- 38f7b38 fix: validate db/remote names before SQL interpolation (defense-in-depth)
- c7cfa2d fix: validate remote names and commit hashes in compactor-dog run.sh
- 7272f84 fix: wait for Dolt MySQL readiness and always pass --server-port to bd init
- 9208223 fix: witness startup fails with exit 127 due to env/exec ordering
Others
- a0e0de2 Add agent framework survey (w-gc-004)
- f428b4f Add dolt-snapshots plugin: lifecycle-aware convoy snapshots (#2324)
- d5bce7d Fix DEFERRED exit incorrectly closing work bead
- 8cf48d0 Fix daemon escalations misidentifying as overseer
- dba1fa7 Fix false positive in health pollution check for ephemeral wisps
- a246a57 Fix gt dog dispatch --plugin not starting dog session
- e680869 Fix witness startup: env(1) cannot run shell builtin exec
- eaa5d4e Merge PR #2514: Fix Docker dashboard port forwarding
- ce3624b Merge PR #2520: guard against bd v0.58.0 non-JSON output in list parsers
- d8d8d67 Merge PR #2532: use rig root for beads queries in prime hook lookup
- f856d1f Merge PR #2549: research: macOS sandbox-exec capabilities and limitations
- 0264cb4 Merge PR #2576: bump filippo.io/edwards25519 from 1.1.0 to 1.1.1
- 0613997 Merge PR #2579: prefer structured agent_state in GetAgentBead
- 75be016 Merge PR #2581: agent framework research (w-gc-004)
- f3850e6 Merge PR #2584: gt prime skips patrol wisps on parked/docked rigs
- 999bc0f Merge PR #2588: set beads.role to maintainer during gt install
- d224dd2 Merge PR #2592: update github actions pin hashes
- 40f448d Merge PR #2593: chore(deps): update dependency promptfoo to v0.121.1
- 462f157 Merge PR #2597: update go x/ packages (sys v0.42.0, time v0.15.0)
- b444ce1 Merge PR #2598: update go-sql-driver/mysql to v1.9.3
- fd821e7 Merge PR #2602: update opentelemetry-go monorepo to v1.42.0
- 779a58c Merge PR #2628: docs: add Gas Town communication instructions to AGENTS.md
- 9a7a3a5 Merge PR #2653: build(deps-dev): bump hono from 4.12.5 to 4.12.7
- 264893a Merge PR #2665: docs: crew specialization and capability-based dispatch design
- 1f9e270 Merge PR #2666: build(deps-dev): bump tar from 7.5.10 to 7.5.11 in gt-model-eval
- 5fc2532 Merge main into fix/formula-var-context-standalone
- 5a81ad3 Merge remote-tracking branch 'gastown/polecat/furiosa/gt-nqy9@mmjtqdye'
- cf58254 Merge remote-tracking branch 'gastown/polecat/nux/gt-pv3k@mmjtqumk'
- 5009f95 Merge remote-tracking branch 'origin/main' into codex/convoy-town-root-routing-2604
- 6b5f112 build(deps-dev): bump hono
- 4c5dd1c build(deps-dev): bump tar
- 2620ad1 chore(deps): bump filippo.io/edwards25519
- c6f8fe1 chore(deps): update dependency promptfoo to v0.121.1
- 87897b1 chore(deps): update github actions
- 4369ae3 fix(dolt-snapshots): add launched status and fix connection pool safety
- 67d9b89 fix(refinery-patrol): embed Active Configuration block in formula root description
- a42a032 fix(refinery-patrol): restore showFormulaStepsFull with var substitution at prime time
- c0a06a6 fix(refinery-patrol): substitute vars directly into Variables table
- 8a9efdc refactor: remove shouldBeWisp heuristic (ZFC compliance)
- e3a5f80 research: macOS sandbox-exec capabilities and limitations (gt-6qt)
- 3c5c04a research: macOS sandbox-exec capabilities and limitations (gt-6qt)
- 5378421 test(convoy): remove short-id uniqueness flake
- d15149c test(convoy): remove short-id uniqueness flake
- 2f38bce test(mail,config): add reply reminder tests and update notify tests
- 3e7a069 test(nudge): add DeliverAfter deferred delivery tests
- 262708b test(windows): accept claude cmd paths in config tests
- 6263d9e test(windows): accept claude cmd paths in config tests
- ef41285 test(windows): fix shared harness assumptions
- 78c1c3f test(windows): fix shared harness assumptions
- 2ef3f44 test(windows): normalize loader claude path checks
- 1d6d5b1 test(windows): normalize loader claude path checks