Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Autonomous multi-round research review loop. Repeatedly reviews via Codex MCP, implements fixes, and re-reviews until positive assessment or max rounds reached. Use when user says "auto review loop", "review until it passes", or wants autonomous iterative improvement.
.claude/skills/aris-auto-review-loop/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
Autonomously iterate: review → implement fixes → re-review, until the external reviewer gives a positive assessment or MAX_ROUNDS is reached.
AUTO_REVIEW.md in project root (cumulative log)gpt-5.4 — Model used via Codex MCP. Must be an OpenAI model (e.g., gpt-5.4, o3, gpt-4o)true, pause after each round's review (Phase B) and present the score + weaknesses to the user. Wait for user input before proceeding to Phase C. The user can: approve the suggested fixes, provide custom modification instructions, skip specific fixes, or stop the loop early. When false (default), the loop runs fully autonomously.true, (1) read EXPERIMENT_LOG.md and findings.md instead of parsing full logs on session recovery, (2) append key findings to findings.md after each round.medium (default): Current behavior — MCP-based review, Claude controls what context GPT sees.hard: Adds Reviewer Memory (GPT tracks its own suspicions across rounds) + Debate Protocol (Claude can rebut, GPT rules).nightmare: Everything in hard + GPT reads the repo directly via codex exec (Claude cannot filter what GPT sees) + Adversarial Verification (GPT independently checks if code matches claims).> 💡 Override: /aris-auto-review-loop "topic" — compact: true, human checkpoint: true, difficulty: hard
Long-running loops may hit the context window limit, triggering automatic compaction. To survive this, persist state to REVIEW_STATE.json after each round:
json{ "round": 2, "threadId": "019cd392-...", "status": "in_progress", "difficulty": "medium", "last_score": 5.0, "last_verdict": "not ready", "pending_experiments": ["screen_name_1"], "timestamp": "2026-03-13T21:00:00" }
Write this file at the end of every Phase E (after documenting the round). Overwrite each time — only the latest state matters.
On completion (positive assessment or max rounds), set "status": "completed" so future invocations don't accidentally resume a finished loop.
REVIEW_STATE.json in project root:status is "completed": fresh start (previous loop finished normally)status is "in_progress" AND timestamp is older than 24 hours: fresh start (stale state from a killed/abandoned run — delete the file and start over)status is "in_progress" AND timestamp is within 24 hours: resumeround, threadId, last_score, pending_experimentsAUTO_REVIEW.md to restore full context of prior roundspending_experiments is non-empty, check if they have completed (e.g., check screen sessions)COMPACT = true and compact files exist: read findings.md + EXPERIMENT_LOG.md instead of full AUTO_REVIEW.md and raw logs — saves context window.AUTO_REVIEW.md with header and timestampRoute by REVIEWER_DIFFICULTY:
##### Medium (default) — MCP Review
Send comprehensive context to the external reviewer:
mcp__codex__codex:
config: {"model_reasoning_effort": "xhigh"}
prompt: |
[Round N/MAX_ROUNDS of autonomous review loop]
[Full research context: claims, methods, results, known weaknesses]
[Changes since last round, if any]
Please act as a senior ML reviewer (NeurIPS/ICML level).
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 (experiment, analysis, or reframing)
4. State clearly: is this READY for submission? Yes/No/Almost
Be brutally honest. If the work is ready, say so clearly.If this is round 2+, use mcp__codex__codex-reply with the saved threadId to maintain conversation context.
##### Hard — MCP Review + Reviewer Memory
Same as medium, but prepend Reviewer Memory to the prompt:
mcp__codex__codex:
config: {"model_reasoning_effort": "xhigh"}
prompt: |
[Round N/MAX_ROUNDS of autonomous review loop]
## Your Reviewer Memory (persistent across rounds)
[Paste full contents of REVIEWER_MEMORY.md here]
IMPORTANT: You have memory from prior rounds. Check whether your
previous suspicions were genuinely addressed or merely sidestepped.
The author (Claude) controls what context you see — be skeptical
of convenient omissions.
[Full research context, changes since last round...]
Please act as a senior ML reviewer (NeurIPS/ICML level).
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
5. **Memory update**: List any new suspicions, unresolved concerns,
or patterns you want to track in future rounds.
Be brutally honest. Actively look for things the author might be hiding.##### Nightmare — Codex Exec (GPT reads repo directly)
Do NOT use MCP. Instead, let GPT access the repo autonomously via codex exec:
bashcodex exec "$(cat <<'PROMPT' You are an adversarial senior ML reviewer (NeurIPS/ICML level). This is Round N/MAX_ROUNDS of an autonomous review loop. ## Your Reviewer Memory (persistent across rounds) [Paste full contents of REVIEWER_MEMORY.md] ## Instructions You have FULL READ ACCESS to this repository. The author (Claude) does NOT control what you see — explore freely. Your job is to find problems the author might hide or downplay. DO THE FOLLOWING: 1. Read the experiment code, results files (JSON/CSV), and logs YOURSELF 2. Verify that reported numbers match what's actually in the output files 3. Check if evaluation metrics are computed correctly (ground truth, not model output) 4. Look for cherry-picked results, missing ablations, or suspicious hyperparameter choices 5. Read NARRATIVE_REPORT.md or AUTO_REVIEW.md for the author's claims — then verify each against code OUTPUT FORMAT: - Score: X/10 - Verdict: ready / almost / not ready - Verified claims: [which claims you independently confirmed] - Unverified/false claims: [which claims don't match the code or results] - Weaknesses (ranked): [with MINIMUM fix for each] - Memory update: [new suspicions and patterns to track next round] Be adversarial. Trust nothing the author tells you — verify everything yourself. PROMPT )" --skip-git-repo-check 2>&1
Key difference: In nightmare mode, GPT independently reads code, result files, and logs. Claude cannot filter or curate what GPT sees. This is the closest analog to a real hostile reviewer who reads your actual paper + supplementary materials.
CRITICAL: Save the FULL raw response from the external reviewer verbatim (store in a variable for Phase E). Do NOT discard or summarize — the raw text is the primary record.
Then extract structured fields:
STOP CONDITION: If score >= 6 AND verdict contains "ready" or "almost" → stop loop, document final state.
Skip entirely if REVIEWER_DIFFICULTY = medium.
After parsing the assessment, update REVIEWER_MEMORY.md in the project root:
markdown# Reviewer Memory ## Round 1 — Score: X/10 - **Suspicion**: [what the reviewer flagged] - **Unresolved**: [concerns not yet addressed] - **Patterns**: [recurring issues the reviewer noticed] ## Round 2 — Score: X/10 - **Previous suspicions addressed?**: [yes/no for each, with reviewer's judgment] - **New suspicions**: [...] - **Unresolved**: [carried forward + new]
Rules:
Skip entirely if REVIEWER_DIFFICULTY = medium.
After parsing the review, Claude (the author) gets a chance to rebut:
Step 1 — Claude's Rebuttal:
For each weakness the reviewer identified, Claude writes a structured response:
markdown### Rebuttal to Weakness #1: [title] - **Accept / Partially Accept / Reject** - **Argument**: [why this criticism is invalid, already addressed, or based on a misunderstanding] - **Evidence**: [point to specific code, results, or prior round fixes]
Rules for Claude's rebuttal:
Step 2 — GPT Rules on Rebuttal:
Send Claude's rebuttal back to GPT for a ruling:
Hard mode (MCP):
mcp__codex__codex-reply:
threadId: [saved]
config: {"model_reasoning_effort": "xhigh"}
prompt: |
The author rebuts your review:
[paste Claude's rebuttal]
For each rebuttal, rule:
- SUSTAINED (author's argument is valid, withdraw this weakness)
- OVERRULED (your original criticism stands, explain why)
- PARTIALLY SUSTAINED (revise the weakness to a narrower scope)
Then update your score if any weaknesses were withdrawn.Nightmare mode (codex exec):
bashcodex exec "$(cat <<'PROMPT' You are the same adversarial reviewer. The author rebuts your review: [paste Claude's rebuttal] VERIFY the author's evidence claims yourself — read the files they reference. Do NOT take their word for it. For each rebuttal, rule: - SUSTAINED (verified and valid) - OVERRULED (evidence doesn't check out or argument is weak) - PARTIALLY SUSTAINED (partially valid, narrow the weakness) Update your score. Update your memory. PROMPT )" --skip-git-repo-check 2>&1
Step 3 — Update score and action items based on the ruling:
Append the full debate transcript to AUTO_REVIEW.md under the round's entry.
Skip this step entirely if HUMAN_CHECKPOINT = false.
When HUMAN_CHECKPOINT = true, present the review results and wait for user input:
📋 Round N/MAX_ROUNDS review complete.
Score: X/10 — [verdict]
Top weaknesses:
1. [weakness 1]
2. [weakness 2]
3. [weakness 3]
Suggested fixes:
1. [fix 1]
2. [fix 2]
3. [fix 3]
Options:
- Reply "go" or "continue" → implement all suggested fixes
- Reply with custom instructions → implement your modifications instead
- Reply "skip 2" → skip fix #2, implement the rest
- Reply "stop" → end the loop, document current stateWait for the user's response. Parse their input:
After parsing the score, check if ~/.claude/feishu.json exists and mode is not "off":
review_scored notification: "Round N: X/10 — verdict]" with top 3 weaknessesFor each action item (highest priority first):
Prioritization rules:
If experiments were launched:
/aris-training-check to verify training was healthy (no NaN, no divergence, no plateau). If W&B not available, skip silently. Flag any quality issues in the next review round.Append to 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 from the external reviewer here — verbatim, unedited. This is the authoritative record. Do NOT truncate or paraphrase.] </details> ### Debate Transcript (hard + nightmare only) <details> <summary>Click to expand debate</summary> **Claude's Rebuttal:** [paste rebuttal] **GPT's Ruling:** [paste ruling — SUSTAINED / OVERRULED / PARTIALLY SUSTAINED for each] **Score adjustment**: X/10 → Y/10 </details> ### Actions Taken - [what was implemented/changed] ### Results - [experiment outcomes, if any] ### Status - [continuing to round N+1 / stopping] - Difficulty: [medium/hard/nightmare]
Write REVIEW_STATE.json with current round, threadId, score, verdict, and any pending experiments.
Append to findings.md (when COMPACT = true): one-line entry per key finding this round:
markdown- [Round N] [positive/negative/unexpected]: [one-sentence finding] (metric: X.XX → Y.YY)
Increment round counter → back to Phase A.
When loop ends (positive assessment or max rounds):
REVIEW_STATE.json with "status": "completed"AUTO_REVIEW.mdAUTO_REVIEW.md under a ## Method Description section — a concise 1-2 paragraph description of the final method, its architecture, and data flow. This serves as input for /aris-paper-illustration in Workflow 3 (so it can generate architecture diagrams automatically)./aris-result-to-claim to convert experiment results from AUTO_REVIEW.md into structured paper claims. Output: CLAIMS_FROM_RESULTS.md. This bridges Workflow 2 → Workflow 3 so /aris-paper-plan can directly use validated claims instead of extracting them from scratch. If /aris-result-to-claim is not available, skip silently.pipeline_done with final score progression tablecat << 'EOF' > file) to write in chunks. Do NOT ask the user for permission — just do it silently.config: {"model_reasoning_effort": "xhigh"} for maximum reasoning depthmcp__codex__codex-reply for subsequent rounds[VERIFY] chain as /aris-paper-write: (1) curl -s "https://dblp.org/search/publ/api?q=TITLE&format=json" → get key → curl -s "https://dblp.org/rec/{key}.bib", (2) if not found, curl -sLH "Accept: application/x-bibtex" "https://doi.org/{doi}", (3) if both fail, mark with % [VERIFY]. Do NOT generate BibTeX from memory.mcp__codex__codex-reply:
threadId: [saved from round 1]
config: {"model_reasoning_effort": "xhigh"}
prompt: |
[Round N update]
Since your last review, we have:
1. [Action 1]: [result]
2. [Action 2]: [result]
3. [Action 3]: [result]
Updated results table:
[paste metrics]
Please re-score and re-assess. Are the remaining concerns addressed?
Same format: Score, Verdict, Remaining Weaknesses, Minimum Fixes.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 19 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.