Managoat is the hosted Fountain. Fountain is the open-source engine, and its name is on the CLI, the API, the SDK and this manual. Everything here applies to Managoat unless a page says it is for a self-hosted server.

A conversation is stuck or failed

This guide shows you how to find which step failed, and what to do about it.

Read the stage events

Open the conversation's log view. Fountain records the progress of a new sandbox as stage events. They are provision, checkpoint_restore, packages, network, clone, setup and turn. The step that failed names itself, and the event data holds the exit code.

packages, clone or setup failed. The cause is almost always the environment's own configuration. A package that does not exist, a repository the token cannot reach, or a setup script that exits non-zero. Fix the environment, then prompt again.

provision failed outright. Fountain could not create the sandbox. The provider is unhealthy, the token is invalid, or the user is at their quota for concurrent sandboxes. Read Sandbox errors.

Stuck, with no failure. A running conversation with no events usually means the process on the sandbox side died and Fountain missed the exit. Interrupt it, or send another prompt. A wake reattaches to the sandbox when that sandbox still exists.

fountain conv show <conv-id> # turn status, sandbox name
fountain conv interrupt <conv-id> # stop the in-flight turn, keep the sandbox
fountain conv terminate <conv-id> # destroy the sandbox, end the conversation

The sandbox itself has an API. GET /api/sandboxes/:id shows its status, its provider and each conversation on it. DELETE /api/sandboxes/:id resets a persistent sandbox. Fountain destroys the machine and keeps the conversations, and the next prompt builds a clean machine. Read Sandboxes.

The provider refused the model

A turn fails when the model provider refuses the agent's model. Fountain records a model stage event with the refused id. The turn stage event holds the provider's own message, and that message usually names a replacement.

The provider refused this agent's model (gemini-2.5-pro): This model
models/gemini-2.5-pro is no longer available to new users. Please update
your code to use models/gemini-3.1-pro-preview for the latest features
and improvements.

Open the agent. Set the model field to the replacement. Send the prompt again. Each turn fails in the same way until that field changes.

The models Fountain lists are advice, not a set of permitted values. Fountain sends any model id under a known provider to the runtime without a check. A model released after the last deploy therefore works on the day it ships. A provider can also retire a model at any time. A model that worked last month can fail today.

What the statuses mean

failed and terminated are the two terminal states. Fountain refuses a further prompt.

idle with a suspended sandbox is the normal state at rest, and not an error. The sandbox parks and scales to zero. The next prompt wakes it, and the agent's memory is intact.

idle with a destroyed sandbox is what a reset, an admin reap or a configured max-lifetime ceiling leaves behind. A reset is DELETE /api/sandboxes/:id. An admin reap is POST /api/admin/sandboxes/:id/reap, or the admin page. The next prompt provisions a fresh sandbox. Fountain leaves the stored transcript alone, but the agent starts a fresh session. Read About conversations, and the full table in Conversation states.

The knock-on effect on quota

A crash in the middle of a provision leaves a pending or starting sandbox row. That row counts against the user's quota, which is 2 concurrent sandboxes by default.

The reaper runs each hour at :07 and releases a row that has been stuck for more than 60 minutes. An admin can raise a user's cap at once, from /admin/users or with POST /api/admin/users/:id/sandbox-limit. An admin can also see every sandbox with GET /api/admin/sandboxes, and release a stuck one with POST /api/admin/sandboxes/:id/reap. Read Admin.

The reaper logs one summary line for each run.

kubectl logs -n fountain -l app=fountain --since=2h | grep 'reaper:'
# reaper: released=0 parked=1 expired=0 destroyed=2 untracked=102 live=114

parked counts the idle sandboxes the reaper suspended. The reaper can undo that, and it is not a teardown.

Conversations from before August 2026

Stage status is reliable now. It was not always. On the default provider, a setup script or a clone that failed could record as successful. The client discarded the exit code and read a 0. See #880, fixed on 2026-08-23. For a conversation that ran before that date, read the logged output. Do not trust its stage status.