Auto-claude-code-research-in-sleep auto-review-loop
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.
git clone https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep
T=$(mktemp -d) && git clone --depth=1 https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/auto-review-loop" ~/.claude/skills/wanshuiyin-auto-claude-code-research-in-sleep-auto-review-loop && rm -rf "$T"
skills/auto-review-loop/SKILL.mdAuto Review Loop: Autonomous Research Improvement
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, or verdict contains "accept", "sufficient", "ready for submission"
- REVIEW_DOC:
(cumulative log) (fall back toreview-stage/AUTO_REVIEW.md
for legacy projects)./AUTO_REVIEW.md - REVIEWER_MODEL =
— Model used via Codex MCP. Must be an OpenAI model (e.g.,gpt-5.4
,gpt-5.4
,o3
)gpt-4o - REVIEWER_BACKEND =
— Default: Codex MCP (xhigh). Override withcodex
for GPT-5.4 Pro via Oracle MCP. See— reviewer: oracle-pro
.shared-references/reviewer-routing.md - OUTPUT_DIR =
— All review-stage outputs go here. Create the directory if it doesn't exist.review-stage/ - HUMAN_CHECKPOINT = false — When
, 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. Whentrue
(default), the loop runs fully autonomously.false - COMPACT = false — When
, (1) readtrue
andEXPERIMENT_LOG.md
instead of parsing full logs on session recovery, (2) append key findings tofindings.md
after each round.findings.md - REVIEWER_DIFFICULTY = medium — Controls how adversarial the reviewer is. Three levels:
(default): Current behavior — MCP-based review, Claude controls what context GPT sees.medium
: Adds Reviewer Memory (GPT tracks its own suspicions across rounds) + Debate Protocol (Claude can rebut, GPT rules).hard
: Everything innightmare
+ GPT reads the repo directly viahard
(Claude cannot filter what GPT sees) + Adversarial Verification (GPT independently checks if code matches claims).codex exec
💡 Override:
/auto-review-loop "topic" — compact: true, human checkpoint: true, difficulty: hard
State Persistence (Compact Recovery)
Long-running loops may hit the context window limit, triggering automatic compaction. To survive this, persist state to
review-stage/REVIEW_STATE.json after each round:
{ "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.
Output Protocols
Follow these shared protocols for all output files:
- Output Versioning Protocol — write timestamped file first, then copy to fixed name
- Output Manifest Protocol — log every output to MANIFEST.md
- Output Language Protocol — respect the project's language setting
Workflow
Initialization
- Check for
(fall back toreview-stage/REVIEW_STATE.json
if not found — legacy path):./REVIEW_STATE.json- If neither path exists: fresh start (normal case, identical to behavior before this feature existed)
- If it exists AND
isstatus
: fresh start (previous loop finished normally)"completed" - If it exists AND
isstatus
AND"in_progress"
is older than 24 hours: fresh start (stale state from a killed/abandoned run — delete the file and start over)timestamp - If it exists AND
isstatus
AND"in_progress"
is within 24 hours: resumetimestamp- Read the state file to recover
,round
,threadId
,last_scorepending_experiments - Read
to restore full context of prior rounds (fall back toreview-stage/AUTO_REVIEW.md
)./AUTO_REVIEW.md - If
is non-empty, check if they have completed (e.g., check screen sessions)pending_experiments - Resume from the next round (round = saved round + 1)
- Log: "Recovered from context compaction. Resuming at Round N."
- Read the state file to recover
- Read project narrative documents, memory files, and any prior review documents. When
and compact files exist: readCOMPACT = true
+findings.md
instead of fullEXPERIMENT_LOG.md
and raw logs — saves context window.review-stage/AUTO_REVIEW.md - Read recent experiment results (check output directories, logs)
- Identify current weaknesses and open TODOs from prior reviews
- Initialize round counter = 1 (unless recovered from state file)
- Create/update
with header and timestampreview-stage/AUTO_REVIEW.md
Loop (repeat up to MAX_ROUNDS)
Phase A: Review
Route 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:
codex 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 review-stage/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.
Phase B: Parse Assessment
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:
- Score (numeric 1-10)
- Verdict ("ready" / "almost" / "not ready")
- Action items (ranked list of fixes)
STOP CONDITION: If score >= 6 AND verdict contains "ready" or "almost" → stop loop, document final state.
Phase B.5: Reviewer Memory Update (hard + nightmare only)
Skip entirely if
.REVIEWER_DIFFICULTY = medium
After parsing the assessment, update
REVIEWER_MEMORY.md in the project root:
# 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:
- Append each round, never delete prior rounds (audit trail)
- If the reviewer's response includes a "Memory update" section, copy it verbatim
- This file is passed back to GPT in the next round's Phase A — it is GPT's persistent brain
Phase B.6: Debate Protocol (hard + nightmare only)
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:
### 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:
- Must be honest — do NOT fabricate evidence or misrepresent results
- Can point out factual errors in the review (reviewer misread code, wrong metric, etc.)
- Can argue a weakness is out of scope or would require unreasonable effort
- Maximum 3 rebuttals per round (pick the most impactful to contest)
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):
codex 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:
- SUSTAINED weaknesses: remove from action items
- OVERRULED: keep as-is
- PARTIALLY SUSTAINED: revise scope
Append the full debate transcript to
review-stage/AUTO_REVIEW.md under the round's entry.
Human Checkpoint (if enabled)
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 state
Wait for the user's response. Parse their input:
- Approval ("go", "continue", "ok", "proceed"): proceed to Phase C with all suggested fixes
- Custom instructions (any other text): treat as additional/replacement guidance for Phase C. Merge with reviewer suggestions where appropriate
- Skip specific fixes ("skip 1,3"): remove those fixes from the action list
- Stop ("stop", "enough", "done"): terminate the loop, jump to Termination
Feishu Notification (if configured)
After parsing the score, check if
~/.claude/feishu.json exists and mode is not "off":
- Send a
notification: "Round N: X/10 — [verdict]" with top 3 weaknessesreview_scored - If interactive mode and verdict is "almost": send as checkpoint, wait for user reply on whether to continue or stop
- If config absent or mode off: skip entirely (no-op)
Phase C: Implement Fixes (if not stopping)
For each action item (highest priority first):
- Code changes: Write/modify experiment scripts, model code, analysis scripts
- Run experiments: Deploy to GPU server via SSH + screen/tmux
- Analysis: Run evaluation, collect results, update figures/tables
- Documentation: Update project notes and review document
Prioritization rules:
- Skip fixes requiring excessive compute (flag for manual follow-up)
- Skip fixes requiring external data/models not available
- Prefer reframing/analysis over new experiments when both address the concern
- Always implement metric additions (cheap, high impact)
Phase D: Wait for Results
If experiments were launched:
- Monitor remote sessions for completion
- Collect results from output files and logs
- Training quality check — if W&B is configured, invoke
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./training-check
Phase E: Document Round
Append to
review-stage/AUTO_REVIEW.md:
## 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
with current round, threadId, score, verdict, and any pending experiments.review-stage/REVIEW_STATE.json
Append to
(when findings.md
COMPACT = true): one-line entry per key finding this round:
- [Round N] [positive/negative/unexpected]: [one-sentence finding] (metric: X.XX → Y.YY)
Increment round counter → back to Phase A.
Termination
When loop ends (positive assessment or max rounds):
- Update
withreview-stage/REVIEW_STATE.json"status": "completed" - Write final summary to
review-stage/AUTO_REVIEW.md - Update project notes with conclusions
- Write method/pipeline description to
under areview-stage/AUTO_REVIEW.md
section — a concise 1-2 paragraph description of the final method, its architecture, and data flow. This serves as input for## Method Description
in Workflow 3 (so it can generate architecture diagrams automatically)./paper-illustration - Generate claims from results — invoke
to convert experiment results from/result-to-claim
into structured paper claims. Output:review-stage/AUTO_REVIEW.md
. This bridges Workflow 2 → Workflow 3 soCLAIMS_FROM_RESULTS.md
can directly use validated claims instead of extracting them from scratch. If/paper-plan
is not available, skip silently./result-to-claim - If stopped at max rounds without positive assessment:
- List remaining blockers
- Estimate effort needed for each
- Suggest whether to continue manually or pivot
- Feishu notification (if configured): Send
with final score progression tablepipeline_done
Key Rules
-
Large file handling: If the Write tool fails due to file size, immediately retry using Bash (
) to write in chunks. Do NOT ask the user for permission — just do it silently.cat << 'EOF' > file -
ALWAYS use
for maximum reasoning depthconfig: {"model_reasoning_effort": "xhigh"} -
Save threadId from first call, use
for subsequent roundsmcp__codex__codex-reply -
Anti-hallucination citations: When adding references during fixes, NEVER fabricate BibTeX. Use the same DBLP → CrossRef →
chain as[VERIFY]
: (1)/paper-write
→ get key →curl -s "https://dblp.org/search/publ/api?q=TITLE&format=json"
, (2) if not found,curl -s "https://dblp.org/rec/{key}.bib"
, (3) if both fail, mark withcurl -sLH "Accept: application/x-bibtex" "https://doi.org/{doi}"
. Do NOT generate BibTeX from memory.% [VERIFY] -
Be honest — include negative results and failed experiments
-
Do NOT hide weaknesses to game a positive score
-
Implement fixes BEFORE re-reviewing (don't just promise to fix)
-
Exhaust before surrendering — before marking any reviewer concern as "cannot address": (1) try at least 2 different solution paths, (2) for experiment issues, adjust hyperparameters or try an alternative baseline, (3) for theory issues, provide a weaker version of the result or an alternative argument, (4) only then concede narrowly and bound the damage. Never give up on the first attempt.
-
If an experiment takes > 30 minutes, launch it and continue with other fixes while waiting
-
Document EVERYTHING — the review log should be self-contained
-
Update project notes after each round, not just at the end
Prompt Template for Round 2+
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.
Review Tracing
After each
mcp__codex__codex or mcp__codex__codex-reply reviewer call, save the trace following shared-references/review-tracing.md. Use tools/save_trace.sh or write files directly to .aris/traces/<skill>/<date>_run<NN>/. Respect the --- trace: parameter (default: full).