Skip to main content
skill CX Codex

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.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add wanshuiyin/Auto-claude-code-research-in-sleep --skill auto-review-loop-llm -a claude-code
Open on GitHub

What 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-code

2Manually: put the files in place

~/.claude/skills/auto-review-loop-llm/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/auto-review-loop-llm/

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

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set78

idea-discovery-robot A skill that takes a broad robotics direction and turns it into benchmarkable, simulation-first ideas through survey, generation, novelty check and review. CX Codex +1 501installs experiment-bridge Reads an experiment plan, writes the missing code, gets it reviewed by another model and deploys runs to GPU. Useful when the plan is ready but the implementation is not. CX Codex +1 497installs paper-poster This deprecated skill redirects requests to /paper-poster-html. It preserves the old entry point, but should not be used for new posters. CX Codex +1 499installs rebuttal A skill that turns external reviews into a grounded, venue-compliant rebuttal. Useful when the response deadline is close and you need every concern covered. CX Codex +1 499installs auto-review-loop-minimax Runs an autonomous research review-and-fix loop using the MiniMax API. Useful when you need external reviews via MiniMax-M3 instead of OpenAI Codex MCP. CX Codex +1 491installs dse-loop Runs your program, reads the metric, picks the next parameters, repeats. Stops when the objective is met or the budget runs out. CX Codex +1 491installs feishu-notify A skill that pushes Feishu or Lark notifications when another skill finishes an experiment, scores a review or waits for your input. CX Codex +1 489installs patent-review This skill runs an external patent-examiner review of claims, specifications, and prior art. Use it to find rejection risks before revising an application. CX Codex +1 488installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor