Skip to content

v0.51.0

Choose a tag to compare

@github-actions github-actions released this 09 Aug 10:40
· 55 commits to main since this release

v0.51.0 — Ouroboros is Loop Engineering

Prompt engineering asks "what do I say to the model?"
Context engineering asks "what does the model see?"
Loop engineering asks: "what structure guarantees the loop converges to done — and can't be gamed along the way?"

This release is the answer taking its final shape. The loop now hides its own
answer key, verifies against declared contracts instead of claims, feeds
execution traces back as hints, and repairs itself when it stalls — on any
runtime kernel you drop underneath it.

Why "Loop Engineering" is now complete

A loop is engineered — not just run — when four properties hold at once:

  1. The worker cannot see the grader's answer key. With the new
    hidden-checklist convergence loop (#1916), acceptance-criteria details are
    unconditionally withheld from the executing agent. The agent works toward the
    goal; the evaluator judges against the full checklist. Teaching-to-the-test is
    structurally impossible, not just discouraged.
  2. Success is a contract, not a claim. Since v0.50.0, an acceptance
    criterion declares in machine-checkable terms what counts as done
    (verify_command / expected_artifacts / output_assertion), and the
    executor, evaluator, and verify gate all judge against that declaration —
    grounded in what actually executed. This release keeps tightening it:
    match-anything regexes are refused as verification evidence (#1837), unreadable
    extractions are no longer remembered as answers (#1915), and verified evidence
    survives across lifecycle steps (#1913).
  3. Failure feeds back as structure, not vibes. When an evaluation falls
    short, trace-grounded hints — what the run actually did versus what the hidden
    checklist wanted — flow into the next generation. run → evaluate → evolve is
    now a single chain, and as of this release ooo auto rides that same chain
    instead of its own hardcoded detour.
  4. The loop survives its own environment. Generation ownership is a durable
    lease (#1891), signals reach detached evolve runs (#1921), transient provider
    deaths are retried instead of terminal, and concurrency adapts to live provider
    feedback (#1851). Zero-time job snapshots hold under load (#1936); checkpoints
    are integrity-validated on save (#1896).

Every piece above is deterministic machinery — schema, gate, lease, chain — not a
prompt asking the model to behave. That is the discipline we mean by loop
engineering
, and with this release the core structure is complete.

The lineage — March to August 2026

Ouroboros didn't arrive here in one step. Each era solved the failure mode the
previous one exposed:

Era Releases What the loop learned
The parts exist v0.26 (late Mar) Socratic interview redesign, first reward-hacking detection in evaluation, runtime-agnostic execution (Codex joins Claude). The stages work — but run separately, and evaluation still trusts prose.
The loop opens outward v0.27–v0.29 (Apr) MCP Bridge brings external tools into seeds; OpenCode and Hermes join as runtimes; capability-aware orchestration (SandboxClass) teaches the engine what tools mean before scheduling them.
The loop becomes observable v0.30–v0.32 (Apr–May) ooo resume, in-run lateral recovery, control directives; then the Agent OS kernel: every LLM and tool call journaled, and spawn / pause / resume / cancel / replay as a real process lifecycle. You can't engineer what you can't see.
The loop closes v0.33–v0.37 (May) ooo auto is born — a bounded supervisor that drives Interview → Seed → Execute → Evaluate on its own, with usage-limit pause & replay, provenance-tagged state, DomainProfiles, and automatic RUN→RALPH chaining.
The loop learns to verify and recover v0.38–v0.39 (May) The orchestrator stack: typed evidence schemas, an external verifier loop, a failure taxonomy with recovery policies, adaptive routing. Plus a high-severity .env trust-boundary RCE fix — the loop's own front door gets locked.
Goal in, product out v0.40–v0.41 (late May–Jun) ooo auto crosses the line from demo to machine that finishes work — then hardens both ends: an advisory panel interrogates the goal at the input, a typed, audited verdict guards the output.
Any kernel underneath v0.42–v0.44 (Jun–Jul) GJC joins eight runtime kernels; the reasoning-effort dial makes cost a per-stage decision; ourocode runs Claude with no SDK; the plugin path goes to production.
Contracts, not claims v0.50 (Jul) The Verifiable Loop: acceptance criteria become machine-checkable contracts, and executor, evaluator, and verify gate all judge against what actually executed.
Loop Engineering v0.51 (Aug) The answer key goes hidden, the feedback becomes trace-grounded, auto joins the unified chain, and the loop self-repairs under real-world failure. The structure is complete.

What's new in v0.51.0

Features

  • Hidden-checklist convergence loop (#1916) — the headline. Acceptance-criteria
    details are unconditionally hidden from the executing agent (no configuration to
    turn it off), evaluation shortfalls come back as trace-grounded hints, and
    run → evaluate → evolve runs as one chain.
  • Adaptive concurrency from provider feedback (#1851) — the orchestrator
    widens and narrows parallelism based on live provider signals instead of a
    static cap.
  • Multi-run live kanban picker (#1904) — the web dashboard now handles
    multiple concurrent runs with a live picker.
  • Native ooo update self-update command (#1859) — upgrade the CLI and
    plugin in one step, from the CLI itself.
  • Bash artifact provenance (#1931) — artifacts claimed as evidence are bound
    to the accepted commands that produced them.
  • Disposable artifact lifecycle (#1855) — scratch artifacts are tracked and
    cleaned up instead of accumulating.

Reliability & correctness

  • Signals now reach detached evolve runs (#1921); generation ownership is a
    durable lease instead of an in-memory flag (#1891).
  • Seed handoff survives an accepted-receipt failure (#1940); convergence
    composition ownership is preserved (#1932); zero-time job snapshots hold under
    load (#1936).
  • Verification hardening: match-anything regexes refused as evidence (#1837),
    unreadable extractions not remembered as answers (#1915), verified evidence
    preserved across lifecycle steps (#1913), interview JSON parsing routed through
    the hardened extractor (#1876).
  • Runtime truthfulness: probe failures distinguished from executable drift
    (#1945), degraded ourocode turns no longer reported as clean (#1895), empty
    OpenCode error frames stay terminal (#1893), Codex setup made truthful with
    nested LLM children isolated (#1920), Windows Codex setup writes atomically
    (#1910).
  • Persistence: EventStore's SQLite-only contract made explicit (#1897),
    checkpoint state snapshotted and integrity-validated on save (#1896), persisted
    Linux owner identity stabilized (#1924).
  • Packaging & CLI: Claude CLI and SDK packaging profiles split (#1928), saved
    logging.level actually applied (#1956), ambiguity score from ouroboros init
    persisted (#1903), Claude reserved command names avoided (#1919), test
    isolation no longer leaks proxy/token vars into os.environ (#1858).

Docs & maintenance

  • zh-CN and Korean quick-start brought to parity with English (#1949); superseded
    planning snapshots archived (#1950); shipped session-signal modes clarified
    (#1925); PyPI project metadata filled in (#1952).

What's Changed

  • chore(deps-dev): bump types-pyyaml from 6.0.12.20260518 to 6.0.12.20260724 by @dependabot[bot] in #1853
  • chore(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 by @dependabot[bot] in #1850
  • chore(deps): bump actions/setup-python from 6.3.0 to 7.0.0 by @dependabot[bot] in #1849
  • chore(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #1848
  • fix(evaluation): refuse regexes that match any input as verification evidence by @MyoungSoo7 in #1837
  • fix(bigbang): route interview JSON parsing through the hardened extractor by @sumin220 in #1876
  • fix(providers): keep an empty OpenCode error frame terminal by @MyoungSoo7 in #1893
  • fix(persistence): snapshot checkpoint state and validate integrity on save by @sumin220 in #1896
  • fix(persistence): make the EventStore's SQLite-only contract explicit by @sumin220 in #1897
  • fix(cli): persist the ambiguity score computed by ouroboros init by @sumin220 in #1903
  • fix(verification): stop remembering an unreadable extraction as an answer by @MyoungSoo7 in #1915
  • feat(orchestrator): adapt concurrency from provider feedback by @Q00 in #1851
  • feat(evolution): add hidden-checklist convergence loop by @Q00 in #1916
  • cleanup(orchestrator): drop the tri-state project-identity sentinel by @sumin220 in #1898
  • feat(dashboard): add multi-run live kanban picker by @Q00 in #1904
  • fix(cli/mcp): stop test isolation leak of proxy/token vars into os.environ by @AmirF194 in #1858
  • fix(orchestrator): restore post-merge integration gates by @Q00 in #1923
  • fix(skills): avoid Claude reserved command names by @Q00 in #1919
  • fix(providers): stop reporting a degraded ourocode turn as a clean one by @MyoungSoo7 in #1895
  • fix(evolution): make evolve_step generation ownership a durable lease by @sumin220 in #1891
  • Fix Windows Codex setup atomic writes by @jkf87 in #1910
  • fix(orchestrator): stabilize persisted Linux owner identity by @Q00 in #1924
  • fix(workflow): preserve verified evidence across lifecycle steps by @seiyeong in #1913
  • docs(mcp): clarify shipped session signal modes by @Q00 in #1925
  • test(orchestrator): synchronize route pause sibling admission by @Q00 in #1929
  • fix(codex): make setup truthful and isolate nested LLM children by @Q00 in #1920
  • feat(provenance): bind Bash artifacts to accepted commands by @Q00 in #1931
  • test(evolution): synchronize generation lease regressions by @Q00 in #1934
  • fix(mcp): preserve zero-time job snapshots under load by @Q00 in #1936
  • fix(mcp): preserve convergence composition ownership by @Q00 in #1932
  • fix(opencode): derive advisory child permissions by @Q00 in #1939
  • fix(mcp): preserve Seed handoff after accepted receipt failure by @Q00 in #1940
  • feat(cli): add native ooo update self-update command by @clroot in #1859
  • fix(evolution): relay signals to detached evolve runs by @Q00 in #1921
  • feat(memory): enforce disposable artifact lifecycle by @Q00 in #1855
  • fix: resolve release-blocking integration contract regressions by @Q00 in #1946
  • fix(runtime): distinguish probe failure from executable drift by @Q00 in #1945
  • docs(history): archive superseded planning snapshots by @Q00 in #1950
  • docs(i18n): bring zh-CN and ko quick start in parity with English by @Q00 in #1949
  • chore(pypi): fill in missing project metadata by @Q00 in #1952
  • fix(packaging): split Claude CLI and SDK profiles by @Q00 in #1928
  • fix(cli): apply the saved logging.level instead of ignoring it by @Q00 in #1956

New Contributors

Full Changelog: v0.50.8...v0.51.0