Default worker stays deepseek-official/deepseek-v4-flash; opt in to deepseek-official/deepseek-flash (DeepSeek-V41-Flash, image-capable) per loop in setup. Ensure dsh is on PATH. DSH companion plugin guard blocks accidental foreground grinds. See docs/dsh-plugin.md and plugins/dsh-agent-looper/.
diff --git a/site/harnesses/index.md b/site/harnesses/index.md
index e46d2d2..b2a9c53 100644
--- a/site/harnesses/index.md
+++ b/site/harnesses/index.md
@@ -38,9 +38,10 @@ Export `CURSOR_API_KEY` or run under Doppler. Run `pnpm exec agent-loop-init` on
DeepSeek Harness CLI — worker is `dsh --profile headless`; `dsh-agent-looper` plugin for `dsh web`. See [docs/dsh-plugin.md](https://github.com/dancingteeth/agent-looper/blob/main/docs/dsh-plugin.md) and [plugins/dsh-agent-looper/](https://github.com/dancingteeth/agent-looper/tree/main/plugins/dsh-agent-looper).
-- Worker: `deepseek-official/deepseek-v4-flash` (escalates to `deepseek-official/deepseek-v4-pro`)
+- Worker: `deepseek-official/deepseek-v4-flash` (escalates to `deepseek-official/deepseek-v4-pro`) — default; opt in per loop to `deepseek-official/deepseek-flash` (DeepSeek-V41-Flash, image-capable)
- Judge: `deepseek-official/deepseek-v4-pro` (when `reviewRuntime: dsh`)
- Run: `pnpm exec agent-loop run .cursor/loops/my-task --runtime dsh --review-gate`
+- DSH companion plugin guard blocks accidental foreground grinds
### Cline (`--runtime cline-pass` · `cline`)
diff --git a/site/index.html b/site/index.html
index efecf1e..ae5c849 100644
--- a/site/index.html
+++ b/site/index.html
@@ -155,7 +155,15 @@
"name": "How do I start a loop from an idea?",
"acceptedAnswer": {
"@type": "Answer",
- "text": "Two paths: (1) If you see your coding agent's logo on this page — type your idea as a normal prompt, and ask it to implement the feature with Agent Looper. It sets up the loop and keeps grinding until the check is green. (2) If you like the terminal — set worker and judge with pnpm exec agent-loop-setup, then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line."
+ "text": "Two paths: (1) If you see your coding agent's logo on this page — type your idea as a normal prompt, and ask it to implement the feature with Agent Looper. It sets up the loop and keeps grinding until the check is green. (2) If you like the terminal — run pnpm exec agent-loop-setup: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line."
+ }
+ },
+ {
+ "@type": "Question",
+ "name": "What if verify fails because my environment is broken?",
+ "acceptedAnswer": {
+ "@type": "Answer",
+ "text": "When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate."
}
},
{
@@ -209,7 +217,7 @@
]
}
-
+
@@ -375,7 +383,13 @@
How do I start a loop from an idea?
If you see your coding agent's logo on this page — type your idea as a normal prompt, and ask it to implement the feature with Agent Looper. It sets up the loop and keeps grinding until the check is green.
- If you like the terminal — set worker and judge with pnpm exec agent-loop-setup, then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line.
+ If you like the terminal — run pnpm exec agent-loop-setup: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use pnpm exec agent-loop-prompt to type your idea and start the run. The check stays the finish line.
+
+
+
+
What if verify fails because my environment is broken?
+
+ When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate.
@@ -393,7 +407,9 @@
What do the spend numbers mean?
How it works
Your agent writes GOAL.md and a deterministic check that the feature really works.
+ 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 that check passes — optional judge / reviewGate only on serious findings.
+ After each visit the harness restores frozen specs if a worker edited them.
Progress lives in git and files, not chat memory.
@@ -403,7 +419,7 @@
Worker
Verifier
-
A deterministic check. Green is only as good as the check you froze. The model doesn't get to hallucinate done. If something's wrong, the mistake is in the goal or the script.
+
A deterministic check. Green is only as good as the check you froze. The model doesn't get to hallucinate done. If your machine is broken, the loop waits — it doesn't burn another worker on a missing command. Real product failures still iterate.
Judge optional
diff --git a/site/index.md b/site/index.md
index 0d9387a..2f76a1e 100644
--- a/site/index.md
+++ b/site/index.md
@@ -40,14 +40,22 @@ Two paths:
1. **If you see your coding agent's logo on this page** — type your idea as a normal prompt, and ask it to implement the feature **with Agent Looper**. It sets up the loop and keeps grinding until the check is green.
-2. **If you like the terminal** — set worker and judge with `pnpm exec agent-loop-setup`, then use `pnpm exec agent-loop-prompt` to type your idea and start the run.
+2. **If you like the terminal** — run `pnpm exec agent-loop-setup`: a one-screen setup wizard shows your recap and the current question, not a scrolling pile. Go back to change one answer without losing the rest. Then use `pnpm exec agent-loop-prompt` to type your idea and start the run.
The check stays the finish line.
+## What if verify fails because my environment is broken?
+
+When the check fails because something on your machine is missing or broken — not because the feature is wrong — the loop waits for you instead of sending another worker. Fix the environment, then resume. Real product failures still iterate.
+
## 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`.
+## 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.
+
## How is Agent Looper different from looping in chat?
- Shell verify is the exit, not the LLM grading itself.
diff --git a/site/llms.txt b/site/llms.txt
index 7507efa..41bd6d4 100644
--- a/site/llms.txt
+++ b/site/llms.txt
@@ -6,7 +6,7 @@ When to use Agent Looper: a human wants a feature finished without babysitting C
When not to use Agent Looper: there is no deterministic check (pure taste with no script or vision gate); you need a team-ops factory, shared org cloud, or multi-repo orchestration; you want the model to grade itself as “done.”
-How an agent should call it: install `@dancingteeth/agent-looper`, ask the human what they want, then implement the feature with Agent Looper (set up the loop, write GOAL.md and verify.sh, run until green). Or from the terminal: `pnpm exec agent-loop-setup` then `pnpm exec agent-loop-prompt --out .cursor/loops/`, then `pnpm exec agent-loop run .cursor/loops/ --runtime `. Optional `--review-gate` re-opens the loop only on blocking review findings. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.0**.
+How an agent should call it: install `@dancingteeth/agent-looper`, ask the human what they want, then implement the feature with Agent Looper (set up the loop, write GOAL.md and verify.sh, run until green). Or from the terminal: `pnpm exec agent-loop-setup` (one-screen setup wizard — recap plus current question) then `pnpm exec agent-loop-prompt --out .cursor/loops/`, then `pnpm exec agent-loop run .cursor/loops/ --runtime `. Optional `--review-gate` re-opens the loop only on blocking review findings. If verify fails because the environment is broken, the loop waits instead of burning another worker. CLI binaries: `agent-loop`, `agent-loop-prompt`. Current npm: **0.6.0** (supported line **0.6.x**).
## Developer resources
diff --git a/src/site/landingAgentReadiness.test.ts b/src/site/landingAgentReadiness.test.ts
index c8780cc..f055510 100644
--- a/src/site/landingAgentReadiness.test.ts
+++ b/src/site/landingAgentReadiness.test.ts
@@ -652,6 +652,68 @@ describe('landing agent readiness', () => {
}
})
+ it('names 0.6.0 setup wizard, env-wait, harness setup, frozen restore, and DSH 4.1 Flash opt-in', () => {
+ const html = readSite('index.html')
+ const md = readSite('index.md')
+ const llms = readSite('llms.txt')
+ const harnessHtml = readSite('harnesses/index.html')
+ const harnessMd = readSite('harnesses/index.md')
+ const graph = jsonLdGraph(html)
+
+ const faq = graph.find(
+ (node) =>
+ typeof node === 'object' &&
+ node !== null &&
+ (node as { '@type'?: string })['@type'] === 'FAQPage',
+ ) as {
+ mainEntity?: Array<{
+ name?: string
+ acceptedAnswer?: { text?: string }
+ }>
+ }
+
+ const promptQuestion = faq?.mainEntity?.find(
+ (q) => q.name === 'How do I start a loop from an idea?',
+ )
+ const envQuestion = faq?.mainEntity?.find(
+ (q) => q.name === 'What if verify fails because my environment is broken?',
+ )
+
+ const setupWizardBeat = 'one-screen setup wizard'
+ const envWaitBeat = 'waits for you instead of sending another worker'
+ const setupBeat = 'setup.sh'
+ const frozenBeat = 'restores frozen specs'
+ const flashOptIn = 'deepseek-flash'
+ const flashLabel = '4.1 Flash'
+
+ for (const surface of [html, md] as const) {
+ expect(surface).toContain(setupWizardBeat)
+ expect(surface).toContain(envWaitBeat)
+ expect(surface).toContain(setupBeat)
+ expect(surface).toContain(frozenBeat)
+ expect(surface).not.toContain('0.5.0')
+ expect(surface).not.toMatch(/\bInk\b/i)
+ }
+
+ expect(llms).toContain('Current npm: **0.6.0**')
+ expect(llms).toContain('0.6.x')
+ expect(llms).not.toContain('0.5.0')
+ expect(llms).toContain(setupWizardBeat)
+
+ expect(promptQuestion?.acceptedAnswer?.text).toContain(setupWizardBeat)
+ expect(envQuestion?.acceptedAnswer?.text).toContain(envWaitBeat)
+
+ const dshCard =
+ harnessHtml.match(
+ /[\s\S]*?<\/article>/,
+ )?.[0] ?? ''
+ expect(dshCard).toContain(flashOptIn)
+ expect(dshCard).toContain(flashLabel)
+ expect(dshCard).toContain('deepseek-v4-flash')
+ expect(harnessMd).toContain(flashOptIn)
+ expect(harnessMd).toContain('deepseek-v4-flash')
+ })
+
it('every HTML page loads analytics.js', () => {
const htmlFiles: string[] = []
function walk(dir: string) {