How it works
Approvals & alerts
Some actions shouldn't be auto-allowed or auto-blocked — they need a human. gmonk can hold an action mid-flight until someone decides, and notify you the moment it happens.
Holds
A guard rule or gate outcome of require_approval is a
real hold: the agent's call blocks until a human approves
(→ executes), denies (→ refused), or it times out (→ expired, and can't be
retro-approved). Decisions are atomic. Enforced at the SQL gateway, the
object gateway, and the MCP proxy.
gmonk approvals # list pending holds
gmonk approve <id> # approve → the held action executes
gmonk deny <id> # deny → the action is refused
The same approve/deny is available as a banner in the review UI.
GMONK_APPROVAL_TIMEOUT_MS (default 5 min) bounds how long a hold
waits.
Alerts
gmonk POSTs alerts to a webhook (Slack-compatible payload) on the events you choose. It's best-effort and timeout-bounded — it never throws or blocks the agent.
GMONK_ALERT_WEBHOOK=https://hooks.slack.com/services/…
GMONK_ALERT_EVENTS=require_approval,block,recoverability_degraded,recoverability_lost,out_of_band
Events: require_approval, block, warn,
approved, denied,
recoverability_degraded, recoverability_lost,
out_of_band (a write that bypassed the gateway but was still
caught on a protected table).
Interactive Slack approvals
Approve or deny a held action from Slack buttons — no context switch. Two transports:
- Socket Mode (recommended) — an outbound WebSocket, no
inbound port. Set
GMONK_SLACK_APP_TOKENand rungmonk slack-listen. - HTTP Request-URL — a signature-gated
POST /slack/interactionsendpoint, viaGMONK_SLACK_SIGNING_SECRET.