resonate-bash is Resonate's MCP tool for running shell commands as durable, asynchronous tasks. You submit a script, get a promise ID back immediately, and get notified when the command completes. The script runs in the background and outlives the session it was submitted from.
A few things it is particularly good at.
Long-running polling loops
Waiting for an external system to reach a state — a CI run finishes, a deploy goes live, DNS propagates, an image-generation job completes. The until X; sleep N; done loop runs in the shell, not in the model. The model is not invoked during the wait.
// Wait for a GitHub Actions run to finish
{
"id": "ci-watch-2026-05-21",
"script": "until gh run view 12345 --json status -q .status | grep -q completed; do sleep 60; done",
"timeoutMs": 3600000
}Operations that need to outlive the current session
Promises live on the Resonate server, not in the calling Claude Code session. If the laptop closes, the host hiccups, or a new conversation starts tomorrow, the work continues. A later session can look up the promise ID and read the result.
Named, queryable state
Promise IDs are first-class — prefix them by project and date (tamrack-ssl-watch-2026-05-21) and filter promise-search later via the tags parameter to audit what fired across days.
Fire-and-watch coordination with external systems
Most CI tools, deploy platforms, image-generation APIs, and data-export jobs expose a status endpoint but no webhook. resonate-bash is the right shape for that: submit the work, poll in the shell, get notified on completion.
Composable with Resonate's promise primitives
The same promise IDs work with promise-create, promise-listen, and promise-settle. A one-off script can be promoted into a multi-step durable workflow later without re-architecture.
Worth knowing
Scripts are stored in the promise and restarted from the top on crash. For "trigger external action then poll" patterns, structure as check-then-trigger + poll so a restart does not double-fire.
