Sprout

live in Slack · OpenTofu

Every answer comes
with the line number.

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?

SproutAGENT
  • Work out which repos hold the answer
  • Spin up an isolated sandbox
  • Clone opentofu/opentofu
  • Read the code and trace the behaviour
  • Write up the answer with citations

// what makes it different

Most bots explain your error back to you. Sprout shows you the code that raises it.

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

It doesn't just answer. It looks after the channel.

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.

repo_search

Explains an error from its source

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:

Deep mode

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

Nobody left behind

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

The FAQ writes itself

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

Grows contributors

Hands a newcomer real good-first-issues as browsable cards, each explained for someone who has never opened a pull request.

verified

Learns from the community

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

Knows when to stop

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

Watch it work.

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.

Sprout in Slack: a live plan block showing five investigation steps, three complete, cloning opentofu/opentofu and flux-iac/tofu-controller.

// how it's built

Three ways of knowing, one agent.

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 repos
Slack Assistants API
The agent surface — streamed answers, suggested prompts, App Home.
Its own MCP server
Seven tools over the real OpenTofu repo and a live sandbox. Not a wrapper around a search box.
Real-Time Search
assistant.search.context, scoped to community channels, so it recalls what the workspace already answered.
Block Kit, properly
Answers are markdown blocks Slack expands natively. The digest charts. Deep mode ticks a live plan. Contribute is a carousel of cards.

Always-on as a systemd service. Socket Mode — no inbound ports.