[rondar](/)

[Product](/)[Pricing](/pricing)[Demo](/demo)[Docs](/docs)[Contact](/contact)

[Sign in](/access#access-sign-in)[Request an invite](/access)

[Product](/)[Pricing](/pricing)[Demo](/demo)[Docs](/docs)[Contact](/contact)[Sign in](/access#access-sign-in)

Docs

**Help article: What your ACP agent must do to pass**

Search documentation

_Field: `search` (search)_

No matching articles.

Start

[Your first session](/docs/getting-started)[Connect a repository](/docs/connecting-a-repo)[Connect a coding agent](/docs/connecting-agents)

Work

[Working with sessions](/docs/sessions)[Plan a change before you build it](/docs/plan-mode)[Preview the running result](/docs/live-previews)[Make your app ready for previews](/docs/preview-ready-app)[Get client feedback without a call](/docs/client-feedback-without-a-call)[From session to pull request](/docs/pull-requests)[Get a second agent to review a pull request](/docs/independent-reviews)[Todos and saved workflows](/docs/todos-and-workflows)

Ship

[Ship a release](/docs/releases)[Set up GitHub Actions deploy workflows](/docs/github-actions-deploy-workflows)[Automate website care plans with agents](/docs/automate-website-care-plans)

Configure

[Agent instructions](/docs/agent-instructions)[Project settings](/docs/project-settings)[Give sessions SSH access to a server](/docs/ssh-servers)[Notifications](/docs/notifications)

Integrate

[Webhooks](/docs/webhooks)[Connect an external agent with MCP](/docs/mcp-and-api)[MCP sign-in check failures](/docs/mcp-sign-in-check)[What your ACP agent must do to pass](/docs/acp-journeys)

Reference

[When something needs attention](/docs/troubleshooting)[Self-host setup](/docs/self-host-setup)[Frequently asked questions](/docs/faq)

Documentation

# What your ACP agent must do to pass

The ACP journeys check runs 7 user journeys of Rondar against your ACP v1 agent CLI. This page gives each journey, what it sends, what it expects, and the common failures.

Updated November 5, 2026

## Run the command

The command `acp-journeys` runs on your machine, in a Docker container. Rondar does not run your agent. Give the command line that starts your agent in ACP mode:

```
./run.sh --agent-dir ./my-agent -- /agent/bin/my-agent --acp
```

The container has no network. If your agent calls a model API, add `--network`, and give its login with `--login` or `--env`.

For each journey, the command starts your agent, sends `initialize` with `protocolVersion` 1 and no client capabilities, and opens a session with `session/new`. The session has one tool server, `rondar`, a stdio MCP server with the tools `create_plan` and `get_plan`. The command answers each `session/request_permission`. At the end of a journey, it closes the input of your agent.

Rondar has 11 user journeys for each agent runtime. The command runs the 7 that a real agent with a real login can run. The other 4 need a stand-in CLI or a part of Rondar's worker.

## Every journey

Each journey also checks these things for each process of your agent:

- The answer to `initialize` has `protocolVersion` 1, as a number.

- Your agent ends by itself in 10 seconds after its input closes.

- No process is left after your agent ends. This includes the shell commands that it started and the tool servers that it opened.

## A turn to its end

It sends: "Reply with exactly REPLY-XXXXXXXX and nothing else."

It expects: the reply comes in one or more `agent_message_chunk` updates and holds the marker. The answer to `session/prompt` has the stop reason `end_turn`.

## A follow-up in the same session

It sends: "Remember this word: WORD-XXXXXXXX. Reply with exactly ACK and nothing else." Then, in the same session of the same process, it asks for the word.

It expects: both prompts end with `end_turn`, and the second reply holds the word.

## A follow-up after a restart

It sends the same first message. Then it closes the input of your agent and starts it again. The new process gets `session/load` with the session ID of the first process, and then the question about the word.

It expects: `initialize` gives `agentCapabilities.loadSession` as `true`, `session/load` answers with no error, and the reply holds the word.

## An image and a file

It writes a text file at `/tmp/.rondar-session-files/note.txt` and sends a prompt that names this path. The prompt also has an image block: a red PNG image of 64 by 64 pixels. It asks for the word in the file and the colour of the image.

It expects: `initialize` gives `agentCapabilities.promptCapabilities.image` as `true`, and the reply holds the word and "red".

## Stop a running turn

It sends: "Run the shell command `sleep 120` and wait for it." When your agent runs the command, it sends `session/cancel`.

It expects: a `tool_call` update or a permission request before the stop, and the stop reason `cancelled` in 30 seconds or less after `session/cancel`. No `sleep` process is left.

## A Plan turn to a saved plan

It puts the session in Plan mode, with the rule of Rondar: a session mode whose ID or name is "plan" or "planning" (`session/set_mode`), or else a "plan" value of a `configOptions` entry of the category "mode" (`session/set_config_option`). Then it asks your agent to read a file with `cat`, to save a plan with `create_plan`, to read it back with `get_plan`, and to reply with the plan ID.

In Plan mode the command allows reads, the two Plan tools and the `cat` command. It refuses every other permission request.

It expects: `create_plan` gets the title of the journey and a description with the output of `cat`, `get_plan` gets the ID of that plan, the reply holds the plan ID, and no file in the workspace changes.

## Plan, then regular, then Plan again

In one session it runs a Plan turn, then a regular turn, then a Plan turn again. Before each turn it sets the mode of that turn. For the regular turn, it sets the mode that the session started in. The regular turn asks your agent to create a file with a shell command. The command allows each permission request in that turn.

It expects: each change of mode answers with no error, both Plan turns save their plan, and the regular turn creates the file.

## Common failures

- **initialize got no answer with protocolVersion 1**: your agent answered with a string, such as "1", or with another version.

- **the agent did not end by itself after its input closed**: end the process when standard input closes, also while a turn runs.

- **a process was left after the agent ended**: stop the child processes of a turn and the tool servers when the session ends.

- **the reply came in no agent_message_chunk update**: send the text of the reply as `session/update` notifications before the answer to `session/prompt`.

- **the agent does not advertise loadSession**: set `loadSession` and keep sessions, so that a new process can load one.

- **the turn ended more than 30 seconds after session/cancel**: stop the running tool call when `session/cancel` comes, and answer the prompt with `cancelled`.

- **the agent advertises no Plan mode**: give a mode "plan" in `modes`, or a "plan" value in a `configOptions` entry of the category "mode".

- **create_plan was not called with the title**: start the stdio tool servers of `mcpServers` from `session/new` and `session/load`.

- **the Plan turn changed the workspace**: in Plan mode, do not write files.

Run `acp-journeys verify result.json` to see the verdict that Rondar will find in your file.

[Contact the team →](/contact)

## On this page

[Run the command](#step-1)[Every journey](#step-2)[A turn to its end](#step-3)[A follow-up in the same session](#step-4)[A follow-up after a restart](#step-5)[An image and a file](#step-6)[Stop a running turn](#step-7)[A Plan turn to a saved plan](#step-8)[Plan, then regular, then Plan again](#step-9)[Common failures](#step-10)

[rondar](/)© 2026 Rondar

[Docs](/docs)[Pricing](/pricing)[Demo](/demo)[Rondar vs Amp](/compare/amp)[Rondar vs T3 Code](/compare/t3-code)[Rondar vs OpenHands](/compare/openhands)[Contact](/contact)[Security](/security)
