| name | ralph |
| description | MCP-owned Ralph loop around background evolve_step jobs |
| mcp_tool | ouroboros_ralph |
| mcp_args | {"lineage_id":"$lineage_id"} |
/ouroboros:ralph
MCP-owned Ralph loop around background evolve_step jobs. "The boulder never stops."
Usage
ooo ralph --lineage-id <lineage_id>
/ouroboros:ralph --lineage-id <lineage_id>
# For a plain natural-language request, run `ooo interview` + `ooo seed` first,
# then call the MCP tool with a fresh lineage_id and the validated Seed YAML.
Trigger keywords: "ralph", "don't stop", "must complete", "until it works", "keep going"
How It Works
Ralph is owned by the ouroboros_ralph MCP tool. In non-plugin runtimes, the
tool starts one background Ralph job, runs repeated evolve_step generations
inside that job, and stops only when QA passes, convergence is reached, a
terminal evolution action occurs, cancellation is requested, or
max_generations is reached. In OpenCode plugin mode, the MCP tool returns a
delegated_to_plugin envelope with job_id=None; the bridge plugin dispatches
a child Task session that owns the loop instead of creating a local JobManager
job.
The client skill should not reimplement the loop. Deterministic frontmatter
dispatch is limited to the router's named --lineage-id option so raw trailing
text is never treated as lineage identity. Raw natural-language
ooo ralph "<request>" input must flow through the validated Seed path before
any mutating Ralph loop starts. Until a lineage id and optional Seed YAML are
prepared, ouroboros_ralph returns structured input guidance instead of
starting a job. Once the inputs are prepared, start the MCP-owned Ralph surface
once, then follow either the returned job tools path or the OpenCode Task widget
path.
Instructions
When the user invokes this skill:
Load MCP Tools (Required first)
The Ouroboros MCP tools are often registered as deferred tools that must be
explicitly loaded before use. Do this before preparing input or calling Ralph:
- Use the active runtime's tool-discovery capability to find and load the Ralph/job MCP tools:
tool discovery query: "+ouroboros ralph job"
- The loaded tools may be exposed under plugin-prefixed names such as
mcp__plugin_ouroboros_ouroboros__ouroboros_ralph. Use the actual tool
names returned by runtime tool discovery; the bare names below are the canonical MCP
tool names for documentation.
- Confirm that
ouroboros_ralph and the job tools (ouroboros_job_wait,
ouroboros_job_status, ouroboros_job_result, and
ouroboros_cancel_job) are callable. If the tools are unavailable, stop and
tell the user that Ralph requires the Ouroboros MCP runtime.
Ralph Flow
-
Prepare lineage input:
- If the user provides an existing
lineage_id and explicitly wants to
continue it, reuse that lineage_id and omit seed_content unless they
explicitly provide an updated Seed.
- If the user provides Seed YAML for a new Ralph run, use it as
seed_content and generate a fresh lineage_id for this run. Keep
lineage_id separate from Seed, interview, and session IDs so separate
Ralph runs over the same Seed do not collide.
- If the user provides only a plain natural-language request, do not treat
it as a direct
ooo ralph "<request>" command, do not freehand Seed YAML,
and do not pass raw text as seed_content. Route through the authoritative
Seed path first: ooo interview to capture requirements, then ooo seed /
ouroboros_generate_seed to produce validated Seed YAML with the normal
ambiguity gate. After Seed generation, call the MCP tool with a fresh
lineage_id and that validated Seed YAML as seed_content; do not use the
raw request text. If an interview/seed session already exists in context,
reuse that validated Seed output instead of regenerating it.
-
Start Ralph by calling ouroboros_ralph with:
lineage_id: existing lineage id for an explicit continuation, otherwise a
freshly generated stable id for this Ralph run, such as
ralph-<short-slug>-<uuid>; do not use a Seed/interview id by itself
seed_content: valid Seed YAML for generation 1 when starting a new lineage
execute: default true
parallel: default true
skip_qa: default false
project_dir: explicit target project directory when known
max_generations: default 10 unless the user requests a tighter bound
-
Handle the start response:
Active Conductor decision policy
For attention_required, use at most one short-lived read-only verifier. If the
host has no verifier primitive, surface the evidence and do not mutate.
Otherwise VERIFY → DECIDE from recommended_host_actions → LOG selected with
ouroboros_record_conductor_decision → ACT only a menu-listed registered tool →
LOG exactly one completed, failed, or declined outcome. Ralph may apply a
conductor directive only to the first and sole bounded successor generation
(max_generations=1), and only when it is deterministic and non-relaxing. Never
silently retry or weaken the approved shared contract.
These are English canonical host instructions. Render them naturally in the
user's conversation language.
Tool Mapping
| Skill action | MCP tool |
|---|
| Start Ralph loop | ouroboros_ralph |
| Wait for progress | ouroboros_job_wait |
| Fetch final result | ouroboros_job_result |
| Cancel loop | ouroboros_cancel_job |
| Inspect current status | ouroboros_job_status |
The Boulder Never Stops
This is the key phrase. Ralph does not give up:
- Each failure is data for the next attempt.
- Verification drives the loop.
- Only success, convergence, terminal failure, cancellation, or max-generation
limits stop it.
RFC #1392 State Breadcrumb Footer
Your final response MUST end with exactly one breadcrumb footer line:
◆ <current state> → next: <recommended action>
Derive <current state> from live session state via ouroboros_session_status when that MCP projection is available; otherwise derive it from this skill's actual outcome. Never use a linear Step N of M footer because Ouroboros is an evolutionary loop. When the next action is genuinely a choice, list 2-3 honest options in the next: clause. The breadcrumb line must be the last line of the response.