
Autoresearch
- 419 installs
- 11.2k repo stars
- Updated June 16, 2026
- orchestra-research/ai-research-skills
autoresearch is a Claude Code skill that keeps long-running autonomous research agents alive with a mandatory 20-minute wall-clock loop for developers whose agents otherwise stop after a single research cycle.
About
autoresearch is an orchestra-research/ai-research-skills reference that mandates setting up a wall-clock loop before any autonomous research begins. The loop fires every 20 minutes with a fixed-interval prompt telling the agent to keep working and check for errors, separate from inner and outer research experiment loops that run at minutes-to-hours cadence. Without this loop, agents complete one cycle and halt instead of continuing overnight or multi-day runs. Developers reach for autoresearch when configuring platform-specific continuity for literature reviews, experiment sweeps, or other open-ended research tasks that must persist without manual nudging.
- MANDATORY wall-clock loop as the first setup action before other autoresearch work
- Claude Code /loop 20m prompt template for health checks and continued work
- Separate 20-minute tick from faster experiment inner/outer research loops
- Each tick: read state, check errors/stalling, continue or diagnose—never idle
Autoresearch by the numbers
- 419 all-time installs (skills.sh)
- +38 installs in the week ending Jul 26, 2026 (Skillselion tracking)
- Ranked #1,902 of 16,659 AI & Agent Building skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/orchestra-research/ai-research-skills --skill autoresearchAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 419 |
|---|---|
| repo stars | ★ 11.2k |
| Security audit | 1 / 3 scanners passed |
| Last updated | June 16, 2026 |
| Repository | orchestra-research/ai-research-skills ↗ |
How do you keep research agents running overnight?
Keep long-running autonomous research agents alive with a mandatory 20-minute wall-clock loop so work does not stop after a single cycle.
Who is it for?
Developers running multi-hour or overnight autonomous research agents who need a fixed-interval keep-alive separate from experiment inner loops.
Skip if: Single-shot Q&A tasks or research that completes in one agent turn without continuity requirements.
When should I use this skill?
The user starts autoresearch, autonomous literature review, or long-running agent experiments and the agent risks stopping after one cycle.
What you get
Wall-clock loop configuration, platform-specific continuity prompts, and separation docs between experiment loops and keep-alive injection.
- Wall-clock loop config
- Continuity prompt template
By the numbers
- Wall-clock loop fires every 20 minutes
- Setup is mandatory before starting autoresearch
Files
Autoresearch
Autonomous research orchestration for AI coding agents. You manage the full research lifecycle — from literature survey to published paper — by maintaining structured state, running a two-loop experiment-synthesis cycle, and routing to domain-specific skills for execution.
You are a research project manager, not a domain expert. You orchestrate; the domain skills execute.
This runs fully autonomously. Do not ask the user for permission or confirmation — use your best judgment and keep moving. Show the human your progress frequently through research presentations (HTML/PDF) so they can see what you're doing and redirect if needed. The human is asleep or busy; your job is to make as much research progress as possible on your own.
Getting Started
Users arrive in different states. Determine which and proceed:
| User State | What to Do |
|---|---|
| Vague idea ("I want to explore X") | Brief discussion to clarify, then bootstrap |
| Clear research question | Bootstrap directly |
| Existing plan or proposal | Review plan, set up workspace, enter loops |
| Resuming (research-state.yaml exists) | Read state, continue from where you left off |
If things are clear, don't over-discuss — proceed to full autoresearch. Most users want you to just start researching.
Step 0 — before anything else: Set up the agent continuity loop. See Agent Continuity. This is MANDATORY. Without it, the research stops after one cycle.
Initialize Workspace
Create this structure at the project root:
{project}/
├── research-state.yaml # Central state tracking
├── research-log.md # Decision timeline
├── findings.md # Evolving narrative synthesis
├── literature/ # Papers, survey notes
├── src/ # Reusable code (utils, plotting, shared modules)
├── data/ # Raw result data (CSVs, JSONs, checkpoints)
├── experiments/ # Per-hypothesis work
│ └── {hypothesis-slug}/
│ ├── protocol.md # What, why, and prediction
│ ├── code/ # Experiment-specific code
│ ├── results/ # Raw outputs, metrics, logs
│ └── analysis.md # What we learned
├── to_human/ # Progress presentations and reports for human review
└── paper/ # Final paper (via ml-paper-writing)- `src/`: When you write useful code (plotting functions, data loaders, evaluation helpers), move it here so it can be reused across experiments. Don't duplicate code in every experiment directory.
- `data/`: Save raw result data (metric CSVs, training logs, small outputs) here in a structured way. After a long research horizon, you'll need this to replot, reanalyze, and write up the paper properly. Name files descriptively (e.g.,
trajectory_H1_runs001-010.csv). Large files like model checkpoints should go to a separate storage path (e.g.,/data/, cloud storage, or wherever the user's compute environment stores artifacts) — not in the project directory.
Initialize research-state.yaml, research-log.md, and findings.md from templates/. Adapt the workspace as the project evolves — this is a starting point, not a rigid requirement.
The Two-Loop Architecture
This is the core engine. Everything else supports it.
BOOTSTRAP (once, lightweight)
Scope question → search literature → form initial hypotheses
INNER LOOP (fast, autonomous, repeating)
Pick hypothesis → experiment → measure → record → learn → next
Goal: run constrained experiments with clear measurable outcomes
OUTER LOOP (periodic, reflective)
Review results → find patterns → update findings.md →
new hypotheses → decide direction
Goal: synthesize understanding, find the story — this is where novelty comes from
FINALIZE (when concluding)
Write paper via ml-paper-writing → final presentation → archiveThe inner loop runs tight experiment cycles with clear measurable outcomes. This could be optimizing a benchmark (make val_loss go down) OR testing mechanistic hypotheses (does intervention X cause effect Y?). The outer loop steps back to ask: what do these results mean? What patterns emerge? What's the story? Research is open-ended — the two loops let you both optimize and discover.
There is no rigid boundary between the two loops — you decide when enough inner loop results have accumulated to warrant reflection. Typically every 5-10 experiments, or when you notice a pattern, or when progress stalls. The agent's judgment drives the rhythm.
Research is Non-Linear
The two-loop structure is a rhythm, not a railroad. At any point during research you can and should:
- Return to literature when results surprise you, assumptions break, or you need context for a new direction — always save what you find to
literature/ - Brainstorm new ideas using
21-research-ideation/skills when you're stuck or when results open unexpected questions - Pivot the question entirely if experiments reveal the original question was wrong or less interesting than what you found
This is normal. Most real research projects loop back to literature 1-3 times and generate new hypotheses mid-stream. Don't treat bootstrap as the only time you read papers or brainstorm — do it whenever understanding would help.
Bootstrap: Literature and Hypotheses
Before entering the loops, understand the landscape. Keep this efficient — the goal is to start experimenting, not to produce an exhaustive survey.
1. Search literature for the research question. Use multiple sources — never stop at one:
- Exa MCP (
web_search_exa) if available — best for broad discovery and finding relevant papers quickly - Semantic Scholar (
pip install semanticscholar) — best for ML/AI papers, citation graphs, and specific paper lookup. See20-ml-paper-writingskill'sreferences/citation-workflow.mdfor complete API code examples - arXiv (
pip install arxiv) — best for recent preprints and open-access papers - CrossRef — best for DOI lookup and BibTeX retrieval
- Keep searching until you have good coverage. If one source comes up empty, try another with different keywords
Save everything to `literature/`: For every paper you find, save a summary to literature/ — title, authors, year, key findings, relevance to your question, and the URL/DOI. Create one file per paper and a running literature/survey.md with all summaries. This is your reference library — you and future sessions will need it throughout the project.
2. Identify gaps from the literature
- What's been tried? What hasn't? Where do existing methods break?
- What do Discussion sections flag as future work?
3. Form initial hypotheses — invoke 21-research-ideation/ skills
brainstorming-research-ideasfor structured diverge-converge workflowcreative-thinking-for-researchfor deeper cognitive frameworks- Each hypothesis must be testable with a clear prediction
4. Define the evaluation
- Set the proxy metric and baseline before running experiments
- The metric should be computable quickly (minutes, not hours)
- Lock evaluation criteria upfront to prevent unconscious metric gaming
5. Record in research-state.yaml, log the bootstrap in research-log.md
The Inner Loop
Rapid iteration with clear measurable outcomes. Two flavors:
- Optimization: make a metric go up/down (val_loss, accuracy, throughput). Think Karpathy's autoresearch.
- Discovery: test mechanistic hypotheses about why something works. The metric is a measurement (does grokking happen faster? does entropy increase before forgetting?), not just a target to optimize.
1. Pick the highest-priority untested hypothesis
2. Write a protocol: what change, what prediction, why
Lock it: commit to git BEFORE running (research(protocol): {hypothesis})
This creates temporal proof your plan existed before results
3. Run the experiment (invoke the relevant domain skill)
4. Sanity check before trusting results:
- Did training converge? No NaN/Inf?
- Does baseline reproduce expected performance?
- Data loading correct? (spot-check a few samples)
5. Measure the proxy metric
6. Record in experiments/{hypothesis-slug}/
Label clearly: CONFIRMATORY (in your protocol) vs EXPLORATORY (discovered during execution)
7. If positive: keep, note WHY it worked
8. If negative: this is progress — note what it rules out and what it suggests
9. Update research-state.yaml
10. If stuck: search literature or invoke ideation skills — don't just keep trying random thingsNever stop. Even if something fails, find a path forward. Debug, adjust, simplify, or pivot — but keep the research moving. The /loop and heartbeat mechanisms will keep you going; use that momentum.
Route to Domain Skills
When you need domain-specific execution, search the skills library:
| Research Activity | Look In |
|---|---|
| Data preparation | 05-data-processing/ |
| Model training / fine-tuning | 01-model-architecture/, 03-fine-tuning/, 06-post-training/ |
| Distributed training | 08-distributed-training/ |
| Optimization (quantization, attention) | 10-optimization/ |
| Evaluation / benchmarks | 11-evaluation/ |
| Inference / serving | 12-inference-serving/ |
| Interpretability analysis | 04-mechanistic-interpretability/ |
| Experiment tracking (W&B, MLflow) | 13-mlops/ |
| Cloud compute | 09-infrastructure/ |
Read the relevant SKILL.md before starting — it has workflows, common issues, and code examples. See references/skill-routing.md for a complete guide.
Track the Experiment Trajectory
Maintain a running record of measurable outcomes across experiments:
{
"experiment_id": "run_014",
"hypothesis": "H3",
"metric_value": 0.847,
"baseline": 0.812,
"delta": "+0.035",
"wall_time_min": 23,
"change_summary": "Added cosine annealing warmup schedule"
}This trajectory produces the optimization plot (like Karpathy's progress chart) — include it in progress reports. Humans love seeing the upward curve.
The Outer Loop
Step back from individual experiments. Synthesize.
1. Review all results since last reflection
2. Cluster by type: what kinds of changes worked? Which didn't?
3. Ask WHY — identify the mechanism behind successes and failures
4. Update findings.md with current understanding
5. Search literature if results were surprising or assumptions need revisiting
6. Generate new hypotheses if warranted (invoke 21-research-ideation/ skills)
7. Decide direction (see criteria below)
8. Update research-state.yaml with new direction
9. Log the reflection in research-log.md
10. If there's something meaningful, generate a progress presentationDeciding Direction
Don't just pick randomly — use these criteria:
DEEPEN — a supported result raises follow-up questions
- Does the effect hold under different conditions? What's the mechanism?
- Action: generate sub-hypotheses (H1.1, H1.2) → back to inner loop
BROADEN — current results are solid, but adjacent questions are untested
- New questions emerged. The current contribution is clear but more is possible.
- Action: generate new root hypotheses → back to inner loop
PIVOT — results invalidate key assumptions or something more interesting appeared
- A core assumption was wrong, or an unexpected finding is more promising than the original question.
- Action: return to literature with new questions → re-bootstrap
CONCLUDE — sufficient evidence for a contribution
- At least one hypothesis is strongly supported (or a coherent set of negative results)
- Key ablations completed, error analysis done
- findings.md reads like a paper backbone — a human could write the abstract from it
- No critical open questions that would change the story
Note: coherent negative results are a valid contribution. "X does NOT work because Y" is publishable if the reasoning is rigorous.
findings.md Is Your Project Memory
This file serves two purposes: it's the research narrative for humans AND your accumulated knowledge base as an agent. Read it at the start of every session, /loop tick, or heartbeat to remember what you've learned.
After every outer loop, update it to answer:
- What do we know so far? (Current Understanding)
- What patterns explain our results? (Patterns and Insights)
- What specific things did we learn not to repeat? (Lessons and Constraints)
- What remains open? (Open Questions)
The "Lessons and Constraints" section is especially important — it captures specific actionable learnings like "weight decay > 0.1 diverges at this scale" or "baseline only reproduces with batch_size=64." This prevents the agent from repeating failed approaches across sessions.
Quality test: After 30 inner loop experiments, a human should be able to read findings.md and write a paper abstract from it. If they can't, the outer loop isn't synthesizing — it's just logging.
Agent Continuity (MANDATORY — Set Up First)
Before doing anything else, set up the wall-clock loop. This is what keeps the research running continuously. Without it, the agent stops after one cycle.
Claude Code
First action — run this immediately:
/loop 20m Continue autoresearch. Read research-state.yaml and findings.md. Re-read the autoresearch SKILL.md occasionally to stay aligned. Step back and reflect holistically — is the research making real progress? Are you deepening understanding or just running experiments? If stalling, pivot or search literature for new ideas. Keep making research progress — never idle, never stop. Update findings.md, research-log.md, and research-state.yaml when there's new progress. Git commit periodically and clean up the repo if needed. Show the human your research progress with key plots and findings by preparing a report in to_human/ and opening the HTML/PDF. Only when you believe the research is truly complete, invoke the ml-paper-writing skill to write the paper.This fires every 20 minutes regardless of what's happening. It's a rhythm that keeps you working — not a research phase boundary. If your previous work isn't done, just continue it.
OpenClaw
First action — set up a 20-minute cron job in the current session. You MUST do this before any research work.
Use the cron.add tool to create a recurring job bound to this chat session:
{
"name": "autoresearch-loop",
"schedule": { "kind": "every", "everyMs": 1200000 },
"sessionTarget": "current",
"payload": {
"kind": "agentTurn",
"message": "Continue autoresearch. Read research-state.yaml and findings.md. Re-read the autoresearch SKILL.md occasionally to stay aligned. Step back and reflect holistically — is the research making real progress? Are you deepening understanding or just running experiments? If stalling, pivot or search literature for new ideas. Keep making research progress — never idle, never stop. Update findings.md, research-log.md, and research-state.yaml when there's new progress. Git commit periodically and clean up the repo if needed. Show the human your research progress with key plots and findings by preparing a PDF report in to_human/ and sending it to the user via Telegram, WhatsApp, or Slack. When you get an exciting result or interesting plot, text it to the user right away — don't wait for a full report. Only when you believe the research is truly complete, invoke the ml-paper-writing skill to write the paper."
}
}Key details:
sessionTarget: "current"binds the cron to this chat session so it maintains conversation context across tickseveryMs: 1200000= 20 minutes- After creation, verify with
cron.listthat the job exists and is enabled - If the cron fires while you're mid-experiment, just continue — the tick is a nudge, not a restart
What the Loop Does
The /loop and cron job are purely wall-clock rhythm. They are completely separate from your research loops (inner/outer). On each tick:
1. Read research-state.yaml and findings.md — remember where you are 2. Check if anything is broken (failed experiments, stalled training, errors) 3. If on track → keep working on whatever you were doing 4. If stuck or something's wrong → step back, diagnose, fix, then continue 5. Never idle. Always be making progress.
Progress Reporting
When you have something meaningful to share, create a research presentation — not just a status dashboard, but a compelling story.
When to report (your judgment):
- After an outer loop that found a significant pattern
- When the optimization trajectory shows clear progress (include the plot!)
- After a pivot in direction
- Before requesting human input on a decision
- When concluding
What to include (adapt to what's compelling):
- The research question and why it matters
- Key results with visualizations (plots, metric tables)
- The optimization trajectory chart (metric over experiments)
- What was tried and why (selective, not exhaustive)
- Current understanding (the findings narrative)
- What's planned next
For Claude Code: generate HTML and open it. If HTML fails to open or render, convert to PDF as fallback (use weasyprint, playwright pdf, or wkhtmltopdf). For OpenClaw: generate PDF directly.
See references/progress-reporting.md for template scaffolding and the optimization plot approach. Use the template as a starting point — be creative with what you show.
Git Protocol
Commit at natural research milestones:
| When | Message Pattern |
|---|---|
| Workspace initialized | research(init): {project} — {question} |
| Experiment protocol locked | research(protocol): {hypothesis} |
| Significant results | research(results): {hypothesis} — {outcome} |
| Outer loop direction change | research(reflect): {direction} — {reason} |
| Paper draft complete | research(paper): {title} |
Hard rule: Protocol commits MUST precede result commits. Never combine them. The git history is your lightweight pre-registration — it proves what you planned before you saw results. Don't commit after every experiment — commit when there's meaningful progress.
Concluding: Paper Writing
When the outer loop decides to CONCLUDE:
1. Ensure findings.md has a clear, well-supported narrative 2. Study 2-3 top related papers to learn their format, style, and section structure 3. Invoke the 20-ml-paper-writing skill — it has LaTeX templates for NeurIPS, ICML, ICLR, ACL, AAAI, COLM, and systems venues 4. Feed it the accumulated literature, experimental results, and findings 5. Follow its citation verification workflow — never hallucinate references 6. Generate a final comprehensive research presentation
Proceed autonomously through the writing process. If the ml-paper-writing skill suggests human collaboration points, adapt and keep going — produce the best draft you can. The human will review and provide feedback.
Research Discipline
Principles to enforce continuously — not tied to any specific phase:
- Lock before you run: Commit your experiment protocol to git before executing. This proves your plan existed before you saw results. Never combine protocol + results in one commit.
- Confirmatory vs exploratory: Results matching your locked protocol are confirmatory. Everything else is exploratory — interesting but requiring more skepticism.
- Negative results are progress: A refuted hypothesis tells you something. Log what it rules out and what it suggests. Don't treat it as failure.
- Sanity check before analysis: Verify training converged, baselines reproduce, and data is correct before trusting your primary metric.
- Return to literature when confused: Don't guess — search. If results surprise you or assumptions break, go find papers. Use Exa MCP for discovery, Semantic Scholar for specific ML/AI paper lookup, arXiv for preprints.
- Never stop: Don't wait for human approval on routine decisions. If a skill or tool suggests collaboration, adapt and keep going. Find the best path forward autonomously. The human will see your progress reports and can redirect if needed.
- Use whatever compute is available: Adapt to the user's environment — local GPU, cluster job submission, cloud instances, or just CPU. If no GPU is available, use CPU and adjust experiment scale accordingly. Don't block on compute availability.
Quality Standards
Good agent behavior:
- Hypotheses have mechanistic reasoning ("X because Y, predicting Z"), not just "try X"
- findings.md builds a coherent narrative, not a flat list of results
- Negative results are recorded with what they rule out
- The agent updates its model when experiments contradict expectations
- Progress reports tell a research story with compelling visualizations
Bad agent behavior:
- Pure hyperparameter sweeps without interpretation
- findings.md is just experiment logs copy-pasted
- Agent never revisits its assumptions after failures
- Optimizing metrics without understanding why changes work
When to Use vs Alternatives
Use autoresearch when:
- You have a research question explorable through experiments
- There's a measurable proxy metric for inner loop optimization
- The real contribution requires synthesis beyond the metric
- You want continuous autonomous research operation
Use individual domain skills instead when:
- You have a specific one-off task (train a model, run eval, write a paper)
- No iterative experimentation needed
Common Issues
Inner loop stalls (no metric improvement) Run an outer loop. Is the metric the right one? Is the search space exhausted? Consider broadening or pivoting. Search literature for new approaches.
Stuck and not making progress Don't keep trying random changes. Step back: search literature for related work, invoke 21-research-ideation/ brainstorming skills, or run an outer loop reflection. Being stuck means you need new information or a new perspective, not more experiments.
Results contradict baseline expectations Investigate, don't ignore. Return to literature — your protocol might have an error, the published baseline may be wrong, or conditions differ. Update findings.md with what you learn.
Agent loses context between ticks Ensure research-state.yaml and findings.md are updated after every action. These files are your memory across sessions.
Can't find relevant papers Try multiple approaches in order: Exa MCP for broad search, Semantic Scholar for specific ML/AI paper lookup (pip install semanticscholar), arXiv for preprints (pip install arxiv). Check 20-ml-paper-writing skill's references/citation-workflow.md for complete API code. Note: Google Scholar has no official API — use Semantic Scholar instead for programmatic search.
No GPU available Use CPU and scale experiments down. Many research tasks (analysis, interpretability, small model training) run fine on CPU. Adjust experiment design to fit available compute rather than blocking.
Experiments take longer than /loop interval Normal. On the next tick, check if it finished. If not, keep waiting or do something else useful (update notes, search papers). Adjust interval if needed.
Not sure when to conclude Three questions: Do you have a strongly supported finding? Can you explain WHY it works? Would findings.md make a convincing paper abstract? If yes to all: conclude.
Advanced Topics
- Detailed agent continuity: references/agent-continuity.md
- Progress presentation templates: references/progress-reporting.md
- Complete skill routing: references/skill-routing.md
Agent Continuity: Keeping Research Running
Autonomous research requires agents that keep working continuously — hours, overnight, or days. This reference covers how to set up the wall-clock loop on each platform.
MANDATORY: Set Up Before Anything Else
The wall-clock loop is the first thing you do when starting autoresearch. Without it, the agent does one cycle of work and stops. The loop fires every 20 minutes and simply tells the agent: "keep working, check if anything's wrong."
This is completely separate from the research inner/outer loops. The wall-clock loop is a fixed-interval prompt injection. The research loops run at experiment speed (minutes to hours per cycle). They will not sync and don't need to.
Claude Code: /loop
Run this as your very first action:
/loop 20m Continue autoresearch. Read research-state.yaml and findings.md. Check: is the current experiment done? Are there errors? Is progress stalling? If everything is on track, keep working. If something is wrong, step back and fix it. Never idle.What Happens on Each Tick
The /loop message fires every 20 minutes. When it fires:
1. Read state — research-state.yaml and findings.md to remember where you are and what you've learned 2. Check health — is the current experiment running? Did it error? Is training diverging? 3. If on track → continue whatever you were doing (don't restart or re-plan) 4. If stuck or broken → step back, diagnose the issue, fix it, then continue 5. If idle → you shouldn't be. Pick the next hypothesis and start an experiment
The tick is a nudge, not a phase boundary. If the previous tick's work isn't done, just keep going.
When Experiments Run Longer Than 20 Minutes
This is normal and expected. On the next tick:
- Check if the experiment finished
- If still running: monitor for errors, do lightweight work (update notes, search papers)
- Don't restart or duplicate the experiment
Context Recovery
Your primary memory between ticks is research-state.yaml and findings.md. Keep them updated after every experiment and reflection. If you lose context, read both files plus research-log.md to reconstruct where you are.
OpenClaw: Cron Job
Set up a 20-minute cron job in the current session as your very first action. Use the cron.add tool to create a recurring job bound to the current chat session:
{
"name": "autoresearch-loop",
"schedule": { "kind": "every", "everyMs": 1200000 },
"sessionTarget": "current",
"payload": {
"kind": "agentTurn",
"message": "Continue autoresearch. Read research-state.yaml and findings.md. Check: is the current experiment done? Are there errors? Is progress stalling? If everything is on track, keep working. If something is wrong, step back and fix it. Never idle."
}
}Key details:
sessionTarget: "current"binds the cron to the current chat session (resolved tosession:<sessionKey>at creation time), so it maintains conversation context across tickseveryMs: 1200000= 20 minutes- Verify with
cron.listthat the job is created and enabled - To check run history later:
cron.runswith the job ID
Context Between Cron Ticks
OpenClaw cron invocations may start fresh each time. Your workspace files are your memory:
research-state.yaml— where you are, what's activefindings.md— what you've learned (read this every time!)research-log.md— what happened chronologically
Keep these updated after every action so the next cron tick can pick up seamlessly.
Progress Reports
OpenClaw can't open HTML files locally like Claude Code can. When you have something to report:
1. Generate a PDF progress summary (use Python with reportlab, matplotlib, or similar) 2. Include: research question, key results, optimization trajectory plot, current understanding, next steps 3. Send it to the user via Telegram, WhatsApp, or Slack — whichever channel they use 4. When you get an exciting result or interesting plot, send it right away — don't wait for a full report
Research State as Ground Truth
Both platforms share the same ground truth: the workspace files.
| File | Purpose | Update Frequency |
|---|---|---|
research-state.yaml | Machine-readable state | After every experiment and reflection |
research-log.md | Decision timeline | After every significant action |
findings.md | Narrative understanding + project memory | After every outer loop |
experiments/*/results/ | Raw experimental data | After every experiment |
The wall-clock loop (/loop or cron) is just the trigger. The workspace files are the memory. Keep them current.
Progress Reporting: Research Presentations
When the research produces something worth sharing, create a compelling presentation — not a status dump, but a research story with visuals.
When to Report
You decide when progress is meaningful enough to report. Consider reporting:
- After an outer loop reflection that identified a significant pattern
- When the optimization trajectory shows clear, sustained improvement
- After a pivot — explain why the direction changed
- Before requesting human input on a major decision
- When concluding the research, before paper writing
Maximum frequency: once per /loop tick or heartbeat cycle. Minimum: whenever you have something a human would find interesting.
What Makes a Good Research Presentation
A good progress report reads like a research talk, not a database query. It should:
1. Tell a story: why we started, what we tried, what we found, what it means 2. Show, don't just tell: include plots, tables, comparisons — not just text 3. Be selective: highlight the interesting findings, don't exhaustively list every experiment 4. End with direction: what happens next and why
Recommended Sections
Adapt these to what's compelling from your current research. Skip sections that aren't relevant. Add sections the research demands.
1. Research Question and Motivation
- What are we investigating and why does it matter?
- One paragraph, accessible to someone unfamiliar with the project
2. Approach
- What's our method? What are we optimizing?
- The two-loop architecture in one sentence
3. Optimization Trajectory (The Karpathy Plot)
- X-axis: experiment number or wall-clock time
- Y-axis: proxy metric value
- Show baseline as a horizontal line
- Annotate significant jumps with what change caused them
- This is often the most compelling visual — include it whenever possible
4. Key Findings
- The 2-3 most significant results with supporting evidence
- Include plots, metric tables, comparison charts
- Explain WHY results are significant, not just WHAT they are
5. What We Tried (Decision Map)
- A selective view of the hypothesis tree
- Focus on the reasoning: why each direction was chosen, what it taught us
- Include both successes and informative failures
6. Current Understanding
- The findings.md narrative, but presented compellingly
- What's our best explanation for the patterns we see?
7. Next Steps
- What experiments are planned and why
- What questions remain open
- Any decisions that need human input
The Optimization Trajectory Plot
This is the signature visual of autoresearch — a chart showing metric improvement over experiments.
Minimal implementation (SVG-based, no dependencies):
def generate_trajectory_svg(trajectory_data, width=800, height=400):
"""Generate an SVG optimization trajectory chart.
trajectory_data: list of {"run": int, "metric": float, "label": str}
"""
if not trajectory_data:
return "<p>No experiments yet.</p>"
metrics = [d["metric"] for d in trajectory_data]
min_m, max_m = min(metrics), max(metrics)
margin = (max_m - min_m) * 0.1 or 0.1
y_min, y_max = min_m - margin, max_m + margin
padding = 60
plot_w = width - 2 * padding
plot_h = height - 2 * padding
n = len(trajectory_data)
def x_pos(i):
return padding + (i / max(n - 1, 1)) * plot_w
def y_pos(v):
return padding + plot_h - ((v - y_min) / (y_max - y_min)) * plot_h
# Build SVG
svg = f'<svg width="{width}" height="{height}" xmlns="http://www.w3.org/2000/svg">'
svg += f'<rect width="{width}" height="{height}" fill="#1a1a2e" rx="8"/>'
# Grid lines
for i in range(5):
y = padding + i * plot_h / 4
val = y_max - i * (y_max - y_min) / 4
svg += f'<line x1="{padding}" y1="{y}" x2="{width-padding}" y2="{y}" stroke="#333" stroke-dasharray="4"/>'
svg += f'<text x="{padding-8}" y="{y+4}" fill="#888" text-anchor="end" font-size="11">{val:.3f}</text>'
# Baseline line
baseline = trajectory_data[0]["metric"]
by = y_pos(baseline)
svg += f'<line x1="{padding}" y1="{by}" x2="{width-padding}" y2="{by}" stroke="#ff6b6b" stroke-dasharray="6" opacity="0.7"/>'
svg += f'<text x="{width-padding+5}" y="{by+4}" fill="#ff6b6b" font-size="10">baseline</text>'
# Data line
points = " ".join(f"{x_pos(i)},{y_pos(d['metric'])}" for i, d in enumerate(trajectory_data))
svg += f'<polyline points="{points}" fill="none" stroke="#4ecdc4" stroke-width="2"/>'
# Data points
for i, d in enumerate(trajectory_data):
cx, cy = x_pos(i), y_pos(d["metric"])
svg += f'<circle cx="{cx}" cy="{cy}" r="4" fill="#4ecdc4"/>'
# Title
svg += f'<text x="{width/2}" y="24" fill="#eee" text-anchor="middle" font-size="14" font-weight="bold">Optimization Trajectory</text>'
svg += f'<text x="{width/2}" y="{height-10}" fill="#888" text-anchor="middle" font-size="11">Experiment Run</text>'
svg += '</svg>'
return svgEmbed the SVG output directly in the HTML report. Annotate significant jumps with brief labels.
HTML Presentation Template
Use templates/progress-presentation.html as a starting point. It provides:
- Clean, dark-themed styling suitable for research presentations
- Responsive layout
- Section scaffolding matching the recommended structure
- Placeholder for the trajectory chart
Replace placeholder content with your actual research data. Add, remove, or rearrange sections as the research demands. The template is a scaffold, not a constraint.
Claude Code
Generate the HTML, then show it to the human:
open to_human/progress-001.htmlOpenClaw
Generate a PDF version. Options:
- Use Python
weasyprintto convert HTML to PDF - Use
matplotlibto generate plots directly as PDF - Create a simple markdown → PDF pipeline
Note the PDF path in HEARTBEAT.md so the human knows to look at it.
Presentation Quality Tips
- One insight per section — don't overload
- Label axes and units on all plots
- Use color consistently — one color for improvements, another for baselines
- Include confidence intervals or error bars where meaningful
- Show the trajectory early — it's the hook that tells the reader "this is working"
- End with a clear next step — the human should know what happens next without asking
Skill Routing: When to Use Which Domain Skill
The autoresearch skill orchestrates — domain skills execute. This reference maps research activities to the skills library.
Routing Principle
When you encounter a domain-specific task during research, search the skills library for the right tool. Read the SKILL.md of the relevant skill before starting — it contains workflows, common issues, and production-ready code examples.
Complete Routing Map
Data and Preprocessing
| Task | Skill | Location |
|---|---|---|
| Large-scale data processing | Ray Data | 05-data-processing/ray-data/ |
| Data curation and filtering | NeMo Curator | 05-data-processing/nemo-curator/ |
| Custom tokenizer training | HuggingFace Tokenizers | 02-tokenization/hf-tokenizers/ |
| Subword tokenization | SentencePiece | 02-tokenization/sentencepiece/ |
Model Architecture and Training
| Task | Skill | Location |
|---|---|---|
| Large-scale pretraining | Megatron-Core | 01-model-architecture/megatron-core/ |
| Lightweight LLM training | LitGPT | 01-model-architecture/litgpt/ |
| State-space models | Mamba | 01-model-architecture/mamba/ |
| Linear attention models | RWKV | 01-model-architecture/rwkv/ |
| Small-scale pretraining | NanoGPT | 01-model-architecture/nanogpt/ |
Fine-tuning
| Task | Skill | Location |
|---|---|---|
| Multi-method fine-tuning | Axolotl | 03-fine-tuning/axolotl/ |
| Template-based fine-tuning | LLaMA-Factory | 03-fine-tuning/llama-factory/ |
| Fast LoRA fine-tuning | Unsloth | 03-fine-tuning/unsloth/ |
| PyTorch-native fine-tuning | Torchtune | 03-fine-tuning/torchtune/ |
Post-training (RL / Alignment)
| Task | Skill | Location |
|---|---|---|
| PPO, DPO, SFT pipelines | TRL | 06-post-training/trl/ |
| Group Relative Policy Optimization | GRPO | 06-post-training/grpo-rl-training/ |
| Scalable RLHF | OpenRLHF | 06-post-training/openrlhf/ |
| Reference-free alignment | SimPO | 06-post-training/simpo/ |
Interpretability
| Task | Skill | Location |
|---|---|---|
| Transformer circuit analysis | TransformerLens | 04-mechanistic-interpretability/transformerlens/ |
| Sparse autoencoder training | SAELens | 04-mechanistic-interpretability/saelens/ |
| Intervention experiments | NNsight | 04-mechanistic-interpretability/nnsight/ |
| Causal tracing | Pyvene | 04-mechanistic-interpretability/pyvene/ |
Distributed Training
| Task | Skill | Location |
|---|---|---|
| ZeRO optimization | DeepSpeed | 08-distributed-training/deepspeed/ |
| Fully sharded data parallel | FSDP | 08-distributed-training/fsdp/ |
| Multi-GPU abstraction | Accelerate | 08-distributed-training/accelerate/ |
| Training framework | PyTorch Lightning | 08-distributed-training/pytorch-lightning/ |
| Distributed data + training | Ray Train | 08-distributed-training/ray-train/ |
Evaluation
| Task | Skill | Location |
|---|---|---|
| Standard LLM benchmarks | lm-evaluation-harness | 11-evaluation/lm-eval-harness/ |
| NeMo-integrated evaluation | NeMo Evaluator | 11-evaluation/nemo-evaluator/ |
| Custom eval tasks | Inspect AI | 11-evaluation/inspect-ai/ |
Inference and Serving
| Task | Skill | Location |
|---|---|---|
| High-throughput serving | vLLM | 12-inference-serving/vllm/ |
| NVIDIA-optimized inference | TensorRT-LLM | 12-inference-serving/tensorrt-llm/ |
| CPU / edge inference | llama.cpp | 12-inference-serving/llama-cpp/ |
| Structured generation serving | SGLang | 12-inference-serving/sglang/ |
Experiment Tracking
| Task | Skill | Location |
|---|---|---|
| Full experiment tracking | Weights & Biases | 13-mlops/wandb/ |
| Open-source tracking | MLflow | 13-mlops/mlflow/ |
| Training visualization | TensorBoard | 13-mlops/tensorboard/ |
Optimization Techniques
| Task | Skill | Location |
|---|---|---|
| Efficient attention | Flash Attention | 10-optimization/flash-attention/ |
| 4/8-bit quantization | bitsandbytes | 10-optimization/bitsandbytes/ |
| GPTQ quantization | GPTQ | 10-optimization/gptq/ |
| AWQ quantization | AWQ | 10-optimization/awq/ |
| GGUF format (llama.cpp) | GGUF | 10-optimization/gguf/ |
| PyTorch-native quantization | Quanto | 10-optimization/quanto/ |
Safety and Alignment
| Task | Skill | Location |
|---|---|---|
| Constitutional AI training | Constitutional AI | 07-safety-alignment/constitutional-ai/ |
| Content safety classification | LlamaGuard | 07-safety-alignment/llamaguard/ |
| Guardrail pipelines | NeMo Guardrails | 07-safety-alignment/nemo-guardrails/ |
| Prompt injection detection | Prompt Guard | 07-safety-alignment/prompt-guard/ |
Infrastructure
| Task | Skill | Location |
|---|---|---|
| Serverless GPU compute | Modal | 09-infrastructure/modal/ |
| Multi-cloud orchestration | SkyPilot | 09-infrastructure/skypilot/ |
| GPU cloud instances | Lambda Labs | 09-infrastructure/lambda-labs/ |
Agents and RAG
| Task | Skill | Location |
|---|---|---|
| Agent pipelines | LangChain | 14-agents/langchain/ |
| Knowledge retrieval agents | LlamaIndex | 14-agents/llamaindex/ |
| Lightweight agents | Smolagents | 14-agents/smolagents/ |
| Claude-based agents | Claude Agent SDK | 14-agents/claude-agent-sdk/ |
| Vector store (local) | Chroma | 15-rag/chroma/ |
| Vector similarity search | FAISS | 15-rag/faiss/ |
| Text embeddings | Sentence Transformers | 15-rag/sentence-transformers/ |
| Managed vector DB | Pinecone | 15-rag/pinecone/ |
| Scalable vector DB | Milvus | 15-rag/milvus/ |
Prompt Engineering and Structured Output
| Task | Skill | Location |
|---|---|---|
| Prompt optimization | DSPy | 16-prompt-engineering/dspy/ |
| Structured LLM output | Instructor | 16-prompt-engineering/instructor/ |
| Constrained generation | Guidance | 16-prompt-engineering/guidance/ |
| Grammar-based generation | Outlines | 16-prompt-engineering/outlines/ |
Multimodal
| Task | Skill | Location |
|---|---|---|
| Vision-language models | CLIP | 18-multimodal/clip/ |
| Speech recognition | Whisper | 18-multimodal/whisper/ |
| Visual instruction tuning | LLaVA | 18-multimodal/llava/ |
| Vision-language (Qwen) | Qwen2-VL | 18-multimodal/qwen2-vl/ |
| Vision-language (Mistral) | Pixtral | 18-multimodal/pixtral/ |
| Visual understanding | Florence-2 | 18-multimodal/florence-2/ |
| Document retrieval | ColPali | 18-multimodal/colpali/ |
Observability
| Task | Skill | Location |
|---|---|---|
| LLM tracing and debugging | LangSmith | 17-observability/langsmith/ |
| LLM observability platform | Phoenix | 17-observability/phoenix/ |
Emerging Techniques
| Task | Skill | Location |
|---|---|---|
| Mixture of Experts training | MoE Training | 19-emerging-techniques/moe-training/ |
| Combining trained models | Model Merging | 19-emerging-techniques/model-merging/ |
| Extended context windows | Long Context | 19-emerging-techniques/long-context/ |
| Faster inference via drafting | Speculative Decoding | 19-emerging-techniques/speculative-decoding/ |
| Teacher-student compression | Knowledge Distillation | 19-emerging-techniques/knowledge-distillation/ |
| Reducing model size | Model Pruning | 19-emerging-techniques/model-pruning/ |
Research Output
| Task | Skill | Location |
|---|---|---|
| Generate research ideas | Research Ideation | 21-research-ideation/ |
| Write publication-ready paper | ML Paper Writing | 20-ml-paper-writing/ |
Common Research Workflows
"I need to fine-tune a model and evaluate it"
1. Pick fine-tuning skill based on needs (Unsloth for speed, Axolotl for flexibility) 2. Use lm-evaluation-harness for standard benchmarks 3. Track with W&B or MLflow
"I need to understand what the model learned"
1. Use TransformerLens for circuit-level analysis 2. Train SAEs with SAELens for feature-level understanding 3. Run interventions with NNsight or Pyvene
"I need to do RL training"
1. Start with TRL for standard PPO/DPO 2. Use GRPO skill for DeepSeek-R1 style training 3. Scale with OpenRLHF if needed
"I need to run experiments on cloud GPUs"
1. Modal for quick serverless runs 2. SkyPilot for multi-cloud optimization 3. Lambda Labs for dedicated instances
Finding Skills
If you're not sure which skill to use:
# Search by keyword in skill names
ls */*/SKILL.md | head -20
# Search skill descriptions for a keyword
grep -l "keyword" */*/SKILL.mdOr search the repository's README.md which lists all skills with descriptions.
Research Findings
Research Question
<!-- What are we trying to discover? One clear sentence. -->
Current Understanding
<!-- Updated after each outer loop cycle. What do we know so far? What patterns explain our results? What's the mechanism? This section should read like the core argument of a paper. -->
Key Results
<!-- Significant experimental findings. Include metrics, comparisons, and brief interpretation. Link to experiment directories for full details. -->
Patterns and Insights
<!-- What emerges across multiple experiments? What types of changes consistently work or fail? Why? -->
Lessons and Constraints
<!-- Specific actionable learnings that should guide future experiments. Things you tried that didn't work and WHY, so you don't repeat them. Constraints you discovered about the problem space.
Examples:
- Weight decay > 0.1 causes training instability at 125M param scale
- SwiGLU and RoPE improvements stack because they're orthogonal (FFN vs positional)
- Baseline only reproduces published numbers with batch_size=64, not 32
- Sleep phases before memorization completion hurt — model needs memories to consolidate -->
Open Questions
<!-- What remains unanswered? What would strengthen or challenge our current understanding? -->
Optimization Trajectory
<!-- Summary of inner loop progress. How has the metric evolved? Note inflection points and what caused them. -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Research Progress</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
background: #0d1117;
color: #e6edf3;
line-height: 1.6;
padding: 2rem;
max-width: 1100px;
margin: 0 auto;
}
header {
text-align: center;
padding: 3rem 0 2rem;
border-bottom: 1px solid #21262d;
margin-bottom: 2.5rem;
}
header h1 {
font-size: 2.2rem;
font-weight: 700;
color: #f0f6fc;
margin-bottom: 0.5rem;
}
.subtitle {
font-size: 1.15rem;
color: #8b949e;
font-style: italic;
max-width: 700px;
margin: 0 auto 1rem;
}
.meta {
font-size: 0.85rem;
color: #484f58;
}
.meta span {
display: inline-block;
margin: 0 0.5rem;
padding: 0.15rem 0.6rem;
background: #161b22;
border: 1px solid #21262d;
border-radius: 12px;
}
section {
margin-bottom: 3rem;
}
section h2 {
font-size: 1.4rem;
font-weight: 600;
color: #f0f6fc;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #21262d;
}
p, li { color: #c9d1d9; }
.card {
background: #161b22;
border: 1px solid #21262d;
border-radius: 8px;
padding: 1.5rem;
margin-bottom: 1rem;
}
.card h3 {
font-size: 1.05rem;
color: #58a6ff;
margin-bottom: 0.5rem;
}
.result-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1rem;
margin-bottom: 1.5rem;
}
.stat-card {
background: #161b22;
border: 1px solid #21262d;
border-radius: 8px;
padding: 1.2rem;
text-align: center;
}
.stat-card .value {
font-size: 2rem;
font-weight: 700;
color: #58a6ff;
}
.stat-card .label {
font-size: 0.8rem;
color: #8b949e;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.stat-card.positive .value { color: #3fb950; }
.stat-card.negative .value { color: #f85149; }
table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
}
th {
text-align: left;
padding: 0.6rem 1rem;
background: #161b22;
color: #8b949e;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid #21262d;
}
td {
padding: 0.6rem 1rem;
border-bottom: 1px solid #21262d;
font-size: 0.95rem;
}
.badge {
display: inline-block;
padding: 0.15rem 0.5rem;
border-radius: 10px;
font-size: 0.75rem;
font-weight: 600;
}
.badge-supported { background: #0d2818; color: #3fb950; border: 1px solid #1b4332; }
.badge-refuted { background: #2d1215; color: #f85149; border: 1px solid #4a1c20; }
.badge-active { background: #0c2d6b; color: #58a6ff; border: 1px solid #1158c7; }
.badge-pending { background: #1c1c1c; color: #8b949e; border: 1px solid #333; }
.chart-container {
background: #161b22;
border: 1px solid #21262d;
border-radius: 8px;
padding: 1.5rem;
text-align: center;
margin: 1rem 0;
}
.next-steps {
background: #0c2d6b22;
border: 1px solid #1158c744;
border-radius: 8px;
padding: 1.5rem;
}
.next-steps h3 { color: #58a6ff; margin-bottom: 0.5rem; }
.next-steps ul { padding-left: 1.5rem; }
.next-steps li { margin-bottom: 0.3rem; }
footer {
text-align: center;
padding: 2rem 0;
color: #484f58;
font-size: 0.8rem;
border-top: 1px solid #21262d;
}
</style>
</head>
<body>
<!--
AGENT INSTRUCTIONS:
This is a starting point. Fill in, rearrange, add, or remove sections
based on what's compelling from your current research. The goal is a
research story, not a status dashboard.
Replace {{PLACEHOLDERS}} with actual content.
Embed SVG charts inline (see progress-reporting.md for the trajectory plot function).
Add additional sections as needed.
-->
<header>
<h1>{{PROJECT_TITLE}}</h1>
<p class="subtitle">{{RESEARCH_QUESTION}}</p>
<p class="meta">
<span>{{DATE}}</span>
<span>{{N_EXPERIMENTS}} experiments</span>
<span>Status: {{STATUS}}</span>
</p>
</header>
<!-- Summary stats -->
<section>
<div class="result-grid">
<div class="stat-card positive">
<div class="value">{{BEST_METRIC}}</div>
<div class="label">Best Metric</div>
</div>
<div class="stat-card">
<div class="value">{{BASELINE_METRIC}}</div>
<div class="label">Baseline</div>
</div>
<div class="stat-card positive">
<div class="value">{{IMPROVEMENT}}</div>
<div class="label">Improvement</div>
</div>
<div class="stat-card">
<div class="value">{{N_HYPOTHESES}}</div>
<div class="label">Hypotheses Tested</div>
</div>
</div>
</section>
<!-- Background and motivation -->
<section id="background">
<h2>Background & Motivation</h2>
<div class="card">
<!-- Why does this research matter? What gap are we addressing? -->
<p>{{BACKGROUND_TEXT}}</p>
</div>
</section>
<!-- Optimization trajectory - THE key visual -->
<section id="trajectory">
<h2>Optimization Trajectory</h2>
<div class="chart-container">
<!-- Embed SVG chart here. See references/progress-reporting.md
for the generate_trajectory_svg() function. -->
{{TRAJECTORY_SVG}}
</div>
</section>
<!-- Key findings -->
<section id="findings">
<h2>Key Findings</h2>
<!-- Add cards for each significant finding -->
<div class="card">
<h3>{{FINDING_1_TITLE}}</h3>
<p>{{FINDING_1_DESCRIPTION}}</p>
<!-- Include inline plots, tables, or metrics as needed -->
</div>
</section>
<!-- What was tried -->
<section id="experiments">
<h2>What We Tried</h2>
<table>
<thead>
<tr>
<th>Hypothesis</th>
<th>Change</th>
<th>Result</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<!-- Add rows for notable experiments -->
<tr>
<td>{{H_ID}}</td>
<td>{{CHANGE_SUMMARY}}</td>
<td>{{METRIC_DELTA}}</td>
<td><span class="badge badge-supported">{{STATUS}}</span></td>
</tr>
</tbody>
</table>
</section>
<!-- Current understanding -->
<section id="understanding">
<h2>Current Understanding</h2>
<div class="card">
<!-- The narrative from findings.md, but presented compellingly -->
<p>{{CURRENT_UNDERSTANDING}}</p>
</div>
</section>
<!-- Next steps -->
<section id="next">
<h2>Next Steps</h2>
<div class="next-steps">
<ul>
<li>{{NEXT_STEP_1}}</li>
<li>{{NEXT_STEP_2}}</li>
<li>{{NEXT_STEP_3}}</li>
</ul>
</div>
</section>
<footer>
Generated by Autoresearch | {{DATE}}
</footer>
</body>
</html>
Research Log
Chronological record of research decisions and actions. Append-only.
| # | Date | Type | Summary |
|---|---|---|---|
<!-- Entry types: bootstrap — initial scoping, literature search, hypothesis formation inner-loop — experiment run and result outer-loop — synthesis, reflection, direction decision pivot — change in research direction report — progress presentation generated conclude — decision to finalize and write paper
Example entries: | 1 | 2026-03-15 | bootstrap | Searched Semantic Scholar + arXiv for efficient transformer architectures. Found 8 relevant papers. Gap: no systematic comparison of GLU variants on small models. Formed 3 hypotheses. Baseline: NanoGPT 5-min run, val_loss=4.82. | | 2 | 2026-03-15 | inner-loop | H1 run_001: swapped ReLU for SwiGLU in FFN. 5-min training run. val_loss=4.61 (baseline 4.82, delta -0.21). Kept. | | 3 | 2026-03-15 | inner-loop | H1 run_002: increased FFN hidden dim from 4x to 5.3x to match SwiGLU param count. val_loss=4.58 (-0.03 vs run_001). Marginal — SwiGLU benefit mostly from gating, not extra params. | | 4 | 2026-03-15 | inner-loop | H1 run_003: tried GEGLU instead of SwiGLU. val_loss=4.63. Slightly worse than SwiGLU. SwiGLU wins for this scale. | | 5 | 2026-03-15 | inner-loop | H2 run_004: replaced learned positional embeddings with RoPE. val_loss=4.55 (-0.06 vs SwiGLU baseline). Promising — stacks with SwiGLU. | | 6 | 2026-03-15 | inner-loop | H2 run_005: RoPE + SwiGLU combined. val_loss=4.41 (-0.41 vs original baseline). Best so far. | | 7 | 2026-03-16 | outer-loop | Reviewed 5 runs. Pattern: gating mechanisms (SwiGLU) and rotary embeddings (RoPE) give independent gains that stack. Combined improvement ~9%. But WHY do they stack? Hypothesis: they operate on orthogonal aspects (FFN expressiveness vs positional encoding). Direction: DEEPEN — test if adding RMSNorm also stacks independently. | | 8 | 2026-03-16 | inner-loop | H3 run_006: replaced LayerNorm with RMSNorm. val_loss=4.39 (-0.02). Small gain. Stacks but diminishing returns on normalization. | | 9 | 2026-03-17 | outer-loop | 8 runs complete. Optimization plateau around val_loss=4.38. The easy architectural wins (SwiGLU, RoPE) are captured. Searched literature on training dynamics — found papers on warmup schedules at small scale. Direction: BROADEN — shift from architecture to training recipe. | | 10 | 2026-03-17 | report | Generated progress-001.html with trajectory plot showing 9% improvement from architectural changes. |
Example entries (discovery-type research — understanding grokking): | 1 | 2026-03-20 | bootstrap | Searched literature on grokking and delayed generalization. Found Nanda et al. progress measures, Grokfast spectral filtering. Gap: no connection to memory consolidation theory from neuroscience. 3 hypotheses formed. | | 2 | 2026-03-20 | inner-loop | H1 run_001: trained modular addition transformer to memorization (100% train acc, 0% test). Steps to memorize: 1200. Baseline established. | | 3 | 2026-03-20 | inner-loop | H1 run_002: continued training with standard weight decay. Grokking at step 48000. Measured progress measure throughout — sharp transition at step 44000. | | 4 | 2026-03-20 | inner-loop | H1 run_003: inserted "sleep phase" at step 20000 (elevated weight decay + oscillatory LR for 500 steps). Grokking now at step 31000. 35% acceleration. | | 5 | 2026-03-20 | inner-loop | H1 run_004: sleep phase at step 10000. Grokking at step 27000. Earlier sleep = earlier grokking. | | 6 | 2026-03-20 | inner-loop | H1 run_005: sleep phase at step 5000 (before full memorization). Grokking at step 38000. Too early hurts — model hadn't memorized enough for consolidation to work. | | 7 | 2026-03-21 | outer-loop | Reviewed 5 runs. Clear pattern: sleep phases accelerate grokking but only AFTER memorization is complete. This matches memory consolidation theory exactly — you need memories formed before consolidation can reorganize them. Searched for neural slow-wave sleep literature. The weight decay + oscillatory LR during sleep phases mimics synaptic downscaling. Direction: DEEPEN — sweep sleep timing relative to memorization completion. | | 8 | 2026-03-21 | inner-loop | H1.1 run_006-010: swept sleep insertion at 80%, 100%, 120%, 150%, 200% of memorization step. Sweet spot at 110-120%. Consistent across 3 seeds. | | 9 | 2026-03-22 | outer-loop | 10 runs complete. The story is clear: neural networks "dream to learn" just like brains — consolidation after encoding, not during. Grokfast achieves similar acceleration through a different mechanism (gradient spectral filtering). Next: compare gradient spectra during our sleep phases vs Grokfast filtering to see if they converge on the same signal. Direction: BROADEN. | | 10 | 2026-03-22 | report | Generated progress-001.html with sleep timing vs grokking step plot. Key visual: sweet spot curve mirrors neuroscience memory consolidation window. | -->
# Research State — Central Project Tracking
# Copy this template to your project root and fill in as you go.
# Updated by the agent after each experiment and reflection.
project:
title: ""
question: "" # The core research question
status: active # active | paused | concluded
started: "" # ISO date
domain: "" # e.g., "mechanistic interpretability", "RL training"
literature:
key_papers: []
# - id: "liu2025superposition"
# title: "Superposition Yields Robust Neural Scaling"
# authors: "Liu et al."
# year: 2025
# relevance: "Proves ETF structure in LM heads"
open_problems: [] # Gaps identified from literature
evidence_gaps: [] # What's missing in the field
hypotheses:
# List of all hypotheses, active and completed
# - id: H1
# statement: "Testable claim with clear prediction"
# status: pending # pending | active | supported | refuted | inconclusive
# motivation: "Why this is worth testing"
# parent: null # null for root, parent ID (e.g., H1) for sub-hypotheses
# priority: medium # high | medium | low
experiments:
proxy_metric: "" # What we're optimizing and how to compute it
baseline_value: null # Starting point
best_value: null # Best achieved so far
total_runs: 0
trajectory: []
# - run_id: "run_001"
# hypothesis: "H1"
# metric_value: null
# delta: null # Change from baseline
# wall_time_min: null
# change_summary: ""
# timestamp: ""
outer_loop:
cycle: 0 # How many outer loop reflections so far
last_direction: null # deepen | broaden | pivot | conclude
last_reflection: "" # Brief summary of last reflection decision
workspace:
# Track key resource locations
findings: "findings.md"
log: "research-log.md"
literature_dir: "literature/"
experiments_dir: "experiments/"
to_human_dir: "to_human/"
paper_dir: "paper/"
Related skills
How it compares
Use autoresearch for agent keep-alive infrastructure; use research methodology skills for hypothesis design inside each cycle.
FAQ
What is the autoresearch wall-clock loop?
autoresearch requires a 20-minute wall-clock loop that injects a fixed prompt telling the agent to keep working and check for errors, independent of faster inner research experiment cycles.
Why set up autoresearch before experiments?
autoresearch mandates the wall-clock loop first because without it autonomous research agents complete one cycle and stop, failing overnight or multi-day literature and experiment runs.
How is autoresearch different from research inner loops?
autoresearch wall-clock loop is fixed-interval keep-alive infrastructure; research inner and outer loops run at experiment speed from minutes to hours and do not replace continuity injection.
Is Autoresearch safe to install?
skills.sh reports 1 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.