Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions site/harnesses/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ <h2 class="harness-operator__title">Agent Looper Grok Bot</h2>
</p>
</div>
<div class="harness-operator__body">
<p>Grok Bot is the Grok operator that runs Agent Looper on the user's computer. It is not a <code>--runtime</code> enum value. Distinct from the Grok 4.7 model that Cursor uses as judge.</p>
<p>Grok Bot is the Grok operator that runs Agent Looper on the user's computer. It is not a <code>--runtime</code> enum value. Distinct from the Grok 4.7 model that Cursor uses as judge by default.</p>
<h3>How to use</h3>
<ol>
<li>Freeze <code>GOAL.md</code> and <code>verify.sh</code> (or <code>pnpm exec agent-loop-prompt --out .cursor/loops/my-task</code>).</li>
Expand Down Expand Up @@ -113,9 +113,10 @@ <h3>Cursor</h3>
<p class="harness-card__chips">
<span class="harness-chip">Worker <code>composer-2.5</code></span>
<span class="harness-chip">Judge Grok 4.7</span>
<span class="harness-chip"><code>grok-4.6</code> / <code>grok-4.5</code> ok</span>
</p>
<p class="harness-card__run"><code>pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate</code></p>
<p class="harness-card__note">Export <code>CURSOR_API_KEY</code> or run under Doppler. Run <code>pnpm exec agent-loop-init</code> once. Set <code>costPreset: "cursor"</code> in <code>loop.json</code> to stay on Cursor for both worker and judge. Repo defaults that pin OpenCode <code>escalateModel</code> are not applied on <code>--runtime cursor</code> — judge uses <code>reviewRuntime</code> / <code>reviewModel</code>.</p>
<p class="harness-card__note">Export <code>CURSOR_API_KEY</code> or run under Doppler. Run <code>pnpm exec agent-loop-init</code> once. Default judge <code>reviewModel</code> is <code>grok-4.7</code> when the worker is Cursor; Composer 2.5 is the only Cursor worker. Set <code>costPreset: "cursor"</code> in <code>loop.json</code> to stay on Cursor for both worker and judge. Repo defaults that pin OpenCode <code>escalateModel</code> are not applied on <code>--runtime cursor</code> — judge uses <code>reviewRuntime</code> / <code>reviewModel</code>.</p>
</article>

<article class="harness-card" id="dsh">
Expand Down Expand Up @@ -200,10 +201,11 @@ <h3>Codex</h3>
<p class="harness-card__job"><code>@openai/codex-sdk</code> and <code>codex</code> CLI — ChatGPT / OpenAI BYO.</p>
<p class="harness-card__chips">
<span class="harness-chip">Worker <code>gpt-5.6-luna</code> → <code>gpt-5.6-terra</code></span>
<span class="harness-chip">Optional <code>gpt-6-astra</code></span>
<span class="harness-chip">Judge any runtime, optional</span>
</p>
<p class="harness-card__run"><code>pnpm exec agent-loop run .cursor/loops/my-task --runtime codex --review-gate</code></p>
<p class="harness-card__note">Install <code>@openai/codex-sdk</code>; ensure <code>codex</code> CLI is on PATH.</p>
<p class="harness-card__note">Install <code>@openai/codex-sdk</code>; ensure <code>codex</code> CLI is on PATH. Codex judge default stays <code>gpt-5.6-sol</code>; <code>gpt-6-astra</code> is listed but not the default judge.</p>
</article>

<article class="harness-card" id="muse">
Expand Down Expand Up @@ -237,7 +239,7 @@ <h3>Claude</h3>
<span class="harness-chip">Judge any runtime, optional</span>
</p>
<p class="harness-card__run"><code>pnpm exec agent-loop run .cursor/loops/my-task --runtime claude --review-gate</code></p>
<p class="harness-card__note">Ensure <code>claude</code> 2.1.169+ is on PATH and <code>claude login</code> has been run. Typical mix: cheap worker + Claude as judge (default <code>opus</code>). See <a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md">docs/claude-runtime.md</a>.</p>
<p class="harness-card__note">Ensure <code>claude</code> 2.1.169+ is on PATH and <code>claude login</code> has been run. <code>opus</code> / <code>sonnet</code> / <code>fable</code> aliases track Claude Code latest-per-family. Typical mix: cheap worker + Claude as judge (default <code>opus</code>). See <a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md">docs/claude-runtime.md</a>.</p>
</article>
</div>
</section>
Expand Down
13 changes: 7 additions & 6 deletions site/harnesses/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ You say what to build and how to know it's done. It keeps a coding agent working

[Add to Grok Bot](https://x.ai/bot/AETdGbRRNWfckrRGv22LD)

Grok Bot is the Grok operator that runs Agent Looper on the user's computer. It is not a `--runtime` enum value. Distinct from the Grok 4.7 model that Cursor uses as judge.
Grok Bot is the Grok operator that runs Agent Looper on the user's computer. It is not a `--runtime` enum value. Distinct from the Grok 4.7 model that Cursor uses as judge by default.

### How to use

Expand All @@ -29,7 +29,7 @@ Install once: `pnpm add -D @dancingteeth/agent-looper`, then add the SDK or CLI
IDE subscription via `@cursor/sdk`.

- Worker: `composer-2.5`
- Judge (when worker is Cursor): Grok 4.7
- Judge (when worker is Cursor): `grok-4.7` (`grok-4.6` / `grok-4.5` still allowed)
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime cursor --review-gate`

Export `CURSOR_API_KEY` or run under Doppler. Run `pnpm exec agent-loop-init` once. Set `costPreset: "cursor"` in `loop.json` to stay on Cursor for both worker and judge. Repo defaults that pin OpenCode `escalateModel` are not applied on `--runtime cursor` — judge uses `reviewRuntime` / `reviewModel`.
Expand All @@ -48,7 +48,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`

`@cline/sdk` — `cline-pass` for subscription quota, `cline` for credits.

- `cline-pass` worker: `cline-pass/deepseek-v4.1-flash` → `qwen3.7-plus`
- `cline-pass` worker: `cline-pass/deepseek-v4.1-flash` → `qwen3.7-plus` (`deepseek-v4-flash` still allowed)
- `cline` worker: `deepseek/deepseek-chat` → `qwen/qwen3-coder-plus`
- Judge: any runtime, optional
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime cline-pass --review-gate` (or `--runtime cline` for credits)
Expand All @@ -57,7 +57,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`

`@opencode-ai/sdk` and `opencode` CLI — Go quota by default, or BYOK through OpenRouter, Vercel AI Gateway, Ollama, or another OpenAI-compatible router.

- Go worker: `opencode-go/deepseek-v4.1-flash` → `qwen3.7-plus`
- Go worker: `opencode-go/deepseek-v4.1-flash` → `qwen3.7-plus` (`deepseek-v4-flash` still allowed)
- BYOK: `openrouter/…`, `openrouter/…:free`, `vercel/…`, `ollama/…`
- Judge: any runtime, optional
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime opencode --review-gate`
Expand All @@ -75,7 +75,8 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`
`@openai/codex-sdk` and `codex` CLI — ChatGPT / OpenAI BYO.

- Worker: `gpt-5.6-luna` → `gpt-5.6-terra`
- Judge: any runtime, optional
- Optional: `gpt-6-astra` (listed; not the default judge)
- Judge: any runtime, optional (Codex-native judge defaults to `gpt-5.6-sol`, not `gpt-6-astra`)
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime codex --review-gate`

### Muse (`--runtime muse`)
Expand All @@ -88,7 +89,7 @@ DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper`

### Claude (`--runtime claude`)

PATH `claude` CLI — Claude Code subscription. `--safe-mode` so the harness prompt is the only instruction source (strips project hooks and auto-memory). Not on `costPreset` minmax. See [docs/claude-runtime.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md).
PATH `claude` CLI — Claude Code subscription. `--safe-mode` so the harness prompt is the only instruction source (strips project hooks and auto-memory). Not on `costPreset` minmax. `opus` / `sonnet` / `fable` aliases track Claude Code latest-per-family. See [docs/claude-runtime.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/claude-runtime.md).

- Worker: `sonnet` → `opus`
- Judge: any runtime, optional
Expand Down
23 changes: 19 additions & 4 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
"name": "How do Agent Looper worker and judge presets work?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On runtime: cursor, repo defaults that pin OpenCode Go escalateModel are not applied — Composer plus another judge uses reviewRuntime / reviewModel, not escalateModel."
"text": "Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok — default judge grok-4.7). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On runtime: cursor, repo defaults that pin OpenCode Go escalateModel are not applied — Composer plus another judge uses reviewRuntime / reviewModel, not escalateModel."
}
},
{
Expand Down Expand Up @@ -171,7 +171,15 @@
"name": "What do the spend numbers mean?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Watch and the report card show two numbers when they differ: list (public API rates, including prompt-cache) and billed (what the runtime invoice says). $0 on a subscription quota is billed $0, not free. Budget caps use billed when you are on PAYG and list when the invoice is $0. OpenCode Go and Cline Pass model lists and list prices come from models.dev; unknown but well-formed slugs soft-gate — warn at loop start, show $0 until priced. Budget caps still reject unpriced worker or escalate models."
"text": "Watch and the report card show two numbers when they differ: list (public API rates, including prompt-cache) and billed (what the runtime invoice says). $0 on a subscription quota is billed $0, not free. Budget caps use billed when you are on PAYG and list when the invoice is $0. OpenCode Go and Cline Pass model lists and list prices come from models.dev — sync picks up Grok 4.7, GPT-6 Luna, MiMo V2.6 Flash/Pro, and Space Bunny Free; unknown but well-formed slugs soft-gate — warn at loop start, show $0 until priced. Budget caps still reject unpriced worker or escalate models."
}
},
{
"@type": "Question",
"name": "How do I harden verify between runs?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Before you add another line to verify.sh or REVIEWS.md, walk a diverse sample of past runs under .cursor/loop-exports/ so the scoreboard matches real failures — not one lucky green. Procedure: docs/unknowns-preflight.md on the repo. Freeze during a run is unchanged."
}
}
]
Expand Down Expand Up @@ -342,7 +350,7 @@ <h2>Which coding agents does Agent Looper work with?</h2>
<article class="tui-answer tui-answer--presets">
<h2>How do Agent Looper worker and judge presets work?</h2>
<p>
Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On <code>runtime: cursor</code>, repo defaults that pin OpenCode Go <code>escalateModel</code> are not applied — Composer plus another judge uses <code>reviewRuntime</code> / <code>reviewModel</code>, not <code>escalateModel</code>.
Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok — default judge <code>grok-4.7</code>). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On <code>runtime: cursor</code>, repo defaults that pin OpenCode Go <code>escalateModel</code> are not applied — Composer plus another judge uses <code>reviewRuntime</code> / <code>reviewModel</code>, not <code>escalateModel</code>.
</p>
</article>
<article class="tui-answer tui-answer--budget">
Expand Down Expand Up @@ -395,7 +403,13 @@ <h2>What if verify fails because my environment is broken?</h2>
<article class="tui-answer tui-answer--spend">
<h2>What do the spend numbers mean?</h2>
<p>
Watch and the report card show two numbers when they differ: <strong>list</strong> (public API rates, including prompt-cache) and <strong>billed</strong> (what the runtime invoice says). <code>$0</code> on a subscription quota is billed <code>$0</code>, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is <code>$0</code>. OpenCode Go and Cline Pass model lists and list prices come from <a href="https://models.dev/api.json">models.dev</a>; unknown but well-formed slugs soft-gate — warn at loop start, show <code>$0</code> until priced. Budget caps still reject unpriced worker or escalate models.
Watch and the report card show two numbers when they differ: <strong>list</strong> (public API rates, including prompt-cache) and <strong>billed</strong> (what the runtime invoice says). <code>$0</code> on a subscription quota is billed <code>$0</code>, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is <code>$0</code>. OpenCode Go and Cline Pass model lists and list prices come from <a href="https://models.dev/api.json">models.dev</a> — sync picks up Grok 4.7, GPT-6 Luna, MiMo V2.6 Flash/Pro, and Space Bunny Free; unknown but well-formed slugs soft-gate — warn at loop start, show <code>$0</code> until priced. Budget caps still reject unpriced worker or escalate models.
</p>
</article>
<article class="tui-answer tui-answer--exports">
<h2>How do I harden verify between runs?</h2>
<p>
Before you add another line to <code>verify.sh</code> or <code>REVIEWS.md</code>, walk a diverse sample of past runs under <code>.cursor/loop-exports/</code> so the scoreboard matches real failures — not one lucky green. Procedure: <a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/unknowns-preflight.md">docs/unknowns-preflight.md</a>. Freeze during a run is unchanged.
</p>
</article>
</div>
Expand All @@ -410,6 +424,7 @@ <h2>How it works</h2>
Optional <code>setup.sh</code> (or <code>setup</code> in <code>loop.json</code>) runs once before the first worker — setup failure does not spawn a worker.
A fresh worker loops until that check passes — optional judge / <code>reviewGate</code> only on serious findings.
After each visit the harness restores frozen specs if a worker edited them — and removes any frozen basename they planted (like <code>setup.sh</code>) so it cannot carry into the next run.
Between runs, label export packs before you tighten the check (<a href="https://github.com/dancingteeth/agent-looper/blob/main/docs/unknowns-preflight.md">unknowns preflight</a>).
Progress lives in git and files, not chat memory.
</p>
<div class="grid two-col">
Expand Down
10 changes: 7 additions & 3 deletions site/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Agent Looper uses the coding agents you already pay for: Cursor, Cline, OpenCode

## How do Agent Looper worker and judge presets work?

Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On `runtime: cursor`, repo defaults that pin OpenCode Go `escalateModel` are not applied — Composer plus another judge uses `reviewRuntime` / `reviewModel`, not `escalateModel`.
Named presets: minmax (efficiency — cheap capable worker, strongest included judge), balanced (spend more on the worker, same judge), cursor (stay on Cursor: Composer + Grok — default judge `grok-4.7`). Or you, your agent, or Looper wires a pair from what's installed. The pair stays for the whole loop. Not Auto. On `runtime: cursor`, repo defaults that pin OpenCode Go `escalateModel` are not applied — Composer plus another judge uses `reviewRuntime` / `reviewModel`, not `escalateModel`.

## How does Agent Looper keep cost down for indie builders?

Expand Down Expand Up @@ -50,11 +50,15 @@ When the check fails because something on your machine is missing or broken —

## What do the spend numbers mean?

Watch and the report card show two numbers when they differ: **list** (public API rates, including prompt-cache) and **billed** (what the runtime invoice says). `$0` on a subscription quota is billed `$0`, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is `$0`. OpenCode Go and Cline Pass model lists and list prices come from [models.dev](https://models.dev/api.json); unknown but well-formed slugs soft-gate — warn at loop start, show `$0` until priced. Budget caps still reject unpriced worker or escalate models.
Watch and the report card show two numbers when they differ: **list** (public API rates, including prompt-cache) and **billed** (what the runtime invoice says). `$0` on a subscription quota is billed `$0`, not “free.” Budget caps use billed when you are on PAYG and list when the invoice is `$0`. OpenCode Go and Cline Pass model lists and list prices come from [models.dev](https://models.dev/api.json) — sync picks up Grok 4.7, GPT-6 Luna, MiMo V2.6 Flash/Pro, and Space Bunny Free; unknown but well-formed slugs soft-gate — warn at loop start, show `$0` until priced. Budget caps still reject unpriced worker or escalate models.

## How do I harden verify between runs?

Before you add another line to `verify.sh` or `REVIEWS.md`, walk a diverse sample of past runs under `.cursor/loop-exports/` so the scoreboard matches real failures — not one lucky green. Procedure: [docs/unknowns-preflight.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/unknowns-preflight.md). Freeze during a run is unchanged.

## How it works

Your agent writes `GOAL.md` and a deterministic check. Optional `setup.sh` (or `setup` in `loop.json`) runs once before the first worker — setup failure does not spawn a worker. A fresh worker loops until the check passes. After each visit the harness restores frozen specs if a worker edited them — and removes any frozen basename they planted (like `setup.sh`) so it cannot carry into the next run.
Your agent writes `GOAL.md` and a deterministic check. Optional `setup.sh` (or `setup` in `loop.json`) runs once before the first worker — setup failure does not spawn a worker. A fresh worker loops until the check passes. After each visit the harness restores frozen specs if a worker edited them — and removes any frozen basename they planted (like `setup.sh`) so it cannot carry into the next run. Between runs, label export packs before you tighten the check ([unknowns preflight](https://github.com/dancingteeth/agent-looper/blob/main/docs/unknowns-preflight.md)).

## How is Agent Looper different from looping in chat?

Expand Down
Loading
Loading