Skip to main content

Feature Parity: Gas Town → Gas City

Created 2026-02-27 from exhaustive exploration of gastown upstream/main (92 top-level commands, 425+ subcommands, 180 command files) compared against gascity main (23 top-level commands, ~60 implementation files). Goal: 100% feature parity. Every gastown feature gets a Gas City equivalent — either via a direct port, a configuration-driven alternative, or a deliberate architectural decision to handle it differently. Key constraint: Gas City has ZERO hardcoded roles. Every gastown command that references mayor/deacon/witness/refinery/polecat/crew must become role-agnostic infrastructure that any pack can use.

Status Legend

StatusMeaning
DONEFully implemented in Gas City
PARTIALCore exists, missing subcommands or capabilities
TODONot yet implemented, needed for parity
REMAPGastown-specific; handled differently in Gas City by design
VERIFYImplementation exists but correctness needs verification
N/ADeployment/polish concern, not SDK scope

1. City/Town Lifecycle

GastownGas CityStatusNotes
gt install [path]gc init [path]DONEAuto-init on gc start too
gt start [path]gc start [path]DONEOne-shot + controller modes
gt down / gt stopgc stop [path]DONEGraceful shutdown + orphan cleanup
gt upgc startDONEgt up is idempotent boot; gc start one-shot reconcile is equivalent
gt shutdowngc stop + gc worktree cleanN/AWONTFIX: gc stop + gc worktree clean --all covers it. Graceful handoff wait and uncommitted work protection are domain-layer concerns for the pack config.
gt restartgc restart [path]DONEStop then start
gt statusgc status [path]DONECity-wide overview: controller, suspended state, all agents/pools, rigs, summary count.
gt enable / gt disablegc suspend / gc resumeDONECity-level suspend: hook injection becomes no-op. Also supports GC_SUSPENDED=1 env override.
gt versiongc versionDONE
gt infoN/AWhats-new splash; polish
gt staleN/ABinary staleness check; polish
gt uninstallN/ADeployment concern
gt git-initREMAPgc init handles city setup; git init is user’s job
gt thanksN/ACredits page; polish

2. Supervisor / Controller

GastownGas CityStatusNotes
gt daemon rungc supervisor runDONECanonical foreground control loop
gt daemon startgc supervisor startDONEBackground supervisor
gt daemon stopgc supervisor stopDONESocket shutdown
gt daemon statusgc supervisor statusDONEPID + uptime
gt daemon logsgc supervisor logsDONETail supervisor log file
gt daemon enable-supervisorgc supervisor install / uninstallDONElaunchd + systemd
Controller flockController flockDONEacquireControllerLock
Controller socket IPCController socket IPCDONEUnix socket + “stop” command
Reconciliation loopReconciliation loopDONETick-based with fsnotify
Config hot-reloadConfig hot-reloadDONEDebounced, validates before apply
Crash tracking + backoffCrash tracking + backoffDONEcrashTracker with window
Idle timeout enforcementIdle timeout enforcementDONEidleTracker per agent
Graceful shutdown danceGraceful shutdownDONEInterrupt → wait → kill
PID file write/cleanupPID file write/cleanupDONEIn runController
Dolt health check tickerDolt EnsureRunning + order dolt-healthDONEEnsureRunning via gc-beads-bd script + cooldown order (30s) for periodic health check and restart.
Dolt remotes patrolOrder recipe: dolt-remotes-patrolDONECooldown order (15m) runs gc dolt sync. Lives in examples/gastown/formulas/orders/dolt-remotes-patrol/.
Feed curatorREMAPGastown tails events.jsonl, deduplicates, aggregates, writes curated feed.jsonl. Gas City’s tick-based reconciler covers recovery; curated feed is UX polish.
Convoy manager (event polling)bd on_close hook → gc convoy autocloseDONEReactive: bd on_close hook triggers gc convoy autoclose <bead-id> which checks parent convoy completion. Replaced polling order convoy-check.
Workspace sync pre-restartsyncWorktree()DONEgit fetch + git pull --rebase + auto-stash/restore in worktree.go. Wired into gc start and pool respawn. Guarded by pre_sync config flag.
KRC prunerN/ANo KRC in Gas City

3. Agent Management

GastownGas CityStatusNotes
gt agents listgc session listDONELists agents with pool/suspend annotations
gt agents menuscripts/agent-menu.shDONEShell script via session_setup; prefix-g keybinding
gt agents checkgc doctorDONEAgent health in doctor checks
gt agents fixgc doctor --fixDONE
Agent start (spawn)Reconciler auto-startsREMAPNo gc agent start; reconciler spawns agents on tick. gc session attach idempotently starts+attaches.
Agent stop (graceful)gc runtime drain / gc agent suspendREMAPNo gc agent stop; drain stops gracefully with timeout, suspend prevents restart.
Agent killgc session kill <name>DONEForce-kill; reconciler restarts on next tick
Agent attachgc session attach <name>DONEInteractive terminal; starts session if not running
Agent statusgc session listDONEShows session, running, suspended, draining state
Agent peekgc session peek [name]DONEScrollback capture with —lines
Agent draingc runtime drain <name>DONEPool drain with timeout + drain-ack + drain-check + undrain
Agent suspendgc agent suspend <name>DONEPrevent reconciler spawn (sets suspended=true in city.toml)
Agent resumegc agent resume <name>DONERe-enable spawning (clears suspended)
Agent nudgegc session nudge <name> <msg>DONESend input to running session via tmux send-keys
Agent add (runtime)gc agent add --name <name>DONEAdd agent to city.toml (supports —prompt-template, —dir, —suspended)
Agent request-restartgc runtime request-restartDONESignal agent to restart on next hook check
Session cycling (gt cycle)session_setup + scriptsDONEInlined as shell scripts in examples/gastown/scripts/cycle.sh, wired via session_setup bind-key with if-shell fallback preservation
Session restart with handoffgc handoff + reconcilerDONECore handoff implemented: mail-to-self + restart-requested + reconciler restart + scrollback clearing. --collect is WONTFIX (fails ZFC: agent writes better handoff notes than a canned state dump).
gt seanceP3Predecessor session forking: decomposes into events + provider --fork-session --resume. Real in gastown but not SDK-critical.
gt cleanupgc doctor --fixDONEZombie/orphan cleanup
gt shell install/removeN/AShell integration; deployment

4. Pool / Polecat Management

GastownGas CityStatusNotes
Pool min/max scalingPool min/max/checkDONEElastic pool with check command
Pool drain with timeoutPool drain with timeoutDONEdrainOps in reconciler
Polecat spawn (worktree)Worktree isolationDONEisolation = "worktree"
Polecat name poolREMAPGas City uses {name}-{N} numeric; names are config
gt polecat listgc session listDONEPool instances shown with annotations
gt polecat add/removeConfig-drivenREMAPEdit city.toml pool.max
gt polecat statusgc session listDONEPer-instance
gt polecat nukegc session kill + gc worktree cleanDONEKill + worktree cleanup
gt polecat gcgc doctor --fixDONEStale worktree cleanup
gt polecat stale/pruneReconcilerDONEOrphan detection in reconciler
gt polecat identityREMAPNo identity system; agents are config
gt namepool add/reset/set/themesREMAPNo name pool; numeric naming
gt prune-branchesgc worktree cleanDONEWorktree cleanup; stale branch pruning built into removeAgentWorktree
Polecat git-state checkgc worktree clean / gc worktree listDONEThree safety checks: HasUncommittedWork, HasUnpushedCommits, HasStashes. Blocks removal unless --force. List shows combined status.
Dolt branch isolationTODOPer-agent dolt branch for write isolation

5. Crew Management

GastownGas CityStatusNotes
gt crew add/removeConfig-drivenREMAPAdd [[agent]] to city.toml
gt crew listgc session listDONE
gt crew start/stopReconciler / gc agent suspend+resumeREMAPNo individual start/stop; reconciler auto-starts, suspend prevents restart
gt crew restartgc session kill (reconciler restarts)DONE
gt crew statusgc session listDONE
gt crew at <name>gc session attach <name>DONE
gt crew refreshgc handoff --targetDONERemote handoff: sends mail + kills session; reconciler restarts
gt crew pristineREMAPJust git: git -C <workdir> pull per agent; witness/deacon prompt can do this
gt crew next/prevTODOCycle between crew sessions
gt crew renameConfig-drivenREMAPEdit city.toml

6. Work Management (Beads)

GastownGas CityStatusNotes
gt show <bead-id>bd show <id>REMAPDelegates to bd CLI directly
gt cat <bead-id>bd show <id>REMAPSame
gt close [bead-id...]bd close <id>REMAPDelegates to bd
gt doneREMAPInlined to prompt: git push + bd create --type=merge-request + bd close + exit. No SDK command needed.
gt release <issue-id>REMAPJust bd: bd update <id> --status=open --assignee="". No SDK command needed.
gt readygc hook (work_query)DONEShows available work
Bead CRUDBead CRUDDONEFileStore + BdStore + MemStore
Bead dependenciesBead dependenciesDONENeeds field + Ready() query
Bead labelsBead labelsDONELabels field
Bead types (custom)TODORegister custom bd types (message, agent, molecule, etc.)
Agent beads (registration)REMAPJust bd: bd create --type=agent + bd update --label. No SDK command needed.
Agent state trackingREMAPJust bd labels: idle:N, backoff-until:TIMESTAMP. Liveness = bead last-updated.
Bead slots (hook column)N/AWONTFIX: Gas City doesn’t use hooked beads. Users can implement via bd labels if needed.
Merge request beadsREMAPJust bd metadata: bd update --set-metadata branch=X target=Y. No structured fields needed — gastown formulas already use this pattern. BdStore.SetMetadata supports it.
Cross-rig bead routingRoutes fileDONEroutes.jsonl for multi-rig
Beads redirectBeads redirectDONEsetupBeadsRedirect for worktrees
gt auditgc events --typePARTIALEvents cover audit; no per-actor query
gt migrate-bead-labelsN/AMigration tool; one-time

7. Hook & Dispatch

GastownGas CityStatusNotes
gt hook (show/attach/detach/clear)gc hookDONEHas work_query. Attach/detach/clear are N/A — Gas City doesn’t use hooked beads; users can implement via bd if needed.
gt sling <bead> [target]gc sling <target> <bead>DONERoutes + nudges
gt unsling / gt unhookN/AWONTFIX: Gas City doesn’t use hooked beads. Users can bd update --hook="" if needed.
Sling to selfgc sling $GC_AGENT <bead>DONEShell expands $GC_AGENT; no special code needed
Sling batch (multiple beads)doSlingBatch container expansionDONEConvoy/epic auto-expand open children; per-child warnings, partial failure, single nudge
Sling with formula instantiationgc sling --formulaDONECreates wisp molecule
Sling idempotencycheckBeadState pre-flightPARTIALWarns on already-assigned/labeled beads; --force suppresses. Warns rather than skips.
Sling —args (natural language)TODOStore instructions on bead, show via gc prime
Sling —merge strategygc sling --mergeDONE--merge direct|mr|local stores merge_strategy metadata on bead
Sling —stdingc sling --stdinDONE--stdin reads text from stdin (first line = title, rest = description); mutually exclusive with --formula
Sling —max-concurrentN/AWONTFIX: pool min/max config controls concurrency; agents pull work via bd ready so overload is self-limiting.
Sling auto-convoygc sling (default)DONEAuto-creates convoy on sling; --no-convoy to suppress, --owned to mark owned
Sling —accountTODOPer-sling account override for quota rotation. Resolves handle → CLAUDE_CONFIG_DIR for spawned agent. Requires gc account + gc quota command groups.
Sling —agent overrideN/AWONTFIX: Use separate pools with different providers. Priority sorting (bd ready --sort priority) handles work routing. Adding pools is already supported via config + gc agent add.
gt handoffgc handoffDONEMail-to-self + restart-requested + block
gt broadcastDEFERNudge all agents; operator convenience, no programmatic callers. Implement when needed.
gt nudge <target> [msg]gc session nudge <name> <msg>DONEDirect message injection via tmux send-keys

8. Mail / Messaging

GastownGas CityStatusNotes
gt mail sendgc mail sendDONECreates message bead
gt mail inboxgc mail inboxDONELists unread
gt mail readgc mail readDONERead + close
gt mail peekgc mail checkDONEObviated by gc mail check --inject
gt mail deleteDEFERAdd when needed
gt mail archivegc mail archiveDONE
gt mail mark-read/mark-unreadDEFERAdd when needed
gt mail checkgc mail checkDONECount unread
gt mail searchDEFERAdd when needed
gt mail thread / gt mail replyDEFERAdd when needed
gt mail claim/releaseDEFERAdd when needed
gt mail clearDEFERAdd when needed
gt mail hookgc mail check --injectDONEHook injection via --inject flag
gt mail announcesREMAPNo channels; direct addressing sufficient
gt mail channelREMAPPub/sub channels; domain pattern
gt mail queueREMAPClaim queues; domain pattern
gt mail groupREMAPMailing lists; domain pattern
gt mail directoryN/ADirectory listing; UX polish
gt mail identityREMAPIdentity is $GC_AGENT
Mail priority (urgent/high/normal/low)DEFERAdd when needed
Mail type (task/scavenge/notification/reply)DEFERAdd when needed
Mail delivery modes (queue/interrupt)DEFERAdd when needed
Mail threading (thread-id, reply-to)DEFERAdd when needed
Two-phase delivery (pending → acked)DEFERAdd when needed
Mail CCDEFERAdd when needed
Address resolution (@town, @rig, groups)DEFERAdd when needed

9. Formulas & Molecules

GastownGas CityStatusNotes
Formula TOML parsingFormula TOML parsingDONEinternal/formula
gc formula listgc formula listDONE
gc formula showgc formula showDONE
gc formula validateREMAPJust bd: bd formula show validates on parse; bd cook --dry-run for full check
gt formula createREMAPUser writes .formula.toml file; no scaffolding command needed
gt formula runREMAPJust bd: bd mol pour <formula> + gc sling; convoy execution is gc sling --formula
Formula types: workflowworkflowDONESequential steps with dependencies
Formula types: convoyREMAPbd owns formula types; bd cook + bd mol pour/wisp handle all types
Formula types: expansionREMAPbd owns formula types; bd cook handles expansion
Formula types: aspectREMAPbd owns formula types; bd cook handles aspects
Formula variables (—var)gc sling --formula --varDONEPasses --var key=value through to bd mol cook
Three-tier resolution (project → city → system)Five-tier (system + city topo + city local + rig topo + rig local)DONESystem formulas via go:embed Layer 0; higher layers shadow by filename
Periodic formula dispatchgc order list/show/run/checkREMAPReplaced by file-based order system. Orders live in orders/<name>/order.toml with gate evaluation (cooldown, cron, condition, manual). gc order check evaluates gates.
gt mol statusREMAPJust bd: bd mol current --for=$GC_AGENT
gt mol currentREMAPJust bd: bd mol current shows steps with “YOU ARE HERE”
gt mol progressREMAPJust bd: bd mol current shows step status indicators
gt mol attach/detachREMAPJust bd: bd update $WISP --assignee=$GC_AGENT / --assignee=""
gt mol step doneREMAPJust bd: bd close <step-id> auto-advances
gt mol squashREMAPJust bd: bd close $MOL_ID + bd create --type=digest
gt mol burnREMAPJust bd: bd mol burn <wisp-id> --force
gt mol attach-from-mailREMAPPrompt-level: read mail, pour wisp, assign
gt mol await-signal/eventREMAPJust gc: gc events --watch --type=... --timeout
gt mol emit-eventREMAPJust gc: gc event emit ...
Wisp molecules (ephemeral)Wisp moleculesDONEEphemeral bead flag
gt compactmol-wisp-compact orderDONEDeacon order formula; raw bd commands (list/delete/update —persistent)

10. Convoy (Batch Work)

GastownGas CityStatusNotes
gt convoy creategc convoy createDONECreate batch tracking bead
gt convoy addgc convoy addDONEAdd issues to convoy
gt convoy closegc convoy closeDONEClose convoy
gt convoy statusgc convoy statusDONEShow progress
gt convoy listgc convoy listDONEDashboard view
gt convoy checkgc convoy checkDONEAuto-close completed convoys
gt convoy landTODOLand completed convoy (cleanup)
gt convoy launchTODODispatch convoy work
gt convoy stageTODOStage convoy for validation
gt convoy strandedgc convoy strandedDONEFind convoys with stuck work
Auto-close on completiongc convoy check + bd on_close hookDONEgc convoy check (batch scan) + gc convoy autoclose (reactive via bd on_close hook)
Close-triggers-convoy-checkbd on_close hook → gc convoy autocloseDONEbd on_close hook triggers gc convoy autoclose <bead-id> which checks parent convoy. Recursive-safe, idempotent.
Reactive feedingN/AWONTFIX: bd ready + pool auto-scaling handle work discovery; agents poll their own queues. Reactive push is unnecessary with pull-based GUPP.
Blocking dependency checkBead dependenciesPARTIALReady() exists; convoy-specific filtering missing

11. Merge Queue

GastownGas CityStatusNotes
gt mq submitREMAPJust bd: polecat sets metadata.branch/metadata.target + assigns to refinery
gt mq listREMAPJust bd: bd list --assignee=refinery --status=open
gt mq statusREMAPJust bd: bd show $WORK --json | jq '.metadata'
gt mq retryREMAPJust bd: refinery rejects back to pool, new polecat picks up
gt mq rejectREMAPJust bd: bd update --status=open --assignee="" --set-metadata rejection_reason=...
gt mq nextREMAPJust bd: bd list --assignee=$GC_AGENT --limit=1
gt mq integrationREMAPGit workflow + bead metadata; gastown-gc helper territory
MR scoring (priority + age + retry)REMAPbd query ordering; prompt-level concern
Conflict detection + retryREMAPPure git in refinery formula; prompt-level
MR bead fields (branch, target, etc.)REMAPJust bd metadata: --set-metadata branch=X target=Y

12. Rig Management

GastownGas CityStatusNotes
gt rig addgc rig addDONE
gt rig listgc rig listDONE
gt rig removeN/AWONTFIX: edit city.toml + gc start; gc doctor can detect orphaned state
gt rig statusgc rig status (via gc status)PARTIALPer-rig agent status not separated
gt rig start/stopgc rig suspend/resumeDONEDifferent naming, same effect
gt rig restartgc rig restartDONEKill agents, reconciler restarts
gt rig park/unparkgc rig suspend/resumeDONE
gt rig dock/undockREMAPSame as suspend/resume
gt rig bootgc start (auto-boots rigs)DONE
gt rig shutdowngc stopDONE
gt rig config show/set/unsetN/AWONTFIX: edit city.toml directly
gt rig settings show/set/unsetN/AWONTFIX: edit city.toml directly
gt rig detectN/AWONTFIX: gc rig add <path> is sufficient
gt rig quick-addN/AWONTFIX: gc rig add <path> is sufficient
gt rig resetTODOReset rig to clean state
Per-rig agents (witness/refinery)Rig-scoped agents (dir = "rig")DONE
Rig beads prefixrig.prefix / EffectivePrefix()DONE
Fork support (push_url)WONTFIXUser runs git remote set-url --push origin <fork> in rig dir; worktrees inherit it. No SDK involvement needed.

13. Health Monitoring

GastownGas CityStatusNotes
gt doctorgc doctorDONEComprehensive health checks
gt doctor --fixgc doctor --fixDONEAuto-repair
Witness patrol (rig-level)Reconciler tickDONEDifferent mechanism, same outcome
Deacon patrol (town-level)Controller loopDONESame
Stall detection (30min threshold)Idle timeoutDONEConfigurable per agent
GUPP violation detectionN/AWONTFIX: idle timeout + prompt self-assessment cover this; depends on hooked beads
Orphaned work detectionOrphan session cleanupDONEReconciler phase 2
Zombie detection (tmux alive, process dead)Doctor zombie checkDONE
gt deacon (18 subcommands)REMAPRole-specific; controller handles patrol
gt witness (5 subcommands)REMAPRole-specific; per-agent health in config
gt boot (deacon watchdog)REMAPController IS the watchdog
gt escalateN/AWONTFIX: idle timeout + health patrol already cover this; escalation is a prompt-level concern
gt warrant (death warrants)REMAPController handles force-kill decisions
Health heartbeat protocolTODOAgent liveness pings with configurable interval
gt patrolREMAPPatrol is the controller reconcile loop
gt orphansDoctor orphan checkDONE

14. Hooks (Provider Integration)

GastownGas CityStatusNotes
Hook installation (Claude)Hook installation (Claude)DONE.gc/settings.json — includes skipDangerousModePermissionPrompt, editorMode, PATH export
Hook installation (Codex)Hook installation (Codex)DONE.codex/hooks.json — SessionStart primes via gc prime --hook; Stop checks queued work via gc hook --inject
Hook installation (Gemini)Hook installation (Gemini)DONE.gemini/settings.json — event names (SessionStart, PreCompress, BeforeAgent, SessionEnd) verified correct against Gemini CLI docs and gastown upstream.
Hook installation (OpenCode)Hook installation (OpenCode)DONE.opencode/plugins/gascity.js
Hook installation (Copilot)Hook installation (Copilot)DONE.github/hooks/gascity.json with .github/copilot-instructions.md as a companion fallback
Hook installation (Pi)Hook installation (Pi)DONE.pi/extensions/gc-hooks.js
Hook installation (OMP)Hook installation (OMP)DONE.omp/hooks/gc-hook.ts
Provider SupportsHooks flagProviderSpec.SupportsHooksDONEPer-provider hook metadata; cross-checked against installer support. AgentHasHooks still requires Claude, explicit install_agent_hooks, or hooks_installed.
Provider InstructionsFileProviderSpec.InstructionsFileDONEPer-provider instructions file (e.g., CLAUDE.md, AGENTS.md)
gt hooks syncTODORegenerate all settings files from config
gt hooks diffTODOPreview what sync would change
gt hooks baseTODOEdit shared base hook config
gt hooks override <target>TODOPer-role hook overrides
gt hooks listTODOShow all managed settings
gt hooks scanTODODiscover hooks in workspace
gt hooks initTODOBootstrap from existing settings
gt hooks registryTODOHook marketplace/registry
gt hooks install <id>TODOInstall hook from registry
Base + override merge strategyTODOPer-matcher merge semantics
6 hook event types4 of 6 implementedPARTIALClaude: SessionStart, PreCompact, UserPromptSubmit, Stop all installed. Missing: PreToolUse, PostToolUse. Adding these would enable tool-level guards (e.g., block rm -rf /).
Roundtrip-safe settings editingTODOPreserve unknown fields when editing settings.json

15. Orders

GastownGas CityStatusNotes
gt order listgc order listDONELists all orders with gate type, timing, pool
gt order showgc order showDONEShows order details incl. source file, description, gate config
gt order rungc order runDONEExecutes order manually: instantiates wisp, slings to target pool
gt order checkgc order checkDONEEvaluates gates for all orders, shows due/not-due table
gt order historygc order historyDONEShow order execution history; queries order-run: labels
Order gate typesinternal/ordersDONE5 of 5 types: cooldown, cron, condition, manual, event.
Order TOML formatorders/<name>/order.tomlDONE[order] header with gate, formula, interval, schedule, check, pool, enabled fields
Order tracking (labels, digest)order-run: labelsDONEExecution recording via bead labels, last-run tracking for gate evaluation
Order execution timeoutTODOTimeout enforcement
Multi-layer order resolution4-layer formula resolutionDONEOrders inherit formula resolution: rig formulas dir → city formulas dir → embedded

16. Events & Activity

GastownGas CityStatusNotes
gt loggc eventsDONEJSONL event log
gt log crashgc events --type=agent.crashedDONE
gt feedN/AWONTFIX: gc events --since/--type/--watch + OTEL covers this; TUI curator is UX polish
gt activity emitgc event emitDONE
gt trail (recent/recap)gc events --sinceDONE
gt trail commitsN/AWONTFIX: git log --since is a trivial shell wrapper, not SDK infrastructure
gt trail beadsN/AWONTFIX: bd list --since is a trivial shell wrapper
gt trail hooksN/AWONTFIX: gc events --type=hook --since covers this
Event visibility tiers (audit/feed/both)N/AWONTFIX: gc events --type filtering is sufficient
Structured event payloads--payload JSONPARTIALFree-form; no typed builders
gc events --watchgc events --watchDONEBlock until events arrive
gc events --payload-matchgc events --payload-matchDONEFilter by payload fields

17. Config Management

GastownGas CityStatusNotes
Config load (TOML)Config load (TOML)DONEcity.toml with progressive activation
Config composition (includes)Config compositionDONEFragment includes + layering
Config patchesConfig patchesDONEPer-agent overrides
Config validationConfig validationDONEAgent, rig, provider validation
Config hot-reloadConfig hot-reloadDONEfsnotify + debounce
gt config set/getgc config showPARTIALShow only; no set/get
gt config cost-tierREMAPProvider per agent is config
gt config default-agentREMAPworkspace.provider
gt config agent-email-domainREMAPAgent env config
Remote pack fetchRemote pack fetchDONEgc pack fetch/list
Pack lock filePack lock fileDONE.gc/pack.lock
Config provenance trackingConfig provenanceDONEWhich file, which line
Config revision hashConfig revision hashDONEFor change detection
Config —strict modeConfig —strict modeDONEPromote warnings to errors

18. Prompt Templates

GastownGas CityStatusNotes
Role templates (7 roles)Prompt templatesDONEAny agent, any template file
Message templates (spawn/nudge/escalation/handoff)TODOTemplate rendering for messages
Template functions ()Template functionsDONE, , , etc.
Shared template compositionShared templatesDONEprompts/shared/ directory
Template variables (role data)Template variablesDONECityRoot, AgentName, RigName, WorkDir, Branch, DefaultBranch, IssuePrefix, WorkQuery, SlingQuery, TemplateName + custom Env
gt primegc primeDONEOutput agent prompt
gt role show/list/def/env/home/detectREMAPRoles are config; gc prime + gc config show
Commands provisioning (.claude/commands/)overlay_dir configDONEGeneric overlay_dir copies any directory tree into agent workdir at startup
CLAUDE.md generationTODOGenerate agent-specific CLAUDE.md files

19. Worktree Isolation

GastownGas CityStatusNotes
Worktree creation (per agent)Worktree creationDONEisolation = "worktree"
Worktree branch namingWorktree branch namingDONEgc-{rig}-{agent}
Worktree cleanup (nuke)gc worktree clean --allDONE
Worktree submodule initcreateAgentWorktreeDONELayer 0 side effect: git submodule update --init --recursive after worktree add
gt worktree listgc worktree listDONEList all worktrees across rigs
gt worktree removegc worktree cleanDONERemove specific or all worktrees
Beads redirect in worktreeBeads redirectDONEPoints to shared rig store
Formula symlink in worktreeFormula symlinkDONEMaterialized in worktree
Worktree gitignore managementensureWorktreeGitignoreDONEAppends infrastructure patterns (.beads/redirect, .gemini/, etc.) to worktree .gitignore. Idempotent, gated on config.
Cross-rig worktreesTODOWorktree in another rig’s repo
Stale worktree repair (doctor)Doctor worktree checkDONEWorktreeCheck validates .git pointers, —fix removes broken entries

20. Dogs (Cross-Rig Workers)

GastownGas CityStatusNotes
gt dog add/removeREMAPConfig-driven pool agents scoped to city
gt dog list/statusgc session listREMAPCity-wide agents shown
gt dog call/dispatch/done/cleargc slingREMAPSling to city-wide agent pool

21. Costs & Accounts

GastownGas CityStatusNotes
gt costsN/ADeployment analytics
gt costs record/digest/migrateN/A
gt account list/add/default/status/switchTODOMulti-account management for quota rotation
gt quota status/scan/clear/rotateTODORate-limit detection and account rotation

22. Dashboard & UI

GastownGas CityStatusNotes
gt dashboardTODOWeb dashboard for convoy tracking
gt status-linesession_setup + scriptsDONEInlined as examples/gastown/scripts/status-line.sh, called via tmux #() in status-right
gt themeN/Atmux theme management
gt dnd (Do Not Disturb)N/ANotification suppression
gt notifyN/ANotification level
gt issue show/set/clearN/AStatus line issue tracking

23. Dolt Integration

GastownGas CityStatusNotes
gt dolt initdolt.InitCityDONE
gt dolt start/stop/statusdolt.EnsureRunning/StopCityDONE
gt dolt logsgc dolt logsDONETail dolt server log with --follow
gt dolt sqlgc dolt sqlDONEInteractive SQL shell; auto-connects to running server or falls back to file-based
gt dolt init-rigdolt.InitRigBeadsDONE
gt dolt listgc dolt listDONEList dolt databases with table/row counts
gt dolt migrateN/ASchema migration; one-time
gt dolt fix-metadataTODORepair metadata.json
gt dolt recovergc dolt recoverDONERecover from corruption: backup, rebuild metadata, verify
gt dolt cleanupTODORemove orphaned databases
gt dolt rollbackgc dolt rollbackDONEList backups or restore with —force
gt dolt syncgc dolt syncDONEPush to configured remotes; stages, commits, pushes each database
Dolt branch per agentTODOWrite isolation branches
Dolt health tickerOrder recipe: dolt-healthDONECooldown order (30s) runs gc dolt status + gc dolt start on failure. Lives in examples/gastown/formulas/orders/dolt-health/.

24. Miscellaneous Gastown Commands

GastownGas CityStatusNotes
gt callbacks processREMAPHandled by hook system
gt checkpoint write/read/clearREMAPBeads-based recovery is sufficient
gt commitN/AWONTFIX: agents use git commit directly; $GC_AGENT env var available for author info
gt signal stopREMAPHook signal; provider-specific
gt tap guardREMAPPR workflow guard; provider-specific hook
gt town next/prev/cycleN/AMulti-town switching; deployment
gt wl (wasteland federation)N/ACross-town federation; future
gt swarm (deprecated)N/ASuperseded by convoy
gt synthesisREMAPConvoy synthesis is a prompt-level concern; agents use bd mol pour + formula steps
gt whoamiN/AWONTFIX: $GC_AGENT env var is sufficient

Priority Summary

P0 — Critical for feature parity (blocks gastown-as-gc-config)

These are features that gastown’s configuration depends on to function:
  1. Agent nudge — DONE (gc session nudge <name> <msg>)
  2. gc done — REMAP (inlined to prompt: git push + bd create + bd close + exit)
  3. Agent bead lifecycle — REMAP (just bd: bd create --type=agent + bd update --label)
  4. Bead slot (hook) operations — N/A WONTFIX (no hooked beads; users can use bd)
  5. Unsling/unhook — N/A WONTFIX (no hooked beads; users can use bd)
  6. Mail enhancements — DEFERRED (peek/hook covered by gc mail check --inject; rest add when needed)
  7. Molecule lifecycle — REMAP (all subcommands are just bd: bd mol current, bd close <step>, bd update --assignee)
  8. Merge queue — REMAP (all subcommands are just bd: bd list --assignee=..., bd update --status=open)
  9. Convoy tracking — DONE (gc convoy create/list/status/add/close/check/stranded; reactive feeding N/A — pull-based GUPP)
  10. gc broadcast — DEFERRED (no use case yet; revisit when needed)
  11. gc handoff — DONE (gc handoff <subject> [message])
  12. Periodic formula dispatch — REMAP (replaced by file-based order system: gc order list/show/run/check with gate evaluation)
  13. GUPP violation detection — N/A WONTFIX (idle timeout + prompt-level self-assessment cover this; gastown’s check depends on hooked beads which Gas City doesn’t use)

P1 — Important for production use

  1. gc status — DONE (gc status [path])
  2. Order system — DONE (list, show, run, check, gate evaluation with 4 of 5 gate types)
  3. Event visibility tiers — N/A WONTFIX (gc events --type filtering is sufficient)
  4. Escalation system — N/A WONTFIX (idle timeout + health patrol already cover this)
  5. gc release — REMAP (just bd: bd update <id> --status=open --assignee="")
  6. tmux status line — DONE (inlined as shell scripts in examples/gastown/scripts/, wired via session_setup)
  7. Dolt management — DONE (gc dolt logs/sql/list/recover/sync)
  8. Rig management — N/A WONTFIX (remove: edit city.toml + gc doctor; config/settings: edit city.toml; detect/quick-add: gc rig add is sufficient)
  9. Session cycling — DONE (inlined as examples/gastown/scripts/cycle.sh + bind-key.sh, wired via session_setup)
  10. Stale branch cleanup — DONE (gc worktree clean + removeAgentWorktree prunes stale branches)
  11. gc whoami — N/A WONTFIX (not used anywhere; $GC_AGENT env var is sufficient)
  12. gc commit — N/A WONTFIX (not used anywhere; agents use git commit directly)
  13. Commands provisioning — DONE (generic overlay_dir config field copies any directory tree into agent workdir)
  14. Polecat git-state check — DONE (3 safety checks in gc worktree clean + gc worktree list)
  15. Worktree gitignore — DONE (ensureWorktreeGitignore manages infrastructure patterns)

P2 — Nice-to-have / polish

  1. Feed curation — N/A WONTFIX (gc events --since/--type/--watch + OTEL covers this; TUI curator is UX polish that fails Bitter Lesson)
  2. Trail subcommands — N/A WONTFIX (git log --since + bd list are trivial shell wrappers, not SDK infrastructure)
  3. Formula types — REMAP (bd owns all formula types: bd cook + bd mol pour/wisp)
  4. Formula create — REMAP (user writes .formula.toml file directly)
  5. Formula variables — DONE (gc sling --formula --var passes through to bd cook --var)
  6. Formula validate — REMAP (bd formula show validates on parse; bd cook --dry-run for full check)
  7. Config set/get — DEFERRED to P3 (too many footguns; edit city.toml directly)
  8. Agent menu — DONE (shell script + session_setup keybinding)
  9. Crew refresh/pristine — DONE/REMAP (refresh = gc handoff --target; pristine = just git pull)
  10. Worktree list/remove — DONE (gc worktree list + gc worktree clean)
  11. Submodule init — DONE (Layer 0 side effect in createAgentWorktree)
  12. Compact (wisp TTL) — DONE (deacon order formula mol-wisp-compact; raw bd commands)
  13. Workspace sync pre-restart — DONE (syncWorktree() with fetch + pull —rebase + auto-stash; wired into start + pool respawn)
  14. Close-triggers-convoy-check — DONE (bd on_close hook → gc convoy autoclose; reactive, recursive-safe, idempotent)
  15. Sling —merge strategy — DONE (--merge direct|mr|local stores merge_strategy metadata)
  16. Sling auto-convoy — DONE (default behavior; --no-convoy to suppress, --owned to mark owned)

P3 — Future / deferred

  1. gt seance — Predecessor session forking; real in gastown but decomposes into events + provider flags
  2. Hooks lifecycle — WONTFIX (gastown uses 3 overlay settings.json files — default/crew/witness — instead of base+override merge; overlay_dir in city.toml handles installation)
  3. Dashboard — Web UI for convoy tracking
  4. Address resolution — @town, @rig group patterns for mail
  5. Cross-rig worktrees — Agent worktree in another rig’s repo
  6. Account managementgc account add/list/switch/default/status + per-sling --account for quota rotation
  7. Quota rotationgc quota scan/rotate/status/clear for multi-account rate-limit management

Remaining TODO items (not yet resolved)

#FeatureSectionPriority
6Convoy land/launch/stage10P2
7Sling —args7P2
11PreToolUse/PostToolUse hooks14P2
12Order event gate type15DONE
13Order tracking (last-run)15P1 DONE
14Message templates18P2
15CLAUDE.md generation18P2
19Sling —stdin7DONE
20Sling —account7P3
21Hooks sync/diff/base/override/list/scan/init14P3
22Roundtrip-safe settings editing14P3
23Order history15DONE
24Order execution timeout15P3
25Embedded system formulas9DONE
26Dolt fix-metadata23P3
27Dolt cleanup23P3
28Dolt rollback CLI23DONE
29Dolt branch per agent23WONTFIX — gastown implemented then removed (Feb 2026); write contention solved differently
30Rig fork push_url12WONTFIX
31Rig reset12P3
32Stale worktree repair (doctor)19DONE
33Cross-rig worktrees19P3
34Custom bead types6P3
35Crew next/prev cycling5DONE — tmux keybinding overrides in examples/gastown/scripts/ (cycle.sh, bind-key.sh, agent-menu.sh)
36Convoy blocking dependency10P3
37Health heartbeat protocol13P3
38Dashboard (web UI)22P3
39Account management21P3
40Quota rotation21P3
41Handoff —collect (auto-state)7WONTFIX
42Scrollback clear on restart3DONE

N/A — Not SDK scope

  • Costs/accounts/quota (deployment analytics) Costs are N/A but accounts + quota are P3 (see #46-47)
  • Themes/DND/notifications (UX polish)
  • Town cycling (multi-town deployment)
  • Wasteland federation (cross-town)
  • Shell integration (deployment)
  • Agent presets (config handles this)
  • Name pools DONE (namepool feature)

Effort Estimates

PriorityTODO ItemsEstimated LinesNotes
P00 remainingAll P0 items resolved (DONE, REMAP, or N/A)
P10 remainingAll P1 items resolved
P26 items (#6-15)~1,200-2,300Sling flags, convoy features, hooks, templates
P323 items (#20-42)~3,400-4,900Hook lifecycle, order polish, dolt CLI, formula resolution, rig ops, accounts, dashboard
Total29 TODO items~4,600-7,200All P0+P1 cleared; 5 P2 resolved, 2 P2 WONTFIX, 1 P2 REMAP (MR bead fields = just bd metadata)
Current Gas City: ~14,000 lines of Go (excl. tests, docs, generated). Feature parity target: ~20,000-23,000 lines.

Audit Log

DateChange
2026-02-27Initial audit: 92 gastown commands mapped, 42 features tracked
2026-02-27Deep comparison (7 agents): +8 new gaps, 12 status corrections, 38 TODO items remaining. Dolt logs/sql/list/recover/sync→DONE. Order list/show/run/check→DONE. Polecat git-state→DONE. Worktree gitignore→DONE. Periodic dispatch→REMAP (orders). Template vars→PARTIAL (missing DefaultBranch). Gemini hooks→VERIFY.
2026-02-27P2 verification: 4 items resolved (workspace sync→DONE, close-triggers-convoy→DONE via bd on_close hook, sling —merge→DONE, sling auto-convoy→DONE). 2 items WONTFIX (reactive feeding — pull-based GUPP obviates; —max-concurrent — pool min/max is sufficient). 1 item REMAP (MR bead fields — just bd update --set-metadata branch=X target=Y, gastown formulas already use this). Convoy-check polling order removed. Order tracking→PARTIAL. 31 TODO items remaining (7 P2, 24 P3).
2026-03-06Provider parity audit: added auggie/pi/omp presets (7→10 providers). Claude settings.json: added skipDangerousModePermissionPrompt, editorMode, PATH export. Added SupportsHooks and InstructionsFile to ProviderSpec (metadata; AgentHasHooks retains hardcoded Claude check — SupportsHooks fallback reverted as behavioral regression). Added pi/omp hook templates with PATH augmentation. Added TestSupportsHooksSyncWithProviderSpec cross-check.
Last modified on March 20, 2026