证据快照复核于 2026-09-05GitHub 数据核对日期: 2026-08-21
来源已审查独立 Skill自动化与智能体codex Profile

ralph

运行受代数上限约束的 Ouroboros 后台迭代循环,直到验证通过、收敛、取消或达到上限才停止。

快速了解

它能做什么

运行受代数上限约束的 Ouroboros 后台迭代循环,直到验证通过、收敛、取消或达到上限才停止。

本站提供的是中文说明,不代表该项目或 Plugin 自身提供中文界面;语言支持请以上游文档为准。

能力
自动化与智能体智能体自动化工作流自动化

选择前先看

Ralph 是一个面向 Ouroboros MCP 的客户端技能,用于围绕后台 evolve_step 任务运行循环。新运行需使用已验证的 Seed YAML 和新的 lineage ID;也可在用户明确要求时继续已有 lineage。它会指导宿主加载 Ralph 与任务工具、只启动一次循环,并通过返回的任务或委派的插件会话获取进度和结果。

适合谁

希望对项目执行由验证驱动的多代实现循环、且可使用 Ouroboros MCP 运行时的开发者。

常见任务

  • 持续推进指定的 Ouroboros lineage,直到 QA 或收敛产生结果。
  • 将已验证的 Seed YAML 用于启动新的、受上限约束的 Ralph 运行。
  • 在 MCP 任务接口可用时查看关键进度,或取消正在运行的 Ralph 任务。

权限与数据

通过 Ouroboros MCP 运行时管理目标项目的后台 Ralph 任务。

权限
  • 需要访问 Ouroboros MCP 的 Ralph 和任务工具。
  • 运行时可能需要指定目标项目目录。
数据处理
  • 会使用 lineage ID;新运行还会使用提交给 MCP 工具的已验证 Seed YAML。
  • 可能保留任务 ID 和游标以观察任务进度。
外部服务
  • Ouroboros MCP 运行时。
凭据
  • 提供的证据未声明。

局限

  • 若 Ouroboros 的 Ralph 与任务 MCP 工具不可用,此技能无法运行。
  • 自然语言请求必须先走文档规定的访谈和已验证 Seed 流程,不能将原始请求文本直接作为 Seed 内容。
  • 循环会在 QA 通过、收敛、终止动作或失败、取消,或达到设定的最大代数时结束。

DSHub 已核对

  • 已捕获固定版本的技能文档。
  • 源代码提交已固定。
  • 已检测到 MIT 许可证。

DSHub 未核对

  • DSHub 未安装或执行此技能及其 MCP 工具。
  • 提供的证据未声明 Harness 版本范围。

固定版本安装

主要操作

这个独立 Skill没有 DSH Plugin 安装操作,请根据源码文档使用真实交付方式。

访问源码项目

维护者原文

Skill 使用说明

查看 commit 03714ba 对应的 SKILL.md
维护者编写的上游内容原文于 2026/9/5skills/ralph/SKILL.md 获取,正文和仓库相对媒体固定到 commit 03714ba44618,内容哈希为 c44e47021a8d。以下是未经 DSHub 翻译的上游原文,语言可能与当前页面不同;第三方托管的 badge 可能独立更新。

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:

  1. Use the active runtime's tool-discovery capability to find and load the Ralph/job MCP tools:
    tool discovery query: "+ouroboros ralph job"
    
  2. 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.
  3. 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

  1. 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.
  2. 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
  3. Handle the start response:

    • If response.meta.job_id is present, report it concisely and retain the job cursor from response.meta.cursor:

      [Ralph] Started background loop: <job_id>
      Lineage: <lineage_id>
      Live view: <dashboard_url, or `ouroboros tui open`>
      
      A read-only observer will post meaningful progress, attention, and terminal
      events here. This conversation remains available for other safe work.
      
    • If response.meta.job_observer is unavailable, recover it from the final <!-- ouroboros-job-observer-v1 base64 ... --> content sentinel. Fail closed unless the bounded payload passes canonical v1 validation and its job identity matches the visible start receipt. Use that ID only as an identity anchor, never to reconstruct tools or arguments. Reject validation failure or any mismatch between structured and inline surfaces.

    • If the structured or recovered job_observer is present and the host supports an independent child session, spawn exactly one read-only observer and pass that contract unchanged. The observer exclusively owns job wait/result calls and the cursor. The main session retains only user conversation, explicit on-demand status, and cancellation when the user requests it. The main session must not poll the same job while the observer is active. It may refine requirements, perform read-only review, or work in an unrelated isolated worktree; check active-worker conflicts before writing to Ralph's workspace. On Codex, call spawn_agent exactly once with task_name="run_observer"; wait is not a spawn, and do not claim an observer until a live child ID/path is returned. Once acknowledged, keep the parent turn open with wait_agent calls of at most 60 seconds while the observer is active. Child send_message calls only enqueue mailbox events and cannot revive an ended parent turn. Relay meaningful updates and wait again until terminal. On OMP, submit exactly one native Task child named RunObserver, require its live agent/job ID, and use the host wait/inbox relay until terminal. User input may interrupt the wait; handle it and resume waiting while observation remains active unless the user asks to stop live observation or replaces the active request. Then end only the relay loop, keep the durable job running, and offer next-turn or explicit-status catch- up. If the observer child fails, is cancelled, or exits before a terminal summary, use that same fallback instead of waiting indefinitely. This relay loop must not poll the Ouroboros job or take cursor ownership. If spawn fails, do not promise live proactive relays: the detached worker continues after the stdio turn, and the main session catches up from durable events on the next interaction or explicit status request. Keep the main turn open in the fallback polling loop only when the user asked for live watching.

    • If response.meta.status == "delegated_to_plugin" and response.meta.job_id is None, report that OpenCode plugin mode delegated the loop to a child Task session. Do not call ouroboros_job_wait, ouroboros_job_result, or ouroboros_cancel_job without a job id; follow the host Task widget/session lifecycle instead.

  4. Monitor non-plugin job progress in the polling owner when a job_id exists.

    The delegated observer is the default owner. Use the main-session loop below only when no independent child session exists and the user explicitly asked for live watching; otherwise catch up on the next parent turn. Never run both loops:

    • ouroboros_job_wait(job_id, cursor, timeout_seconds=120, stream="linked", wait_for="attention_or_ac_change") for long polling; after every wait/status response, update cursor = response.meta.cursor
    • ouroboros_job_status(job_id) for a quick status check
    • ouroboros_job_result(job_id) when the job is terminal
    • ouroboros_cancel_job(job_id) if the user says stop/cancel

    Observer events are concise: relay phase/progress changes in 1-2 lines, surface attention_required immediately, present terminal as the final result, distinguish Synapse queued from runtime-proven applied, surface rejected/uncertain delivery immediately, and suppress unchanged heartbeats or raw tool output. Render every relay in the user's current conversation language; preserve raw event codes only when exact diagnostics help. Interpret structured subtypes: report run configuration, total ACs and dependency/parallel levels, first scheduled ACs, bounded Discover targets, current model/harness changes, level transitions, and verified AC completion. Say "currently running with" because later generations may escalate or switch harnesses. Never forward raw commands or model reasoning.

    When a new generation starts, do not just report the generation number — lineage.generation.started carries an ac_focus block (active_ac_indices, frozen_ac_indices, active_ac_descriptions, reason). Report WHAT the generation is redoing, e.g. "Gen 7: 2/5 AC 재작업 — 'CSV export writes summary.csv', 'CLI exits 0 on --help' (3 AC는 이전 PASS 증거로 frozen)". When ac_focus is absent or every AC is active with reason "initial/full generation", say the full AC graph is being executed. Never quote verify commands or expected outputs — descriptions only.

    When the user asks a live AC a read-only question or provides additive intent, reload +ouroboros session signal, call ouroboros_session_signal_targets for the observed execution, and select the semantically relevant AC without asking for internal IDs. Use mode="inform" for assurance/questions and omit fallback_mode in that mode. For implementation refinement use contract_effect="additive", source="user", mode="redirect", and explicit fallback_mode="after_turn" with the exact discovered guards. Shared goal/AC/ constraint/non-goal changes require an approved shared successor.

  5. On non-plugin job termination, the polling owner fetches ouroboros_job_result(job_id) and summarize the final job result and next step:

    • Success / convergence: summarize the final generation output, QA verdict, and any worktree_path / worktree_branch returned in job metadata. Do not present ooo evaluate as an automatic next step for Ralph results: the Ralph job contract preserves the evolution lineage_id, but it does not reliably preserve a separate execution session_id for the evaluate workflow. If a valid execution session_id is explicitly available from a separate run result, keep it distinct from the Ralph lineage_id and follow the ooo evaluate <session_id> contract; otherwise state that formal evaluation needs a real execution session and should not be invoked from the Ralph lineage id alone.
    • Max generations / failure: summarize the stop reason and suggest ooo unstuck, ooo interview, or a narrower Ralph retry
    • Cancelled: confirm cancellation and preserve the job id for later inspection
  6. On OpenCode plugin delegation, rely on the child Task result as the terminal surface. Summarize the Task completion/error state and lineage id; do not claim a local Ralph job can be polled or cancelled.

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.

有意识地管理

安装与管理

前置条件与目标 Profile

目标 codex Profile

交付方式 Skill 文件 — https://raw.githubusercontent.com/Q00/ouroboros/03714ba446186423dcb46e25d12bd19c3a2e82f6/skills/ralph/SKILL.md

兼容性与访问范围

Requires the Ouroboros MCP runtime and Ralph/job tools Not declared in supplied evidence

检查兼容性证据

风险事实

background-execution

Can start background jobs that repeatedly run evolution steps against a target project.

证据
project-access

May use an explicit target project directory and invoke MCP tools that operate on the run.

证据
证据与编辑审查Manifest、Bundle patch、分发与新鲜度

不可变证据

审查状态与源码活动

人工已批准

在核对来源内容和不可变发布记录后,已由人工批准发布。AI 参与了内容草稿生成,最终发布决定由人工完成。

人工审查于 2026/9/5 UTC 17:19GitHub 事实核对日期: 2026/9/5 UTC 16:31

自当前证据基线以来,没有记录到重要源码变化。

下一步

比较生态 Artifact 类型

订阅重要变化: ralph