| name | autoresearch |
| description | Use when you want to autonomously improve a SKILL.md's quality by running iterative experiments. Triggers on "autoresearch ๋๋ ค์ค", "์คํฌ ํ์ง ์ฌ๋ ค์ค", "์ด ์คํฌ์ ์๋์ผ๋ก ๊ฐ์ ํด์ค", "run autoresearch on this skill", or any request to automatically improve a skill's eval pass rate through repeated experimentation. Applies Karpathy's autoresearch technique - fixed-budget iterative loop with single-metric hill-climbing and automatic keep/discard decisions. |
Autoresearch: Autonomous Skill Improvement
Karpathy์ autoresearch ๊ธฐ๋ฒ์ SKILL.md ๊ฐ์ ์ ์ ์ฉํ๋ค. ๊ณ ์ ์์ฐ ๋ด์์ ๋ฐ๋ณต ์คํ(mutate โ evaluate โ keep/discard)์ ์์จ ์คํํ์ฌ ์คํฌ ํ์ง์ ์๋์ผ๋ก ํฅ์ํ๋ค.
ํต์ฌ ์๋ฆฌ:
- ํ ๋ฒ์ ํ๋์ ๋ณ๊ฒฝ๋ง (์์ธ ์ถ์ ๊ฐ๋ฅ)
- ๋จ์ผ ๋ฉํธ๋ฆญ hill-climbing (mean_pass_rate)
- Assertion-level regression ๊ฐ์ง (์ ์ฒด ์ ์๊ฐ ์ฌ๋ผ๋ ๊ธฐ์กด ํต๊ณผ assertion ์คํจ ์ discard)
- Workspace isolation (์๋ณธ ์์ ๋ณด์ฅ)
- Context window ๋ณดํธ (eval ์ถ๋ ฅ์ ํ์ผ๋ก, grading summary๋ง ์ฝ๊ธฐ)
Phase 0: ์ด๊ธฐํ
0-1. ๋์ ์คํฌ ์๋ณ
์ฌ์ฉ์๊ฐ ์คํฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ฉด ํด๋น ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค. ์ง์ ํ์ง ์์ผ๋ฉด:
- ํ์ฌ ๋ํ์์ ์ธ๊ธ๋ ์คํฌ ๊ฒฝ๋ก๋ฅผ ํ์ง
- ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ๋์ ์คํฌ ๊ฒฝ๋ก๋ฅผ ์์ฒญ
ํ์ํ ํ์ผ ํ์ธ:
{skill-path}/SKILL.md โ ๊ฐ์ ๋์ (ํ์, ์์ผ๋ฉด ์ค๋จ)
{skill-path}/EVAL.md โ ํ๊ฐ ๊ธฐ์ค (ํ์, ์์ผ๋ฉด ์ค๋จ + "EVAL.md๋ฅผ ๋จผ์ ์์ฑํ์ธ์" ์๋ด)
0-2. Workspace ์ด๊ธฐํ
{repo-root}/{skill-name}-autoresearch/
autoresearch-log.json # ์ ์ฒด ์คํ ๋ฉํ๋ฐ์ดํฐ
iteration-0/ # ๋ฒ ์ด์ค๋ผ์ธ (Phase 1์์ ์์ฑ)
iteration-N/ # ๊ฐ ์คํ ๊ฒฐ๊ณผ
Workspace ๋๋ ํ ๋ฆฌ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ฉด ์ด์ ์คํ์ autoresearch-log.json์ ์ฝ์ด ์ํ๋ฅผ ํ์ธํ๋ค. ์ด์ ์คํ์ด ์๋ฃ๋ ์ํ๋ผ๋ฉด ์ ์คํ์ ์์ํ๋ค.
0-3. Eval ์ธํ๋ผ ํ์ธ
{skill-name}-workspace/evals/evals.json์ ์ฐพ๋๋ค. ์์ผ๋ฉด:
- EVAL.md์ binary criteria๋ฅผ ๊ธฐ๋ฐ์ผ๋ก evals.json ์์ฑ์ ์ ์
- ์ฌ์ฉ์๊ฐ evals.json์ ์ง์ ์ ๊ณตํ ๋๊น์ง ๋๊ธฐ
evals.json ํ์ ์คํค๋ง:
{
"skill_name": "target-skill",
"evals": [
{
"id": 1,
"name": "eval-case-name",
"level": "L1-routing",
"prompt": "eval ์คํ ํ๋กฌํํธ",
"files": ["test-targets/file.py"],
"expected_output": "์์ฐ์ด ๊ธฐ๋ ๊ฒฐ๊ณผ ์์ ",
"assertions": [
{
"id": "assertion_id",
"description": "์ด assertion์ด ๊ฒ์ฆํ๋ ๊ฒ",
"check": "keyword",
"keywords": ["keyword1", "keyword2"]
}
]
}
]
}
assertions ๋ฐฐ์ด์ด ์์ผ๋ฉด expected_output์ LLM-judge๋ก ํ๊ฐํ๋ค (์ ํ๋ ๋ฎ์, ๊ฒฝ๊ณ ํ์).
level ํ๋๋ ์ ํ์ ์ด๋ฉฐ, ๋ฏธ์ง์ ์ ๊ธฐ๋ณธ๊ฐ์ L1-routing์ด๋ค:
| ๋ ๋ฒจ | ์ค๋ช
| ํ์ฉ |
|---|
L1-routing | ์ฌ๋ฐ๋ฅธ ์ ์ฐจ๋ก ๋ผ์ฐํ
๋๋๊ฐ | ๊ธฐ๋ณธ |
L2-execution | ์ ์ฐจ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์คํํ๋๊ฐ | Phase 2์์ L1 ์ ๋ PASS ์ ์ง์ค |
L3-quality | ์คํ ๊ฒฐ๊ณผ์ ๋ฐ์ดํฐ ํ์ง์ด ์ ํํ๊ฐ | Phase 2์์ L2 ์ ๋ PASS ์ ์ง์ค |
Phase 2-1 ANALYZE์์ ๋ ๋ฒจ๋ณ pass_rate๋ฅผ ๋ถ๋ฆฌ ์ง๊ณํ๊ณ , L1์ด ๋ชจ๋ PASS์ด๋ฉด L2์, L2๊ฐ ๋ชจ๋ PASS์ด๋ฉด L3์ ์ง์คํ์ฌ mutation ๊ฐ์ค์ ์๋ฆฝํ๋ค.
0-4. program.md ํ์ธ
{workspace}/program.md๋ฅผ ์ฐพ๋๋ค. ์์ผ๋ฉด ๋ก๋ํ์ฌ mutation ์ ๋ต์ผ๋ก ์ฌ์ฉํ๋ค. ์์ผ๋ฉด ์๋ "Default Mutation Strategy"๋ฅผ ์ฌ์ฉํ๋ค.
program.md์ force_at_least_one_iteration: true๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด,
baseline์ด target_pass_rate์ ๋๋ฌํด๋ ์ ์๋ ์ ๋ต ์ค ๋ฏธ์๋ ํญ๋ชฉ์ ๋ํด
์ต์ 1ํ mutation์ ์๋ํ๋ค. ์ด๋ eval ๋ง์ ์ด์ด๋ ์ง์นจ์ ๋ช
ํ์ฑ์ ๊ฐ์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ค.
program.md์ mutation_exclusions๊ฐ ์ ์๋์ด ์์ผ๋ฉด ๋ก๋ํ๋ค:
exclusions:
- pattern: "string โ number ํ์
๋ณํ workaround"
reason: "API ์คํค๋ง ์์ ์ด ์ ํ๋์ด์ผ ํจ"
exclusion ํจํด๊ณผ ์ผ์นํ๋ mutation์ Phase 2-3 MUTATE ํ eval ์คํ ์์ด ์ฆ์ ํ๊ธฐํ๊ณ , ๋ค๋ฅธ ๊ฐ์ค๋ก 2-2๋ถํฐ ์ฌ์๋ํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด SKILL.md ์์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ์ธ๋ถ ๋ฌธ์ (API ์คํค๋ง, ์๋ฒ ๋ฒ๊ทธ ๋ฑ)์ mutation ์์ฐ์ ๋ญ๋นํ์ง ์๋๋ค.
0-5. ์ธ๋ถ ๊ฒ์ฆ ๊ฒฐ๊ณผ ์ฐธ์กฐ (์ ํ)
{workspace}/verification-results.json์ด ์์ผ๋ฉด ๋ก๋ํ๋ค.
capability_issues ๋ฐฐ์ด์์ mutation ๋์์ ์ถ์ถํ์ฌ Phase 2์ ๊ฐ์ค ์๋ฆฝ์ ํ์ฉํ๋ค
api_issues ๋ฐฐ์ด์ mutation ๋์์์ ์ ์ธํ๋ค (mutation_exclusions๋ก ์๋ ๋ฑ๋ก). API ์คํค๋ง ๋ถ์ผ์น๋ ์๋ฒ ์ค๋ฅ๋ SKILL.md ์์ ์ผ๋ก ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์์ผ๋ฉด ๊ฑด๋๋ (๊ธฐ์กด ๋์ ์ ์ง)
0-6. ์์ฐ ์ค์
์ฌ์ฉ์๊ฐ ์ง์ ํ์ง ์์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ:
| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|---|
max_iterations | 10 | ์ต๋ ์คํ ํ์ |
target_pass_rate | 1.0 | ์ด pass_rate ๋ฌ์ฑ ์ ์กฐ๊ธฐ ์ข
๋ฃ |
stall_limit | 3 | ์ฐ์ Nํ DISCARD ์ ์๋ ์ค๋จ |
eval_runs | 2 | ๊ฐ eval์ ์คํ ํ์ (๋ถ์ผ์น ์ +1) |
์ฌ์ฉ์์๊ฒ ์ค์ ์ ํ์ธํ๋ค:
Autoresearch ์ค์ :
- ๋์: {skill-path}/SKILL.md
- Eval: {evals-count}๊ฐ ์ผ์ด์ค, {assertions-count}๊ฐ assertions
- ์์ฐ: max {max_iterations} iterations
- ๋ชฉํ: pass_rate โฅ {target_pass_rate}
- ์ ๋ต: {program.md ๋๋ Default}
์์ํ์๊ฒ ์ต๋๊น?
Phase 1: ๋ฒ ์ด์ค๋ผ์ธ ์ธก์
1-1. SKILL.md ๋ฐฑ์
ํ์ฌ SKILL.md๋ฅผ {workspace}/iteration-0/SKILL.md.bak์ ๋ณต์ฌํ๋ค.
1-2. ๋ฒ ์ด์ค๋ผ์ธ Eval ์คํ
๊ฐ eval ์ผ์ด์ค์ ๋ํด:
-
Agent ๋์คํจ์น โ eval ์คํ์ ๊ฒฉ๋ฆฌ๋ Agent์์ ์ํ
- Agent ํ๋กฌํํธ: ๋์ ์คํฌ์ SKILL.md ์ ๋ฌธ + eval์
prompt + files ๋ด์ฉ
- Agent ์ง์: "์ด ์คํฌ์ ์ง์์ ๋ฐ๋ผ ์ฃผ์ด์ง ํ๋กฌํํธ๋ฅผ ์ํํ๋ผ. ๊ฒฐ๊ณผ๋ง ์ถ๋ ฅํ๋ผ."
- Agent ์ถ๋ ฅ์
{workspace}/iteration-0/eval-{name}/output.md์ Write
-
Grading โ ์ถ๋ ฅ๋ฌผ์ assertions์ ๋์กฐ
check: "keyword": keywords ์ค ํ๋๋ผ๋ ์ถ๋ ฅ์ ํฌํจ๋๋ฉด pass
check: "llm_judge" (๋๋ assertions ์์ ๋): expected_output ๊ธฐ์ค์ผ๋ก LLM ํ์
- ๊ฒฐ๊ณผ๋ฅผ
{workspace}/iteration-0/eval-{name}/grading.json์ ์ ์ฅ:
{
"eval_id": 1,
"eval_name": "eval-case-name",
"run": 1,
"assertions": [
{ "id": "assertion_id", "passed": true, "evidence": "๋งค์นญ๋ ํ
์คํธ ๋ฐ์ท" }
],
"pass_rate": 0.85
}
-
Multi-run โ eval_runsํ ๋ฐ๋ณต ์คํ
- 2ํ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ๋ฉด (๋์ผ assertions pass/fail) ํ์
- ๋ถ์ผ์นํ๋ฉด 3ํ์งธ ์คํ, ๋ค์๊ฒฐ(2/3)๋ก ํ์
1-3. ๋ฒ ์ด์ค๋ผ์ธ ๊ธฐ๋ก
{workspace}/iteration-0/benchmark.json ์์ฑ:
{
"iteration": 0,
"type": "baseline",
"mean_pass_rate": 0.85,
"per_eval": [
{ "name": "eval-case-name", "pass_rate": 0.85, "runs": 2 }
],
"assertion_baseline": {
"eval-case-name": {
"assertion_id_1": true,
"assertion_id_2": false
}
}
}
์ฌ์ฉ์์๊ฒ ๋ฒ ์ด์ค๋ผ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ :
๋ฒ ์ด์ค๋ผ์ธ ์ธก์ ์๋ฃ:
- Mean pass rate: {mean_pass_rate}
- ์คํจํ assertions: {list}
- Phase 2 ๋ฐ๋ณต ์คํ์ ์์ํฉ๋๋ค.
Phase 2: ๋ฐ๋ณต ์คํ ๋ฃจํ
best_pass_rate = baseline_pass_rate
best_assertions = baseline_assertions
consecutive_stalls = 0
for iteration in 1..max_iterations:
2-1. ANALYZE โ ์คํจ ๋ถ์
์ด์ iteration์ grading ๊ฒฐ๊ณผ์์:
- ์คํจํ assertions์
id, description, evidence ์ถ์ถ
- ์ปจํ
์คํธ ๊ด๋ฆฌ: grading.json์ assertions ๋ชฉ๋ก๋ง ์ฝ๊ธฐ. ์ ์ฒด eval output์ ์ฝ์ง ์์.
- ์ด์ ์ ์๋ํ๋ค๊ฐ DISCARD๋ mutation์ hypothesis.md ๋ชฉ๋ก์
autoresearch-log.json์์ ํ์ธ (๊ฐ์ ๋ฐฉํฅ ๋ฐ๋ณต ๋ฐฉ์ง)
2-2. HYPOTHESIZE โ ๊ฐ์ค ์๋ฆฝ
program.md์ ์ ๋ต์ ๋ฐ๋ฅธ๋ค (์์ผ๋ฉด Default Mutation Strategy ์ฌ์ฉ).
๊ฐ์ค์ {workspace}/iteration-N/hypothesis.md์ ๊ธฐ๋ก:
# Iteration {N} ๊ฐ์ค
**๋์ assertion:** {์คํจํ assertion id + description}
**๋ถ์:** {์ ์คํจํ๋์ง โ SKILL.md์ ์ด๋ ๋ถ๋ถ์ด ๋ถ์กฑํ์ง}
**๋ณ๊ฒฝ ๊ณํ:** {๊ตฌ์ฒด์ ์ผ๋ก SKILL.md์ ์ด๋ค ๋ถ๋ถ์ ์ด๋ป๊ฒ ์์ ํ ์ง}
**์ ๋ต ์ ํ:** {๋๋ฝ / ๋ชจํธ / ๊ตฌ์กฐ / ๊ณผ์}
2-3. MUTATE โ SKILL.md ์์
- ํ์ฌ best SKILL.md๋ฅผ ์ฝ๋๋ค
- ๊ฐ์ค์ ๋ฐ๋ผ ํ๋์ ์ธก๋ฉด๋ง ์์ ํ๋ค
- ์ฌ๋ฌ ๋ณ๊ฒฝ์ ๋์์ ํ์ง ์๋๋ค (์ด๋ค ๋ณ๊ฒฝ์ด ํจ๊ณผ์ ์ด์๋์ง ์ถ์ ๋ถ๊ฐ)
- mutation_exclusions๊ฐ ์ ์๋์ด ์์ผ๋ฉด, ์์ฑ๋ mutation์ด exclusion ํจํด๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค. ์ผ์นํ๋ฉด ์ฆ์ ํ๊ธฐํ๊ณ 2-2๋ก ๋์๊ฐ ๋ค๋ฅธ ๊ฐ์ค์ ์๋ฆฝํ๋ค (์ต๋ 2ํ ์ฌ์๋).
- ์์ ๋ SKILL.md๋ฅผ
{workspace}/iteration-N/SKILL.md์ ์ ์ฅ
2-4. VALIDATE STRUCTURE โ ๊ตฌ์กฐ ๊ฒ์ฆ
mutation ์งํ, ์์ ๋ SKILL.md์ ๊ตฌ์กฐ๋ฅผ ๊ฒ์ฆ:
- YAML frontmatter โ
---๋ก ๊ฐ์ธ์ง YAML ๋ธ๋ก์ด ํ์ฑ ๊ฐ๋ฅํ๊ฐ
- ํ์ ํ๋ โ
name, description ํ๋๊ฐ ์กด์ฌํ๋๊ฐ
- ์น์
๊ตฌ์กฐ โ ์๋ณธ SKILL.md์ H2 ํค๋ฉ์ด ๋ชจ๋ ๋ณด์กด๋์๋๊ฐ
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ โ
${CLAUDE_PLUGIN_ROOT} ๋ฑ ๋ณ์ ์ฐธ์กฐ๊ฐ ๊นจ์ง์ง ์์๋๊ฐ
๊ฒ์ฆ ์คํจ ์: mutation์ ํ๊ธฐํ๊ณ ๋ค๋ฅธ ๊ฐ์ค๋ก 2-2๋ถํฐ ์ฌ์๋ (์ต๋ 2ํ ์ฌ์๋).
2-5. EVALUATE โ Eval ์คํ
Phase 1๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก eval suite๋ฅผ ์คํํ๋ค. ๋จ, ๋ณํ๋ SKILL.md๋ฅผ ์ฌ์ฉ:
- ์๋ณธ SKILL.md๋ฅผ ์์ ๋ฐฑ์
- ๋ณํ๋ SKILL.md๋ฅผ ์๋ณธ ์์น์ ๋ณต์ฌ
- ๊ฐ eval ์ผ์ด์ค ์คํ (Agent ๋์คํจ์น + Grading)
- ์๋ณธ SKILL.md๋ฅผ ๋ณต์
- ๊ฒฐ๊ณผ๋ฅผ
{workspace}/iteration-N/benchmark.json์ ์ ์ฅ
2-6. COMPARE โ ํ์
Step A: Pass rate ๋น๊ต
new_pass_rate vs best_pass_rate ๊ณ์ฐ
Step B: Assertion-level regression ๊ฐ์ง
Step C: ํ์
| ์กฐ๊ฑด | ํ์ | ๋์ |
|---|
| new > best AND regressions ์์ | KEEP | best = new, SKILL.md ๊ต์ฒด, consecutive_stalls = 0 |
| new > best AND regressions ์์ | DISCARD | regression์ ํ์ฉํ์ง ์์. ๋ณํ ํ๊ธฐ, regression ๋ด์ฉ์ autoresearch-log.json์ ๊ธฐ๋ก, consecutive_stalls += 1 |
| new == best AND program.md ์ ๋ต ๊ธฐ๋ฐ AND regression ์์ | NEUTRAL | diff๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ์. ์ฌ์ฉ์ ์น์ธ ์ KEEP (consecutive_stalls ๋ฏธ์ฆ๊ฐ), ๊ฑฐ๋ถ ์ DISCARD |
| new == best (๊ธฐํ) | DISCARD | ๋ณํ ํ๊ธฐ, consecutive_stalls += 1 |
| new < best | DISCARD | ๋ณํ ํ๊ธฐ, consecutive_stalls += 1 |
autoresearch-log.json์ iteration ๊ธฐ๋ก:
{
"iteration": 1,
"hypothesis": "Fast Mode ๋ผ์ฐํ
๊ท์น์ '๋จ์ผ ํ์ผ = Fast Mode' ๋ช
์",
"strategy_type": "missing",
"pass_rate": 0.92,
"delta": "+0.07",
"outcome": "kept",
"regressions": [],
"kept_assertions_gained": ["assertion_id_3"],
"timestamp": "2026-03-26T10:15:00"
}
2-7. CIRCUIT BREAKER
๋ฃจํ ์ข
๋ฃ ์กฐ๊ฑด ํ์ธ:
| ์กฐ๊ฑด | ๋์ |
|---|
consecutive_stalls >= stall_limit | ์๋ ์ค๋จ โ "์ฐ์ {stall_limit}ํ ๊ฐ์ ์์. ๋ค๋ฅธ ์ ๋ต์ด ํ์ํฉ๋๋ค." |
best_pass_rate >= target_pass_rate AND force ๋ฏธ์ค์ | ์ฑ๊ณต ์ข
๋ฃ โ "๋ชฉํ pass_rate {target_pass_rate} ๋ฌ์ฑ!" |
best_pass_rate >= target_pass_rate AND force ์ค์ AND ๋ชจ๋ ์ ๋ต ์๋ ์๋ฃ | ์ฑ๊ณต ์ข
๋ฃ โ ๋ชจ๋ program.md ์ ๋ต์ ์๋ํ ํ ์ข
๋ฃ |
iteration >= max_iterations | ์์ฐ ์์ง โ "์ต๋ iteration ์ ๋๋ฌ." |
์ด๋ ์กฐ๊ฑด์๋ ํด๋นํ์ง ์์ผ๋ฉด ๋ค์ iteration์ผ๋ก ์งํ (2-1๋ก ๋์๊ฐ).
Phase 3: ๊ฒฐ๊ณผ ๋ณด๊ณ
3-1. ์ต์ข
๋ณด๊ณ ์ ์์ฑ
{workspace}/report.md์ ์์ฑ:
# Autoresearch Report: {skill-name}
**์คํ ์ผ์:** {started_at} ~ {completed_at}
**์ข
๋ฃ ์ฌ์ :** {target ๋ฌ์ฑ / stall ์ค๋จ / ์์ฐ ์์ง}
## ๊ฒฐ๊ณผ ์์ฝ
| ๋ฉํธ๋ฆญ | Baseline | Final | Delta |
|--------|----------|-------|-------|
| Mean Pass Rate | {baseline} | {final} | {delta} |
| ์ด Iterations | โ | {total} | โ |
| Kept | โ | {kept_count} | โ |
| Discarded | โ | {discarded_count} | โ |
## ํจ๊ณผ์ ์ด์๋ Mutations
| Iteration | ์ ๋ต | ๊ฐ์ค | Delta |
|-----------|------|------|-------|
| {N} | {type} | {hypothesis summary} | {delta} |
## Assertion-Level ๋ณํ
| Assertion | Baseline | Final | Changed in |
|-----------|----------|-------|------------|
| {id} | FAIL | PASS | Iteration {N} |
## ์คํจํ Mutations (์ฐธ๊ณ ์ฉ)
| Iteration | ๊ฐ์ค | ์คํจ ์ฌ์ |
|-----------|------|-----------|
| {N} | {hypothesis} | {pass_rate delta or regression} |
3-2. SKILL.md ๋ฐ์
์ฌ์ฉ์์๊ฒ ์ต์ข
ํ์ธ์ ์์ฒญ:
Autoresearch ์๋ฃ:
- Pass rate: {baseline} โ {final} ({delta})
- {kept_count}๊ฐ mutation ์ ์ฉ, {discarded_count}๊ฐ ํ๊ธฐ
์ต์ข
SKILL.md๋ฅผ ์๋ณธ์ ๋ฐ์ํ์๊ฒ ์ต๋๊น?
- Yes: ์๋ณธ SKILL.md๋ฅผ ๊ต์ฒดํ๊ณ git commit
- No: workspace์๋ง ๋ณด๊ด (์๋ณธ ๋ณ๊ฒฝ ์์)
- Diff: ๋ณ๊ฒฝ ๋ด์ฉ์ ๋จผ์ ํ์ธ
3-3. ์คํ ๋ก๊ทธ ๊ธฐ๋ก
๊ธฐ์กด logging-protocol.md์ ๋ฐ๋ผ:
~/.claude/agent-team/autoresearch/logs/{timestamp}/result.json ์์ฑ
~/.claude/agent-team/autoresearch/logs/{timestamp}/summary.md ์์ฑ
~/.claude/agent-team/autoresearch/logs/index.json ์
๋ฐ์ดํธ
result.json ํ์ฅ ํ๋:
{
"skillName": "da-review",
"skillPath": "agent-team-plugin/skills/da-review/SKILL.md",
"baselinePassRate": 0.85,
"finalPassRate": 1.0,
"totalIterations": 7,
"keptMutations": 4,
"discardedMutations": 3,
"terminationReason": "target_achieved"
}
Default Mutation Strategy
program.md๊ฐ ์์ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๋ต. ์คํจํ assertions๋ฅผ ๋ถ์ํ๊ณ ๋ค์ ์์๋ก ์์ ์ ์๋ํ๋ค:
1. ๋๋ฝ๋ ์ง์ (Missing Instruction)
์คํจํ assertion์ด ์๊ตฌํ๋ ํ๋์ด SKILL.md์ ์์ ์ธ๊ธ๋์ง ์์ ๊ฒฝ์ฐ.
์ง๋จ: assertion์ description๊ณผ keywords๋ฅผ SKILL.md์์ ๊ฒ์. ๊ด๋ จ ๋ด์ฉ์ด ์์ผ๋ฉด "๋๋ฝ"์ผ๋ก ๋ถ๋ฅ.
์์ : ํด๋น ํ๋์ ์ ์ ํ Phase/Step์ ์ฒดํฌ๋ฆฌ์คํธ, ๊ณต๊ฒฉ ์ง๋ฌธ, ๋๋ ์์ด์ ํธ ์ญํ ์ ์ถ๊ฐ.
์์: assertion "rollback_plan ํฌํจ"์ด ์คํจ โ SKILL.md์ Verdict ์น์
์ "rollback strategy ํ์ ํญ๋ชฉ" ์ถ๊ฐ.
2. ๋ชจํธํ ์ง์ (Ambiguous Instruction)
๊ด๋ จ ๋ด์ฉ์ด ์์ง๋ง ์ถฉ๋ถํ ๊ตฌ์ฒด์ ์ด์ง ์์ LLM์ด ๋์น๋ ๊ฒฝ์ฐ.
์ง๋จ: assertion์ keywords๊ฐ SKILL.md์ ์ ์ฌํ๊ฒ ์กด์ฌํ์ง๋ง, eval ์ถ๋ ฅ์์ ํด๋น ์์ญ์ depth๊ฐ ๋ถ์กฑ.
์์ : ์ผ๋ฐ์ ํํ์ ๊ตฌ์ฒด์ ํํ์ผ๋ก ๊ต์ฒด.
์์: "๋ณด์ ํ์ธ" โ "SQL ์ธ์ ์
, XSS, SSRF, ์ธ์ฆ ์ฐํ ๋ฒกํฐ๋ฅผ ๊ฐ๊ฐ ํ์ธ"
3. ๊ตฌ์กฐ์ ๋ฌธ์ (Structural Issue)
์ง์๊ฐ ์์ง๋ง ์ํฌํ๋ก์ฐ ์์์ ๋์น๊ธฐ ์ฌ์ด ์์น์ ์๋ ๊ฒฝ์ฐ.
์ง๋จ: SKILL.md์ ๊ด๋ จ ๋ด์ฉ์ด ์กด์ฌํ๊ณ , ์ผ๋ถ eval run์์๋ ํต๊ณผํ์ง๋ง variance๊ฐ ๋์ ๊ฒฝ์ฐ.
์์ : ํด๋น ์ง์๋ฅผ ๋ ์ Phase๋ก ์ด๋ํ๊ฑฐ๋, ํ์ ์ฒดํฌ ํญ๋ชฉ์ผ๋ก ๊ฒฉ์.
4. ๊ณผ์ ์ง์ (Excess Instruction)
๋ถํ์ํ ๋ด์ฉ์ด ํต์ฌ ์ง์๋ฅผ ํฌ์ํ์ฌ LLM์ด ์ค์ํ ๋ถ๋ถ์ ๋์น๋ ๊ฒฝ์ฐ.
์ง๋จ: SKILL.md์ ํน์ ์น์
์ด ๊ณผ๋ํ๊ฒ ๊ธธ๊ณ , ํด๋น ์น์
๊ทผ์ฒ์ ๋ค๋ฅธ assertion๋ ํจ๊ป ์คํจ.
์์ : ๋ถํ์ํ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ฑฐ๋ Level 3 references๋ก ์ด๋ํ์ฌ ์ ํธ ๋ ์ก์ ๋น์จ ๊ฐ์ .
autoresearch-log.json ์คํค๋ง
์ ์ฒด ์คํ ์คํ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ค.
{
"skill_name": "da-review",
"skill_path": "agent-team-plugin/skills/da-review/SKILL.md",
"started_at": "2026-03-26T10:00:00",
"completed_at": "2026-03-26T11:30:00",
"config": {
"max_iterations": 10,
"target_pass_rate": 1.0,
"stall_limit": 3,
"eval_runs": 2
},
"baseline_pass_rate": 0.85,
"final_pass_rate": 1.0,
"total_iterations": 7,
"kept_mutations": 4,
"discarded_mutations": 3,
"termination_reason": "target_achieved",
"iterations": [
{
"iteration": 1,
"hypothesis": "Fast Mode ๋ผ์ฐํ
๊ท์น์ '๋จ์ผ ํ์ผ = Fast Mode' ๋ช
์",
"strategy_type": "missing",
"pass_rate": 0.92,
"delta": "+0.07",
"outcome": "kept",
"regressions": [],
"timestamp": "2026-03-26T10:15:00"
}
],
"program_md_used": false
}
Common Mistakes
- ์ฌ๋ฌ ๋ณ๊ฒฝ์ ๋์์ ํ๊ธฐ: ํ iteration์ ํ๋์ ๋ณ๊ฒฝ๋ง. ์ฌ๋ฌ ๋ณ๊ฒฝ์ ํ๋ฉด ์ด๋ค ๋ณ๊ฒฝ์ด ํจ๊ณผ์ ์ด์๋์ง ์ ์ ์๋ค.
- Eval ์ถ๋ ฅ ์ ์ฒด๋ฅผ ์ปจํ
์คํธ์ ๋ฃ๊ธฐ: grading.json์ summary๋ง ์ฝ์ ๊ฒ. ์ ์ฒด output์ ์ปจํ
์คํธ๋ฅผ ์์ง์ํจ๋ค.
- Regression ๋ฌด์: ์ ์ฒด pass_rate๊ฐ ์ฌ๋ผ๋ ๊ฐ๋ณ assertion regression์ด ์์ผ๋ฉด ๊ฒํ ๊ฐ ํ์ํ๋ค.
- ์๋ณธ SKILL.md ์ง์ ์์ : ํญ์ workspace์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ์์
ํ ๊ฒ. ์๋ณธ์ ์ต์ข
ํ์ธ ํ์๋ง ๊ต์ฒด.
- ๊ตฌ์กฐ ๊ฒ์ฆ ์๋ต: mutation ํ YAML frontmatter, ํ์ ์น์
์ ๋ฐ๋์ ๊ฒ์ฆ. LLM์ด ๊ตฌ์กฐ๋ฅผ ๊นจํธ๋ฆด ์ ์๋ค.
Reference Documentation