[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GTE8H3HSVTPRW0TGMXA0CJ":3,"skill-same:01M6GTE8H3HSVTPRW0TGMXA0CJ":112},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":21,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":33,"install":34,"resources":47},"01M6GTE8H3HSVTPRW0TGMXA0CJ","autoresearch",null,"zircote-plugins\u002Fautoresearch","zircote-plugins","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F301837963?v=4","01M6GTE6DH8D5BQT2187AP92AR","01M6GTE6JHPD8X818VD3YQ2NNS",1,"MIT","https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002FSKILL.md",[16],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5],"2026-11-10 10:12:30",false,"---\nname: autoresearch\ndescription: Autonomous skill and MCP server improvement loop inspired by Karpathy's autoresearch pattern. Iteratively modifies skills or MCP server code, evaluates against fixed evals, keeps or discards changes to converge on higher quality. Supports skill evals (evals.json) and MCP server evals (evaluation.xml with QA pairs). Includes eval management and convergence reporting. Use when users want to automatically improve a skill's quality, improve an MCP server, create or fix evals for a skill or MCP server, or view improvement loop results. Triggers on \"autoresearch\", \"improve skill automatically\", \"auto-improve\", \"skill improvement loop\", \"run improvement loop\", \"eval doctor\", \"fix evals\", \"create evals for skill\", \"skill quality\", \"autonomous improvement\", \"improve MCP server\", \"MCP eval\".\nargument-hint: [--eval-doctor | --report | --iterations N] \u003Cskill-path>\n---\n\n# Autoresearch\n\nAutonomous skill improvement loop. Modify → evaluate → keep\u002Fdiscard → repeat.\n\n**CRITICAL: This skill MUST actually execute all commands and create real files on disk.** Do NOT simulate, describe, or document what \"would\" happen. Every `mkdir`, `python3`, `rm`, and file write must be a real tool invocation that produces real filesystem artifacts. If a step says \"create directory X,\" you must run `mkdir -p X` via a Bash tool call and verify it exists. Transcripts must reflect actual execution, not hypothetical walkthroughs.\n\n## Mode Detection\n\nParse the user's input to determine which mode to run:\n\n1. **Full loop** (default): `\u002Fautoresearch \u003Cskill-path>` or `\u002Fautoresearch \u003Cskill-path> --iterations N`\n2. **Eval doctor**: `\u002Fautoresearch --eval-doctor \u003Cskill-path>`\n3. **Report**: `\u002Fautoresearch --report \u003Cworkspace-path>`\n\nExtract:\n- `skill_path`: Path to the skill or MCP server directory\n- `mode`: One of `loop`, `eval-doctor`, `report`\n- `max_iterations`: Number of iterations (default: 5, max: 10)\n\n## Prerequisites\n\nBefore running any mode, locate skill-creator:\n\n```bash\nSKILL_CREATOR=$(find ${CLAUDE_CONFIG_DIR:-${HOME}\u002F.claude}\u002Fplugins\u002Fcache\u002Fclaude-plugins-official\u002Fskill-creator\u002F -name \"SKILL.md\" -path \"*\u002Fskills\u002Fskill-creator\u002F*\" -print -quit 2>\u002Fdev\u002Fnull | xargs dirname)\n```\n\nIf not found, tell the user: \"The skill-creator plugin is required. Install it with: `claude plugins add skill-creator`\"\n\nAlso verify the skill path and detect artifact type:\n1. If `{skill_path}\u002Fevals\u002Fevaluation.xml` exists → set `ARTIFACT_TYPE=mcp-server`\n   Else if `{skill_path}\u002Fevals\u002Fevals.json` exists → set `ARTIFACT_TYPE=skill`\n   Else → error: \"No evals found. Run `\u002Fautoresearch --eval-doctor {skill_path}` to create them.\"\n2. For `ARTIFACT_TYPE=skill`: Check `{skill_path}\u002FSKILL.md` exists\n3. For `ARTIFACT_TYPE=mcp-server`: Verify a server entry point exists (package.json, main .py\u002F.ts file)\n\n## Script Paths\n\nAll scripts are in this skill's `scripts\u002F` directory:\n\n```bash\nSCRIPTS_DIR=\"${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fscripts\"\n```\n\nUsage:\n```bash\npython3 -c \"import sys; sys.path.insert(0, '${SCRIPTS_DIR}'); from snapshot import snapshot; from pathlib import Path; snapshot(Path('src'), Path('dst'))\"\n```\n\n---\n\n## Mode 1: Full Improvement Loop\n\nRead `references\u002Falgorithm.md` for the complete specification. Summary below.\n\n### Step 1: Initialize Workspace\n\nRun these commands via Bash tool calls (do NOT just describe them — actually execute them):\n\n```bash\nWORKSPACE=\"${skill_path}\u002F..\u002F$(basename ${skill_path})-autoresearch\"\nmkdir -p \"${WORKSPACE}\"\n```\n\n1. **Snapshot v0** (immutable baseline):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import snapshot; from pathlib import Path\n   snapshot(Path('${skill_path}'), Path('${WORKSPACE}\u002Fv0'))\n   \"\n   ```\n\n2. **Copy candidate** (mutable working copy):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import snapshot; from pathlib import Path\n   snapshot(Path('${skill_path}'), Path('${WORKSPACE}\u002Fcandidate'))\n   \"\n   ```\n\n3. **Evaluate baseline** (Step 2 below), get score_0\n4. **Log baseline**:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from results_log import append; from pathlib import Path\n   append(Path('${WORKSPACE}\u002Fresults.tsv'), {\n       'iteration': '0', 'score': '${score_0}', 'best_score': '${score_0}',\n       'action': 'baseline', 'changelog': 'Initial evaluation'\n   })\n   \"\n   ```\n\n### Step 2: Evaluate Candidate\n\n**If `ARTIFACT_TYPE=mcp-server`**: Use MCP QA evaluation (see Step 2-MCP below).\n**If `ARTIFACT_TYPE=skill`**: Use skill evaluation (this section).\n\n**CRITICAL: Each eval execution MUST produce visible tool calls in the transcript.** The eval subagent must actually run Bash commands, read files, and write outputs using real tool invocations. The transcript must show these tool calls — not narrative summaries like \"Eval 1: scored 4\u002F5\". If the transcript only contains descriptions of what happened without visible Bash\u002FRead\u002FWrite tool calls for each eval, the evaluation is invalid.\n\nFor each eval case in `evals\u002Fevals.json`:\n\n1. Create run directory via Bash: `mkdir -p ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F`\n2. Execute the eval by spawning a subagent (Agent or Task tool). The subagent MUST use real tool calls (Bash, Read, Write, Edit) to execute the skill and produce outputs — every step must be a visible tool invocation in the transcript, not a narrated summary:\n\n```\nExecute this task using REAL tool calls (Bash, Read, Write). Every action must be a visible tool invocation, not a description.\n- Read the skill at: ${WORKSPACE}\u002Fcandidate\u002FSKILL.md\n- Follow the skill's instructions to accomplish this task: {eval_case.prompt}\n- Input files: {eval_case.files or \"none\"}\n- Deterministic checks: {eval_case.deterministic_checks or \"none\"} (optional, run automatically in step 3.5)\n- Save all outputs to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F\n- Save a transcript of your work to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Ftranscript.md\nIMPORTANT: Your transcript must contain actual tool call results, not prose descriptions of what you did.\n```\n\n3.5. Run deterministic checks (if the eval case has a `deterministic_checks` field):\n\n```bash\npython3 -c \"\nimport sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom deterministic_checker import run_deterministic_checks\nfrom pathlib import Path\n\nchecks = json.loads(Path('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevals.json').read_text())\neval_case = [e for e in (checks if isinstance(checks, list) else checks.get('evals', checks)) if str(e.get('id')) == '${eval_id}'][0]\ndet_checks = eval_case.get('deterministic_checks', [])\nif det_checks:\n    result = run_deterministic_checks(\n        det_checks,\n        Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Foutputs\u002F'),\n        env={'OUTPUTS_DIR': '${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Foutputs\u002F'}\n    )\n    Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fdeterministic-results.json').write_text(\n        json.dumps(result, indent=2)\n    )\n    print(f'Deterministic: {result[\\\"summary\\\"][\\\"passed\\\"]}\u002F{result[\\\"summary\\\"][\\\"total\\\"]} passed')\n\"\n```\n\n4. Grade by spawning a grader subagent that reads `${SKILL_CREATOR}\u002Fagents\u002Fgrader.md`:\n\n```\nYou are a grader. Read and follow the instructions in: ${SKILL_CREATOR}\u002Fagents\u002Fgrader.md\n\nGrade these expectations against the execution results:\n- expectations: {eval_case.expectations}\n- deterministic_checks: {eval_case.deterministic_checks or \"none\"} (optional, results merged in step 4.5)\n- transcript_path: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Ftranscript.md\n- outputs_dir: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F\n\nWrite grading.json to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Fgrading.json\n```\n\n4.5. Merge deterministic results into grading (if deterministic-results.json exists):\n\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom deterministic_checker import merge_deterministic_into_grading\nfrom pathlib import Path\n\ndet = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fdeterministic-results.json')\ngrading = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fgrading.json')\nif det.exists() and grading.exists():\n    merge_deterministic_into_grading(det, grading)\n    print('Merged deterministic results into grading.json')\n\"\n```\n\n5. Compute composite score:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from score import compute_score; from pathlib import Path\n   print(compute_score(Path('${WORKSPACE}'), ${iteration}))\n   \"\n   ```\n\n### Step 2-MCP: Evaluate Candidate (MCP Server Mode)\n\nWhen `ARTIFACT_TYPE=mcp-server`, use XML QA evaluation instead of skill evals:\n\n1. Parse the evaluation file:\n   ```bash\n   python3 -c \"\n   import sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from xml_eval_parser import parse_evaluation_xml\n   qa_pairs = parse_evaluation_xml('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevaluation.xml')\n   print(json.dumps(qa_pairs, indent=2))\n   \"\n   ```\n\n2. For each QA pair, create the run directory and spawn a subagent that uses the MCP tools:\n   ```bash\n   mkdir -p ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Foutputs\u002F\n   ```\n\n   Spawn a subagent:\n   ```\n   You are evaluating an MCP server. Use the available MCP tools to answer this question.\n\n   Question: {qa_pair.question}\n\n   Think step by step. Use the MCP tools available to you.\n   When you have your final answer, write ONLY the answer (nothing else) to:\n   ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Foutputs\u002Fanswer.txt\n\n   Also save a transcript of your work to:\n   ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Ftranscript.md\n   ```\n\n3. After all QA pairs are evaluated, convert results to grading.json:\n   ```bash\n   python3 -c \"\n   import sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from xml_eval_parser import parse_evaluation_xml, write_per_question_grading\n   from pathlib import Path\n\n   qa_pairs = parse_evaluation_xml('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevaluation.xml')\n   results = []\n   for qa in qa_pairs:\n       answer_file = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-' + qa['id'] + '\u002Foutputs\u002Fanswer.txt')\n       actual = answer_file.read_text().strip() if answer_file.exists() else ''\n       results.append({\n           'id': qa['id'], 'question': qa['question'],\n           'expected': qa['expected_answer'], 'actual': actual\n       })\n\n   write_per_question_grading(results, Path('${WORKSPACE}\u002Fiteration-${i}'))\n   from xml_eval_parser import qa_results_to_grading\n   summary = qa_results_to_grading(results)['summary']\n   print(f'MCP Eval: {summary[\\\"passed\\\"]}\u002F{summary[\\\"total\\\"]} QA pairs correct')\n   \"\n   ```\n\n4. Compute score using the SAME `score.py` (unchanged):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from score import compute_score; from pathlib import Path\n   print(compute_score(Path('${WORKSPACE}'), ${iteration}))\n   \"\n   ```\n\n**Note**: After the improver modifies MCP server source code, wait for the dev server to reload before evaluating:\n```bash\nsleep ${RELOAD_DELAY_SECONDS:-3}\n```\n\n### Step 3: Improvement Loop\n\nFor each iteration i = 1 to max_iterations:\n\n**3a. Modify** — Spawn the improver agent (read `agents\u002Fimprover.md`):\n\n```\nYou are a skill improver. Read and follow: ${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fimprover.md\n\nInputs:\n- candidate_path: ${WORKSPACE}\u002Fcandidate\u002F\n- grading_results: ${WORKSPACE}\u002Fiteration-{i-1}\u002F*\u002Fgrading.json\n- history: ${WORKSPACE}\u002Fresults.tsv\n- iteration: {i}\n\nImprove the candidate skill to achieve higher eval pass rates.\n```\n\n**3b. Evaluate** — Run Step 2 on the modified candidate.\n\n**3c. Keep or Discard**:\n- If `score_i > best_score`: snapshot candidate to `v{i}\u002F`, update best\n- If `score_i \u003C= best_score`: restore candidate from best snapshot\n\n**3d. Log** — Append to results.tsv\n\n**3d½. Update Dashboard** — Regenerate the HTML dashboard after each iteration so it can be viewed mid-loop:\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom dashboard import generate_dashboard; from pathlib import Path\nhtml = generate_dashboard(Path('${WORKSPACE}'))\nPath('${WORKSPACE}\u002Fdashboard.html').write_text(html)\nprint('Dashboard updated: ${WORKSPACE}\u002Fdashboard.html')\n\"\n```\n\n**3e. Check Abort Conditions**:\n- `best_score >= 1.0` → Stop (perfect)\n- Last 3 actions all \"reverted\" → Stop (stuck)\n\n### Step 4: Finalize\n\n1. Generate final dashboard and copy to a persistent location (before workspace cleanup):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from dashboard import generate_dashboard; from pathlib import Path\n   html = generate_dashboard(Path('${WORKSPACE}'))\n   Path('${WORKSPACE}\u002Fdashboard.html').write_text(html)\n   # Copy to sibling of skill so it survives workspace cleanup\n   out = Path('${skill_path}').parent \u002F '$(basename ${skill_path})-dashboard.html'\n   out.write_text(html)\n   print(f'Dashboard saved: {out}')\n   \"\n   ```\n\n2. Spawn convergence reporter (read `agents\u002Fconvergence-reporter.md`):\n   ```\n   You are a convergence reporter. Read and follow:\n   ${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fconvergence-reporter.md\n\n   Inputs:\n   - workspace: ${WORKSPACE}\n   - v0_path: ${WORKSPACE}\u002Fv0\u002F\n   - best_path: ${WORKSPACE}\u002Fv{best_version}\u002F\n   - dashboard_path: ${skill_path}\u002F..\u002F$(basename ${skill_path})-dashboard.html\n   ```\n\n3. Show the report and diff to the user\n4. Ask: \"Apply the best version (v{N}, score {S}) to the original skill? [y\u002Fn]\"\n5. If confirmed:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import restore; from pathlib import Path\n   restore(Path('${WORKSPACE}\u002Fv${best_version}'), Path('${skill_path}'))\n   \"\n   ```\n\n6. **Open and clean up dashboard** — the persistent dashboard copy is a viewing artifact, not a repo resource. Open it for the user, then offer to remove it:\n   ```bash\n   DASHBOARD_FILE=\"${skill_path}\u002F..\u002F$(basename ${skill_path})-dashboard.html\"\n   if [ -f \"${DASHBOARD_FILE}\" ]; then\n     open \"${DASHBOARD_FILE}\"\n   fi\n   ```\n   Ask: \"Remove `$(basename ${skill_path})-dashboard.html`? [y\u002Fn]\"\n   If confirmed:\n   ```bash\n   rm -f \"${DASHBOARD_FILE}\"\n   ```\n   The dashboard file must never be committed — it is gitignored via `*-dashboard.html` as a safety net.\n\n7. **Clean up workspace** — always remove the workspace after finalization, regardless of whether changes were applied:\n   ```bash\n   rm -rf \"${WORKSPACE}\"\n   ```\n   The workspace is a transient working directory. It must never persist after the loop completes — results are captured in the convergence report and applied changes live in the skill directory.\n\n---\n\n## Mode 2: Eval Doctor\n\nSpawn the eval-doctor agent (read `agents\u002Feval-doctor.md`):\n\n```\nYou are an eval doctor. Read and follow:\n${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Feval-doctor.md\n\nInputs:\n- skill_path: ${skill_path}\n- prior_grading: \u003Cpaths to any existing grading.json files, or \"none\">\n\nCreate or improve evals for this skill.\n```\n\nAfter the eval-doctor completes:\n\n**If `ARTIFACT_TYPE=skill`** (default):\n1. Validate `evals\u002Fevals.json` has valid JSON with required fields\n2. Verify each eval case has at least one `deterministic_check` entry — deterministic checks are the primary value-add of the eval-doctor. Aim for at least 50% deterministic coverage (deterministic checks \u002F total assertions). String-presence checks (`file_contains`, `file_not_contains`) should be used wherever an expectation uses \"must contain\" \u002F \"must NOT contain\" language, reserving LLM expectations only for semantic or structural judgments.\n3. Report how many eval cases were created\u002Fmodified and the deterministic check ratio\n\n**If `ARTIFACT_TYPE=mcp-server`**:\n1. Validate `evals\u002Fevaluation.xml` has valid XML with `\u003Cevaluation>\u002F\u003Cqa_pair>` elements\n2. Verify each `\u003Cqa_pair>` has `\u003Cquestion>` and `\u003Canswer>` children\n3. Report QA pair count (aim for 8-15 pairs for a typical MCP server)\n\n4. **MANDATORY — suggest running the full loop.** You MUST end your response with this exact suggestion (substituting the actual path): \"Evals ready. Run `\u002Fautoresearch ${skill_path}` to start the improvement loop.\" This line must appear as the final output so the user knows the next step. Do not omit it.\n\n---\n\n## Mode 3: Report\n\nRead `results.tsv` to determine the best version number before spawning.\n\nThe report MUST display every iteration present in `results.tsv` — show the complete score trajectory table with all rows. For each iteration, show the score, best score, action (kept\u002Freverted\u002Fbaseline), and changelog summary. If a version was reverted, explicitly state it was reverted and why. If a version was kept, state the score improvement (e.g., \"score improved from X to Y\").\n\nGenerate the HTML dashboard first:\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom dashboard import generate_dashboard; from pathlib import Path\nhtml = generate_dashboard(Path('${workspace_path}'))\nout = Path('${workspace_path}\u002Fdashboard.html')\nout.write_text(html)\nprint(f'Dashboard: {out}')\n\"\n```\n\nSpawn the convergence reporter (read `agents\u002Fconvergence-reporter.md`):\n\n```\nYou are a convergence reporter. Read and follow:\n${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fconvergence-reporter.md\n\nInputs:\n- workspace: ${workspace_path}\n- v0_path: ${workspace_path}\u002Fv0\u002F\n- best_path: ${workspace_path}\u002Fv{best_version}\u002F\n- dashboard_path: ${workspace_path}\u002Fdashboard.html\n```\n\n---\n\n## Safety Rails\n\n- **Never modify the original skill** during the loop — work only on `candidate\u002F`\n- **Snapshots are immutable** — never write to `v{N}\u002F` after creation\n- **Evals frozen during improvement** — the improver must not touch `evals\u002F`\n- **User confirmation required** before applying changes to the original\n- **Abort on stuck** — 3 consecutive reverts stops the loop\n- **Workspace cleanup mandatory** — `rm -rf ${WORKSPACE}` after finalization; workspaces are transient and must never persist\n\n## References\n\n- `references\u002Falgorithm.md` — Complete loop algorithm specification\n- `references\u002Feval-quality-rubric.md` — What makes good evals\n- `agents\u002Fimprover.md` — How the improver modifies skills\n- `agents\u002Feval-doctor.md` — How the eval-doctor creates\u002Ffixes evals\n- `agents\u002Fconvergence-reporter.md` — How convergence reports are generated\n- `references\u002Fmcp-eval-guide.md` — MCP server evaluation format and QA pair authoring guide\n","# Autoresearch\n\nAutonomous skill improvement loop. Modify → evaluate → keep\u002Fdiscard → repeat.\n\n**CRITICAL: This skill MUST actually execute all commands and create real files on disk.** Do NOT simulate, describe, or document what \"would\" happen. Every `mkdir`, `python3`, `rm`, and file write must be a real tool invocation that produces real filesystem artifacts. If a step says \"create directory X,\" you must run `mkdir -p X` via a Bash tool call and verify it exists. Transcripts must reflect actual execution, not hypothetical walkthroughs.\n\n## Mode Detection\n\nParse the user's input to determine which mode to run:\n\n1. **Full loop** (default): `\u002Fautoresearch \u003Cskill-path>` or `\u002Fautoresearch \u003Cskill-path> --iterations N`\n2. **Eval doctor**: `\u002Fautoresearch --eval-doctor \u003Cskill-path>`\n3. **Report**: `\u002Fautoresearch --report \u003Cworkspace-path>`\n\nExtract:\n- `skill_path`: Path to the skill or MCP server directory\n- `mode`: One of `loop`, `eval-doctor`, `report`\n- `max_iterations`: Number of iterations (default: 5, max: 10)\n\n## Prerequisites\n\nBefore running any mode, locate skill-creator:\n\n```bash\nSKILL_CREATOR=$(find ${CLAUDE_CONFIG_DIR:-${HOME}\u002F.claude}\u002Fplugins\u002Fcache\u002Fclaude-plugins-official\u002Fskill-creator\u002F -name \"SKILL.md\" -path \"*\u002Fskills\u002Fskill-creator\u002F*\" -print -quit 2>\u002Fdev\u002Fnull | xargs dirname)\n```\n\nIf not found, tell the user: \"The skill-creator plugin is required. Install it with: `claude plugins add skill-creator`\"\n\nAlso verify the skill path and detect artifact type:\n1. If `{skill_path}\u002Fevals\u002Fevaluation.xml` exists → set `ARTIFACT_TYPE=mcp-server`\n   Else if `{skill_path}\u002Fevals\u002Fevals.json` exists → set `ARTIFACT_TYPE=skill`\n   Else → error: \"No evals found. Run `\u002Fautoresearch --eval-doctor {skill_path}` to create them.\"\n2. For `ARTIFACT_TYPE=skill`: Check `{skill_path}\u002FSKILL.md` exists\n3. For `ARTIFACT_TYPE=mcp-server`: Verify a server entry point exists (package.json, main .py\u002F.ts file)\n\n## Script Paths\n\nAll scripts are in this skill's `scripts\u002F` directory:\n\n```bash\nSCRIPTS_DIR=\"${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fscripts\"\n```\n\nUsage:\n```bash\npython3 -c \"import sys; sys.path.insert(0, '${SCRIPTS_DIR}'); from snapshot import snapshot; from pathlib import Path; snapshot(Path('src'), Path('dst'))\"\n```\n\n---\n\n## Mode 1: Full Improvement Loop\n\nRead `references\u002Falgorithm.md` for the complete specification. Summary below.\n\n### Step 1: Initialize Workspace\n\nRun these commands via Bash tool calls (do NOT just describe them — actually execute them):\n\n```bash\nWORKSPACE=\"${skill_path}\u002F..\u002F$(basename ${skill_path})-autoresearch\"\nmkdir -p \"${WORKSPACE}\"\n```\n\n1. **Snapshot v0** (immutable baseline):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import snapshot; from pathlib import Path\n   snapshot(Path('${skill_path}'), Path('${WORKSPACE}\u002Fv0'))\n   \"\n   ```\n\n2. **Copy candidate** (mutable working copy):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import snapshot; from pathlib import Path\n   snapshot(Path('${skill_path}'), Path('${WORKSPACE}\u002Fcandidate'))\n   \"\n   ```\n\n3. **Evaluate baseline** (Step 2 below), get score_0\n4. **Log baseline**:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from results_log import append; from pathlib import Path\n   append(Path('${WORKSPACE}\u002Fresults.tsv'), {\n       'iteration': '0', 'score': '${score_0}', 'best_score': '${score_0}',\n       'action': 'baseline', 'changelog': 'Initial evaluation'\n   })\n   \"\n   ```\n\n### Step 2: Evaluate Candidate\n\n**If `ARTIFACT_TYPE=mcp-server`**: Use MCP QA evaluation (see Step 2-MCP below).\n**If `ARTIFACT_TYPE=skill`**: Use skill evaluation (this section).\n\n**CRITICAL: Each eval execution MUST produce visible tool calls in the transcript.** The eval subagent must actually run Bash commands, read files, and write outputs using real tool invocations. The transcript must show these tool calls — not narrative summaries like \"Eval 1: scored 4\u002F5\". If the transcript only contains descriptions of what happened without visible Bash\u002FRead\u002FWrite tool calls for each eval, the evaluation is invalid.\n\nFor each eval case in `evals\u002Fevals.json`:\n\n1. Create run directory via Bash: `mkdir -p ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F`\n2. Execute the eval by spawning a subagent (Agent or Task tool). The subagent MUST use real tool calls (Bash, Read, Write, Edit) to execute the skill and produce outputs — every step must be a visible tool invocation in the transcript, not a narrated summary:\n\n```\nExecute this task using REAL tool calls (Bash, Read, Write). Every action must be a visible tool invocation, not a description.\n- Read the skill at: ${WORKSPACE}\u002Fcandidate\u002FSKILL.md\n- Follow the skill's instructions to accomplish this task: {eval_case.prompt}\n- Input files: {eval_case.files or \"none\"}\n- Deterministic checks: {eval_case.deterministic_checks or \"none\"} (optional, run automatically in step 3.5)\n- Save all outputs to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F\n- Save a transcript of your work to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Ftranscript.md\nIMPORTANT: Your transcript must contain actual tool call results, not prose descriptions of what you did.\n```\n\n3.5. Run deterministic checks (if the eval case has a `deterministic_checks` field):\n\n```bash\npython3 -c \"\nimport sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom deterministic_checker import run_deterministic_checks\nfrom pathlib import Path\n\nchecks = json.loads(Path('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevals.json').read_text())\neval_case = [e for e in (checks if isinstance(checks, list) else checks.get('evals', checks)) if str(e.get('id')) == '${eval_id}'][0]\ndet_checks = eval_case.get('deterministic_checks', [])\nif det_checks:\n    result = run_deterministic_checks(\n        det_checks,\n        Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Foutputs\u002F'),\n        env={'OUTPUTS_DIR': '${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Foutputs\u002F'}\n    )\n    Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fdeterministic-results.json').write_text(\n        json.dumps(result, indent=2)\n    )\n    print(f'Deterministic: {result[\\\"summary\\\"][\\\"passed\\\"]}\u002F{result[\\\"summary\\\"][\\\"total\\\"]} passed')\n\"\n```\n\n4. Grade by spawning a grader subagent that reads `${SKILL_CREATOR}\u002Fagents\u002Fgrader.md`:\n\n```\nYou are a grader. Read and follow the instructions in: ${SKILL_CREATOR}\u002Fagents\u002Fgrader.md\n\nGrade these expectations against the execution results:\n- expectations: {eval_case.expectations}\n- deterministic_checks: {eval_case.deterministic_checks or \"none\"} (optional, results merged in step 4.5)\n- transcript_path: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Ftranscript.md\n- outputs_dir: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Foutputs\u002F\n\nWrite grading.json to: ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{id}\u002Fgrading.json\n```\n\n4.5. Merge deterministic results into grading (if deterministic-results.json exists):\n\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom deterministic_checker import merge_deterministic_into_grading\nfrom pathlib import Path\n\ndet = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fdeterministic-results.json')\ngrading = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-${eval_id}\u002Fgrading.json')\nif det.exists() and grading.exists():\n    merge_deterministic_into_grading(det, grading)\n    print('Merged deterministic results into grading.json')\n\"\n```\n\n5. Compute composite score:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from score import compute_score; from pathlib import Path\n   print(compute_score(Path('${WORKSPACE}'), ${iteration}))\n   \"\n   ```\n\n### Step 2-MCP: Evaluate Candidate (MCP Server Mode)\n\nWhen `ARTIFACT_TYPE=mcp-server`, use XML QA evaluation instead of skill evals:\n\n1. Parse the evaluation file:\n   ```bash\n   python3 -c \"\n   import sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from xml_eval_parser import parse_evaluation_xml\n   qa_pairs = parse_evaluation_xml('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevaluation.xml')\n   print(json.dumps(qa_pairs, indent=2))\n   \"\n   ```\n\n2. For each QA pair, create the run directory and spawn a subagent that uses the MCP tools:\n   ```bash\n   mkdir -p ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Foutputs\u002F\n   ```\n\n   Spawn a subagent:\n   ```\n   You are evaluating an MCP server. Use the available MCP tools to answer this question.\n\n   Question: {qa_pair.question}\n\n   Think step by step. Use the MCP tools available to you.\n   When you have your final answer, write ONLY the answer (nothing else) to:\n   ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Foutputs\u002Fanswer.txt\n\n   Also save a transcript of your work to:\n   ${WORKSPACE}\u002Fiteration-{i}\u002Feval-{qa_id}\u002Ftranscript.md\n   ```\n\n3. After all QA pairs are evaluated, convert results to grading.json:\n   ```bash\n   python3 -c \"\n   import sys, json; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from xml_eval_parser import parse_evaluation_xml, write_per_question_grading\n   from pathlib import Path\n\n   qa_pairs = parse_evaluation_xml('${WORKSPACE}\u002Fcandidate\u002Fevals\u002Fevaluation.xml')\n   results = []\n   for qa in qa_pairs:\n       answer_file = Path('${WORKSPACE}\u002Fiteration-${i}\u002Feval-' + qa['id'] + '\u002Foutputs\u002Fanswer.txt')\n       actual = answer_file.read_text().strip() if answer_file.exists() else ''\n       results.append({\n           'id': qa['id'], 'question': qa['question'],\n           'expected': qa['expected_answer'], 'actual': actual\n       })\n\n   write_per_question_grading(results, Path('${WORKSPACE}\u002Fiteration-${i}'))\n   from xml_eval_parser import qa_results_to_grading\n   summary = qa_results_to_grading(results)['summary']\n   print(f'MCP Eval: {summary[\\\"passed\\\"]}\u002F{summary[\\\"total\\\"]} QA pairs correct')\n   \"\n   ```\n\n4. Compute score using the SAME `score.py` (unchanged):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from score import compute_score; from pathlib import Path\n   print(compute_score(Path('${WORKSPACE}'), ${iteration}))\n   \"\n   ```\n\n**Note**: After the improver modifies MCP server source code, wait for the dev server to reload before evaluating:\n```bash\nsleep ${RELOAD_DELAY_SECONDS:-3}\n```\n\n### Step 3: Improvement Loop\n\nFor each iteration i = 1 to max_iterations:\n\n**3a. Modify** — Spawn the improver agent (read `agents\u002Fimprover.md`):\n\n```\nYou are a skill improver. Read and follow: ${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fimprover.md\n\nInputs:\n- candidate_path: ${WORKSPACE}\u002Fcandidate\u002F\n- grading_results: ${WORKSPACE}\u002Fiteration-{i-1}\u002F*\u002Fgrading.json\n- history: ${WORKSPACE}\u002Fresults.tsv\n- iteration: {i}\n\nImprove the candidate skill to achieve higher eval pass rates.\n```\n\n**3b. Evaluate** — Run Step 2 on the modified candidate.\n\n**3c. Keep or Discard**:\n- If `score_i > best_score`: snapshot candidate to `v{i}\u002F`, update best\n- If `score_i \u003C= best_score`: restore candidate from best snapshot\n\n**3d. Log** — Append to results.tsv\n\n**3d½. Update Dashboard** — Regenerate the HTML dashboard after each iteration so it can be viewed mid-loop:\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom dashboard import generate_dashboard; from pathlib import Path\nhtml = generate_dashboard(Path('${WORKSPACE}'))\nPath('${WORKSPACE}\u002Fdashboard.html').write_text(html)\nprint('Dashboard updated: ${WORKSPACE}\u002Fdashboard.html')\n\"\n```\n\n**3e. Check Abort Conditions**:\n- `best_score >= 1.0` → Stop (perfect)\n- Last 3 actions all \"reverted\" → Stop (stuck)\n\n### Step 4: Finalize\n\n1. Generate final dashboard and copy to a persistent location (before workspace cleanup):\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from dashboard import generate_dashboard; from pathlib import Path\n   html = generate_dashboard(Path('${WORKSPACE}'))\n   Path('${WORKSPACE}\u002Fdashboard.html').write_text(html)\n   # Copy to sibling of skill so it survives workspace cleanup\n   out = Path('${skill_path}').parent \u002F '$(basename ${skill_path})-dashboard.html'\n   out.write_text(html)\n   print(f'Dashboard saved: {out}')\n   \"\n   ```\n\n2. Spawn convergence reporter (read `agents\u002Fconvergence-reporter.md`):\n   ```\n   You are a convergence reporter. Read and follow:\n   ${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fconvergence-reporter.md\n\n   Inputs:\n   - workspace: ${WORKSPACE}\n   - v0_path: ${WORKSPACE}\u002Fv0\u002F\n   - best_path: ${WORKSPACE}\u002Fv{best_version}\u002F\n   - dashboard_path: ${skill_path}\u002F..\u002F$(basename ${skill_path})-dashboard.html\n   ```\n\n3. Show the report and diff to the user\n4. Ask: \"Apply the best version (v{N}, score {S}) to the original skill? [y\u002Fn]\"\n5. If confirmed:\n   ```bash\n   python3 -c \"\n   import sys; sys.path.insert(0, '${SCRIPTS_DIR}')\n   from snapshot import restore; from pathlib import Path\n   restore(Path('${WORKSPACE}\u002Fv${best_version}'), Path('${skill_path}'))\n   \"\n   ```\n\n6. **Open and clean up dashboard** — the persistent dashboard copy is a viewing artifact, not a repo resource. Open it for the user, then offer to remove it:\n   ```bash\n   DASHBOARD_FILE=\"${skill_path}\u002F..\u002F$(basename ${skill_path})-dashboard.html\"\n   if [ -f \"${DASHBOARD_FILE}\" ]; then\n     open \"${DASHBOARD_FILE}\"\n   fi\n   ```\n   Ask: \"Remove `$(basename ${skill_path})-dashboard.html`? [y\u002Fn]\"\n   If confirmed:\n   ```bash\n   rm -f \"${DASHBOARD_FILE}\"\n   ```\n   The dashboard file must never be committed — it is gitignored via `*-dashboard.html` as a safety net.\n\n7. **Clean up workspace** — always remove the workspace after finalization, regardless of whether changes were applied:\n   ```bash\n   rm -rf \"${WORKSPACE}\"\n   ```\n   The workspace is a transient working directory. It must never persist after the loop completes — results are captured in the convergence report and applied changes live in the skill directory.\n\n---\n\n## Mode 2: Eval Doctor\n\nSpawn the eval-doctor agent (read `agents\u002Feval-doctor.md`):\n\n```\nYou are an eval doctor. Read and follow:\n${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Feval-doctor.md\n\nInputs:\n- skill_path: ${skill_path}\n- prior_grading: \u003Cpaths to any existing grading.json files, or \"none\">\n\nCreate or improve evals for this skill.\n```\n\nAfter the eval-doctor completes:\n\n**If `ARTIFACT_TYPE=skill`** (default):\n1. Validate `evals\u002Fevals.json` has valid JSON with required fields\n2. Verify each eval case has at least one `deterministic_check` entry — deterministic checks are the primary value-add of the eval-doctor. Aim for at least 50% deterministic coverage (deterministic checks \u002F total assertions). String-presence checks (`file_contains`, `file_not_contains`) should be used wherever an expectation uses \"must contain\" \u002F \"must NOT contain\" language, reserving LLM expectations only for semantic or structural judgments.\n3. Report how many eval cases were created\u002Fmodified and the deterministic check ratio\n\n**If `ARTIFACT_TYPE=mcp-server`**:\n1. Validate `evals\u002Fevaluation.xml` has valid XML with `\u003Cevaluation>\u002F\u003Cqa_pair>` elements\n2. Verify each `\u003Cqa_pair>` has `\u003Cquestion>` and `\u003Canswer>` children\n3. Report QA pair count (aim for 8-15 pairs for a typical MCP server)\n\n4. **MANDATORY — suggest running the full loop.** You MUST end your response with this exact suggestion (substituting the actual path): \"Evals ready. Run `\u002Fautoresearch ${skill_path}` to start the improvement loop.\" This line must appear as the final output so the user knows the next step. Do not omit it.\n\n---\n\n## Mode 3: Report\n\nRead `results.tsv` to determine the best version number before spawning.\n\nThe report MUST display every iteration present in `results.tsv` — show the complete score trajectory table with all rows. For each iteration, show the score, best score, action (kept\u002Freverted\u002Fbaseline), and changelog summary. If a version was reverted, explicitly state it was reverted and why. If a version was kept, state the score improvement (e.g., \"score improved from X to Y\").\n\nGenerate the HTML dashboard first:\n```bash\npython3 -c \"\nimport sys; sys.path.insert(0, '${SCRIPTS_DIR}')\nfrom dashboard import generate_dashboard; from pathlib import Path\nhtml = generate_dashboard(Path('${workspace_path}'))\nout = Path('${workspace_path}\u002Fdashboard.html')\nout.write_text(html)\nprint(f'Dashboard: {out}')\n\"\n```\n\nSpawn the convergence reporter (read `agents\u002Fconvergence-reporter.md`):\n\n```\nYou are a convergence reporter. Read and follow:\n${PLUGIN_ROOT}\u002Fskills\u002Fautoresearch\u002Fagents\u002Fconvergence-reporter.md\n\nInputs:\n- workspace: ${workspace_path}\n- v0_path: ${workspace_path}\u002Fv0\u002F\n- best_path: ${workspace_path}\u002Fv{best_version}\u002F\n- dashboard_path: ${workspace_path}\u002Fdashboard.html\n```\n\n---\n\n## Safety Rails\n\n- **Never modify the original skill** during the loop — work only on `candidate\u002F`\n- **Snapshots are immutable** — never write to `v{N}\u002F` after creation\n- **Evals frozen during improvement** — the improver must not touch `evals\u002F`\n- **User confirmation required** before applying changes to the original\n- **Abort on stuck** — 3 consecutive reverts stops the loop\n- **Workspace cleanup mandatory** — `rm -rf ${WORKSPACE}` after finalization; workspaces are transient and must never persist\n\n## References\n\n- `references\u002Falgorithm.md` — Complete loop algorithm specification\n- `references\u002Feval-quality-rubric.md` — What makes good evals\n- `agents\u002Fimprover.md` — How the improver modifies skills\n- `agents\u002Feval-doctor.md` — How the eval-doctor creates\u002Ffixes evals\n- `agents\u002Fconvergence-reporter.md` — How convergence reports are generated\n- `references\u002Fmcp-eval-guide.md` — MCP server evaluation format and QA pair authoring guide\n",{},"main","a83d6fed9d0cfa076d86aa431b542fe2c2d7e4f5","skills\u002Fautoresearch",0,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch","https:\u002F\u002Fgithub.com\u002Fzircote-plugins","2026-03-27 17:46:10",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add zircote-plugins\u002Fautoresearch --skill autoresearch",{"tool":40,"command":41},"bunx","bunx skills add zircote-plugins\u002Fautoresearch --skill autoresearch",{"tool":43,"command":44},"pnpm","pnpm dlx skills add zircote-plugins\u002Fautoresearch --skill autoresearch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002FSKILL.md",true,[48,54,58,62,66,70,74,78,84,88,92,96,100,104,108],{"path":49,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":52,"sourceHtmlUrl":53},"agents\u002Fconvergence-reporter.md","REFERENCE","参考文档",4450,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fagents\u002Fconvergence-reporter.md",{"path":55,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":56,"sourceHtmlUrl":57},"agents\u002Feval-doctor.md",7657,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fagents\u002Feval-doctor.md",{"path":59,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":60,"sourceHtmlUrl":61},"agents\u002Fimprover.md",6262,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fagents\u002Fimprover.md",{"path":63,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":64,"sourceHtmlUrl":65},"evals\u002Fevals.json",9261,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fevals\u002Fevals.json",{"path":67,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Falgorithm.md",10014,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Freferences\u002Falgorithm.md",{"path":71,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Feval-quality-rubric.md",7087,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Freferences\u002Feval-quality-rubric.md",{"path":75,"resourceType":50,"resourceTypeDesc":51,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Fmcp-eval-guide.md",4700,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Freferences\u002Fmcp-eval-guide.md",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002F__init__.py","SCRIPT","脚本",66,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002F__init__.py",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fdashboard.py",22195,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fdashboard.py",{"path":89,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fdeterministic_checker.py",15306,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fdeterministic_checker.py",{"path":93,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Fdiff_report.py",1694,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fdiff_report.py",{"path":97,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fresults_log.py",1710,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fresults_log.py",{"path":101,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fscore.py",1374,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fscore.py",{"path":105,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":106,"sourceHtmlUrl":107},"scripts\u002Fsnapshot.py",2317,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fsnapshot.py",{"path":109,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fxml_eval_parser.py",5048,"https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Fskills\u002Fautoresearch\u002Fscripts\u002Fxml_eval_parser.py",[113,124,130,136],{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":120,"publishedAt":22},"01M6GTEPJMKTVBD2DDF8ZS3MBB","sample-skill","A sample skill for testing autoresearch.","https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-skill\u002FSKILL.md",[119],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},[121,122,123,5],"sample skill","sample","testing",{"skillNo":125,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":129,"publishedAt":22},"01M6GTEKN6VYPNQ31MR2DQRMPJ","https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-skill-autoresearch\u002Fv1\u002FSKILL.md",[128],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},[121,122,123,5],{"skillNo":131,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":135,"publishedAt":22},"01M6GTEGD1AWZVM3HQ7N14GV23","https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-skill-autoresearch\u002Fv0\u002FSKILL.md",[134],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},[121,122,123,5],{"skillNo":137,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":141,"publishedAt":22},"01M6GTED64RAA1PQ6APBTETFPR","https:\u002F\u002Fgithub.com\u002Fzircote-plugins\u002Fautoresearch\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-skill-autoresearch\u002Fcandidate\u002FSKILL.md",[140],{"categoryNo":17,"categoryName":18,"taxonomyType":19,"taxonomyTypeDesc":20},[121,122,123,5]]