sandbox_exec
Runs your config, for real
Paste a broken config and Sprout runs `tofu validate` in an isolated Daytona sandbox, reads the real error, writes a fix, then re-runs the sandbox on its own fix. It only says “fixed” once the sandbox agrees.
live in Slack · OpenTofu
Open-source maintainers drown in the same questions. The answers exist — in the source, in a closed issue, in a thread nobody can find. Sprout goes and gets them: it reads the project's real code, runs your config in a real sandbox, and cites every claim back to a file you can open.
Try it: @Sprout deep: … · @Sprout contribute · @Sprout digest
@Sprout deep: why does OpenTofu reject for_each when the value isn't known until apply?
// what makes it different
you paste
Error: Invalid for_each argument
The given "for_each" argument value is unsuitable.
Sprout answers
OpenTofu raises this when the map keys depend on values it can't know until apply — it needs the full set of instance keys to build the plan. The error text itself says so:
An agent that answers confidently and wrongly is worse than no agent — it poisons the channel and wastes the maintainers it was meant to help. So Sprout is built to be checkable. Click the citation above. It opens the real file, at the real commit.
// what it does
sandbox_exec
Paste a broken config and Sprout runs `tofu validate` in an isolated Daytona sandbox, reads the real error, writes a fix, then re-runs the sandbox on its own fix. It only says “fixed” once the sandbox agrees.
repo_search
Paste a diagnostic and it searches the literal string in the codebase, names the file that raises it, and gives the precise triggering condition — not a list of maybes.
deep:
Clones the real repositories and turns a coding agent loose on the source. It decides which repos it needs: a Flux question pulls in opentofu/opentofu and flux-iac/tofu-controller, unprompted.
sweeper
A sweeper watches the channel and answers anything nobody picked up after a few minutes — the asked-at-2am case that quietly loses newcomers.
faq
Recurring questions become a Slack canvas, built from the answers the community actually gave and refreshed in place, so the link you shared never breaks.
contribute
Hands a newcomer real good-first-issues as browsable cards, each explained for someone who has never opened a pull request.
verified
Thumbs-up an answer and it is stored as community-verified, then preferred next time. Stored answers are treated as untrusted input — prompt-injection hardened.
escalate
For a roadmap call, a licensing question, or anything it cannot ground, it fetches a human instead of guessing. Bluffing is the one thing it will not do.
// not a mockup
Deep mode, mid-flight. It worked out on its own that a Flux question needs opentofu/opentofu and flux-iac/tofu-controller, cloned both, and is reading the source. Nobody told it which repos to look in.

// how it's built
Slack (Socket Mode) ──► Bolt ──► OpenAI Agents SDK
│
┌────────────────────┼────────────────────┐
▼ ▼ ▼
Sprout MCP server Slack MCP server Real-Time Search
(own, stdio) assistant.search.context
│
repo_search · read_file · issue_search
release_notes · good_first_issues
contribution_guide · sandbox_exec
│
▼
Daytona sandboxes
warm: tofu validate (~0.8s)
ephemeral: deep mode, OpenCode
over cloned reposAlways-on as a systemd service. Socket Mode — no inbound ports.