Reference for the unified escalation system in Gas Town.
Gas Town agents escalate issues when automated resolution is not possible. Escalations are severity-routed, tracked as beads, and support stale detection with automatic re-escalation.
| Level | Priority | Description | Default Route |
|---|---|---|---|
| CRITICAL | P0 (urgent) | System-threatening, immediate attention | bead + mail + email + SMS |
| HIGH | P1 (high) | Important blocker, needs human soon | bead + mail + email |
| MEDIUM | P2 (normal) | Standard escalation, human at convenience | bead + mail mayor |
Agent -> gt escalate -s <SEVERITY> "description"
|
v
[Deacon receives]
|
+-- resolves --> updates issue, re-slings work
+-- cannot --> forwards to Mayor
+-- resolves --> updates issue, re-slings
+-- cannot --> forwards to Overseer --> resolves
Each tier can resolve OR forward. The chain is tracked via bead comments.
Config file: ~/gt/settings/escalation.json
{
"type": "escalation",
"version": 1,
"routes": {
"medium": ["bead", "mail:mayor"],
"high": ["bead", "mail:mayor", "email:human"],
"critical": ["bead", "mail:mayor", "email:human", "sms:human"]
},
"contacts": {
"human_email": "",
"human_sms": "",
"slack_webhook": "",
"smtp_host": "",
"smtp_port": "587",
"smtp_from": "",
"smtp_user": "",
"smtp_pass": "",
"sms_webhook": ""
},
"stale_threshold": "4h",
"max_reescalations": 2
}| Action | Format | Behavior |
|---|---|---|
bead |
bead |
Create escalation bead (always first, implicit) |
mail:<target> |
mail:mayor |
Send gt mail to target |
email:human |
email:human |
Send email to contacts.human_email |
sms:human |
sms:human |
Send SMS to contacts.human_sms |
slack |
slack |
Post to contacts.slack_webhook |
log |
log |
Write to escalation log file |
Escalation beads use type: escalation with structured labels for tracking.
| Label | Values | Purpose |
|---|---|---|
severity:<level> |
MEDIUM, HIGH, CRITICAL | Current severity |
source:<type>:<name> |
plugin:rebuild-gt, patrol:deacon | What triggered it |
acknowledged:<bool> |
true, false | Has human acknowledged |
reescalated:<bool> |
true, false | Has been re-escalated |
reescalation_count:<n> |
0, 1, 2, ... | Times re-escalated |
original_severity:<level> |
MEDIUM, HIGH | Initial severity |
Categories provide structured routing based on the nature of the escalation.
Not yet implemented as CLI flags; currently use --to for explicit routing.
| Category | Description | Default Route |
|---|---|---|
decision |
Multiple valid paths, need choice | Deacon -> Mayor |
help |
Need guidance or expertise | Deacon -> Mayor |
blocked |
Waiting on unresolvable dependency | Mayor |
failed |
Unexpected error, can't proceed | Deacon |
emergency |
Security or data integrity issue | Overseer (direct) |
gate_timeout |
Gate didn't resolve in time | Deacon |
lifecycle |
Worker stuck or needs recycle | Witness |
Create a new escalation.
gt escalate -s <MEDIUM|HIGH|CRITICAL> "Short description" \
[-m "Detailed explanation"] [--source="plugin:rebuild-gt"]Flags: -s severity (required), -m body, --source origin identifier,
--to route to tier (deacon/mayor/overseer), --dry-run, --json.
Acknowledge an escalation (prevents re-escalation).
gt escalate ack <bead-id> [--note="Investigating"]gt escalate list [--severity=...] [--stale] [--unacked] [--all] [--json]Re-escalate stale (unacked past stale_threshold) escalations. Bumps severity
(MEDIUM->HIGH->CRITICAL), re-executes route, respects max_reescalations.
gt escalate stale [--dry-run]gt escalate close <bead-id> [--reason="Fixed in commit abc123"]Plugins use escalation for failure notification:
gt escalate -s MEDIUM "Plugin FAILED: rebuild-gt" \
-m "$ERROR" --source="plugin:rebuild-gt"Deacon uses escalation for health issues:
if [ $unresponsive_cycles -ge 5 ]; then
gt escalate -s HIGH "Witness unresponsive: gastown" \
-m "Witness has been unresponsive for $unresponsive_cycles cycles" \
--source="patrol:deacon:health-scan"
fiDeacon patrol also runs gt escalate stale periodically to catch unacked
escalations and re-escalate them.
- System errors: Database corruption, disk full, network failures
- Security issues: Unauthorized access attempts, credential exposure
- Unresolvable conflicts: Merge conflicts that cannot be auto-resolved
- Ambiguous requirements: Spec is unclear, multiple valid interpretations
- Design decisions: Architectural choices that need human judgment
- Stuck loops: Agent is stuck and cannot make progress
- Gate timeouts: Async conditions did not resolve in expected time
- Normal workflow: Regular work that can proceed without human input
- Recoverable errors: Transient failures that will auto-retry
- Information queries: Questions that can be answered from context
On gt prime, Mayor displays pending escalations grouped by severity.
Action: review with bd list --tag=escalation, close with bd close <id> --reason "...".
# List all open escalations
bd list --status=open --tag=escalation
# Filter by category
bd list --tag=escalation --tag=decision
# View specific escalation
bd show <escalation-id>
# Close resolved escalation
bd close <id> --reason "Resolved by fixing X"