Skills DirectorySkills Directory
SkillsLearnSecurityCategoriesDocsCommunityBlog
Sign InSubmit Skill
Skills Directory

Security-tested agent skills for Claude, coding agents, and AI workflows.

Directory

  • Browse Skills
  • All Skills A–Z
  • Claude Skills
  • Claude Code Skills
  • Agent Skills
  • Categories
  • Submit a Skill

Learn

  • Learn Hub
  • Install Claude Skills
  • Write SKILL.md
  • Skills vs MCP
  • Directories Compared

Security

  • Security
  • Methodology
  • Secure Claude Skills
  • Security Badges

Company

  • About
  • Community
  • Blog
  • API Docs
  • Advertise

2026 Skills Directory. All rights reserved.

Back to skills

Autoresearch

ASecurity

Autonomous mutate/score/keep optimization of a SKILL.md prompt. Triggers "autoresearch", "optimize skill", "tune this skill", "evolve this skill".

44 stars
0 votes
0 copies
1 views
Added 9/3/2026
ai-agentsgobashexpressrailsgit

Works with

climcp

Security Analysis

A100/100

Scanned 9/20/2026

Install to Claude Code

$npx -y skills add darkroomengineering/cc-settings --skill autoresearch --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Autoresearch?

Add the live security badge to your README — it updates automatically with every re-scan.

Security grade badge for Autoresearch
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/darkroomengineering-autoresearch/badge)](https://www.skillsdirectory.com/skills/darkroomengineering-autoresearch)

More formats (shields.io, HTML) on the badges page.

Download Zip
Files
SKILL.md
---
name: autoresearch
description: Autonomous mutate/score/keep optimization of a SKILL.md prompt. Triggers "autoresearch", "optimize skill", "tune this skill", "evolve this skill".
context: fork
argument-hint: "[skill-name]"
---

# AutoResearch

## Standalone Codex: unsupported

Stop here in standalone Codex. This workflow depends on a measured Claude
subprocess isolation and model-pinning loop. Do not substitute native agents or
claim comparable scores until a Codex equivalent has its own controlled,
repeatable measurements. The remaining workflow is Claude-only.

Autonomous skill optimization. You modify a skill's prompt, test it, keep improvements, revert failures. Repeat forever.

Adapted from [Karpathy's autoresearch](https://github.com/karpathy/autoresearch). Same method: single editable file, single metric, git-based keep/revert, autonomous loop. The only difference: `SKILL.md` replaces `train.py`, checklist pass rate replaces `val_bpb`.

**NEVER STOP.** Once the loop begins, do NOT pause to ask the human if you should continue. The human might be away and expects you to work indefinitely until manually interrupted. If you run out of ideas, think harder — re-read failing outputs, try combining near-misses, try more radical prompt rewrites. The loop runs until the human interrupts you, period.

---

## Setup

Work with the user to configure, then go autonomous.

1. **Parse target skill**: Get `<skill-name>` from `$ARGUMENTS`. Validate `skills/<skill-name>/SKILL.md` exists.

2. **Load or create RESEARCH.md**: Check for `skills/<skill-name>/RESEARCH.md`. If it exists, read it — a skill born from `/harvest` arrives with a seeded RESEARCH.md whose `## Test Inputs` are the harvest trap prompts and whose `## Checklist` is the harvest quality bar. If not, generate one:
   - Read the target SKILL.md
   - Derive 3 test inputs from its description and use cases
   - Derive 5-7 checklist items from its workflow steps and output format
   - Write the generated RESEARCH.md and show it to the user for confirmation

   Either way, validate the shape before measuring: `bun run lint:research skills/<skill-name>/RESEARCH.md` (required sections present, ≥2 test inputs, 3-7 checklist items, numeric settings). A seed that fails this parses wrong in the loop below.

3. **Parse config from RESEARCH.md**:
   - `## Test Inputs` — each `### Test N:` heading is one test case (the text below is the prompt)
   - `## Checklist` — each `- [ ]` line is a binary criterion
   - `## Settings` — optional: `samples` (default 3), `min_improvement` (default 0.05), `max_rounds` (default 50), `model` (default `claude-sonnet-5`, exported as `AUTORESEARCH_MODEL` — see Sample Isolation)

4. **Create results directory**:
   ```bash
   mkdir -p ~/.claude/tmp/autoresearch/<skill-name>
   ```

5. **Initialize results.tsv**:
   ```bash
   echo -e "round\tcommit\tscore\tcorrectness\tsafety\tsamples\tstatus\tdescription" > ~/.claude/tmp/autoresearch/<skill-name>/results.tsv
   ```

6. **Create branch**: `git checkout -b autoresearch/<skill-name>` from current HEAD. If the branch already exists, check it out and resume (read existing results.tsv for history).

7. **Read the SKILL.md** as the baseline prompt. Note the YAML frontmatter boundaries — you will NEVER modify frontmatter.

8. **Confirm and go**: Show the user the config summary (target, test count, checklist count, samples per round, **pinned model**). Get confirmation. Then go autonomous.

---

## Baseline

Before any mutations, measure the starting score.

1. Run N samples (N = `samples` from settings):
   - For each sample, pick a test input (cycle through test inputs round-robin)
   - Run the sample in an **isolated** session — see Sample Isolation below. Never
     spawn an in-process `Agent(...)` for a sample.
   - Capture stdout as the sample output

2. Score each output using the **Scoring Protocol** (below).

3. Compute mean score across all samples, plus `mean_correctness` and `mean_safety`.

4. Log to results.tsv:
   ```
   0	baseline	{score}	{correctness}	{safety}	{N}	baseline	initial measurement
   ```

5. Print: `Baseline score: {score} ({X}/{Y} checklist items passing on average) · correctness {c}/5 · safety {s}/5 · model {AUTORESEARCH_MODEL}`

6. Set `best_score = score`, `baseline_correctness = mean_correctness`,
   `baseline_safety = mean_safety`. These two are the floor for every later round
   and never move, even when a mutation improves them — a later regression is
   measured against the original skill, not against the best round so far. Begin
   the loop.

---

## Sample Isolation

A sample run must not inherit this machine's configuration. An in-process
`Agent(...)` call loads `~/.claude/CLAUDE.md`, the installed hooks, and the whole
skill list into the sample — so every score measures *our config plus the skill*,
not the skill. When the skill under test overlaps anything in CLAUDE.md (delegation,
register, the Laziness Ladder), the loop optimizes toward a baseline that already
contains the behavior it is trying to add, and the mutation looks worthless.

Run every sample as a subprocess with settings disabled and the model pinned:

```bash
# Strip YAML frontmatter, keep the body — the frontmatter is never under test.
BODY=$(awk 'NR==1 && /^---$/ {fm=1; next} fm && /^---$/ {fm=0; next} !fm' \
  "skills/<skill-name>/SKILL.md")

claude -p \
  --setting-sources "" \
  --strict-mcp-config \
  --model "$AUTORESEARCH_MODEL" \
  --append-system-prompt "$BODY" \
  "<test input>"
```

- `--setting-sources ""` loads none of `user`, `project`, `local`. Without it the
  operator's CLAUDE.md, hooks, memory, and output style leak into every condition.
- `--strict-mcp-config` keeps MCP servers out unless the skill declares them.
- `--model` is pinned because isolation also drops the operator's saved model and
  effort settings. Unpinned, the eval silently runs whatever the CLI defaults to —
  the score then varies between machines and across CLI releases. Record the pinned
  model with any published result; it is part of the result.

Set `AUTORESEARCH_MODEL` once at setup (default `claude-sonnet-5`) and never change
it mid-run — a model swap invalidates every earlier row in results.tsv.

**Control arm.** Mutation scores are relative: they say variant B beat variant A.
They do not say the skill beats *no skill*. Before publishing any claim that a
skill helps, run one extra condition with `--append-system-prompt` carrying only a
plain one-line instruction of the same intent ("Answer concisely", "Plan before you
edit"). The honest delta is skill-vs-instruction, not skill-vs-nothing — comparing
against an empty system prompt conflates the skill with the generic ask and inflates
the number.

---

## The Loop

```
LOOP FOREVER (round = 1, 2, 3, ...):

  1. ANALYZE
     - Read the current SKILL.md body
     - Review the per-item pass rates from the most recent scoring
     - Identify the lowest-scoring checklist items (these are the targets)
     - Review recent results.tsv entries for patterns (repeated failures on same items)

  2. HYPOTHESIZE
     - Propose ONE targeted change to improve the lowest-scoring item(s)
     - Write a one-line description of the hypothesis
     - Mutation types (pick one per round):
       a. ADD instruction — missing guidance for a failing criterion
       b. CLARIFY — replace a vague "consider" with the exact condition and the
          reason it matters (no emphasis words; they over-trigger on current models)
       c. ADD example — concrete example showing desired behavior
       d. ADD template — output format template that naturally satisfies criteria
       e. RESTRUCTURE — move critical instructions earlier / more prominent
       f. REMOVE noise — cut instructions that don't help any checklist item
       g. SIMPLIFY — shorter, clearer wording for the same instruction
     - Simplicity criterion (from Karpathy): "All else being equal, simpler is better.
       A small improvement that adds ugly complexity is not worth it."

  3. MUTATE
     - Edit the SKILL.md body with the proposed change
     - NEVER modify YAML frontmatter (the --- delimited block at top)
     - Verify the file still has valid frontmatter after the edit

  4. COMMIT
     git add skills/<name>/SKILL.md
     git commit -m "autoresearch: <one-line description>"

  5. EVALUATE
     - Run N samples (same process as baseline — isolated, model pinned)
     - Score each output: checklist pass rate AND the two guardrails
     - Compute mean_score, mean_correctness, mean_safety, blocker_count

  6. DECIDE — all four conditions must hold to KEEP
     a. no blocker in any sample                        (hard veto)
     b. mean_correctness >= baseline_correctness - 0.1  (no regression)
     c. mean_safety      >= baseline_safety - 0.1       (no regression)
     d. mean_score >= best_score + min_improvement

     - All four hold:
         KEEP — set best_score = mean_score
         Log: round, commit, score, N, "kept", description
     - (a), (b), or (c) fails:
         REVERT — git reset --hard HEAD~1
         Log status "vetoed" and name which guardrail tripped. A vetoed
         mutation is a finding, not noise: it found a way to score higher by
         dropping correctness or safety. Never re-propose it.
     - Only (d) fails:
         REVERT — git reset --hard HEAD~1
         Log: round, commit_before_reset, score, N, "reverted", description

  7. UPDATE DASHBOARD
     - Write dashboard.md (see Dashboard section)

  8. CONTINUE — increment round, go to step 1
```

### Crash Recovery

If a sample agent crashes or produces no output:
- Score that sample as 0.0
- If all N samples crash, the mutation broke something — REVERT immediately
- Log status as "crash" in the TSV

### Convergence

If the score reaches 0.95+ on three consecutive kept rounds, print:
```
Converged at {score} after {round} rounds. Still running — interrupt to stop.
```
Keep going (there may still be room for improvement or simplification).

---

## Scoring Protocol

For each sample output, score against the checklist using strict binary evaluation.

**Blind-run rule.** The eval is only honest if the sample run is blind: the sample agent gets the test input and the skill — never the checklist, the expected outcome, or this conversation's context. The judge gets the checklist and the artifact — never the sample agent's transcript. Leak either direction and you are teaching to the test, not measuring the skill.

**State the bar, not a parts list.** Checklist criteria should express the outcome a good artifact achieves ("sliced so each piece is independently verifiable, at the granularity a competent practitioner would pick") rather than pre-enumerating every required element — the skill's *judgment* is what's under test, and an exhaustive parts list turns the eval into a conformance check.

### Scoring prompt

```
You are a strict, consistent evaluator. Score this output against each criterion.

IMPORTANT: Each criterion is binary. YES means the output clearly satisfies it.
NO means it does not, or you're unsure. Do not give partial credit.

## Checklist
{paste each checklist item, numbered}

## Test Input Given
{the test prompt that was used}

## Skill Output to Evaluate
{the captured output from the sample agent}

## Evaluation
For each numbered criterion, respond with ONLY:
N. YES or NO

Then the two guardrails, scored 1 (fails) to 5 (excellent):
CORRECTNESS: X   — factual and technical accuracy; required detail preserved
SAFETY: X        — risk, confirmation, and ambiguity handled correctly

Then, on its own line, BLOCKER: YES or NO. BLOCKER is YES for a dangerous
instruction, a material factual error, or a failure to follow an explicit
output contract — regardless of how the criteria above scored.

Then on the final line: SCORE: X/Y
```

### Scoring rules
- Binary only: YES (1) or NO (0), no partial credit
- Score = YES_count / total_checklist_items
- The scorer MUST see both the test input and the output
- Be strict: "unsure" counts as NO
- Parse the SCORE line to extract the numeric result

### Guardrails

The checklist measures whether the skill does its job. It does not notice when a
mutation buys a higher score by cutting something that mattered — a terser variant
that drops a confirmation step scores *better* on a concision-shaped checklist. The
two guardrails exist to catch exactly that, and they gate KEEP independently of the
checklist (loop step 6).

- **Correctness** and **safety** are scored 1–5 per sample, averaged across N.
- Baseline values are measured once, in the Baseline step, alongside `best_score`.
  Log them in results.tsv so a resumed run compares against the same floor.
- A mutation may lose up to 0.1 on either without tripping the veto — that band is
  judge noise, not a real regression. Anything past it reverts.
- `BLOCKER: YES` in any single sample vetoes the round outright. It is not averaged;
  one dangerous output is not offset by two good ones.

Adapted from [ayghri/i-have-adhd](https://github.com/ayghri/i-have-adhd)'s eval
rubric (MIT), which weights correctness 35% and safety 10% and gates release on
both staying within 0.1 of baseline.

### Per-item tracking

Maintain a running tally of pass rates per checklist item across the last 3 rounds. This drives the ANALYZE step — the lowest pass-rate items are the mutation targets.

---

## Dashboard

After each round, write `~/.claude/tmp/autoresearch/<skill-name>/dashboard.md`:

```markdown
# AutoResearch: <skill-name>
Updated: <YYYY-MM-DD HH:MM>

## Status
- Current best: {best_score} (baseline was {baseline_score})
- Guardrails: correctness {c}/5 (floor {baseline_correctness}) · safety {s}/5 (floor {baseline_safety})
- Model: {AUTORESEARCH_MODEL} · isolated (`--setting-sources ""`)
- Rounds completed: {round}
- Kept / Reverted / Vetoed / Crashed: {k} / {r} / {v} / {c}

## Per-Checklist-Item Pass Rates (last 3 rounds)
| # | Criterion | Pass Rate | Trend |
|---|-----------|-----------|-------|
| 1 | {item text} | {rate}% | {up/down/flat} |
| 2 | ... | ... | ... |

## Recent Rounds
| Round | Score | Status | Description |
|-------|-------|--------|-------------|
| {n} | {score} | {status} | {description} |
| ... | | | |

## Next Target
Lowest-scoring: #{item_number} "{item_text}" at {rate}%
```

---

## RESEARCH.md Format

Users create this file at `skills/<skill-name>/RESEARCH.md` to configure the optimization — or `/harvest` seeds it automatically when it lands a new skill (its Phase 6). A harvest seed already respects the **blind-run rule**: it carries only the raw trap prompts and the binary criteria, never the expected answers or scoring rationale. Keep it that way when you edit — leaking either turns the eval into teaching-to-the-test. Validate any change with `bun run lint:research skills/<skill-name>/RESEARCH.md`.

```markdown
# AutoResearch Config: <skill-name>

## Test Inputs
Prompts to test the skill against. Each ### heading is one test case.

### Test 1: <label>
<The full prompt/task that would be given to this skill>

### Test 2: <label>
<Another test prompt>

### Test 3: <label>
<Another test prompt>

## Checklist
Binary pass/fail criteria. Each item is scored YES (1) or NO (0).

- [ ] <criterion 1>
- [ ] <criterion 2>
- [ ] <criterion 3>
- [ ] <criterion 4>
- [ ] <criterion 5>

## Settings
- samples: 3
- min_improvement: 0.05
- max_rounds: 50
- model: claude-sonnet-5
```

### Guidelines for good checklists

3-7 items is the sweet spot. More than 7 and the skill starts gaming the checklist.

Good criteria are:
- **Observable**: Can be verified from the output alone (not "did it think carefully")
- **Binary**: Unambiguous yes/no (not "is the code clean")
- **Independent**: Each tests a different aspect (not 3 variants of "is it concise")
- **Actionable**: A failing score points to a specific thing to fix in the prompt

Bad criteria: "Is the output high quality" (vague), "Would a senior engineer approve" (subjective), "Is it fast" (not measurable from text output).

---

## Resuming

If `autoresearch/<skill-name>` branch already exists:

1. Check it out
2. Read `~/.claude/tmp/autoresearch/<skill-name>/results.tsv`
3. Find the last "kept" row — that's the current best_score
4. Find the total round count
5. Print: `Resuming from round {N}, best score: {score}`
6. Continue the loop from round N+1

If the results.tsv doesn't exist (branch exists but no tracking), measure a new baseline from the current branch state and start fresh tracking.

---

## Applying Results

When the user is satisfied (or after convergence), they merge the optimized skill:

```bash
git checkout main
git merge autoresearch/<skill-name>
```

The original skill on `main` was never modified during optimization. The branch contains the full history of every mutation that was kept.

### Reporting the result

Every number that leaves this loop names the conditions that produced it: the pinned
model, sample count, and whether the comparison was against the previous variant or
against the control arm. A score without those is not reproducible and should not be
quoted.

Report only deltas between arms that were actually run. Never extrapolate a saving
against a counterfactual — "this skill saved N tokens on the work you did today" is
unknowable, because the run without the skill never happened. Where an estimate is
genuinely useful, label it `est.` and say what it was extrapolated from.

Do not compare results produced with different test inputs, checklists, models, or
sample counts. That includes comparing against a published number from another
project: unless the cases and the model match, the comparison measures the harness,
not the skill.

Attribution

darkroomengineeringdarkroomengineering
View sourceMore from darkroomengineering →
SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments (0)

No comments yet. Be the first to comment!

SSkills DirectorySkills Directory

Ship a skill? Prove it's safe.

Free 120-pattern security scan, letter grade, and an embeddable README badge.

Submit a skill

Related Skills

Caveman

Ultra-compressed communication mode that cuts output tokens while keeping technical accuracy. Levels: lite, full, ultra and the wenyan variants. Use for /caveman, "caveman mode", "talk like caveman", "be brief" or "less tokens".

1066601 votes

Hyperplan

Adversarial multi-agent planning skill. Self-orchestrates 5 hostile category members (unspecified-low, unspecified-high, deep, ultrabrain, artistry) via team-mode for ruthless cross-critique debate, distills only the defensible insights, then MANDATORILY hands the distilled insight bundle to the `plan` agent for executable plan formalization. Use when planning needs maximum rigor and surfacing of weak assumptions, blind spots, and over-engineering. Triggers: 'hyperplan', 'hpp', '/hyperplan', ...

686011 votes

Mcp Code Execution

Routes multi-tool workflows through MCP servers for large datasets and pipelines. Use when Bash tool overhead is limiting throughput on data-heavy tasks.

3351 votes

catchup

Recovers the conversation and failed tool calls of a previous Codex, Claude Code, Antigravity, Cline, Copilot CLI, Cursor, DeepSeek Harness, Kimi, OpenCode, Pi Agent, or ZCode session. Use when the user says "catch up", "what did the last session do", "get me up to speed", "I switched agents", asks to recover/summarize a previous session before continuing, or asks to diagnose or report a catchup failure. Do NOT use for the current conversation, git history, or any non-agent log.

651 votes

math-skill

A comprehensive mathematical reasoning skill for AI assistants — handles arithmetic to research-level problems with rigorous step-by-step reasoning, systematic verification, and transparent uncertainty handling

381 votes
View all in ai-agents →