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.
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
initializehasprotocolVersion1, 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/updatenotifications before the answer tosession/prompt. - the agent does not advertise loadSession: set
loadSessionand 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/cancelcomes, and answer the prompt withcancelled. - the agent advertises no Plan mode: give a mode "plan" in
modes, or a "plan" value in aconfigOptionsentry of the category "mode". - create_plan was not called with the title: start the stdio tool servers of
mcpServersfromsession/newandsession/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.