auto-review-loop-llm — Claude Code skill: review loop via any LLM API
Runs your work through review, fixes and another review until an outside model scores it high enough. Handy for pushing a paper or experiment to submission shape.
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a claude-codeWhat auto-review-loop-llm does
The skill drives a review → implement fixes → re-review cycle until the external reviewer gives a positive assessment or MAX_ROUNDS is reached. MAX_ROUNDS defaults to 4. The stop check needs both conditions at once: a score of at least 6 out of 10 and a verdict of "ready" or "almost".
Any OpenAI-compatible model can act as the reviewer. The main path is the llm-chat MCP server, configured in ~/.claude/settings.json with LLM_API_KEY, LLM_BASE_URL and LLM_MODEL. When MCP is unavailable the skill falls back to curl against the same endpoint. Third-party compatible endpoints get max_tokens in the request body, a direct OpenAI call gets max_completion_tokens; LLM_MAX_TOKENS_FIELD overrides that choice.
Each round is persisted to review-stage/REVIEW_STATE.json, and the cumulative log goes to review-stage/AUTO_REVIEW.md. That means the loop survives a context compaction and picks up where it stopped. Do not wrap it in /loop, /schedule or CronCreate — it already loops internally, and an external timer re-enters from the top, dropping the accumulated context and spending tokens on no new signal. Schedule the wait before the run, not the verdict.
What it helps with
- push a draft paper until the reviewer calls it ready
- get remaining weaknesses ranked by severity
- turn each criticism into the minimum fix
- resume the review loop after context compaction from saved state
- run the review through your own model instead of a built-in one
Example prompts for the agent
- auto review loop llm — review the experiments section
- llm review: score my paper and tell me what blocks submission
- auto review loop llm [methods and results]
How to install auto-review-loop-llm
1Skills CLI (Vercel)
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a claude-code2Manually: put the files in place
~/.claude/skills/auto-review-loop-llm/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/auto-review-loop-llm/
1Skills CLI (Vercel)
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a codex2Manually: put the files in place
.agents/skills/auto-review-loop-llm/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a cursor2Manually: put the files in place
.cursor/skills/auto-review-loop-llm/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install wanshuiyin/Auto-claude-code-research-in-sleep auto-review-loop-llm2Manually: put the files in place
.github/skills/auto-review-loop-llm/SKILL.md1Skills CLI (Vercel)
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a gemini-cli2Platform CLI
gemini skills install https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep --path skills/auto-review-loop-llmManually: put the files in place
.devin/skills/auto-review-loop-llm/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about auto-review-loop-llm
How do I install auto-review-loop-llm in Claude?
Run npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a claude-code. The skill then lives at ~/.claude/skills/auto-review-loop-llm/SKILL.md.
What does auto-review-loop-llm do?
It loops review, fixes and re-review until the external model scores the work at least 6 out of 10 with a verdict of "ready" or "almost", or the rounds run out.
What has to be set up before the first run?
The llm-chat MCP server in ~/.claude/settings.json with LLM_API_KEY, LLM_BASE_URL and LLM_MODEL. Without MCP the skill calls the same endpoint through curl.
Source text
SKILL.md · MIT
---
name: auto-review-loop-llm
description: Autonomous research review loop using any OpenAI-compatible LLM API. Configure via llm-chat MCP server or environment variables. Trigger with "auto review loop llm" or "llm review".
argument-hint: "[topic-or-scope]"
allowed-tools: Bash(*), Read, Grep, Glob, Write, Edit, Skill
---
# Auto Review Loop (Generic LLM): Autonomous Research Improvement
> 🔒 **Do not wrap this skill in `/loop`, `/schedule`, or `CronCreate`.** Like
> `/auto-review-loop`, it already loops internally (review → fix → re-review),
> feeding each round's prior-round summary into the next review prompt (the
> backend is a stateless per-round API/MCP call, not a shared thread). An
> external timer re-enters from the top each tick, dropping that accumulated
> context and firing the verdict on wall-clock time instead of on artifact
> change — zero new signal, full token cost. Schedule the *external wait that
> precedes it*, not the verdict. See
> [`shared-references/external-cadence.md`](../shared-references/external-cadence.md).
Autonomously iterate: review → implement fixes → re-review, until the external reviewer gives a positive assessment or MAX_ROUNDS is reached.
## Context: $ARGUMENTS
## Constants
- MAX_ROUNDS = 4
- POSITIVE_THRESHOLD: score >= 6/10 **AND** verdict ∈ {"ready", "almost"} — **both** must hold, matching the operative STOP check below. Verdict vocabulary is {"ready", "almost", "not ready"}. (Earlier wording used `or` and a stale verdict set; the `AND` form is authoritative.)
- REVIEW_DOC: `review-stage/AUTO_REVIEW.md` (cumulative log) *(fall back to `./AUTO_REVIEW.md` for legacy projects)*
## LLM Configuration
This skill uses **any OpenAI-compatible API** for external review via the `llm-chat` MCP server.
### Configuration via MCP Server (Recommended)
Add to `~/.claude/settings.json`:
```json
{
"mcpServers": {
"llm-chat": {
"command": "/usr/bin/python3",
"args": ["/Users/yourname/.claude/mcp-servers/llm-chat/server.py"],
"env": {
"LLM_API_KEY": "your-api-key",
"LLM_BASE_URL": "https://api.deepseek.com/v1",
"LLM_MODEL": "deepseek-chat"
}
}
}
}
```
### Supported Providers
| Provider | LLM_BASE_URL | LLM_MODEL |
|----------|--------------|-----------|
| **OpenAI** | `https://api.openai.com/v1` | `gpt-6.1-sol`, `gpt-6-astra` |
| **DeepSeek** | `https://api.deepseek.com/v1` | `deepseek-chat`, `deepseek-reasoner` |
| **MiniMax** | `https://api.minimax.io/v1` | `MiniMax-M3` |
| **Kimi (Moonshot)** | `https://api.moonshot.cn/v1` | `moonshot-v1-8k`, `moonshot-v1-32k` |
| **ZhiPu (GLM)** | `https://open.bigmodel.cn/api/paas/v4` | `glm-4`, `glm-4-plus` |
| **SiliconFlow** | `https://api.siliconflow.cn/v1` | `Qwen/Qwen2.5-72B-Instruct` |
| **阿里云百炼** | `https://dashscope.aliyuncs.com/compatible-mode/v1` | `qwen-max` |
| **零一万物** | `https://api.lingyiwanwu.com/v1` | `yi-large` |
The `llm-chat` server defaults to `gpt-6.1-sol`. When `LLM_FALLBACK_MODEL` is
unset, the 504-timeout fallback inherits `LLM_MODEL` (so it is not a fixed,
different model). Calls to `api.openai.com` automatically use
`max_completion_tokens`; third-party OpenAI-compatible endpoints use
`max_tokens`. Set `LLM_MAX_TOKENS_FIELD=max_tokens` or
`LLM_MAX_TOKENS_FIELD=max_completion_tokens` to override that automatic choice.
## API Call Method
**Primary: MCP Tool**
```
mcp__llm-chat__chat:
prompt: |
[Review prompt content]
model: "deepseek-chat"
system: "You are a senior ML reviewer..."
```
**Fallback: curl**
For third-party OpenAI-compatible endpoints, use `max_tokens`:
```bash
curl -s "${LLM_BASE_URL}/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${LLM_API_KEY}" \
-d '{
"model": "${LLM_MODEL}",
"messages": [
{"role": "system", "content": "You are a senior ML reviewer..."},
{"role": "user", "content": "[review prompt]"}
],
"max_tokens": 4096
}'
```
For a direct OpenAI call, use `max_completion_tokens` instead:
```bash
curl -s "https://api.openai.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${LLM_API_KEY}" \
-d '{
"model": "gpt-6.1-sol",
"messages": [
{"role": "system", "content": "You are a senior ML reviewer..."},
{"role": "user", "content": "[review prompt]"}
],
"max_completion_tokens": 4096
}'
```
## State Persistence (Compact Recovery)
Persist state to `review-stage/REVIEW_STATE.json` after each round:
```json
{
"round": 2,
"status": "in_progress",
"last_score": 5.0,
"last_verdict": "not ready",
"pending_experiments": [],
"timestamp": "2026-03-15T10:00:00"
}
```
**Write this file at the end of every Phase E** (after documenting the round).
**On completion**, set `"status": "completed"`.
## Workflow
### Initialization
1. **Check `review-stage/REVIEW_STATE.json`** for recovery *(fall back to `./REVIEW_STATE.json` if not found — legacy path)*
2. Read project context and prior reviews
3. Initialize round counter
### Loop (up to MAX_ROUNDS)
#### Phase A: Review
**If MCP available:**
```
mcp__llm-chat__chat:
system: "You are a senior ML reviewer (NeurIPS/ICML level)."
prompt: |
[Round N/MAX_ROUNDS of autonomous review loop]
[Full research context: claims, methods, results, known weaknesses]
[Changes since last round, if any]
1. Score this work 1-10 for a top venue
2. List remaining critical weaknesses (ranked by severity)
3. For each weakness, specify the MINIMUM fix
4. State clearly: is this READY for submission? Yes/No/Almost
Be brutally honest. If the work is ready, say so clearly.
```
**If MCP NOT available:** For third-party OpenAI-compatible endpoints use
`max_tokens`; for direct OpenAI calls use `max_completion_tokens` instead.
```bash
curl -s "${LLM_BASE_URL}/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${LLM_API_KEY}" \
-d '{
"model": "${LLM_MODEL}",
"messages": [
{"role": "system", "content": "You are a senior ML reviewer (NeurIPS/ICML level)."},
{"role": "user", "content": "[Full review prompt]"}
],
"max_tokens": 4096
}'
```
#### Phase B: Parse Assessment
**CRITICAL: Save the FULL raw response** verbatim. Then extract:
- **Score** (numeric 1-10)
- **Verdict** ("ready" / "almost" / "not ready")
- **Action items** (ranked list of fixes)
**STOP**: If score >= 6 AND verdict ∈ {"ready", "almost"} (exact — "not ready" does NOT qualify)
#### Phase C: Implement Fixes
Priority: metric additions > reframing > new experiments
#### Phase D: Wait for Results
Monitor remote experiments
#### Phase E: Document Round
Append to `review-stage/AUTO_REVIEW.md`:
```markdown
## Round N (timestamp)
### Assessment (Summary)
- Score: X/10
- Verdict: [ready/almost/not ready]
- Key criticisms: [bullet list]
### Reviewer Raw Response
<details>
<summary>Click to expand full reviewer response</summary>
[Paste the COMPLETE raw response here — verbatim, unedited.]
</details>
### Actions Taken
- [what was implemented/changed]
### Results
- [experiment outcomes, if any]
### Status
- [continuing to round N+1 / stopping]
```
**Write `review-stage/REVIEW_STATE.json`** with current state.
### Termination
1. Set `review-stage/REVIEW_STATE.json` status to "completed"
2. Write final summary
## Key Rules
- **Large file handling**: If the Write tool fails due to file size, immediately retry using Bash (`cat << 'EOF' > file`) to write in chunks. Do NOT ask the user for permission — just do it silently.
- **Anti-hallucination citations**: When adding references, NEVER fabricate BibTeX. Use DBLP → CrossRef → `[VERIFY]` chain. Do NOT generate BibTeX from memory.
- Be honest about weaknesses
- Implement fixes BEFORE re-reviewing
- Document everything
- Include previous context in round 2+ prompts
- Prefer MCP tool over curl when available
## Prompt Template for Round 2+
```
mcp__llm-chat__chat:
system: "You are a senior ML reviewer (NeurIPS/ICML level)."
prompt: |
[Round N/MAX_ROUNDS of autonomous review loop]
## Previous Review Summary (Round N-1)
- Previous Score: X/10
- Previous Verdict: [ready/almost/not ready]
- Previous Key Weaknesses: [list]
## Changes Since Last Review
1. [Action 1]: [result]
2. [Action 2]: [result]
## Updated Results
[paste updated metrics/tables]
Please re-score and re-assess:
1. Score this work 1-10 for a top venue
2. List remaining critical weaknesses (ranked by severity)
3. For each weakness, specify the MINIMUM fix
4. State clearly: is this READY for submission? Yes/No/Almost
Be brutally honest. If the work is ready, say so clearly.
```
## Output Protocols
> Follow these shared protocols for all output files:
> - **[Output Versioning Protocol](../shared-references/output-versioning.md)** — write timestamped file first, then copy to fixed name
> - **[Output Manifest Protocol](../shared-references/output-manifest.md)** — log every output to MANIFEST.md
> - **[Output Language Protocol](../shared-references/output-language.md)** — respect the project's language setting
© wanshuiyin · MIT · wanshuiyin/Auto-claude-code-research-in-sleep