[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-configure-axis":3,"mdc-fd1n06-key":37,"related-org-netlify-configure-axis":4626,"related-repo-netlify-configure-axis":4796},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":32,"sourceUrl":35,"mdContent":36},"configure-axis","configure AXIS agent evaluation scenarios","Author AXIS (Agent Experience Index Score) scenarios and axis.config.json for a project. Use when the user asks to set up AXIS, add a scenario, write or edit axis.config.json, or evaluate an AI agent with AXIS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Configuration","configuration","tag",{"name":17,"slug":18,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Agents","agents",32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",null,0,[29,30,31,18],"agent-experience","ai","ax",{"repoUrl":24,"stars":23,"forks":27,"topics":33,"description":34},[29,30,31,18],"Open source tooling and scoring framework to measure how well services work for AI agents.","https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis\u002Ftree\u002FHEAD\u002Fskills\u002Fconfigure-axis","---\nname: configure-axis\ndescription: Author AXIS (Agent Experience Index Score) scenarios and axis.config.json for a project. Use when the user asks to set up AXIS, add a scenario, write or edit axis.config.json, or evaluate an AI agent with AXIS.\n---\n\n# Configure AXIS\n\nAXIS (Agent Experience Index Score) is a synthetic testing framework for AI agents. This skill teaches you to author the two files an AXIS user maintains:\n\n1. **Scenarios** under `scenarios\u002F` (or any path the config points at): one JSON file per task the agent will be asked to perform.\n2. **`axis.config.json`** at the project root: which agents to run, where scenarios live, and what is shared across them.\n\n## When to use this skill\n\nTrigger phrases include \"set up AXIS\", \"add an AXIS scenario\", \"write an axis.config.json\", \"evaluate my agent with AXIS\", \"score my agent on X\".\n\nBefore authoring, do this:\n\n1. Look for an existing `axis.config.json` (or `axis.config.{js,ts}`) at the project root. If one exists, read it; do not overwrite without confirmation.\n2. List the existing scenarios directory if present. Match its naming and style.\n3. If no config exists, suggest running `npx @netlify\u002Faxis init` first, or scaffold one yourself using the patterns below.\n\n## Conceptual model\n\nFor each scenario, AXIS runs every configured agent against the same prompt in an isolated workspace, then scores each run on four dimensions and produces an HTML + JSON report.\n\n- **Goal achievement** (default weight 0.4): did the agent satisfy the judge's checks?\n- **Environment** (0.2): did filesystem \u002F shell \u002F network operations succeed reliably?\n- **Service** (0.2): did external services (APIs, MCP servers) respond reliably?\n- **Agent** (0.2): were the agent's decisions sound across every tool call?\n\nRefer to the framework's output as the **AXIS Result**. The acronym expands to **Agent Experience Index Score**.\n\n## Authoring a scenario\n\nA scenario is a JSON file under the scenarios directory. The file path (without extension, relative to that directory) becomes the scenario's `key`. Only `name`, `prompt`, and `judge` are required.\n\n> The annotated examples below are labeled `jsonc` for documentation only. They contain `\u002F\u002F comments` and trailing commas. Real `.json` files do NOT support either. When copying these examples into output, strip every `\u002F\u002F` comment line and every trailing comma. Plain JSON examples (in the Recipes section) are safe to copy verbatim.\n\nFull annotated shape:\n\n```jsonc\n{\n  \u002F\u002F Display name shown in reports.\n  \"name\": \"Refactor utility module\",\n\n  \u002F\u002F Set true to exclude this scenario from runs without deleting it.\n  \"skip\": false,\n\n  \u002F\u002F Run before the agent starts. Two action types: run_script and copy.\n  \"setup\": [\n    { \"action\": \"run_script\", \"command\": \"git init -q && git add -A && git commit -q -m init\" },\n    { \"action\": \"copy\", \"match\": \"fixtures\u002Fsample-repo\u002F**\", \"destination\": \".\" },\n  ],\n\n  \u002F\u002F The task. Be specific and verifiable.\n  \"prompt\": \"Refactor src\u002Futils.js to split it into two files: src\u002Fstrings.js and src\u002Fnumbers.js. Update all import sites and ensure `npm test` still passes.\",\n\n  \u002F\u002F Judge: either a single string OR an array of weighted checks.\n  \u002F\u002F Use the array form for multi-criterion scoring. Weight is optional;\n  \u002F\u002F remaining weight is distributed equally across unweighted entries.\n  \"judge\": [\n    { \"check\": \"src\u002Fstrings.js exists and exports the string utilities\", \"weight\": 0.3 },\n    { \"check\": \"src\u002Fnumbers.js exists and exports the numeric utilities\", \"weight\": 0.3 },\n    { \"check\": \"All import sites are updated and reference the new files\", \"weight\": 0.2 },\n    { \"check\": \"`npm test` passes after the change\", \"weight\": 0.2 },\n  ],\n\n  \u002F\u002F Run after the agent finishes, before scoring.\n  \"teardown\": [{ \"action\": \"run_script\", \"command\": \"rm -rf node_modules\" }],\n\n  \u002F\u002F Only these agents run this scenario. Overrides the top-level agents list.\n  \"agents\": [\"claude-code\"],\n\n  \u002F\u002F Skills passed to the agent under test. Each entry is a local path,\n  \u002F\u002F GitHub shorthand (owner\u002Frepo), or a full GitHub URL.\n  \"skills\": [\".\u002Fskills\u002Frepo-conventions\", \"anthropics\u002Fskills\"],\n\n  \u002F\u002F MCP servers available to the agent for this scenario only. Merged\n  \u002F\u002F with the top-level mcp_servers from axis.config.json.\n  \"mcp_servers\": {\n    \"filesystem\": { \"type\": \"stdio\", \"command\": \"npx\", \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"] },\n  },\n\n  \u002F\u002F Per-scenario time\u002Ftoken limits. Defaults: 15 minutes, no token cap.\n  \"limits\": { \"time_minutes\": 10, \"tokens\": 200000 },\n\n  \u002F\u002F Glob patterns (relative to the workspace) of files to capture into the\n  \u002F\u002F report after teardown. Merged with the top-level artifacts list.\n  \"artifacts\": [\"src\u002F**\u002F*.js\", \"test-output.log\"],\n}\n```\n\n### Judge: string vs weighted array\n\n- **String** when one statement captures the whole pass\u002Ffail bar: `\"The agent should have written summary.md with at least three sentences.\"`\n- **Weighted array** when there are multiple checks the agent could partially satisfy. Each entry has a `check` (the statement) and an optional `weight` (sum your weights to 1.0; unweighted entries split the remainder evenly).\n\nWrite checks as **observable facts a third party could verify**, not vibes. \"Agent wrote a file named `summary.md` with at least three sentences\" beats \"Agent did a good job summarizing\".\n\n### Lifecycle actions\n\nTwo action types are allowed in `setup` and `teardown`:\n\n- `{ \"action\": \"run_script\", \"command\": \"\u003Cshell command>\" }`: runs with the agent's workspace as cwd. Available env vars include `AXIS_PHASE` (`setup`\u002F`teardown`), `AXIS_WORKSPACE`, and `AXIS_OUTPUT` (a file path where the script can append markdown that will surface in the report).\n- `{ \"action\": \"copy\", \"match\": \"\u003Cglob>\", \"destination\": \"\u003Cworkspace-relative path>\" }`: copies files matching `match` (resolved relative to the config file) into `destination` (relative to the workspace). The path of each matched file relative to the longest non-glob prefix of `match` is preserved under `destination`.\n\n### Variants\n\nWhen a scenario should run multiple times with small differences, define `variants`. The parent does not run by itself; each variant inherits all parent fields and may override `prompt`, `judge`, `setup`, `teardown`, `agents`, `skills`, `mcp_servers`, `limits`, `artifacts`, or `skip`.\n\n```jsonc\n{\n  \"name\": \"Summarize the docs\",\n  \"prompt\": \"Summarize the contents of docs\u002F into summary.md.\",\n  \"judge\": \"summary.md exists and is at least 200 words.\",\n  \"variants\": [\n    { \"name\": \"baseline\" },\n    { \"name\": \"concise\", \"prompt\": \"Summarize the contents of docs\u002F into summary.md in fewer than 100 words.\" },\n  ],\n}\n```\n\nEach variant's key is `{scenarioKey}@{variantName}`. Variant names must match `\u002F^[a-zA-Z0-9_-]+$\u002F`.\n\n## Authoring `axis.config.json`\n\nSits at the project root. Minimum viable file:\n\n```json\n{\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [\"claude-code\"]\n}\n```\n\nFull annotated shape:\n\n```jsonc\n{\n  \u002F\u002F Shown in report headers.\n  \"name\": \"My Project\",\n\n  \u002F\u002F Where scenarios come from. Three forms:\n  \u002F\u002F  - \".\u002Fpath\" (a directory, walked recursively for *.json scenarios)\n  \u002F\u002F  - [\".\u002Fpath1\", \".\u002Fscenarios\u002Fspecial.json\"] (mix of dirs and single files)\n  \u002F\u002F  - Mixed with inline scenarios (objects with a required \"key\" field) when\n  \u002F\u002F    authoring axis.config.{js,ts} programmatically.\n  \u002F\u002F  - Git URLs (\"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\") cloned into .axis\u002Fremotes\u002F\n  \u002F\u002F    and merged from their own axis.config.\n  \u002F\u002F Defaults to \".\u002Fscenarios\" when omitted.\n  \"scenarios\": [\".\u002Fscenarios\", \"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fagent-runner-orchestrator\"],\n\n  \u002F\u002F Agents to evaluate. Strings are shorthand for { \"agent\": \"\u003Cname>\" }.\n  \"agents\": [\n    \"claude-code\",\n    { \"agent\": \"claude-code\", \"model\": \"claude-opus-4-6\" },\n    { \"agent\": \"codex\", \"model\": \"gpt-5-codex\" },\n    {\n      \"agent\": \"echo\", \u002F\u002F custom adapter (see \"adapters\" below)\n      \"command\": \".\u002Fbin\u002Fmy-agent\", \u002F\u002F CLI override for custom adapters\n      \"scenarios\": [\"hello-world\"], \u002F\u002F restrict this agent to a subset (scenario keys)\n      \"skills\": [\".\u002Fskills\u002Fmy-conventions\"], \u002F\u002F per-agent skills\n      \"flags\": { \"debug\": true, \"max-turns\": \"5\" },\n    },\n    \u002F\u002F Provider-prefixed models (e.g. OpenRouter) are supported. The raw string\n    \u002F\u002F is passed verbatim to the CLI via --model; the derived agent name slugifies\n    \u002F\u002F the slashes, so this becomes \"claude-code|anthropic-claude-3.5-sonnet\".\n    { \"agent\": \"claude-code\", \"model\": \"anthropic\u002Fclaude-3.5-sonnet\" },\n  ],\n\n  \u002F\u002F Agents used to score runs. When omitted, each agent judges itself\n  \u002F\u002F (it scores its own transcript). Otherwise the first entry whose adapter\n  \u002F\u002F name differs from the run's own agent is picked; if every entry matches,\n  \u002F\u002F the first entry is used. Order is precedence.\n  \"judging\": {\n    \"agents\": [{ \"agent\": \"claude-code\", \"model\": \"claude-opus-4-7\" }, \"codex\"],\n  },\n\n  \u002F\u002F MCP servers shared across all agents and all scenarios. Two types:\n  \u002F\u002F stdio (local subprocess) and http (remote endpoint).\n  \"mcp_servers\": {\n    \"filesystem\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"],\n      \"env\": { \"DEBUG\": \"1\" },\n    },\n    \"search\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsearch\",\n      \"headers\": { \"Authorization\": \"Bearer ${SEARCH_TOKEN}\" },\n    },\n  },\n\n  \u002F\u002F Skills shared across all agents. Each entry is one of:\n  \u002F\u002F  - local path: \".\u002Fskills\u002Fmy-skill\"\n  \u002F\u002F  - GitHub shorthand: \"anthropics\u002Fskills\"\n  \u002F\u002F  - GitHub URL: \"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills\"\n  \"skills\": [\".\u002Fskills\u002Frepo-conventions\"],\n\n  \u002F\u002F Glob patterns (relative to each scenario's workspace) of files captured\n  \u002F\u002F into the report after teardown. Merged with per-scenario artifacts.\n  \"artifacts\": [\".\u002F*.md\", \"src\u002F**\u002F*.js\"],\n\n  \u002F\u002F Custom adapters. Keys are adapter names referenced by \"agents\" entries;\n  \u002F\u002F values are paths (relative to this config) to JS\u002FTS modules that export\n  \u002F\u002F an AgentAdapter as default or as `adapter`.\n  \"adapters\": { \"echo\": \".\u002Fadapters\u002Fecho.ts\" },\n\n  \u002F\u002F Extra env vars allowed through to agent processes. PATH, HOME, and the\n  \u002F\u002F default agent API keys (ANTHROPIC_API_KEY, CODEX_API_KEY, GEMINI_API_KEY)\n  \u002F\u002F pass through automatically; entries here are merged on top.\n  \"env\": [\"GITHUB_TOKEN\", \"MY_FEATURE_FLAG\"],\n\n  \u002F\u002F Run-wide settings.\n  \"settings\": {\n    \"concurrency\": 8,\n    \"limits\": {\n      \"run\": { \"time_minutes\": 60, \"tokens\": 5000000 },\n      \"scenario\": { \"time_minutes\": 10, \"tokens\": 200000 },\n    },\n    \"remotes\": { \"maxDepth\": 1 },\n  },\n\n  \u002F\u002F CLI-only lifecycle hooks. beforeAll runs once before any scenarios start;\n  \u002F\u002F afterAll runs once after every scenario is scored. Scripts execute with\n  \u002F\u002F cwd set to the config directory. afterAll receives AXIS_REPORT_DIR,\n  \u002F\u002F AXIS_TOTAL, AXIS_COMPLETED, AXIS_FAILED, AXIS_DURATION_MS as env vars.\n  \u002F\u002F These are not fired by the programmatic run() API.\n  \"beforeAll\": [{ \"action\": \"run_script\", \"command\": \"npm install --silent\" }],\n  \"afterAll\": [{ \"action\": \"run_script\", \"command\": \"echo Report at $AXIS_REPORT_DIR\" }],\n}\n```\n\n### Built-in adapters\n\n- `claude-code`: Anthropic Claude Code CLI. Requires `ANTHROPIC_API_KEY`.\n- `codex`: OpenAI Codex CLI. Requires `CODEX_API_KEY`.\n- `gemini`: Google Gemini CLI. Requires `GEMINI_API_KEY`.\n\nAny other name in `agents[].agent` must be declared in the `adapters` map and point to a module that exports an `AgentAdapter`.\n\n### Judging precedence\n\nFor each run, AXIS finds a judge by scanning `judging.agents` in order and picking the first entry whose adapter name differs from the agent being scored. If every entry matches, the first entry is used. When `judging` is omitted, the run's own agent judges itself.\n\n## Recipes\n\n### Minimal scenario\n\n```json\n{\n  \"name\": \"Hello world\",\n  \"prompt\": \"Say hello.\",\n  \"judge\": \"The agent should say hello.\"\n}\n```\n\n### Realistic scenario with setup, weighted judge, and teardown\n\n```json\n{\n  \"name\": \"Debug and fix a broken script\",\n  \"setup\": [\n    {\n      \"action\": \"run_script\",\n      \"command\": \"mkdir -p \u002Ftmp\u002Fdemo && echo 'function add(a, b) { return a - b; }' > \u002Ftmp\u002Fdemo\u002Fadd.js\"\n    }\n  ],\n  \"prompt\": \"There is a JavaScript file at \u002Ftmp\u002Fdemo\u002Fadd.js with a bug. Run it, fix it, and verify the fix.\",\n  \"judge\": [\n    { \"check\": \"Agent ran the script and observed the wrong output\", \"weight\": 0.25 },\n    { \"check\": \"Agent identified the subtraction-instead-of-addition bug\", \"weight\": 0.25 },\n    { \"check\": \"Agent fixed the bug in the file\", \"weight\": 0.25 },\n    { \"check\": \"Agent re-ran the script and confirmed correct output\", \"weight\": 0.25 }\n  ],\n  \"teardown\": [{ \"action\": \"run_script\", \"command\": \"rm -rf \u002Ftmp\u002Fdemo\" }]\n}\n```\n\n### Multi-agent comparison config\n\n```json\n{\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [\n    { \"agent\": \"claude-code\", \"model\": \"claude-sonnet-4-6\" },\n    { \"agent\": \"claude-code\", \"model\": \"claude-opus-4-6\" },\n    \"codex\"\n  ],\n  \"judging\": {\n    \"agents\": [{ \"agent\": \"claude-code\", \"model\": \"claude-opus-4-7\" }]\n  }\n}\n```\n\n### Custom adapter wiring\n\nModule `adapters\u002Fecho.ts`:\n\n```ts\nimport { createAgentAdapter } from \"@netlify\u002Faxis\";\n\nexport default createAgentAdapter\u003C{ stdout: string }>({\n  name: \"echo\",\n  resolveCommand: () => ({ command: \"echo\", prefixArgs: [] }),\n  buildArgs: (input) => [input.prompt],\n  initialState: () => ({ stdout: \"\" }),\n  streamConfig: {\n    mode: \"aggregate\",\n    onChunk: (chunk, ctx) => {\n      ctx.state.stdout += chunk;\n    },\n  },\n  getResult: (ctx) => ({ result: ctx.state.stdout.trim() || null }),\n});\n```\n\n`axis.config.json`:\n\n```json\n{\n  \"adapters\": { \"echo\": \".\u002Fadapters\u002Fecho.ts\" },\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [{ \"agent\": \"echo\" }]\n}\n```\n\n## Reading AXIS reports\n\nFor interpreting reports, comparing runs, finding regressions, or explaining scores, use the companion skill `using-axis`. It covers the report file layout, dimension semantics, calibration, and citation rules in depth. This skill stays focused on authoring.\n\n## Rules you must follow\n\n1. Refer to the score as the **AXIS Result**, never \"AXIS Score\" (which reads as \"score score\"). The acronym is **Agent Experience Index Score**, never \"eXperience\".\n2. Do not use em dashes in any prose, comment, or judge check you author. Use a comma, semicolon, colon, parenthesis, or a new sentence instead.\n3. Do not invent fields. The authoritative schemas live at `src\u002Ftypes\u002Fscenario.ts` and `src\u002Ftypes\u002Fconfig.ts` in the netlify\u002Faxis repo. If you are unsure whether a field exists, omit it and tell the user where to look.\n4. Judge checks must be specific and verifiable. Prefer \"Agent wrote a file named X with property Y\" over \"Agent did well at the task\".\n5. The default per-scenario time limit is 15 minutes. Only override it when the task warrants a different ceiling.\n6. For `skills` entries, pick the simplest form that works: prefer a local path during development, GitHub shorthand (`owner\u002Frepo`) for public skills, full URLs only when needed.\n7. When `judge` is a weighted array, sum your weights to 1.0 (or leave some unweighted to split the remainder; do not exceed 1.0).\n8. Variant names match `\u002F^[a-zA-Z0-9_-]+$\u002F`. Scenario keys are derived from the file path; do not set `key` for file-based scenarios.\n9. `beforeAll` and `afterAll` only fire from the CLI. Do not rely on them when the user runs AXIS programmatically via `run()`.\n10. In an isolated AXIS scenario workspace, do NOT try to verify your authored file by executing it, importing it, or cross-checking it against an installed copy of `@netlify\u002Faxis`. The workspace is intentionally minimal: no `node_modules`, no git history. That means: no `tsc`, no `node -e \"require(...)\"`, no `git diff` or `git status`, no `npm install`, and no reading or grepping the globally-installed `@netlify\u002Faxis` package outside the workspace (paths like `\u002Fusr\u002Flocal\u002Flib\u002Fnode_modules\u002F@netlify\u002Faxis`, `\u002Fopt\u002Fhomebrew\u002F...\u002Fnode_modules\u002F@netlify\u002Faxis`, or any `node_modules\u002F@netlify\u002Faxis` you did not put there yourself). Every such command fails or wastes interactions and tanks the environment and agent dimensions. Write the file once, correctly, against the schema you already know from this skill. The AXIS judge inspects your output directly; you do not need to prove it works first.\n11. When asked to make a targeted edit (add a field, fix a single bug), edit ONLY what the prompt specifies. Do not reorganize, reformat, or add unrelated fields. Preserve every field the prompt did not name. The judge often checks \"original X and Y fields are preserved unchanged\".\n12. Minimize unnecessary tool calls. Every tool call is evaluated as an agent decision; redundant `ls`, repeated `cat` of the same file, exploratory `find` that you do not act on, all tank the agent dimension via the `necessity` sub-dimension. Read each file you need once. Write each edit once. Stop when the task is done.\n13. Field-name discipline. AXIS uses snake_case in all JSON config fields: `mcp_servers` not `mcpServers`, `time_minutes` not `timeMinutes`, `run_script` not `runScript` or `shell`. The deprecated alias `rubric` exists for backwards compat; prefer `judge`. Other commonly-invented names that are WRONG: `criteria`, `success_criteria`, `expected`, `tasks`, `evaluators`, `models`, `timeout`, `maxTokens`, `tokenLimit`, `timeoutMinutes`.\n\n## Validation\n\nAfter authoring or editing, ask the user to run:\n\n```\nnpx @netlify\u002Faxis run --help\n```\n\nto confirm the CLI is installed, then:\n\n```\nnpx @netlify\u002Faxis run\n```\n\nThe config loader validates the file on load and prints actionable errors (missing required fields, unknown adapter names, malformed limits, invalid skill sources, etc.). Fix any reported errors before declaring the work done.\n\n## Reference\n\n- Documentation site: https:\u002F\u002Faxis.run\n- Scenario schema: `src\u002Ftypes\u002Fscenario.ts` in the netlify\u002Faxis repo\n- Config schema: `src\u002Ftypes\u002Fconfig.ts` in the netlify\u002Faxis repo\n- Validator (source of truth for accepted shapes): `src\u002Fconfig\u002Fvalidator.ts`\n\n## Installing this skill\n\nTo make this skill available to your AI tool in a project, drop it under `.claude\u002Fskills\u002F`:\n\n```\nmkdir -p .claude\u002Fskills\u002Fconfigure-axis\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fnetlify\u002Faxis\u002Fmain\u002Fskills\u002Fconfigure-axis\u002FSKILL.md \\\n  -o .claude\u002Fskills\u002Fconfigure-axis\u002FSKILL.md\n```\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,50,56,95,102,107,112,153,159,164,208,227,233,270,311,316,759,766,811,831,837,858,949,955,1033,1109,1129,1140,1145,1254,1258,2062,2068,2124,2152,2158,2179,2185,2191,2317,2323,2916,2922,3290,3296,3308,3896,3905,4072,4078,4091,4097,4497,4503,4508,4518,4523,4532,4537,4543,4593,4599,4611,4620],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Configure AXIS",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"AXIS (Agent Experience Index Score) is a synthetic testing framework for AI agents. This skill teaches you to author the two files an AXIS user maintains:",{"type":43,"tag":57,"props":58,"children":59},"ol",{},[60,81],{"type":43,"tag":61,"props":62,"children":63},"li",{},[64,70,72,79],{"type":43,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":48,"value":69},"Scenarios",{"type":48,"value":71}," under ",{"type":43,"tag":73,"props":74,"children":76},"code",{"className":75},[],[77],{"type":48,"value":78},"scenarios\u002F",{"type":48,"value":80}," (or any path the config points at): one JSON file per task the agent will be asked to perform.",{"type":43,"tag":61,"props":82,"children":83},{},[84,93],{"type":43,"tag":65,"props":85,"children":86},{},[87],{"type":43,"tag":73,"props":88,"children":90},{"className":89},[],[91],{"type":48,"value":92},"axis.config.json",{"type":48,"value":94}," at the project root: which agents to run, where scenarios live, and what is shared across them.",{"type":43,"tag":96,"props":97,"children":99},"h2",{"id":98},"when-to-use-this-skill",[100],{"type":48,"value":101},"When to use this skill",{"type":43,"tag":51,"props":103,"children":104},{},[105],{"type":48,"value":106},"Trigger phrases include \"set up AXIS\", \"add an AXIS scenario\", \"write an axis.config.json\", \"evaluate my agent with AXIS\", \"score my agent on X\".",{"type":43,"tag":51,"props":108,"children":109},{},[110],{"type":48,"value":111},"Before authoring, do this:",{"type":43,"tag":57,"props":113,"children":114},{},[115,135,140],{"type":43,"tag":61,"props":116,"children":117},{},[118,120,125,127,133],{"type":48,"value":119},"Look for an existing ",{"type":43,"tag":73,"props":121,"children":123},{"className":122},[],[124],{"type":48,"value":92},{"type":48,"value":126}," (or ",{"type":43,"tag":73,"props":128,"children":130},{"className":129},[],[131],{"type":48,"value":132},"axis.config.{js,ts}",{"type":48,"value":134},") at the project root. If one exists, read it; do not overwrite without confirmation.",{"type":43,"tag":61,"props":136,"children":137},{},[138],{"type":48,"value":139},"List the existing scenarios directory if present. Match its naming and style.",{"type":43,"tag":61,"props":141,"children":142},{},[143,145,151],{"type":48,"value":144},"If no config exists, suggest running ",{"type":43,"tag":73,"props":146,"children":148},{"className":147},[],[149],{"type":48,"value":150},"npx @netlify\u002Faxis init",{"type":48,"value":152}," first, or scaffold one yourself using the patterns below.",{"type":43,"tag":96,"props":154,"children":156},{"id":155},"conceptual-model",[157],{"type":48,"value":158},"Conceptual model",{"type":43,"tag":51,"props":160,"children":161},{},[162],{"type":48,"value":163},"For each scenario, AXIS runs every configured agent against the same prompt in an isolated workspace, then scores each run on four dimensions and produces an HTML + JSON report.",{"type":43,"tag":165,"props":166,"children":167},"ul",{},[168,178,188,198],{"type":43,"tag":61,"props":169,"children":170},{},[171,176],{"type":43,"tag":65,"props":172,"children":173},{},[174],{"type":48,"value":175},"Goal achievement",{"type":48,"value":177}," (default weight 0.4): did the agent satisfy the judge's checks?",{"type":43,"tag":61,"props":179,"children":180},{},[181,186],{"type":43,"tag":65,"props":182,"children":183},{},[184],{"type":48,"value":185},"Environment",{"type":48,"value":187}," (0.2): did filesystem \u002F shell \u002F network operations succeed reliably?",{"type":43,"tag":61,"props":189,"children":190},{},[191,196],{"type":43,"tag":65,"props":192,"children":193},{},[194],{"type":48,"value":195},"Service",{"type":48,"value":197}," (0.2): did external services (APIs, MCP servers) respond reliably?",{"type":43,"tag":61,"props":199,"children":200},{},[201,206],{"type":43,"tag":65,"props":202,"children":203},{},[204],{"type":48,"value":205},"Agent",{"type":48,"value":207}," (0.2): were the agent's decisions sound across every tool call?",{"type":43,"tag":51,"props":209,"children":210},{},[211,213,218,220,225],{"type":48,"value":212},"Refer to the framework's output as the ",{"type":43,"tag":65,"props":214,"children":215},{},[216],{"type":48,"value":217},"AXIS Result",{"type":48,"value":219},". The acronym expands to ",{"type":43,"tag":65,"props":221,"children":222},{},[223],{"type":48,"value":224},"Agent Experience Index Score",{"type":48,"value":226},".",{"type":43,"tag":96,"props":228,"children":230},{"id":229},"authoring-a-scenario",[231],{"type":48,"value":232},"Authoring a scenario",{"type":43,"tag":51,"props":234,"children":235},{},[236,238,244,246,252,254,260,262,268],{"type":48,"value":237},"A scenario is a JSON file under the scenarios directory. The file path (without extension, relative to that directory) becomes the scenario's ",{"type":43,"tag":73,"props":239,"children":241},{"className":240},[],[242],{"type":48,"value":243},"key",{"type":48,"value":245},". Only ",{"type":43,"tag":73,"props":247,"children":249},{"className":248},[],[250],{"type":48,"value":251},"name",{"type":48,"value":253},", ",{"type":43,"tag":73,"props":255,"children":257},{"className":256},[],[258],{"type":48,"value":259},"prompt",{"type":48,"value":261},", and ",{"type":43,"tag":73,"props":263,"children":265},{"className":264},[],[266],{"type":48,"value":267},"judge",{"type":48,"value":269}," are required.",{"type":43,"tag":271,"props":272,"children":273},"blockquote",{},[274],{"type":43,"tag":51,"props":275,"children":276},{},[277,279,285,287,293,295,301,303,309],{"type":48,"value":278},"The annotated examples below are labeled ",{"type":43,"tag":73,"props":280,"children":282},{"className":281},[],[283],{"type":48,"value":284},"jsonc",{"type":48,"value":286}," for documentation only. They contain ",{"type":43,"tag":73,"props":288,"children":290},{"className":289},[],[291],{"type":48,"value":292},"\u002F\u002F comments",{"type":48,"value":294}," and trailing commas. Real ",{"type":43,"tag":73,"props":296,"children":298},{"className":297},[],[299],{"type":48,"value":300},".json",{"type":48,"value":302}," files do NOT support either. When copying these examples into output, strip every ",{"type":43,"tag":73,"props":304,"children":306},{"className":305},[],[307],{"type":48,"value":308},"\u002F\u002F",{"type":48,"value":310}," comment line and every trailing comma. Plain JSON examples (in the Recipes section) are safe to copy verbatim.",{"type":43,"tag":51,"props":312,"children":313},{},[314],{"type":48,"value":315},"Full annotated shape:",{"type":43,"tag":317,"props":318,"children":322},"pre",{"className":319,"code":320,"language":284,"meta":321,"style":321},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \u002F\u002F Display name shown in reports.\n  \"name\": \"Refactor utility module\",\n\n  \u002F\u002F Set true to exclude this scenario from runs without deleting it.\n  \"skip\": false,\n\n  \u002F\u002F Run before the agent starts. Two action types: run_script and copy.\n  \"setup\": [\n    { \"action\": \"run_script\", \"command\": \"git init -q && git add -A && git commit -q -m init\" },\n    { \"action\": \"copy\", \"match\": \"fixtures\u002Fsample-repo\u002F**\", \"destination\": \".\" },\n  ],\n\n  \u002F\u002F The task. Be specific and verifiable.\n  \"prompt\": \"Refactor src\u002Futils.js to split it into two files: src\u002Fstrings.js and src\u002Fnumbers.js. Update all import sites and ensure `npm test` still passes.\",\n\n  \u002F\u002F Judge: either a single string OR an array of weighted checks.\n  \u002F\u002F Use the array form for multi-criterion scoring. Weight is optional;\n  \u002F\u002F remaining weight is distributed equally across unweighted entries.\n  \"judge\": [\n    { \"check\": \"src\u002Fstrings.js exists and exports the string utilities\", \"weight\": 0.3 },\n    { \"check\": \"src\u002Fnumbers.js exists and exports the numeric utilities\", \"weight\": 0.3 },\n    { \"check\": \"All import sites are updated and reference the new files\", \"weight\": 0.2 },\n    { \"check\": \"`npm test` passes after the change\", \"weight\": 0.2 },\n  ],\n\n  \u002F\u002F Run after the agent finishes, before scoring.\n  \"teardown\": [{ \"action\": \"run_script\", \"command\": \"rm -rf node_modules\" }],\n\n  \u002F\u002F Only these agents run this scenario. Overrides the top-level agents list.\n  \"agents\": [\"claude-code\"],\n\n  \u002F\u002F Skills passed to the agent under test. Each entry is a local path,\n  \u002F\u002F GitHub shorthand (owner\u002Frepo), or a full GitHub URL.\n  \"skills\": [\".\u002Fskills\u002Frepo-conventions\", \"anthropics\u002Fskills\"],\n\n  \u002F\u002F MCP servers available to the agent for this scenario only. Merged\n  \u002F\u002F with the top-level mcp_servers from axis.config.json.\n  \"mcp_servers\": {\n    \"filesystem\": { \"type\": \"stdio\", \"command\": \"npx\", \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"] },\n  },\n\n  \u002F\u002F Per-scenario time\u002Ftoken limits. Defaults: 15 minutes, no token cap.\n  \"limits\": { \"time_minutes\": 10, \"tokens\": 200000 },\n\n  \u002F\u002F Glob patterns (relative to the workspace) of files to capture into the\n  \u002F\u002F report after teardown. Merged with the top-level artifacts list.\n  \"artifacts\": [\"src\u002F**\u002F*.js\", \"test-output.log\"],\n}\n","",[323],{"type":43,"tag":73,"props":324,"children":325},{"__ignoreMap":321},[326,337,346,355,365,374,383,391,400,409,418,427,436,444,453,462,470,479,488,497,506,515,524,533,542,550,558,567,576,584,593,602,609,618,627,636,644,653,662,671,680,689,697,706,715,723,732,741,750],{"type":43,"tag":327,"props":328,"children":331},"span",{"class":329,"line":330},"line",1,[332],{"type":43,"tag":327,"props":333,"children":334},{},[335],{"type":48,"value":336},"{\n",{"type":43,"tag":327,"props":338,"children":340},{"class":329,"line":339},2,[341],{"type":43,"tag":327,"props":342,"children":343},{},[344],{"type":48,"value":345},"  \u002F\u002F Display name shown in reports.\n",{"type":43,"tag":327,"props":347,"children":349},{"class":329,"line":348},3,[350],{"type":43,"tag":327,"props":351,"children":352},{},[353],{"type":48,"value":354},"  \"name\": \"Refactor utility module\",\n",{"type":43,"tag":327,"props":356,"children":358},{"class":329,"line":357},4,[359],{"type":43,"tag":327,"props":360,"children":362},{"emptyLinePlaceholder":361},true,[363],{"type":48,"value":364},"\n",{"type":43,"tag":327,"props":366,"children":368},{"class":329,"line":367},5,[369],{"type":43,"tag":327,"props":370,"children":371},{},[372],{"type":48,"value":373},"  \u002F\u002F Set true to exclude this scenario from runs without deleting it.\n",{"type":43,"tag":327,"props":375,"children":377},{"class":329,"line":376},6,[378],{"type":43,"tag":327,"props":379,"children":380},{},[381],{"type":48,"value":382},"  \"skip\": false,\n",{"type":43,"tag":327,"props":384,"children":386},{"class":329,"line":385},7,[387],{"type":43,"tag":327,"props":388,"children":389},{"emptyLinePlaceholder":361},[390],{"type":48,"value":364},{"type":43,"tag":327,"props":392,"children":394},{"class":329,"line":393},8,[395],{"type":43,"tag":327,"props":396,"children":397},{},[398],{"type":48,"value":399},"  \u002F\u002F Run before the agent starts. Two action types: run_script and copy.\n",{"type":43,"tag":327,"props":401,"children":403},{"class":329,"line":402},9,[404],{"type":43,"tag":327,"props":405,"children":406},{},[407],{"type":48,"value":408},"  \"setup\": [\n",{"type":43,"tag":327,"props":410,"children":412},{"class":329,"line":411},10,[413],{"type":43,"tag":327,"props":414,"children":415},{},[416],{"type":48,"value":417},"    { \"action\": \"run_script\", \"command\": \"git init -q && git add -A && git commit -q -m init\" },\n",{"type":43,"tag":327,"props":419,"children":421},{"class":329,"line":420},11,[422],{"type":43,"tag":327,"props":423,"children":424},{},[425],{"type":48,"value":426},"    { \"action\": \"copy\", \"match\": \"fixtures\u002Fsample-repo\u002F**\", \"destination\": \".\" },\n",{"type":43,"tag":327,"props":428,"children":430},{"class":329,"line":429},12,[431],{"type":43,"tag":327,"props":432,"children":433},{},[434],{"type":48,"value":435},"  ],\n",{"type":43,"tag":327,"props":437,"children":439},{"class":329,"line":438},13,[440],{"type":43,"tag":327,"props":441,"children":442},{"emptyLinePlaceholder":361},[443],{"type":48,"value":364},{"type":43,"tag":327,"props":445,"children":447},{"class":329,"line":446},14,[448],{"type":43,"tag":327,"props":449,"children":450},{},[451],{"type":48,"value":452},"  \u002F\u002F The task. Be specific and verifiable.\n",{"type":43,"tag":327,"props":454,"children":456},{"class":329,"line":455},15,[457],{"type":43,"tag":327,"props":458,"children":459},{},[460],{"type":48,"value":461},"  \"prompt\": \"Refactor src\u002Futils.js to split it into two files: src\u002Fstrings.js and src\u002Fnumbers.js. Update all import sites and ensure `npm test` still passes.\",\n",{"type":43,"tag":327,"props":463,"children":465},{"class":329,"line":464},16,[466],{"type":43,"tag":327,"props":467,"children":468},{"emptyLinePlaceholder":361},[469],{"type":48,"value":364},{"type":43,"tag":327,"props":471,"children":473},{"class":329,"line":472},17,[474],{"type":43,"tag":327,"props":475,"children":476},{},[477],{"type":48,"value":478},"  \u002F\u002F Judge: either a single string OR an array of weighted checks.\n",{"type":43,"tag":327,"props":480,"children":482},{"class":329,"line":481},18,[483],{"type":43,"tag":327,"props":484,"children":485},{},[486],{"type":48,"value":487},"  \u002F\u002F Use the array form for multi-criterion scoring. Weight is optional;\n",{"type":43,"tag":327,"props":489,"children":491},{"class":329,"line":490},19,[492],{"type":43,"tag":327,"props":493,"children":494},{},[495],{"type":48,"value":496},"  \u002F\u002F remaining weight is distributed equally across unweighted entries.\n",{"type":43,"tag":327,"props":498,"children":500},{"class":329,"line":499},20,[501],{"type":43,"tag":327,"props":502,"children":503},{},[504],{"type":48,"value":505},"  \"judge\": [\n",{"type":43,"tag":327,"props":507,"children":509},{"class":329,"line":508},21,[510],{"type":43,"tag":327,"props":511,"children":512},{},[513],{"type":48,"value":514},"    { \"check\": \"src\u002Fstrings.js exists and exports the string utilities\", \"weight\": 0.3 },\n",{"type":43,"tag":327,"props":516,"children":518},{"class":329,"line":517},22,[519],{"type":43,"tag":327,"props":520,"children":521},{},[522],{"type":48,"value":523},"    { \"check\": \"src\u002Fnumbers.js exists and exports the numeric utilities\", \"weight\": 0.3 },\n",{"type":43,"tag":327,"props":525,"children":527},{"class":329,"line":526},23,[528],{"type":43,"tag":327,"props":529,"children":530},{},[531],{"type":48,"value":532},"    { \"check\": \"All import sites are updated and reference the new files\", \"weight\": 0.2 },\n",{"type":43,"tag":327,"props":534,"children":536},{"class":329,"line":535},24,[537],{"type":43,"tag":327,"props":538,"children":539},{},[540],{"type":48,"value":541},"    { \"check\": \"`npm test` passes after the change\", \"weight\": 0.2 },\n",{"type":43,"tag":327,"props":543,"children":545},{"class":329,"line":544},25,[546],{"type":43,"tag":327,"props":547,"children":548},{},[549],{"type":48,"value":435},{"type":43,"tag":327,"props":551,"children":553},{"class":329,"line":552},26,[554],{"type":43,"tag":327,"props":555,"children":556},{"emptyLinePlaceholder":361},[557],{"type":48,"value":364},{"type":43,"tag":327,"props":559,"children":561},{"class":329,"line":560},27,[562],{"type":43,"tag":327,"props":563,"children":564},{},[565],{"type":48,"value":566},"  \u002F\u002F Run after the agent finishes, before scoring.\n",{"type":43,"tag":327,"props":568,"children":570},{"class":329,"line":569},28,[571],{"type":43,"tag":327,"props":572,"children":573},{},[574],{"type":48,"value":575},"  \"teardown\": [{ \"action\": \"run_script\", \"command\": \"rm -rf node_modules\" }],\n",{"type":43,"tag":327,"props":577,"children":579},{"class":329,"line":578},29,[580],{"type":43,"tag":327,"props":581,"children":582},{"emptyLinePlaceholder":361},[583],{"type":48,"value":364},{"type":43,"tag":327,"props":585,"children":587},{"class":329,"line":586},30,[588],{"type":43,"tag":327,"props":589,"children":590},{},[591],{"type":48,"value":592},"  \u002F\u002F Only these agents run this scenario. Overrides the top-level agents list.\n",{"type":43,"tag":327,"props":594,"children":596},{"class":329,"line":595},31,[597],{"type":43,"tag":327,"props":598,"children":599},{},[600],{"type":48,"value":601},"  \"agents\": [\"claude-code\"],\n",{"type":43,"tag":327,"props":603,"children":604},{"class":329,"line":23},[605],{"type":43,"tag":327,"props":606,"children":607},{"emptyLinePlaceholder":361},[608],{"type":48,"value":364},{"type":43,"tag":327,"props":610,"children":612},{"class":329,"line":611},33,[613],{"type":43,"tag":327,"props":614,"children":615},{},[616],{"type":48,"value":617},"  \u002F\u002F Skills passed to the agent under test. Each entry is a local path,\n",{"type":43,"tag":327,"props":619,"children":621},{"class":329,"line":620},34,[622],{"type":43,"tag":327,"props":623,"children":624},{},[625],{"type":48,"value":626},"  \u002F\u002F GitHub shorthand (owner\u002Frepo), or a full GitHub URL.\n",{"type":43,"tag":327,"props":628,"children":630},{"class":329,"line":629},35,[631],{"type":43,"tag":327,"props":632,"children":633},{},[634],{"type":48,"value":635},"  \"skills\": [\".\u002Fskills\u002Frepo-conventions\", \"anthropics\u002Fskills\"],\n",{"type":43,"tag":327,"props":637,"children":639},{"class":329,"line":638},36,[640],{"type":43,"tag":327,"props":641,"children":642},{"emptyLinePlaceholder":361},[643],{"type":48,"value":364},{"type":43,"tag":327,"props":645,"children":647},{"class":329,"line":646},37,[648],{"type":43,"tag":327,"props":649,"children":650},{},[651],{"type":48,"value":652},"  \u002F\u002F MCP servers available to the agent for this scenario only. Merged\n",{"type":43,"tag":327,"props":654,"children":656},{"class":329,"line":655},38,[657],{"type":43,"tag":327,"props":658,"children":659},{},[660],{"type":48,"value":661},"  \u002F\u002F with the top-level mcp_servers from axis.config.json.\n",{"type":43,"tag":327,"props":663,"children":665},{"class":329,"line":664},39,[666],{"type":43,"tag":327,"props":667,"children":668},{},[669],{"type":48,"value":670},"  \"mcp_servers\": {\n",{"type":43,"tag":327,"props":672,"children":674},{"class":329,"line":673},40,[675],{"type":43,"tag":327,"props":676,"children":677},{},[678],{"type":48,"value":679},"    \"filesystem\": { \"type\": \"stdio\", \"command\": \"npx\", \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"] },\n",{"type":43,"tag":327,"props":681,"children":683},{"class":329,"line":682},41,[684],{"type":43,"tag":327,"props":685,"children":686},{},[687],{"type":48,"value":688},"  },\n",{"type":43,"tag":327,"props":690,"children":692},{"class":329,"line":691},42,[693],{"type":43,"tag":327,"props":694,"children":695},{"emptyLinePlaceholder":361},[696],{"type":48,"value":364},{"type":43,"tag":327,"props":698,"children":700},{"class":329,"line":699},43,[701],{"type":43,"tag":327,"props":702,"children":703},{},[704],{"type":48,"value":705},"  \u002F\u002F Per-scenario time\u002Ftoken limits. Defaults: 15 minutes, no token cap.\n",{"type":43,"tag":327,"props":707,"children":709},{"class":329,"line":708},44,[710],{"type":43,"tag":327,"props":711,"children":712},{},[713],{"type":48,"value":714},"  \"limits\": { \"time_minutes\": 10, \"tokens\": 200000 },\n",{"type":43,"tag":327,"props":716,"children":718},{"class":329,"line":717},45,[719],{"type":43,"tag":327,"props":720,"children":721},{"emptyLinePlaceholder":361},[722],{"type":48,"value":364},{"type":43,"tag":327,"props":724,"children":726},{"class":329,"line":725},46,[727],{"type":43,"tag":327,"props":728,"children":729},{},[730],{"type":48,"value":731},"  \u002F\u002F Glob patterns (relative to the workspace) of files to capture into the\n",{"type":43,"tag":327,"props":733,"children":735},{"class":329,"line":734},47,[736],{"type":43,"tag":327,"props":737,"children":738},{},[739],{"type":48,"value":740},"  \u002F\u002F report after teardown. Merged with the top-level artifacts list.\n",{"type":43,"tag":327,"props":742,"children":744},{"class":329,"line":743},48,[745],{"type":43,"tag":327,"props":746,"children":747},{},[748],{"type":48,"value":749},"  \"artifacts\": [\"src\u002F**\u002F*.js\", \"test-output.log\"],\n",{"type":43,"tag":327,"props":751,"children":753},{"class":329,"line":752},49,[754],{"type":43,"tag":327,"props":755,"children":756},{},[757],{"type":48,"value":758},"}\n",{"type":43,"tag":760,"props":761,"children":763},"h3",{"id":762},"judge-string-vs-weighted-array",[764],{"type":48,"value":765},"Judge: string vs weighted array",{"type":43,"tag":165,"props":767,"children":768},{},[769,785],{"type":43,"tag":61,"props":770,"children":771},{},[772,777,779],{"type":43,"tag":65,"props":773,"children":774},{},[775],{"type":48,"value":776},"String",{"type":48,"value":778}," when one statement captures the whole pass\u002Ffail bar: ",{"type":43,"tag":73,"props":780,"children":782},{"className":781},[],[783],{"type":48,"value":784},"\"The agent should have written summary.md with at least three sentences.\"",{"type":43,"tag":61,"props":786,"children":787},{},[788,793,795,801,803,809],{"type":43,"tag":65,"props":789,"children":790},{},[791],{"type":48,"value":792},"Weighted array",{"type":48,"value":794}," when there are multiple checks the agent could partially satisfy. Each entry has a ",{"type":43,"tag":73,"props":796,"children":798},{"className":797},[],[799],{"type":48,"value":800},"check",{"type":48,"value":802}," (the statement) and an optional ",{"type":43,"tag":73,"props":804,"children":806},{"className":805},[],[807],{"type":48,"value":808},"weight",{"type":48,"value":810}," (sum your weights to 1.0; unweighted entries split the remainder evenly).",{"type":43,"tag":51,"props":812,"children":813},{},[814,816,821,823,829],{"type":48,"value":815},"Write checks as ",{"type":43,"tag":65,"props":817,"children":818},{},[819],{"type":48,"value":820},"observable facts a third party could verify",{"type":48,"value":822},", not vibes. \"Agent wrote a file named ",{"type":43,"tag":73,"props":824,"children":826},{"className":825},[],[827],{"type":48,"value":828},"summary.md",{"type":48,"value":830}," with at least three sentences\" beats \"Agent did a good job summarizing\".",{"type":43,"tag":760,"props":832,"children":834},{"id":833},"lifecycle-actions",[835],{"type":48,"value":836},"Lifecycle actions",{"type":43,"tag":51,"props":838,"children":839},{},[840,842,848,850,856],{"type":48,"value":841},"Two action types are allowed in ",{"type":43,"tag":73,"props":843,"children":845},{"className":844},[],[846],{"type":48,"value":847},"setup",{"type":48,"value":849}," and ",{"type":43,"tag":73,"props":851,"children":853},{"className":852},[],[854],{"type":48,"value":855},"teardown",{"type":48,"value":857},":",{"type":43,"tag":165,"props":859,"children":860},{},[861,909],{"type":43,"tag":61,"props":862,"children":863},{},[864,870,872,878,880,885,887,892,894,900,901,907],{"type":43,"tag":73,"props":865,"children":867},{"className":866},[],[868],{"type":48,"value":869},"{ \"action\": \"run_script\", \"command\": \"\u003Cshell command>\" }",{"type":48,"value":871},": runs with the agent's workspace as cwd. Available env vars include ",{"type":43,"tag":73,"props":873,"children":875},{"className":874},[],[876],{"type":48,"value":877},"AXIS_PHASE",{"type":48,"value":879}," (",{"type":43,"tag":73,"props":881,"children":883},{"className":882},[],[884],{"type":48,"value":847},{"type":48,"value":886},"\u002F",{"type":43,"tag":73,"props":888,"children":890},{"className":889},[],[891],{"type":48,"value":855},{"type":48,"value":893},"), ",{"type":43,"tag":73,"props":895,"children":897},{"className":896},[],[898],{"type":48,"value":899},"AXIS_WORKSPACE",{"type":48,"value":261},{"type":43,"tag":73,"props":902,"children":904},{"className":903},[],[905],{"type":48,"value":906},"AXIS_OUTPUT",{"type":48,"value":908}," (a file path where the script can append markdown that will surface in the report).",{"type":43,"tag":61,"props":910,"children":911},{},[912,918,920,926,928,934,936,941,943,948],{"type":43,"tag":73,"props":913,"children":915},{"className":914},[],[916],{"type":48,"value":917},"{ \"action\": \"copy\", \"match\": \"\u003Cglob>\", \"destination\": \"\u003Cworkspace-relative path>\" }",{"type":48,"value":919},": copies files matching ",{"type":43,"tag":73,"props":921,"children":923},{"className":922},[],[924],{"type":48,"value":925},"match",{"type":48,"value":927}," (resolved relative to the config file) into ",{"type":43,"tag":73,"props":929,"children":931},{"className":930},[],[932],{"type":48,"value":933},"destination",{"type":48,"value":935}," (relative to the workspace). The path of each matched file relative to the longest non-glob prefix of ",{"type":43,"tag":73,"props":937,"children":939},{"className":938},[],[940],{"type":48,"value":925},{"type":48,"value":942}," is preserved under ",{"type":43,"tag":73,"props":944,"children":946},{"className":945},[],[947],{"type":48,"value":933},{"type":48,"value":226},{"type":43,"tag":760,"props":950,"children":952},{"id":951},"variants",[953],{"type":48,"value":954},"Variants",{"type":43,"tag":51,"props":956,"children":957},{},[958,960,965,967,972,973,978,979,984,985,990,991,996,997,1003,1004,1010,1011,1017,1018,1024,1026,1032],{"type":48,"value":959},"When a scenario should run multiple times with small differences, define ",{"type":43,"tag":73,"props":961,"children":963},{"className":962},[],[964],{"type":48,"value":951},{"type":48,"value":966},". The parent does not run by itself; each variant inherits all parent fields and may override ",{"type":43,"tag":73,"props":968,"children":970},{"className":969},[],[971],{"type":48,"value":259},{"type":48,"value":253},{"type":43,"tag":73,"props":974,"children":976},{"className":975},[],[977],{"type":48,"value":267},{"type":48,"value":253},{"type":43,"tag":73,"props":980,"children":982},{"className":981},[],[983],{"type":48,"value":847},{"type":48,"value":253},{"type":43,"tag":73,"props":986,"children":988},{"className":987},[],[989],{"type":48,"value":855},{"type":48,"value":253},{"type":43,"tag":73,"props":992,"children":994},{"className":993},[],[995],{"type":48,"value":22},{"type":48,"value":253},{"type":43,"tag":73,"props":998,"children":1000},{"className":999},[],[1001],{"type":48,"value":1002},"skills",{"type":48,"value":253},{"type":43,"tag":73,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":48,"value":1009},"mcp_servers",{"type":48,"value":253},{"type":43,"tag":73,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":48,"value":1016},"limits",{"type":48,"value":253},{"type":43,"tag":73,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":48,"value":1023},"artifacts",{"type":48,"value":1025},", or ",{"type":43,"tag":73,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":48,"value":1031},"skip",{"type":48,"value":226},{"type":43,"tag":317,"props":1034,"children":1036},{"className":319,"code":1035,"language":284,"meta":321,"style":321},"{\n  \"name\": \"Summarize the docs\",\n  \"prompt\": \"Summarize the contents of docs\u002F into summary.md.\",\n  \"judge\": \"summary.md exists and is at least 200 words.\",\n  \"variants\": [\n    { \"name\": \"baseline\" },\n    { \"name\": \"concise\", \"prompt\": \"Summarize the contents of docs\u002F into summary.md in fewer than 100 words.\" },\n  ],\n}\n",[1037],{"type":43,"tag":73,"props":1038,"children":1039},{"__ignoreMap":321},[1040,1047,1055,1063,1071,1079,1087,1095,1102],{"type":43,"tag":327,"props":1041,"children":1042},{"class":329,"line":330},[1043],{"type":43,"tag":327,"props":1044,"children":1045},{},[1046],{"type":48,"value":336},{"type":43,"tag":327,"props":1048,"children":1049},{"class":329,"line":339},[1050],{"type":43,"tag":327,"props":1051,"children":1052},{},[1053],{"type":48,"value":1054},"  \"name\": \"Summarize the docs\",\n",{"type":43,"tag":327,"props":1056,"children":1057},{"class":329,"line":348},[1058],{"type":43,"tag":327,"props":1059,"children":1060},{},[1061],{"type":48,"value":1062},"  \"prompt\": \"Summarize the contents of docs\u002F into summary.md.\",\n",{"type":43,"tag":327,"props":1064,"children":1065},{"class":329,"line":357},[1066],{"type":43,"tag":327,"props":1067,"children":1068},{},[1069],{"type":48,"value":1070},"  \"judge\": \"summary.md exists and is at least 200 words.\",\n",{"type":43,"tag":327,"props":1072,"children":1073},{"class":329,"line":367},[1074],{"type":43,"tag":327,"props":1075,"children":1076},{},[1077],{"type":48,"value":1078},"  \"variants\": [\n",{"type":43,"tag":327,"props":1080,"children":1081},{"class":329,"line":376},[1082],{"type":43,"tag":327,"props":1083,"children":1084},{},[1085],{"type":48,"value":1086},"    { \"name\": \"baseline\" },\n",{"type":43,"tag":327,"props":1088,"children":1089},{"class":329,"line":385},[1090],{"type":43,"tag":327,"props":1091,"children":1092},{},[1093],{"type":48,"value":1094},"    { \"name\": \"concise\", \"prompt\": \"Summarize the contents of docs\u002F into summary.md in fewer than 100 words.\" },\n",{"type":43,"tag":327,"props":1096,"children":1097},{"class":329,"line":393},[1098],{"type":43,"tag":327,"props":1099,"children":1100},{},[1101],{"type":48,"value":435},{"type":43,"tag":327,"props":1103,"children":1104},{"class":329,"line":402},[1105],{"type":43,"tag":327,"props":1106,"children":1107},{},[1108],{"type":48,"value":758},{"type":43,"tag":51,"props":1110,"children":1111},{},[1112,1114,1120,1122,1128],{"type":48,"value":1113},"Each variant's key is ",{"type":43,"tag":73,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":48,"value":1119},"{scenarioKey}@{variantName}",{"type":48,"value":1121},". Variant names must match ",{"type":43,"tag":73,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":48,"value":1127},"\u002F^[a-zA-Z0-9_-]+$\u002F",{"type":48,"value":226},{"type":43,"tag":96,"props":1130,"children":1132},{"id":1131},"authoring-axisconfigjson",[1133,1135],{"type":48,"value":1134},"Authoring ",{"type":43,"tag":73,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":48,"value":92},{"type":43,"tag":51,"props":1141,"children":1142},{},[1143],{"type":48,"value":1144},"Sits at the project root. Minimum viable file:",{"type":43,"tag":317,"props":1146,"children":1150},{"className":1147,"code":1148,"language":1149,"meta":321,"style":321},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [\"claude-code\"]\n}\n","json",[1151],{"type":43,"tag":73,"props":1152,"children":1153},{"__ignoreMap":321},[1154,1162,1205,1247],{"type":43,"tag":327,"props":1155,"children":1156},{"class":329,"line":330},[1157],{"type":43,"tag":327,"props":1158,"children":1160},{"style":1159},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1161],{"type":48,"value":336},{"type":43,"tag":327,"props":1163,"children":1164},{"class":329,"line":339},[1165,1170,1176,1181,1185,1190,1196,1200],{"type":43,"tag":327,"props":1166,"children":1167},{"style":1159},[1168],{"type":48,"value":1169},"  \"",{"type":43,"tag":327,"props":1171,"children":1173},{"style":1172},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1174],{"type":48,"value":1175},"scenarios",{"type":43,"tag":327,"props":1177,"children":1178},{"style":1159},[1179],{"type":48,"value":1180},"\"",{"type":43,"tag":327,"props":1182,"children":1183},{"style":1159},[1184],{"type":48,"value":857},{"type":43,"tag":327,"props":1186,"children":1187},{"style":1159},[1188],{"type":48,"value":1189}," \"",{"type":43,"tag":327,"props":1191,"children":1193},{"style":1192},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1194],{"type":48,"value":1195},".\u002Fscenarios",{"type":43,"tag":327,"props":1197,"children":1198},{"style":1159},[1199],{"type":48,"value":1180},{"type":43,"tag":327,"props":1201,"children":1202},{"style":1159},[1203],{"type":48,"value":1204},",\n",{"type":43,"tag":327,"props":1206,"children":1207},{"class":329,"line":348},[1208,1212,1216,1220,1224,1229,1233,1238,1242],{"type":43,"tag":327,"props":1209,"children":1210},{"style":1159},[1211],{"type":48,"value":1169},{"type":43,"tag":327,"props":1213,"children":1214},{"style":1172},[1215],{"type":48,"value":22},{"type":43,"tag":327,"props":1217,"children":1218},{"style":1159},[1219],{"type":48,"value":1180},{"type":43,"tag":327,"props":1221,"children":1222},{"style":1159},[1223],{"type":48,"value":857},{"type":43,"tag":327,"props":1225,"children":1226},{"style":1159},[1227],{"type":48,"value":1228}," [",{"type":43,"tag":327,"props":1230,"children":1231},{"style":1159},[1232],{"type":48,"value":1180},{"type":43,"tag":327,"props":1234,"children":1235},{"style":1192},[1236],{"type":48,"value":1237},"claude-code",{"type":43,"tag":327,"props":1239,"children":1240},{"style":1159},[1241],{"type":48,"value":1180},{"type":43,"tag":327,"props":1243,"children":1244},{"style":1159},[1245],{"type":48,"value":1246},"]\n",{"type":43,"tag":327,"props":1248,"children":1249},{"class":329,"line":357},[1250],{"type":43,"tag":327,"props":1251,"children":1252},{"style":1159},[1253],{"type":48,"value":758},{"type":43,"tag":51,"props":1255,"children":1256},{},[1257],{"type":48,"value":315},{"type":43,"tag":317,"props":1259,"children":1261},{"className":319,"code":1260,"language":284,"meta":321,"style":321},"{\n  \u002F\u002F Shown in report headers.\n  \"name\": \"My Project\",\n\n  \u002F\u002F Where scenarios come from. Three forms:\n  \u002F\u002F  - \".\u002Fpath\" (a directory, walked recursively for *.json scenarios)\n  \u002F\u002F  - [\".\u002Fpath1\", \".\u002Fscenarios\u002Fspecial.json\"] (mix of dirs and single files)\n  \u002F\u002F  - Mixed with inline scenarios (objects with a required \"key\" field) when\n  \u002F\u002F    authoring axis.config.{js,ts} programmatically.\n  \u002F\u002F  - Git URLs (\"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\") cloned into .axis\u002Fremotes\u002F\n  \u002F\u002F    and merged from their own axis.config.\n  \u002F\u002F Defaults to \".\u002Fscenarios\" when omitted.\n  \"scenarios\": [\".\u002Fscenarios\", \"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fagent-runner-orchestrator\"],\n\n  \u002F\u002F Agents to evaluate. Strings are shorthand for { \"agent\": \"\u003Cname>\" }.\n  \"agents\": [\n    \"claude-code\",\n    { \"agent\": \"claude-code\", \"model\": \"claude-opus-4-6\" },\n    { \"agent\": \"codex\", \"model\": \"gpt-5-codex\" },\n    {\n      \"agent\": \"echo\", \u002F\u002F custom adapter (see \"adapters\" below)\n      \"command\": \".\u002Fbin\u002Fmy-agent\", \u002F\u002F CLI override for custom adapters\n      \"scenarios\": [\"hello-world\"], \u002F\u002F restrict this agent to a subset (scenario keys)\n      \"skills\": [\".\u002Fskills\u002Fmy-conventions\"], \u002F\u002F per-agent skills\n      \"flags\": { \"debug\": true, \"max-turns\": \"5\" },\n    },\n    \u002F\u002F Provider-prefixed models (e.g. OpenRouter) are supported. The raw string\n    \u002F\u002F is passed verbatim to the CLI via --model; the derived agent name slugifies\n    \u002F\u002F the slashes, so this becomes \"claude-code|anthropic-claude-3.5-sonnet\".\n    { \"agent\": \"claude-code\", \"model\": \"anthropic\u002Fclaude-3.5-sonnet\" },\n  ],\n\n  \u002F\u002F Agents used to score runs. When omitted, each agent judges itself\n  \u002F\u002F (it scores its own transcript). Otherwise the first entry whose adapter\n  \u002F\u002F name differs from the run's own agent is picked; if every entry matches,\n  \u002F\u002F the first entry is used. Order is precedence.\n  \"judging\": {\n    \"agents\": [{ \"agent\": \"claude-code\", \"model\": \"claude-opus-4-7\" }, \"codex\"],\n  },\n\n  \u002F\u002F MCP servers shared across all agents and all scenarios. Two types:\n  \u002F\u002F stdio (local subprocess) and http (remote endpoint).\n  \"mcp_servers\": {\n    \"filesystem\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"],\n      \"env\": { \"DEBUG\": \"1\" },\n    },\n    \"search\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsearch\",\n      \"headers\": { \"Authorization\": \"Bearer ${SEARCH_TOKEN}\" },\n    },\n  },\n\n  \u002F\u002F Skills shared across all agents. Each entry is one of:\n  \u002F\u002F  - local path: \".\u002Fskills\u002Fmy-skill\"\n  \u002F\u002F  - GitHub shorthand: \"anthropics\u002Fskills\"\n  \u002F\u002F  - GitHub URL: \"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills\"\n  \"skills\": [\".\u002Fskills\u002Frepo-conventions\"],\n\n  \u002F\u002F Glob patterns (relative to each scenario's workspace) of files captured\n  \u002F\u002F into the report after teardown. Merged with per-scenario artifacts.\n  \"artifacts\": [\".\u002F*.md\", \"src\u002F**\u002F*.js\"],\n\n  \u002F\u002F Custom adapters. Keys are adapter names referenced by \"agents\" entries;\n  \u002F\u002F values are paths (relative to this config) to JS\u002FTS modules that export\n  \u002F\u002F an AgentAdapter as default or as `adapter`.\n  \"adapters\": { \"echo\": \".\u002Fadapters\u002Fecho.ts\" },\n\n  \u002F\u002F Extra env vars allowed through to agent processes. PATH, HOME, and the\n  \u002F\u002F default agent API keys (ANTHROPIC_API_KEY, CODEX_API_KEY, GEMINI_API_KEY)\n  \u002F\u002F pass through automatically; entries here are merged on top.\n  \"env\": [\"GITHUB_TOKEN\", \"MY_FEATURE_FLAG\"],\n\n  \u002F\u002F Run-wide settings.\n  \"settings\": {\n    \"concurrency\": 8,\n    \"limits\": {\n      \"run\": { \"time_minutes\": 60, \"tokens\": 5000000 },\n      \"scenario\": { \"time_minutes\": 10, \"tokens\": 200000 },\n    },\n    \"remotes\": { \"maxDepth\": 1 },\n  },\n\n  \u002F\u002F CLI-only lifecycle hooks. beforeAll runs once before any scenarios start;\n  \u002F\u002F afterAll runs once after every scenario is scored. Scripts execute with\n  \u002F\u002F cwd set to the config directory. afterAll receives AXIS_REPORT_DIR,\n  \u002F\u002F AXIS_TOTAL, AXIS_COMPLETED, AXIS_FAILED, AXIS_DURATION_MS as env vars.\n  \u002F\u002F These are not fired by the programmatic run() API.\n  \"beforeAll\": [{ \"action\": \"run_script\", \"command\": \"npm install --silent\" }],\n  \"afterAll\": [{ \"action\": \"run_script\", \"command\": \"echo Report at $AXIS_REPORT_DIR\" }],\n}\n",[1262],{"type":43,"tag":73,"props":1263,"children":1264},{"__ignoreMap":321},[1265,1272,1280,1288,1295,1303,1311,1319,1327,1335,1343,1351,1359,1367,1374,1382,1390,1398,1406,1414,1422,1435,1448,1461,1474,1482,1490,1498,1506,1514,1522,1529,1536,1544,1552,1560,1568,1576,1584,1591,1598,1606,1614,1621,1629,1637,1645,1653,1661,1668,1677,1686,1695,1704,1712,1720,1728,1737,1746,1755,1764,1773,1781,1790,1799,1808,1816,1825,1834,1843,1852,1860,1869,1878,1887,1896,1904,1913,1922,1931,1940,1949,1958,1966,1975,1983,1991,2000,2009,2018,2027,2036,2045,2054],{"type":43,"tag":327,"props":1266,"children":1267},{"class":329,"line":330},[1268],{"type":43,"tag":327,"props":1269,"children":1270},{},[1271],{"type":48,"value":336},{"type":43,"tag":327,"props":1273,"children":1274},{"class":329,"line":339},[1275],{"type":43,"tag":327,"props":1276,"children":1277},{},[1278],{"type":48,"value":1279},"  \u002F\u002F Shown in report headers.\n",{"type":43,"tag":327,"props":1281,"children":1282},{"class":329,"line":348},[1283],{"type":43,"tag":327,"props":1284,"children":1285},{},[1286],{"type":48,"value":1287},"  \"name\": \"My Project\",\n",{"type":43,"tag":327,"props":1289,"children":1290},{"class":329,"line":357},[1291],{"type":43,"tag":327,"props":1292,"children":1293},{"emptyLinePlaceholder":361},[1294],{"type":48,"value":364},{"type":43,"tag":327,"props":1296,"children":1297},{"class":329,"line":367},[1298],{"type":43,"tag":327,"props":1299,"children":1300},{},[1301],{"type":48,"value":1302},"  \u002F\u002F Where scenarios come from. Three forms:\n",{"type":43,"tag":327,"props":1304,"children":1305},{"class":329,"line":376},[1306],{"type":43,"tag":327,"props":1307,"children":1308},{},[1309],{"type":48,"value":1310},"  \u002F\u002F  - \".\u002Fpath\" (a directory, walked recursively for *.json scenarios)\n",{"type":43,"tag":327,"props":1312,"children":1313},{"class":329,"line":385},[1314],{"type":43,"tag":327,"props":1315,"children":1316},{},[1317],{"type":48,"value":1318},"  \u002F\u002F  - [\".\u002Fpath1\", \".\u002Fscenarios\u002Fspecial.json\"] (mix of dirs and single files)\n",{"type":43,"tag":327,"props":1320,"children":1321},{"class":329,"line":393},[1322],{"type":43,"tag":327,"props":1323,"children":1324},{},[1325],{"type":48,"value":1326},"  \u002F\u002F  - Mixed with inline scenarios (objects with a required \"key\" field) when\n",{"type":43,"tag":327,"props":1328,"children":1329},{"class":329,"line":402},[1330],{"type":43,"tag":327,"props":1331,"children":1332},{},[1333],{"type":48,"value":1334},"  \u002F\u002F    authoring axis.config.{js,ts} programmatically.\n",{"type":43,"tag":327,"props":1336,"children":1337},{"class":329,"line":411},[1338],{"type":43,"tag":327,"props":1339,"children":1340},{},[1341],{"type":48,"value":1342},"  \u002F\u002F  - Git URLs (\"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\") cloned into .axis\u002Fremotes\u002F\n",{"type":43,"tag":327,"props":1344,"children":1345},{"class":329,"line":420},[1346],{"type":43,"tag":327,"props":1347,"children":1348},{},[1349],{"type":48,"value":1350},"  \u002F\u002F    and merged from their own axis.config.\n",{"type":43,"tag":327,"props":1352,"children":1353},{"class":329,"line":429},[1354],{"type":43,"tag":327,"props":1355,"children":1356},{},[1357],{"type":48,"value":1358},"  \u002F\u002F Defaults to \".\u002Fscenarios\" when omitted.\n",{"type":43,"tag":327,"props":1360,"children":1361},{"class":329,"line":438},[1362],{"type":43,"tag":327,"props":1363,"children":1364},{},[1365],{"type":48,"value":1366},"  \"scenarios\": [\".\u002Fscenarios\", \"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fagent-runner-orchestrator\"],\n",{"type":43,"tag":327,"props":1368,"children":1369},{"class":329,"line":446},[1370],{"type":43,"tag":327,"props":1371,"children":1372},{"emptyLinePlaceholder":361},[1373],{"type":48,"value":364},{"type":43,"tag":327,"props":1375,"children":1376},{"class":329,"line":455},[1377],{"type":43,"tag":327,"props":1378,"children":1379},{},[1380],{"type":48,"value":1381},"  \u002F\u002F Agents to evaluate. Strings are shorthand for { \"agent\": \"\u003Cname>\" }.\n",{"type":43,"tag":327,"props":1383,"children":1384},{"class":329,"line":464},[1385],{"type":43,"tag":327,"props":1386,"children":1387},{},[1388],{"type":48,"value":1389},"  \"agents\": [\n",{"type":43,"tag":327,"props":1391,"children":1392},{"class":329,"line":472},[1393],{"type":43,"tag":327,"props":1394,"children":1395},{},[1396],{"type":48,"value":1397},"    \"claude-code\",\n",{"type":43,"tag":327,"props":1399,"children":1400},{"class":329,"line":481},[1401],{"type":43,"tag":327,"props":1402,"children":1403},{},[1404],{"type":48,"value":1405},"    { \"agent\": \"claude-code\", \"model\": \"claude-opus-4-6\" },\n",{"type":43,"tag":327,"props":1407,"children":1408},{"class":329,"line":490},[1409],{"type":43,"tag":327,"props":1410,"children":1411},{},[1412],{"type":48,"value":1413},"    { \"agent\": \"codex\", \"model\": \"gpt-5-codex\" },\n",{"type":43,"tag":327,"props":1415,"children":1416},{"class":329,"line":499},[1417],{"type":43,"tag":327,"props":1418,"children":1419},{},[1420],{"type":48,"value":1421},"    {\n",{"type":43,"tag":327,"props":1423,"children":1424},{"class":329,"line":508},[1425,1430],{"type":43,"tag":327,"props":1426,"children":1427},{},[1428],{"type":48,"value":1429},"      \"agent\": \"echo\",",{"type":43,"tag":327,"props":1431,"children":1432},{},[1433],{"type":48,"value":1434}," \u002F\u002F custom adapter (see \"adapters\" below)\n",{"type":43,"tag":327,"props":1436,"children":1437},{"class":329,"line":517},[1438,1443],{"type":43,"tag":327,"props":1439,"children":1440},{},[1441],{"type":48,"value":1442},"      \"command\": \".\u002Fbin\u002Fmy-agent\",",{"type":43,"tag":327,"props":1444,"children":1445},{},[1446],{"type":48,"value":1447}," \u002F\u002F CLI override for custom adapters\n",{"type":43,"tag":327,"props":1449,"children":1450},{"class":329,"line":526},[1451,1456],{"type":43,"tag":327,"props":1452,"children":1453},{},[1454],{"type":48,"value":1455},"      \"scenarios\": [\"hello-world\"],",{"type":43,"tag":327,"props":1457,"children":1458},{},[1459],{"type":48,"value":1460}," \u002F\u002F restrict this agent to a subset (scenario keys)\n",{"type":43,"tag":327,"props":1462,"children":1463},{"class":329,"line":535},[1464,1469],{"type":43,"tag":327,"props":1465,"children":1466},{},[1467],{"type":48,"value":1468},"      \"skills\": [\".\u002Fskills\u002Fmy-conventions\"],",{"type":43,"tag":327,"props":1470,"children":1471},{},[1472],{"type":48,"value":1473}," \u002F\u002F per-agent skills\n",{"type":43,"tag":327,"props":1475,"children":1476},{"class":329,"line":544},[1477],{"type":43,"tag":327,"props":1478,"children":1479},{},[1480],{"type":48,"value":1481},"      \"flags\": { \"debug\": true, \"max-turns\": \"5\" },\n",{"type":43,"tag":327,"props":1483,"children":1484},{"class":329,"line":552},[1485],{"type":43,"tag":327,"props":1486,"children":1487},{},[1488],{"type":48,"value":1489},"    },\n",{"type":43,"tag":327,"props":1491,"children":1492},{"class":329,"line":560},[1493],{"type":43,"tag":327,"props":1494,"children":1495},{},[1496],{"type":48,"value":1497},"    \u002F\u002F Provider-prefixed models (e.g. OpenRouter) are supported. The raw string\n",{"type":43,"tag":327,"props":1499,"children":1500},{"class":329,"line":569},[1501],{"type":43,"tag":327,"props":1502,"children":1503},{},[1504],{"type":48,"value":1505},"    \u002F\u002F is passed verbatim to the CLI via --model; the derived agent name slugifies\n",{"type":43,"tag":327,"props":1507,"children":1508},{"class":329,"line":578},[1509],{"type":43,"tag":327,"props":1510,"children":1511},{},[1512],{"type":48,"value":1513},"    \u002F\u002F the slashes, so this becomes \"claude-code|anthropic-claude-3.5-sonnet\".\n",{"type":43,"tag":327,"props":1515,"children":1516},{"class":329,"line":586},[1517],{"type":43,"tag":327,"props":1518,"children":1519},{},[1520],{"type":48,"value":1521},"    { \"agent\": \"claude-code\", \"model\": \"anthropic\u002Fclaude-3.5-sonnet\" },\n",{"type":43,"tag":327,"props":1523,"children":1524},{"class":329,"line":595},[1525],{"type":43,"tag":327,"props":1526,"children":1527},{},[1528],{"type":48,"value":435},{"type":43,"tag":327,"props":1530,"children":1531},{"class":329,"line":23},[1532],{"type":43,"tag":327,"props":1533,"children":1534},{"emptyLinePlaceholder":361},[1535],{"type":48,"value":364},{"type":43,"tag":327,"props":1537,"children":1538},{"class":329,"line":611},[1539],{"type":43,"tag":327,"props":1540,"children":1541},{},[1542],{"type":48,"value":1543},"  \u002F\u002F Agents used to score runs. When omitted, each agent judges itself\n",{"type":43,"tag":327,"props":1545,"children":1546},{"class":329,"line":620},[1547],{"type":43,"tag":327,"props":1548,"children":1549},{},[1550],{"type":48,"value":1551},"  \u002F\u002F (it scores its own transcript). Otherwise the first entry whose adapter\n",{"type":43,"tag":327,"props":1553,"children":1554},{"class":329,"line":629},[1555],{"type":43,"tag":327,"props":1556,"children":1557},{},[1558],{"type":48,"value":1559},"  \u002F\u002F name differs from the run's own agent is picked; if every entry matches,\n",{"type":43,"tag":327,"props":1561,"children":1562},{"class":329,"line":638},[1563],{"type":43,"tag":327,"props":1564,"children":1565},{},[1566],{"type":48,"value":1567},"  \u002F\u002F the first entry is used. Order is precedence.\n",{"type":43,"tag":327,"props":1569,"children":1570},{"class":329,"line":646},[1571],{"type":43,"tag":327,"props":1572,"children":1573},{},[1574],{"type":48,"value":1575},"  \"judging\": {\n",{"type":43,"tag":327,"props":1577,"children":1578},{"class":329,"line":655},[1579],{"type":43,"tag":327,"props":1580,"children":1581},{},[1582],{"type":48,"value":1583},"    \"agents\": [{ \"agent\": \"claude-code\", \"model\": \"claude-opus-4-7\" }, \"codex\"],\n",{"type":43,"tag":327,"props":1585,"children":1586},{"class":329,"line":664},[1587],{"type":43,"tag":327,"props":1588,"children":1589},{},[1590],{"type":48,"value":688},{"type":43,"tag":327,"props":1592,"children":1593},{"class":329,"line":673},[1594],{"type":43,"tag":327,"props":1595,"children":1596},{"emptyLinePlaceholder":361},[1597],{"type":48,"value":364},{"type":43,"tag":327,"props":1599,"children":1600},{"class":329,"line":682},[1601],{"type":43,"tag":327,"props":1602,"children":1603},{},[1604],{"type":48,"value":1605},"  \u002F\u002F MCP servers shared across all agents and all scenarios. Two types:\n",{"type":43,"tag":327,"props":1607,"children":1608},{"class":329,"line":691},[1609],{"type":43,"tag":327,"props":1610,"children":1611},{},[1612],{"type":48,"value":1613},"  \u002F\u002F stdio (local subprocess) and http (remote endpoint).\n",{"type":43,"tag":327,"props":1615,"children":1616},{"class":329,"line":699},[1617],{"type":43,"tag":327,"props":1618,"children":1619},{},[1620],{"type":48,"value":670},{"type":43,"tag":327,"props":1622,"children":1623},{"class":329,"line":708},[1624],{"type":43,"tag":327,"props":1625,"children":1626},{},[1627],{"type":48,"value":1628},"    \"filesystem\": {\n",{"type":43,"tag":327,"props":1630,"children":1631},{"class":329,"line":717},[1632],{"type":43,"tag":327,"props":1633,"children":1634},{},[1635],{"type":48,"value":1636},"      \"type\": \"stdio\",\n",{"type":43,"tag":327,"props":1638,"children":1639},{"class":329,"line":725},[1640],{"type":43,"tag":327,"props":1641,"children":1642},{},[1643],{"type":48,"value":1644},"      \"command\": \"npx\",\n",{"type":43,"tag":327,"props":1646,"children":1647},{"class":329,"line":734},[1648],{"type":43,"tag":327,"props":1649,"children":1650},{},[1651],{"type":48,"value":1652},"      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \".\"],\n",{"type":43,"tag":327,"props":1654,"children":1655},{"class":329,"line":743},[1656],{"type":43,"tag":327,"props":1657,"children":1658},{},[1659],{"type":48,"value":1660},"      \"env\": { \"DEBUG\": \"1\" },\n",{"type":43,"tag":327,"props":1662,"children":1663},{"class":329,"line":752},[1664],{"type":43,"tag":327,"props":1665,"children":1666},{},[1667],{"type":48,"value":1489},{"type":43,"tag":327,"props":1669,"children":1671},{"class":329,"line":1670},50,[1672],{"type":43,"tag":327,"props":1673,"children":1674},{},[1675],{"type":48,"value":1676},"    \"search\": {\n",{"type":43,"tag":327,"props":1678,"children":1680},{"class":329,"line":1679},51,[1681],{"type":43,"tag":327,"props":1682,"children":1683},{},[1684],{"type":48,"value":1685},"      \"type\": \"http\",\n",{"type":43,"tag":327,"props":1687,"children":1689},{"class":329,"line":1688},52,[1690],{"type":43,"tag":327,"props":1691,"children":1692},{},[1693],{"type":48,"value":1694},"      \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsearch\",\n",{"type":43,"tag":327,"props":1696,"children":1698},{"class":329,"line":1697},53,[1699],{"type":43,"tag":327,"props":1700,"children":1701},{},[1702],{"type":48,"value":1703},"      \"headers\": { \"Authorization\": \"Bearer ${SEARCH_TOKEN}\" },\n",{"type":43,"tag":327,"props":1705,"children":1707},{"class":329,"line":1706},54,[1708],{"type":43,"tag":327,"props":1709,"children":1710},{},[1711],{"type":48,"value":1489},{"type":43,"tag":327,"props":1713,"children":1715},{"class":329,"line":1714},55,[1716],{"type":43,"tag":327,"props":1717,"children":1718},{},[1719],{"type":48,"value":688},{"type":43,"tag":327,"props":1721,"children":1723},{"class":329,"line":1722},56,[1724],{"type":43,"tag":327,"props":1725,"children":1726},{"emptyLinePlaceholder":361},[1727],{"type":48,"value":364},{"type":43,"tag":327,"props":1729,"children":1731},{"class":329,"line":1730},57,[1732],{"type":43,"tag":327,"props":1733,"children":1734},{},[1735],{"type":48,"value":1736},"  \u002F\u002F Skills shared across all agents. Each entry is one of:\n",{"type":43,"tag":327,"props":1738,"children":1740},{"class":329,"line":1739},58,[1741],{"type":43,"tag":327,"props":1742,"children":1743},{},[1744],{"type":48,"value":1745},"  \u002F\u002F  - local path: \".\u002Fskills\u002Fmy-skill\"\n",{"type":43,"tag":327,"props":1747,"children":1749},{"class":329,"line":1748},59,[1750],{"type":43,"tag":327,"props":1751,"children":1752},{},[1753],{"type":48,"value":1754},"  \u002F\u002F  - GitHub shorthand: \"anthropics\u002Fskills\"\n",{"type":43,"tag":327,"props":1756,"children":1758},{"class":329,"line":1757},60,[1759],{"type":43,"tag":327,"props":1760,"children":1761},{},[1762],{"type":48,"value":1763},"  \u002F\u002F  - GitHub URL: \"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills\"\n",{"type":43,"tag":327,"props":1765,"children":1767},{"class":329,"line":1766},61,[1768],{"type":43,"tag":327,"props":1769,"children":1770},{},[1771],{"type":48,"value":1772},"  \"skills\": [\".\u002Fskills\u002Frepo-conventions\"],\n",{"type":43,"tag":327,"props":1774,"children":1776},{"class":329,"line":1775},62,[1777],{"type":43,"tag":327,"props":1778,"children":1779},{"emptyLinePlaceholder":361},[1780],{"type":48,"value":364},{"type":43,"tag":327,"props":1782,"children":1784},{"class":329,"line":1783},63,[1785],{"type":43,"tag":327,"props":1786,"children":1787},{},[1788],{"type":48,"value":1789},"  \u002F\u002F Glob patterns (relative to each scenario's workspace) of files captured\n",{"type":43,"tag":327,"props":1791,"children":1793},{"class":329,"line":1792},64,[1794],{"type":43,"tag":327,"props":1795,"children":1796},{},[1797],{"type":48,"value":1798},"  \u002F\u002F into the report after teardown. Merged with per-scenario artifacts.\n",{"type":43,"tag":327,"props":1800,"children":1802},{"class":329,"line":1801},65,[1803],{"type":43,"tag":327,"props":1804,"children":1805},{},[1806],{"type":48,"value":1807},"  \"artifacts\": [\".\u002F*.md\", \"src\u002F**\u002F*.js\"],\n",{"type":43,"tag":327,"props":1809,"children":1811},{"class":329,"line":1810},66,[1812],{"type":43,"tag":327,"props":1813,"children":1814},{"emptyLinePlaceholder":361},[1815],{"type":48,"value":364},{"type":43,"tag":327,"props":1817,"children":1819},{"class":329,"line":1818},67,[1820],{"type":43,"tag":327,"props":1821,"children":1822},{},[1823],{"type":48,"value":1824},"  \u002F\u002F Custom adapters. Keys are adapter names referenced by \"agents\" entries;\n",{"type":43,"tag":327,"props":1826,"children":1828},{"class":329,"line":1827},68,[1829],{"type":43,"tag":327,"props":1830,"children":1831},{},[1832],{"type":48,"value":1833},"  \u002F\u002F values are paths (relative to this config) to JS\u002FTS modules that export\n",{"type":43,"tag":327,"props":1835,"children":1837},{"class":329,"line":1836},69,[1838],{"type":43,"tag":327,"props":1839,"children":1840},{},[1841],{"type":48,"value":1842},"  \u002F\u002F an AgentAdapter as default or as `adapter`.\n",{"type":43,"tag":327,"props":1844,"children":1846},{"class":329,"line":1845},70,[1847],{"type":43,"tag":327,"props":1848,"children":1849},{},[1850],{"type":48,"value":1851},"  \"adapters\": { \"echo\": \".\u002Fadapters\u002Fecho.ts\" },\n",{"type":43,"tag":327,"props":1853,"children":1855},{"class":329,"line":1854},71,[1856],{"type":43,"tag":327,"props":1857,"children":1858},{"emptyLinePlaceholder":361},[1859],{"type":48,"value":364},{"type":43,"tag":327,"props":1861,"children":1863},{"class":329,"line":1862},72,[1864],{"type":43,"tag":327,"props":1865,"children":1866},{},[1867],{"type":48,"value":1868},"  \u002F\u002F Extra env vars allowed through to agent processes. PATH, HOME, and the\n",{"type":43,"tag":327,"props":1870,"children":1872},{"class":329,"line":1871},73,[1873],{"type":43,"tag":327,"props":1874,"children":1875},{},[1876],{"type":48,"value":1877},"  \u002F\u002F default agent API keys (ANTHROPIC_API_KEY, CODEX_API_KEY, GEMINI_API_KEY)\n",{"type":43,"tag":327,"props":1879,"children":1881},{"class":329,"line":1880},74,[1882],{"type":43,"tag":327,"props":1883,"children":1884},{},[1885],{"type":48,"value":1886},"  \u002F\u002F pass through automatically; entries here are merged on top.\n",{"type":43,"tag":327,"props":1888,"children":1890},{"class":329,"line":1889},75,[1891],{"type":43,"tag":327,"props":1892,"children":1893},{},[1894],{"type":48,"value":1895},"  \"env\": [\"GITHUB_TOKEN\", \"MY_FEATURE_FLAG\"],\n",{"type":43,"tag":327,"props":1897,"children":1899},{"class":329,"line":1898},76,[1900],{"type":43,"tag":327,"props":1901,"children":1902},{"emptyLinePlaceholder":361},[1903],{"type":48,"value":364},{"type":43,"tag":327,"props":1905,"children":1907},{"class":329,"line":1906},77,[1908],{"type":43,"tag":327,"props":1909,"children":1910},{},[1911],{"type":48,"value":1912},"  \u002F\u002F Run-wide settings.\n",{"type":43,"tag":327,"props":1914,"children":1916},{"class":329,"line":1915},78,[1917],{"type":43,"tag":327,"props":1918,"children":1919},{},[1920],{"type":48,"value":1921},"  \"settings\": {\n",{"type":43,"tag":327,"props":1923,"children":1925},{"class":329,"line":1924},79,[1926],{"type":43,"tag":327,"props":1927,"children":1928},{},[1929],{"type":48,"value":1930},"    \"concurrency\": 8,\n",{"type":43,"tag":327,"props":1932,"children":1934},{"class":329,"line":1933},80,[1935],{"type":43,"tag":327,"props":1936,"children":1937},{},[1938],{"type":48,"value":1939},"    \"limits\": {\n",{"type":43,"tag":327,"props":1941,"children":1943},{"class":329,"line":1942},81,[1944],{"type":43,"tag":327,"props":1945,"children":1946},{},[1947],{"type":48,"value":1948},"      \"run\": { \"time_minutes\": 60, \"tokens\": 5000000 },\n",{"type":43,"tag":327,"props":1950,"children":1952},{"class":329,"line":1951},82,[1953],{"type":43,"tag":327,"props":1954,"children":1955},{},[1956],{"type":48,"value":1957},"      \"scenario\": { \"time_minutes\": 10, \"tokens\": 200000 },\n",{"type":43,"tag":327,"props":1959,"children":1961},{"class":329,"line":1960},83,[1962],{"type":43,"tag":327,"props":1963,"children":1964},{},[1965],{"type":48,"value":1489},{"type":43,"tag":327,"props":1967,"children":1969},{"class":329,"line":1968},84,[1970],{"type":43,"tag":327,"props":1971,"children":1972},{},[1973],{"type":48,"value":1974},"    \"remotes\": { \"maxDepth\": 1 },\n",{"type":43,"tag":327,"props":1976,"children":1978},{"class":329,"line":1977},85,[1979],{"type":43,"tag":327,"props":1980,"children":1981},{},[1982],{"type":48,"value":688},{"type":43,"tag":327,"props":1984,"children":1986},{"class":329,"line":1985},86,[1987],{"type":43,"tag":327,"props":1988,"children":1989},{"emptyLinePlaceholder":361},[1990],{"type":48,"value":364},{"type":43,"tag":327,"props":1992,"children":1994},{"class":329,"line":1993},87,[1995],{"type":43,"tag":327,"props":1996,"children":1997},{},[1998],{"type":48,"value":1999},"  \u002F\u002F CLI-only lifecycle hooks. beforeAll runs once before any scenarios start;\n",{"type":43,"tag":327,"props":2001,"children":2003},{"class":329,"line":2002},88,[2004],{"type":43,"tag":327,"props":2005,"children":2006},{},[2007],{"type":48,"value":2008},"  \u002F\u002F afterAll runs once after every scenario is scored. Scripts execute with\n",{"type":43,"tag":327,"props":2010,"children":2012},{"class":329,"line":2011},89,[2013],{"type":43,"tag":327,"props":2014,"children":2015},{},[2016],{"type":48,"value":2017},"  \u002F\u002F cwd set to the config directory. afterAll receives AXIS_REPORT_DIR,\n",{"type":43,"tag":327,"props":2019,"children":2021},{"class":329,"line":2020},90,[2022],{"type":43,"tag":327,"props":2023,"children":2024},{},[2025],{"type":48,"value":2026},"  \u002F\u002F AXIS_TOTAL, AXIS_COMPLETED, AXIS_FAILED, AXIS_DURATION_MS as env vars.\n",{"type":43,"tag":327,"props":2028,"children":2030},{"class":329,"line":2029},91,[2031],{"type":43,"tag":327,"props":2032,"children":2033},{},[2034],{"type":48,"value":2035},"  \u002F\u002F These are not fired by the programmatic run() API.\n",{"type":43,"tag":327,"props":2037,"children":2039},{"class":329,"line":2038},92,[2040],{"type":43,"tag":327,"props":2041,"children":2042},{},[2043],{"type":48,"value":2044},"  \"beforeAll\": [{ \"action\": \"run_script\", \"command\": \"npm install --silent\" }],\n",{"type":43,"tag":327,"props":2046,"children":2048},{"class":329,"line":2047},93,[2049],{"type":43,"tag":327,"props":2050,"children":2051},{},[2052],{"type":48,"value":2053},"  \"afterAll\": [{ \"action\": \"run_script\", \"command\": \"echo Report at $AXIS_REPORT_DIR\" }],\n",{"type":43,"tag":327,"props":2055,"children":2057},{"class":329,"line":2056},94,[2058],{"type":43,"tag":327,"props":2059,"children":2060},{},[2061],{"type":48,"value":758},{"type":43,"tag":760,"props":2063,"children":2065},{"id":2064},"built-in-adapters",[2066],{"type":48,"value":2067},"Built-in adapters",{"type":43,"tag":165,"props":2069,"children":2070},{},[2071,2088,2106],{"type":43,"tag":61,"props":2072,"children":2073},{},[2074,2079,2081,2087],{"type":43,"tag":73,"props":2075,"children":2077},{"className":2076},[],[2078],{"type":48,"value":1237},{"type":48,"value":2080},": Anthropic Claude Code CLI. Requires ",{"type":43,"tag":73,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":48,"value":2086},"ANTHROPIC_API_KEY",{"type":48,"value":226},{"type":43,"tag":61,"props":2089,"children":2090},{},[2091,2097,2099,2105],{"type":43,"tag":73,"props":2092,"children":2094},{"className":2093},[],[2095],{"type":48,"value":2096},"codex",{"type":48,"value":2098},": OpenAI Codex CLI. Requires ",{"type":43,"tag":73,"props":2100,"children":2102},{"className":2101},[],[2103],{"type":48,"value":2104},"CODEX_API_KEY",{"type":48,"value":226},{"type":43,"tag":61,"props":2107,"children":2108},{},[2109,2115,2117,2123],{"type":43,"tag":73,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":48,"value":2114},"gemini",{"type":48,"value":2116},": Google Gemini CLI. Requires ",{"type":43,"tag":73,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":48,"value":2122},"GEMINI_API_KEY",{"type":48,"value":226},{"type":43,"tag":51,"props":2125,"children":2126},{},[2127,2129,2135,2137,2143,2145,2151],{"type":48,"value":2128},"Any other name in ",{"type":43,"tag":73,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":48,"value":2134},"agents[].agent",{"type":48,"value":2136}," must be declared in the ",{"type":43,"tag":73,"props":2138,"children":2140},{"className":2139},[],[2141],{"type":48,"value":2142},"adapters",{"type":48,"value":2144}," map and point to a module that exports an ",{"type":43,"tag":73,"props":2146,"children":2148},{"className":2147},[],[2149],{"type":48,"value":2150},"AgentAdapter",{"type":48,"value":226},{"type":43,"tag":760,"props":2153,"children":2155},{"id":2154},"judging-precedence",[2156],{"type":48,"value":2157},"Judging precedence",{"type":43,"tag":51,"props":2159,"children":2160},{},[2161,2163,2169,2171,2177],{"type":48,"value":2162},"For each run, AXIS finds a judge by scanning ",{"type":43,"tag":73,"props":2164,"children":2166},{"className":2165},[],[2167],{"type":48,"value":2168},"judging.agents",{"type":48,"value":2170}," in order and picking the first entry whose adapter name differs from the agent being scored. If every entry matches, the first entry is used. When ",{"type":43,"tag":73,"props":2172,"children":2174},{"className":2173},[],[2175],{"type":48,"value":2176},"judging",{"type":48,"value":2178}," is omitted, the run's own agent judges itself.",{"type":43,"tag":96,"props":2180,"children":2182},{"id":2181},"recipes",[2183],{"type":48,"value":2184},"Recipes",{"type":43,"tag":760,"props":2186,"children":2188},{"id":2187},"minimal-scenario",[2189],{"type":48,"value":2190},"Minimal scenario",{"type":43,"tag":317,"props":2192,"children":2194},{"className":1147,"code":2193,"language":1149,"meta":321,"style":321},"{\n  \"name\": \"Hello world\",\n  \"prompt\": \"Say hello.\",\n  \"judge\": \"The agent should say hello.\"\n}\n",[2195],{"type":43,"tag":73,"props":2196,"children":2197},{"__ignoreMap":321},[2198,2205,2241,2277,2310],{"type":43,"tag":327,"props":2199,"children":2200},{"class":329,"line":330},[2201],{"type":43,"tag":327,"props":2202,"children":2203},{"style":1159},[2204],{"type":48,"value":336},{"type":43,"tag":327,"props":2206,"children":2207},{"class":329,"line":339},[2208,2212,2216,2220,2224,2228,2233,2237],{"type":43,"tag":327,"props":2209,"children":2210},{"style":1159},[2211],{"type":48,"value":1169},{"type":43,"tag":327,"props":2213,"children":2214},{"style":1172},[2215],{"type":48,"value":251},{"type":43,"tag":327,"props":2217,"children":2218},{"style":1159},[2219],{"type":48,"value":1180},{"type":43,"tag":327,"props":2221,"children":2222},{"style":1159},[2223],{"type":48,"value":857},{"type":43,"tag":327,"props":2225,"children":2226},{"style":1159},[2227],{"type":48,"value":1189},{"type":43,"tag":327,"props":2229,"children":2230},{"style":1192},[2231],{"type":48,"value":2232},"Hello world",{"type":43,"tag":327,"props":2234,"children":2235},{"style":1159},[2236],{"type":48,"value":1180},{"type":43,"tag":327,"props":2238,"children":2239},{"style":1159},[2240],{"type":48,"value":1204},{"type":43,"tag":327,"props":2242,"children":2243},{"class":329,"line":348},[2244,2248,2252,2256,2260,2264,2269,2273],{"type":43,"tag":327,"props":2245,"children":2246},{"style":1159},[2247],{"type":48,"value":1169},{"type":43,"tag":327,"props":2249,"children":2250},{"style":1172},[2251],{"type":48,"value":259},{"type":43,"tag":327,"props":2253,"children":2254},{"style":1159},[2255],{"type":48,"value":1180},{"type":43,"tag":327,"props":2257,"children":2258},{"style":1159},[2259],{"type":48,"value":857},{"type":43,"tag":327,"props":2261,"children":2262},{"style":1159},[2263],{"type":48,"value":1189},{"type":43,"tag":327,"props":2265,"children":2266},{"style":1192},[2267],{"type":48,"value":2268},"Say hello.",{"type":43,"tag":327,"props":2270,"children":2271},{"style":1159},[2272],{"type":48,"value":1180},{"type":43,"tag":327,"props":2274,"children":2275},{"style":1159},[2276],{"type":48,"value":1204},{"type":43,"tag":327,"props":2278,"children":2279},{"class":329,"line":357},[2280,2284,2288,2292,2296,2300,2305],{"type":43,"tag":327,"props":2281,"children":2282},{"style":1159},[2283],{"type":48,"value":1169},{"type":43,"tag":327,"props":2285,"children":2286},{"style":1172},[2287],{"type":48,"value":267},{"type":43,"tag":327,"props":2289,"children":2290},{"style":1159},[2291],{"type":48,"value":1180},{"type":43,"tag":327,"props":2293,"children":2294},{"style":1159},[2295],{"type":48,"value":857},{"type":43,"tag":327,"props":2297,"children":2298},{"style":1159},[2299],{"type":48,"value":1189},{"type":43,"tag":327,"props":2301,"children":2302},{"style":1192},[2303],{"type":48,"value":2304},"The agent should say hello.",{"type":43,"tag":327,"props":2306,"children":2307},{"style":1159},[2308],{"type":48,"value":2309},"\"\n",{"type":43,"tag":327,"props":2311,"children":2312},{"class":329,"line":367},[2313],{"type":43,"tag":327,"props":2314,"children":2315},{"style":1159},[2316],{"type":48,"value":758},{"type":43,"tag":760,"props":2318,"children":2320},{"id":2319},"realistic-scenario-with-setup-weighted-judge-and-teardown",[2321],{"type":48,"value":2322},"Realistic scenario with setup, weighted judge, and teardown",{"type":43,"tag":317,"props":2324,"children":2326},{"className":1147,"code":2325,"language":1149,"meta":321,"style":321},"{\n  \"name\": \"Debug and fix a broken script\",\n  \"setup\": [\n    {\n      \"action\": \"run_script\",\n      \"command\": \"mkdir -p \u002Ftmp\u002Fdemo && echo 'function add(a, b) { return a - b; }' > \u002Ftmp\u002Fdemo\u002Fadd.js\"\n    }\n  ],\n  \"prompt\": \"There is a JavaScript file at \u002Ftmp\u002Fdemo\u002Fadd.js with a bug. Run it, fix it, and verify the fix.\",\n  \"judge\": [\n    { \"check\": \"Agent ran the script and observed the wrong output\", \"weight\": 0.25 },\n    { \"check\": \"Agent identified the subtraction-instead-of-addition bug\", \"weight\": 0.25 },\n    { \"check\": \"Agent fixed the bug in the file\", \"weight\": 0.25 },\n    { \"check\": \"Agent re-ran the script and confirmed correct output\", \"weight\": 0.25 }\n  ],\n  \"teardown\": [{ \"action\": \"run_script\", \"command\": \"rm -rf \u002Ftmp\u002Fdemo\" }]\n}\n",[2327],{"type":43,"tag":73,"props":2328,"children":2329},{"__ignoreMap":321},[2330,2337,2373,2397,2404,2443,2476,2484,2491,2527,2550,2619,2683,2747,2812,2819,2909],{"type":43,"tag":327,"props":2331,"children":2332},{"class":329,"line":330},[2333],{"type":43,"tag":327,"props":2334,"children":2335},{"style":1159},[2336],{"type":48,"value":336},{"type":43,"tag":327,"props":2338,"children":2339},{"class":329,"line":339},[2340,2344,2348,2352,2356,2360,2365,2369],{"type":43,"tag":327,"props":2341,"children":2342},{"style":1159},[2343],{"type":48,"value":1169},{"type":43,"tag":327,"props":2345,"children":2346},{"style":1172},[2347],{"type":48,"value":251},{"type":43,"tag":327,"props":2349,"children":2350},{"style":1159},[2351],{"type":48,"value":1180},{"type":43,"tag":327,"props":2353,"children":2354},{"style":1159},[2355],{"type":48,"value":857},{"type":43,"tag":327,"props":2357,"children":2358},{"style":1159},[2359],{"type":48,"value":1189},{"type":43,"tag":327,"props":2361,"children":2362},{"style":1192},[2363],{"type":48,"value":2364},"Debug and fix a broken script",{"type":43,"tag":327,"props":2366,"children":2367},{"style":1159},[2368],{"type":48,"value":1180},{"type":43,"tag":327,"props":2370,"children":2371},{"style":1159},[2372],{"type":48,"value":1204},{"type":43,"tag":327,"props":2374,"children":2375},{"class":329,"line":348},[2376,2380,2384,2388,2392],{"type":43,"tag":327,"props":2377,"children":2378},{"style":1159},[2379],{"type":48,"value":1169},{"type":43,"tag":327,"props":2381,"children":2382},{"style":1172},[2383],{"type":48,"value":847},{"type":43,"tag":327,"props":2385,"children":2386},{"style":1159},[2387],{"type":48,"value":1180},{"type":43,"tag":327,"props":2389,"children":2390},{"style":1159},[2391],{"type":48,"value":857},{"type":43,"tag":327,"props":2393,"children":2394},{"style":1159},[2395],{"type":48,"value":2396}," [\n",{"type":43,"tag":327,"props":2398,"children":2399},{"class":329,"line":357},[2400],{"type":43,"tag":327,"props":2401,"children":2402},{"style":1159},[2403],{"type":48,"value":1421},{"type":43,"tag":327,"props":2405,"children":2406},{"class":329,"line":367},[2407,2412,2418,2422,2426,2430,2435,2439],{"type":43,"tag":327,"props":2408,"children":2409},{"style":1159},[2410],{"type":48,"value":2411},"      \"",{"type":43,"tag":327,"props":2413,"children":2415},{"style":2414},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2416],{"type":48,"value":2417},"action",{"type":43,"tag":327,"props":2419,"children":2420},{"style":1159},[2421],{"type":48,"value":1180},{"type":43,"tag":327,"props":2423,"children":2424},{"style":1159},[2425],{"type":48,"value":857},{"type":43,"tag":327,"props":2427,"children":2428},{"style":1159},[2429],{"type":48,"value":1189},{"type":43,"tag":327,"props":2431,"children":2432},{"style":1192},[2433],{"type":48,"value":2434},"run_script",{"type":43,"tag":327,"props":2436,"children":2437},{"style":1159},[2438],{"type":48,"value":1180},{"type":43,"tag":327,"props":2440,"children":2441},{"style":1159},[2442],{"type":48,"value":1204},{"type":43,"tag":327,"props":2444,"children":2445},{"class":329,"line":376},[2446,2450,2455,2459,2463,2467,2472],{"type":43,"tag":327,"props":2447,"children":2448},{"style":1159},[2449],{"type":48,"value":2411},{"type":43,"tag":327,"props":2451,"children":2452},{"style":2414},[2453],{"type":48,"value":2454},"command",{"type":43,"tag":327,"props":2456,"children":2457},{"style":1159},[2458],{"type":48,"value":1180},{"type":43,"tag":327,"props":2460,"children":2461},{"style":1159},[2462],{"type":48,"value":857},{"type":43,"tag":327,"props":2464,"children":2465},{"style":1159},[2466],{"type":48,"value":1189},{"type":43,"tag":327,"props":2468,"children":2469},{"style":1192},[2470],{"type":48,"value":2471},"mkdir -p \u002Ftmp\u002Fdemo && echo 'function add(a, b) { return a - b; }' > \u002Ftmp\u002Fdemo\u002Fadd.js",{"type":43,"tag":327,"props":2473,"children":2474},{"style":1159},[2475],{"type":48,"value":2309},{"type":43,"tag":327,"props":2477,"children":2478},{"class":329,"line":385},[2479],{"type":43,"tag":327,"props":2480,"children":2481},{"style":1159},[2482],{"type":48,"value":2483},"    }\n",{"type":43,"tag":327,"props":2485,"children":2486},{"class":329,"line":393},[2487],{"type":43,"tag":327,"props":2488,"children":2489},{"style":1159},[2490],{"type":48,"value":435},{"type":43,"tag":327,"props":2492,"children":2493},{"class":329,"line":402},[2494,2498,2502,2506,2510,2514,2519,2523],{"type":43,"tag":327,"props":2495,"children":2496},{"style":1159},[2497],{"type":48,"value":1169},{"type":43,"tag":327,"props":2499,"children":2500},{"style":1172},[2501],{"type":48,"value":259},{"type":43,"tag":327,"props":2503,"children":2504},{"style":1159},[2505],{"type":48,"value":1180},{"type":43,"tag":327,"props":2507,"children":2508},{"style":1159},[2509],{"type":48,"value":857},{"type":43,"tag":327,"props":2511,"children":2512},{"style":1159},[2513],{"type":48,"value":1189},{"type":43,"tag":327,"props":2515,"children":2516},{"style":1192},[2517],{"type":48,"value":2518},"There is a JavaScript file at \u002Ftmp\u002Fdemo\u002Fadd.js with a bug. Run it, fix it, and verify the fix.",{"type":43,"tag":327,"props":2520,"children":2521},{"style":1159},[2522],{"type":48,"value":1180},{"type":43,"tag":327,"props":2524,"children":2525},{"style":1159},[2526],{"type":48,"value":1204},{"type":43,"tag":327,"props":2528,"children":2529},{"class":329,"line":411},[2530,2534,2538,2542,2546],{"type":43,"tag":327,"props":2531,"children":2532},{"style":1159},[2533],{"type":48,"value":1169},{"type":43,"tag":327,"props":2535,"children":2536},{"style":1172},[2537],{"type":48,"value":267},{"type":43,"tag":327,"props":2539,"children":2540},{"style":1159},[2541],{"type":48,"value":1180},{"type":43,"tag":327,"props":2543,"children":2544},{"style":1159},[2545],{"type":48,"value":857},{"type":43,"tag":327,"props":2547,"children":2548},{"style":1159},[2549],{"type":48,"value":2396},{"type":43,"tag":327,"props":2551,"children":2552},{"class":329,"line":420},[2553,2558,2562,2566,2570,2574,2578,2583,2587,2592,2596,2600,2604,2608,2614],{"type":43,"tag":327,"props":2554,"children":2555},{"style":1159},[2556],{"type":48,"value":2557},"    {",{"type":43,"tag":327,"props":2559,"children":2560},{"style":1159},[2561],{"type":48,"value":1189},{"type":43,"tag":327,"props":2563,"children":2564},{"style":2414},[2565],{"type":48,"value":800},{"type":43,"tag":327,"props":2567,"children":2568},{"style":1159},[2569],{"type":48,"value":1180},{"type":43,"tag":327,"props":2571,"children":2572},{"style":1159},[2573],{"type":48,"value":857},{"type":43,"tag":327,"props":2575,"children":2576},{"style":1159},[2577],{"type":48,"value":1189},{"type":43,"tag":327,"props":2579,"children":2580},{"style":1192},[2581],{"type":48,"value":2582},"Agent ran the script and observed the wrong output",{"type":43,"tag":327,"props":2584,"children":2585},{"style":1159},[2586],{"type":48,"value":1180},{"type":43,"tag":327,"props":2588,"children":2589},{"style":1159},[2590],{"type":48,"value":2591},",",{"type":43,"tag":327,"props":2593,"children":2594},{"style":1159},[2595],{"type":48,"value":1189},{"type":43,"tag":327,"props":2597,"children":2598},{"style":2414},[2599],{"type":48,"value":808},{"type":43,"tag":327,"props":2601,"children":2602},{"style":1159},[2603],{"type":48,"value":1180},{"type":43,"tag":327,"props":2605,"children":2606},{"style":1159},[2607],{"type":48,"value":857},{"type":43,"tag":327,"props":2609,"children":2611},{"style":2610},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2612],{"type":48,"value":2613}," 0.25",{"type":43,"tag":327,"props":2615,"children":2616},{"style":1159},[2617],{"type":48,"value":2618}," },\n",{"type":43,"tag":327,"props":2620,"children":2621},{"class":329,"line":429},[2622,2626,2630,2634,2638,2642,2646,2651,2655,2659,2663,2667,2671,2675,2679],{"type":43,"tag":327,"props":2623,"children":2624},{"style":1159},[2625],{"type":48,"value":2557},{"type":43,"tag":327,"props":2627,"children":2628},{"style":1159},[2629],{"type":48,"value":1189},{"type":43,"tag":327,"props":2631,"children":2632},{"style":2414},[2633],{"type":48,"value":800},{"type":43,"tag":327,"props":2635,"children":2636},{"style":1159},[2637],{"type":48,"value":1180},{"type":43,"tag":327,"props":2639,"children":2640},{"style":1159},[2641],{"type":48,"value":857},{"type":43,"tag":327,"props":2643,"children":2644},{"style":1159},[2645],{"type":48,"value":1189},{"type":43,"tag":327,"props":2647,"children":2648},{"style":1192},[2649],{"type":48,"value":2650},"Agent identified the subtraction-instead-of-addition bug",{"type":43,"tag":327,"props":2652,"children":2653},{"style":1159},[2654],{"type":48,"value":1180},{"type":43,"tag":327,"props":2656,"children":2657},{"style":1159},[2658],{"type":48,"value":2591},{"type":43,"tag":327,"props":2660,"children":2661},{"style":1159},[2662],{"type":48,"value":1189},{"type":43,"tag":327,"props":2664,"children":2665},{"style":2414},[2666],{"type":48,"value":808},{"type":43,"tag":327,"props":2668,"children":2669},{"style":1159},[2670],{"type":48,"value":1180},{"type":43,"tag":327,"props":2672,"children":2673},{"style":1159},[2674],{"type":48,"value":857},{"type":43,"tag":327,"props":2676,"children":2677},{"style":2610},[2678],{"type":48,"value":2613},{"type":43,"tag":327,"props":2680,"children":2681},{"style":1159},[2682],{"type":48,"value":2618},{"type":43,"tag":327,"props":2684,"children":2685},{"class":329,"line":438},[2686,2690,2694,2698,2702,2706,2710,2715,2719,2723,2727,2731,2735,2739,2743],{"type":43,"tag":327,"props":2687,"children":2688},{"style":1159},[2689],{"type":48,"value":2557},{"type":43,"tag":327,"props":2691,"children":2692},{"style":1159},[2693],{"type":48,"value":1189},{"type":43,"tag":327,"props":2695,"children":2696},{"style":2414},[2697],{"type":48,"value":800},{"type":43,"tag":327,"props":2699,"children":2700},{"style":1159},[2701],{"type":48,"value":1180},{"type":43,"tag":327,"props":2703,"children":2704},{"style":1159},[2705],{"type":48,"value":857},{"type":43,"tag":327,"props":2707,"children":2708},{"style":1159},[2709],{"type":48,"value":1189},{"type":43,"tag":327,"props":2711,"children":2712},{"style":1192},[2713],{"type":48,"value":2714},"Agent fixed the bug in the file",{"type":43,"tag":327,"props":2716,"children":2717},{"style":1159},[2718],{"type":48,"value":1180},{"type":43,"tag":327,"props":2720,"children":2721},{"style":1159},[2722],{"type":48,"value":2591},{"type":43,"tag":327,"props":2724,"children":2725},{"style":1159},[2726],{"type":48,"value":1189},{"type":43,"tag":327,"props":2728,"children":2729},{"style":2414},[2730],{"type":48,"value":808},{"type":43,"tag":327,"props":2732,"children":2733},{"style":1159},[2734],{"type":48,"value":1180},{"type":43,"tag":327,"props":2736,"children":2737},{"style":1159},[2738],{"type":48,"value":857},{"type":43,"tag":327,"props":2740,"children":2741},{"style":2610},[2742],{"type":48,"value":2613},{"type":43,"tag":327,"props":2744,"children":2745},{"style":1159},[2746],{"type":48,"value":2618},{"type":43,"tag":327,"props":2748,"children":2749},{"class":329,"line":446},[2750,2754,2758,2762,2766,2770,2774,2779,2783,2787,2791,2795,2799,2803,2807],{"type":43,"tag":327,"props":2751,"children":2752},{"style":1159},[2753],{"type":48,"value":2557},{"type":43,"tag":327,"props":2755,"children":2756},{"style":1159},[2757],{"type":48,"value":1189},{"type":43,"tag":327,"props":2759,"children":2760},{"style":2414},[2761],{"type":48,"value":800},{"type":43,"tag":327,"props":2763,"children":2764},{"style":1159},[2765],{"type":48,"value":1180},{"type":43,"tag":327,"props":2767,"children":2768},{"style":1159},[2769],{"type":48,"value":857},{"type":43,"tag":327,"props":2771,"children":2772},{"style":1159},[2773],{"type":48,"value":1189},{"type":43,"tag":327,"props":2775,"children":2776},{"style":1192},[2777],{"type":48,"value":2778},"Agent re-ran the script and confirmed correct output",{"type":43,"tag":327,"props":2780,"children":2781},{"style":1159},[2782],{"type":48,"value":1180},{"type":43,"tag":327,"props":2784,"children":2785},{"style":1159},[2786],{"type":48,"value":2591},{"type":43,"tag":327,"props":2788,"children":2789},{"style":1159},[2790],{"type":48,"value":1189},{"type":43,"tag":327,"props":2792,"children":2793},{"style":2414},[2794],{"type":48,"value":808},{"type":43,"tag":327,"props":2796,"children":2797},{"style":1159},[2798],{"type":48,"value":1180},{"type":43,"tag":327,"props":2800,"children":2801},{"style":1159},[2802],{"type":48,"value":857},{"type":43,"tag":327,"props":2804,"children":2805},{"style":2610},[2806],{"type":48,"value":2613},{"type":43,"tag":327,"props":2808,"children":2809},{"style":1159},[2810],{"type":48,"value":2811}," }\n",{"type":43,"tag":327,"props":2813,"children":2814},{"class":329,"line":455},[2815],{"type":43,"tag":327,"props":2816,"children":2817},{"style":1159},[2818],{"type":48,"value":435},{"type":43,"tag":327,"props":2820,"children":2821},{"class":329,"line":464},[2822,2826,2830,2834,2838,2843,2847,2851,2855,2859,2863,2867,2871,2875,2879,2883,2887,2891,2895,2900,2904],{"type":43,"tag":327,"props":2823,"children":2824},{"style":1159},[2825],{"type":48,"value":1169},{"type":43,"tag":327,"props":2827,"children":2828},{"style":1172},[2829],{"type":48,"value":855},{"type":43,"tag":327,"props":2831,"children":2832},{"style":1159},[2833],{"type":48,"value":1180},{"type":43,"tag":327,"props":2835,"children":2836},{"style":1159},[2837],{"type":48,"value":857},{"type":43,"tag":327,"props":2839,"children":2840},{"style":1159},[2841],{"type":48,"value":2842}," [{",{"type":43,"tag":327,"props":2844,"children":2845},{"style":1159},[2846],{"type":48,"value":1189},{"type":43,"tag":327,"props":2848,"children":2849},{"style":2414},[2850],{"type":48,"value":2417},{"type":43,"tag":327,"props":2852,"children":2853},{"style":1159},[2854],{"type":48,"value":1180},{"type":43,"tag":327,"props":2856,"children":2857},{"style":1159},[2858],{"type":48,"value":857},{"type":43,"tag":327,"props":2860,"children":2861},{"style":1159},[2862],{"type":48,"value":1189},{"type":43,"tag":327,"props":2864,"children":2865},{"style":1192},[2866],{"type":48,"value":2434},{"type":43,"tag":327,"props":2868,"children":2869},{"style":1159},[2870],{"type":48,"value":1180},{"type":43,"tag":327,"props":2872,"children":2873},{"style":1159},[2874],{"type":48,"value":2591},{"type":43,"tag":327,"props":2876,"children":2877},{"style":1159},[2878],{"type":48,"value":1189},{"type":43,"tag":327,"props":2880,"children":2881},{"style":2414},[2882],{"type":48,"value":2454},{"type":43,"tag":327,"props":2884,"children":2885},{"style":1159},[2886],{"type":48,"value":1180},{"type":43,"tag":327,"props":2888,"children":2889},{"style":1159},[2890],{"type":48,"value":857},{"type":43,"tag":327,"props":2892,"children":2893},{"style":1159},[2894],{"type":48,"value":1189},{"type":43,"tag":327,"props":2896,"children":2897},{"style":1192},[2898],{"type":48,"value":2899},"rm -rf \u002Ftmp\u002Fdemo",{"type":43,"tag":327,"props":2901,"children":2902},{"style":1159},[2903],{"type":48,"value":1180},{"type":43,"tag":327,"props":2905,"children":2906},{"style":1159},[2907],{"type":48,"value":2908}," }]\n",{"type":43,"tag":327,"props":2910,"children":2911},{"class":329,"line":472},[2912],{"type":43,"tag":327,"props":2913,"children":2914},{"style":1159},[2915],{"type":48,"value":758},{"type":43,"tag":760,"props":2917,"children":2919},{"id":2918},"multi-agent-comparison-config",[2920],{"type":48,"value":2921},"Multi-agent comparison config",{"type":43,"tag":317,"props":2923,"children":2925},{"className":1147,"code":2924,"language":1149,"meta":321,"style":321},"{\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [\n    { \"agent\": \"claude-code\", \"model\": \"claude-sonnet-4-6\" },\n    { \"agent\": \"claude-code\", \"model\": \"claude-opus-4-6\" },\n    \"codex\"\n  ],\n  \"judging\": {\n    \"agents\": [{ \"agent\": \"claude-code\", \"model\": \"claude-opus-4-7\" }]\n  }\n}\n",[2926],{"type":43,"tag":73,"props":2927,"children":2928},{"__ignoreMap":321},[2929,2936,2971,2994,3068,3140,3156,3163,3187,3275,3283],{"type":43,"tag":327,"props":2930,"children":2931},{"class":329,"line":330},[2932],{"type":43,"tag":327,"props":2933,"children":2934},{"style":1159},[2935],{"type":48,"value":336},{"type":43,"tag":327,"props":2937,"children":2938},{"class":329,"line":339},[2939,2943,2947,2951,2955,2959,2963,2967],{"type":43,"tag":327,"props":2940,"children":2941},{"style":1159},[2942],{"type":48,"value":1169},{"type":43,"tag":327,"props":2944,"children":2945},{"style":1172},[2946],{"type":48,"value":1175},{"type":43,"tag":327,"props":2948,"children":2949},{"style":1159},[2950],{"type":48,"value":1180},{"type":43,"tag":327,"props":2952,"children":2953},{"style":1159},[2954],{"type":48,"value":857},{"type":43,"tag":327,"props":2956,"children":2957},{"style":1159},[2958],{"type":48,"value":1189},{"type":43,"tag":327,"props":2960,"children":2961},{"style":1192},[2962],{"type":48,"value":1195},{"type":43,"tag":327,"props":2964,"children":2965},{"style":1159},[2966],{"type":48,"value":1180},{"type":43,"tag":327,"props":2968,"children":2969},{"style":1159},[2970],{"type":48,"value":1204},{"type":43,"tag":327,"props":2972,"children":2973},{"class":329,"line":348},[2974,2978,2982,2986,2990],{"type":43,"tag":327,"props":2975,"children":2976},{"style":1159},[2977],{"type":48,"value":1169},{"type":43,"tag":327,"props":2979,"children":2980},{"style":1172},[2981],{"type":48,"value":22},{"type":43,"tag":327,"props":2983,"children":2984},{"style":1159},[2985],{"type":48,"value":1180},{"type":43,"tag":327,"props":2987,"children":2988},{"style":1159},[2989],{"type":48,"value":857},{"type":43,"tag":327,"props":2991,"children":2992},{"style":1159},[2993],{"type":48,"value":2396},{"type":43,"tag":327,"props":2995,"children":2996},{"class":329,"line":357},[2997,3001,3005,3010,3014,3018,3022,3026,3030,3034,3038,3043,3047,3051,3055,3060,3064],{"type":43,"tag":327,"props":2998,"children":2999},{"style":1159},[3000],{"type":48,"value":2557},{"type":43,"tag":327,"props":3002,"children":3003},{"style":1159},[3004],{"type":48,"value":1189},{"type":43,"tag":327,"props":3006,"children":3007},{"style":2414},[3008],{"type":48,"value":3009},"agent",{"type":43,"tag":327,"props":3011,"children":3012},{"style":1159},[3013],{"type":48,"value":1180},{"type":43,"tag":327,"props":3015,"children":3016},{"style":1159},[3017],{"type":48,"value":857},{"type":43,"tag":327,"props":3019,"children":3020},{"style":1159},[3021],{"type":48,"value":1189},{"type":43,"tag":327,"props":3023,"children":3024},{"style":1192},[3025],{"type":48,"value":1237},{"type":43,"tag":327,"props":3027,"children":3028},{"style":1159},[3029],{"type":48,"value":1180},{"type":43,"tag":327,"props":3031,"children":3032},{"style":1159},[3033],{"type":48,"value":2591},{"type":43,"tag":327,"props":3035,"children":3036},{"style":1159},[3037],{"type":48,"value":1189},{"type":43,"tag":327,"props":3039,"children":3040},{"style":2414},[3041],{"type":48,"value":3042},"model",{"type":43,"tag":327,"props":3044,"children":3045},{"style":1159},[3046],{"type":48,"value":1180},{"type":43,"tag":327,"props":3048,"children":3049},{"style":1159},[3050],{"type":48,"value":857},{"type":43,"tag":327,"props":3052,"children":3053},{"style":1159},[3054],{"type":48,"value":1189},{"type":43,"tag":327,"props":3056,"children":3057},{"style":1192},[3058],{"type":48,"value":3059},"claude-sonnet-4-6",{"type":43,"tag":327,"props":3061,"children":3062},{"style":1159},[3063],{"type":48,"value":1180},{"type":43,"tag":327,"props":3065,"children":3066},{"style":1159},[3067],{"type":48,"value":2618},{"type":43,"tag":327,"props":3069,"children":3070},{"class":329,"line":367},[3071,3075,3079,3083,3087,3091,3095,3099,3103,3107,3111,3115,3119,3123,3127,3132,3136],{"type":43,"tag":327,"props":3072,"children":3073},{"style":1159},[3074],{"type":48,"value":2557},{"type":43,"tag":327,"props":3076,"children":3077},{"style":1159},[3078],{"type":48,"value":1189},{"type":43,"tag":327,"props":3080,"children":3081},{"style":2414},[3082],{"type":48,"value":3009},{"type":43,"tag":327,"props":3084,"children":3085},{"style":1159},[3086],{"type":48,"value":1180},{"type":43,"tag":327,"props":3088,"children":3089},{"style":1159},[3090],{"type":48,"value":857},{"type":43,"tag":327,"props":3092,"children":3093},{"style":1159},[3094],{"type":48,"value":1189},{"type":43,"tag":327,"props":3096,"children":3097},{"style":1192},[3098],{"type":48,"value":1237},{"type":43,"tag":327,"props":3100,"children":3101},{"style":1159},[3102],{"type":48,"value":1180},{"type":43,"tag":327,"props":3104,"children":3105},{"style":1159},[3106],{"type":48,"value":2591},{"type":43,"tag":327,"props":3108,"children":3109},{"style":1159},[3110],{"type":48,"value":1189},{"type":43,"tag":327,"props":3112,"children":3113},{"style":2414},[3114],{"type":48,"value":3042},{"type":43,"tag":327,"props":3116,"children":3117},{"style":1159},[3118],{"type":48,"value":1180},{"type":43,"tag":327,"props":3120,"children":3121},{"style":1159},[3122],{"type":48,"value":857},{"type":43,"tag":327,"props":3124,"children":3125},{"style":1159},[3126],{"type":48,"value":1189},{"type":43,"tag":327,"props":3128,"children":3129},{"style":1192},[3130],{"type":48,"value":3131},"claude-opus-4-6",{"type":43,"tag":327,"props":3133,"children":3134},{"style":1159},[3135],{"type":48,"value":1180},{"type":43,"tag":327,"props":3137,"children":3138},{"style":1159},[3139],{"type":48,"value":2618},{"type":43,"tag":327,"props":3141,"children":3142},{"class":329,"line":376},[3143,3148,3152],{"type":43,"tag":327,"props":3144,"children":3145},{"style":1159},[3146],{"type":48,"value":3147},"    \"",{"type":43,"tag":327,"props":3149,"children":3150},{"style":1192},[3151],{"type":48,"value":2096},{"type":43,"tag":327,"props":3153,"children":3154},{"style":1159},[3155],{"type":48,"value":2309},{"type":43,"tag":327,"props":3157,"children":3158},{"class":329,"line":385},[3159],{"type":43,"tag":327,"props":3160,"children":3161},{"style":1159},[3162],{"type":48,"value":435},{"type":43,"tag":327,"props":3164,"children":3165},{"class":329,"line":393},[3166,3170,3174,3178,3182],{"type":43,"tag":327,"props":3167,"children":3168},{"style":1159},[3169],{"type":48,"value":1169},{"type":43,"tag":327,"props":3171,"children":3172},{"style":1172},[3173],{"type":48,"value":2176},{"type":43,"tag":327,"props":3175,"children":3176},{"style":1159},[3177],{"type":48,"value":1180},{"type":43,"tag":327,"props":3179,"children":3180},{"style":1159},[3181],{"type":48,"value":857},{"type":43,"tag":327,"props":3183,"children":3184},{"style":1159},[3185],{"type":48,"value":3186}," {\n",{"type":43,"tag":327,"props":3188,"children":3189},{"class":329,"line":402},[3190,3194,3198,3202,3206,3210,3214,3218,3222,3226,3230,3234,3238,3242,3246,3250,3254,3258,3262,3267,3271],{"type":43,"tag":327,"props":3191,"children":3192},{"style":1159},[3193],{"type":48,"value":3147},{"type":43,"tag":327,"props":3195,"children":3196},{"style":2414},[3197],{"type":48,"value":22},{"type":43,"tag":327,"props":3199,"children":3200},{"style":1159},[3201],{"type":48,"value":1180},{"type":43,"tag":327,"props":3203,"children":3204},{"style":1159},[3205],{"type":48,"value":857},{"type":43,"tag":327,"props":3207,"children":3208},{"style":1159},[3209],{"type":48,"value":2842},{"type":43,"tag":327,"props":3211,"children":3212},{"style":1159},[3213],{"type":48,"value":1189},{"type":43,"tag":327,"props":3215,"children":3216},{"style":2610},[3217],{"type":48,"value":3009},{"type":43,"tag":327,"props":3219,"children":3220},{"style":1159},[3221],{"type":48,"value":1180},{"type":43,"tag":327,"props":3223,"children":3224},{"style":1159},[3225],{"type":48,"value":857},{"type":43,"tag":327,"props":3227,"children":3228},{"style":1159},[3229],{"type":48,"value":1189},{"type":43,"tag":327,"props":3231,"children":3232},{"style":1192},[3233],{"type":48,"value":1237},{"type":43,"tag":327,"props":3235,"children":3236},{"style":1159},[3237],{"type":48,"value":1180},{"type":43,"tag":327,"props":3239,"children":3240},{"style":1159},[3241],{"type":48,"value":2591},{"type":43,"tag":327,"props":3243,"children":3244},{"style":1159},[3245],{"type":48,"value":1189},{"type":43,"tag":327,"props":3247,"children":3248},{"style":2610},[3249],{"type":48,"value":3042},{"type":43,"tag":327,"props":3251,"children":3252},{"style":1159},[3253],{"type":48,"value":1180},{"type":43,"tag":327,"props":3255,"children":3256},{"style":1159},[3257],{"type":48,"value":857},{"type":43,"tag":327,"props":3259,"children":3260},{"style":1159},[3261],{"type":48,"value":1189},{"type":43,"tag":327,"props":3263,"children":3264},{"style":1192},[3265],{"type":48,"value":3266},"claude-opus-4-7",{"type":43,"tag":327,"props":3268,"children":3269},{"style":1159},[3270],{"type":48,"value":1180},{"type":43,"tag":327,"props":3272,"children":3273},{"style":1159},[3274],{"type":48,"value":2908},{"type":43,"tag":327,"props":3276,"children":3277},{"class":329,"line":411},[3278],{"type":43,"tag":327,"props":3279,"children":3280},{"style":1159},[3281],{"type":48,"value":3282},"  }\n",{"type":43,"tag":327,"props":3284,"children":3285},{"class":329,"line":420},[3286],{"type":43,"tag":327,"props":3287,"children":3288},{"style":1159},[3289],{"type":48,"value":758},{"type":43,"tag":760,"props":3291,"children":3293},{"id":3292},"custom-adapter-wiring",[3294],{"type":48,"value":3295},"Custom adapter wiring",{"type":43,"tag":51,"props":3297,"children":3298},{},[3299,3301,3307],{"type":48,"value":3300},"Module ",{"type":43,"tag":73,"props":3302,"children":3304},{"className":3303},[],[3305],{"type":48,"value":3306},"adapters\u002Fecho.ts",{"type":48,"value":857},{"type":43,"tag":317,"props":3309,"children":3313},{"className":3310,"code":3311,"language":3312,"meta":321,"style":321},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createAgentAdapter } from \"@netlify\u002Faxis\";\n\nexport default createAgentAdapter\u003C{ stdout: string }>({\n  name: \"echo\",\n  resolveCommand: () => ({ command: \"echo\", prefixArgs: [] }),\n  buildArgs: (input) => [input.prompt],\n  initialState: () => ({ stdout: \"\" }),\n  streamConfig: {\n    mode: \"aggregate\",\n    onChunk: (chunk, ctx) => {\n      ctx.state.stdout += chunk;\n    },\n  },\n  getResult: (ctx) => ({ result: ctx.state.stdout.trim() || null }),\n});\n","ts",[3314],{"type":43,"tag":73,"props":3315,"children":3316},{"__ignoreMap":321},[3317,3365,3372,3424,3453,3537,3585,3638,3654,3683,3725,3765,3772,3779,3881],{"type":43,"tag":327,"props":3318,"children":3319},{"class":329,"line":330},[3320,3326,3331,3337,3342,3347,3351,3356,3360],{"type":43,"tag":327,"props":3321,"children":3323},{"style":3322},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[3324],{"type":48,"value":3325},"import",{"type":43,"tag":327,"props":3327,"children":3328},{"style":1159},[3329],{"type":48,"value":3330}," {",{"type":43,"tag":327,"props":3332,"children":3334},{"style":3333},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[3335],{"type":48,"value":3336}," createAgentAdapter",{"type":43,"tag":327,"props":3338,"children":3339},{"style":1159},[3340],{"type":48,"value":3341}," }",{"type":43,"tag":327,"props":3343,"children":3344},{"style":3322},[3345],{"type":48,"value":3346}," from",{"type":43,"tag":327,"props":3348,"children":3349},{"style":1159},[3350],{"type":48,"value":1189},{"type":43,"tag":327,"props":3352,"children":3353},{"style":1192},[3354],{"type":48,"value":3355},"@netlify\u002Faxis",{"type":43,"tag":327,"props":3357,"children":3358},{"style":1159},[3359],{"type":48,"value":1180},{"type":43,"tag":327,"props":3361,"children":3362},{"style":1159},[3363],{"type":48,"value":3364},";\n",{"type":43,"tag":327,"props":3366,"children":3367},{"class":329,"line":339},[3368],{"type":43,"tag":327,"props":3369,"children":3370},{"emptyLinePlaceholder":361},[3371],{"type":48,"value":364},{"type":43,"tag":327,"props":3373,"children":3374},{"class":329,"line":348},[3375,3380,3385,3390,3395,3401,3405,3410,3415,3420],{"type":43,"tag":327,"props":3376,"children":3377},{"style":3322},[3378],{"type":48,"value":3379},"export",{"type":43,"tag":327,"props":3381,"children":3382},{"style":3322},[3383],{"type":48,"value":3384}," default",{"type":43,"tag":327,"props":3386,"children":3388},{"style":3387},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[3389],{"type":48,"value":3336},{"type":43,"tag":327,"props":3391,"children":3392},{"style":1159},[3393],{"type":48,"value":3394},"\u003C{",{"type":43,"tag":327,"props":3396,"children":3398},{"style":3397},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[3399],{"type":48,"value":3400}," stdout",{"type":43,"tag":327,"props":3402,"children":3403},{"style":1159},[3404],{"type":48,"value":857},{"type":43,"tag":327,"props":3406,"children":3407},{"style":2414},[3408],{"type":48,"value":3409}," string",{"type":43,"tag":327,"props":3411,"children":3412},{"style":1159},[3413],{"type":48,"value":3414}," }>",{"type":43,"tag":327,"props":3416,"children":3417},{"style":3333},[3418],{"type":48,"value":3419},"(",{"type":43,"tag":327,"props":3421,"children":3422},{"style":1159},[3423],{"type":48,"value":336},{"type":43,"tag":327,"props":3425,"children":3426},{"class":329,"line":357},[3427,3432,3436,3440,3445,3449],{"type":43,"tag":327,"props":3428,"children":3429},{"style":3397},[3430],{"type":48,"value":3431},"  name",{"type":43,"tag":327,"props":3433,"children":3434},{"style":1159},[3435],{"type":48,"value":857},{"type":43,"tag":327,"props":3437,"children":3438},{"style":1159},[3439],{"type":48,"value":1189},{"type":43,"tag":327,"props":3441,"children":3442},{"style":1192},[3443],{"type":48,"value":3444},"echo",{"type":43,"tag":327,"props":3446,"children":3447},{"style":1159},[3448],{"type":48,"value":1180},{"type":43,"tag":327,"props":3450,"children":3451},{"style":1159},[3452],{"type":48,"value":1204},{"type":43,"tag":327,"props":3454,"children":3455},{"class":329,"line":367},[3456,3461,3465,3470,3475,3479,3484,3489,3493,3497,3501,3505,3509,3514,3518,3523,3528,3533],{"type":43,"tag":327,"props":3457,"children":3458},{"style":3387},[3459],{"type":48,"value":3460},"  resolveCommand",{"type":43,"tag":327,"props":3462,"children":3463},{"style":1159},[3464],{"type":48,"value":857},{"type":43,"tag":327,"props":3466,"children":3467},{"style":1159},[3468],{"type":48,"value":3469}," ()",{"type":43,"tag":327,"props":3471,"children":3472},{"style":1172},[3473],{"type":48,"value":3474}," =>",{"type":43,"tag":327,"props":3476,"children":3477},{"style":3333},[3478],{"type":48,"value":879},{"type":43,"tag":327,"props":3480,"children":3481},{"style":1159},[3482],{"type":48,"value":3483},"{",{"type":43,"tag":327,"props":3485,"children":3486},{"style":3397},[3487],{"type":48,"value":3488}," command",{"type":43,"tag":327,"props":3490,"children":3491},{"style":1159},[3492],{"type":48,"value":857},{"type":43,"tag":327,"props":3494,"children":3495},{"style":1159},[3496],{"type":48,"value":1189},{"type":43,"tag":327,"props":3498,"children":3499},{"style":1192},[3500],{"type":48,"value":3444},{"type":43,"tag":327,"props":3502,"children":3503},{"style":1159},[3504],{"type":48,"value":1180},{"type":43,"tag":327,"props":3506,"children":3507},{"style":1159},[3508],{"type":48,"value":2591},{"type":43,"tag":327,"props":3510,"children":3511},{"style":3397},[3512],{"type":48,"value":3513}," prefixArgs",{"type":43,"tag":327,"props":3515,"children":3516},{"style":1159},[3517],{"type":48,"value":857},{"type":43,"tag":327,"props":3519,"children":3520},{"style":3333},[3521],{"type":48,"value":3522}," [] ",{"type":43,"tag":327,"props":3524,"children":3525},{"style":1159},[3526],{"type":48,"value":3527},"}",{"type":43,"tag":327,"props":3529,"children":3530},{"style":3333},[3531],{"type":48,"value":3532},")",{"type":43,"tag":327,"props":3534,"children":3535},{"style":1159},[3536],{"type":48,"value":1204},{"type":43,"tag":327,"props":3538,"children":3539},{"class":329,"line":376},[3540,3545,3549,3553,3559,3563,3567,3572,3576,3581],{"type":43,"tag":327,"props":3541,"children":3542},{"style":3387},[3543],{"type":48,"value":3544},"  buildArgs",{"type":43,"tag":327,"props":3546,"children":3547},{"style":1159},[3548],{"type":48,"value":857},{"type":43,"tag":327,"props":3550,"children":3551},{"style":1159},[3552],{"type":48,"value":879},{"type":43,"tag":327,"props":3554,"children":3556},{"style":3555},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[3557],{"type":48,"value":3558},"input",{"type":43,"tag":327,"props":3560,"children":3561},{"style":1159},[3562],{"type":48,"value":3532},{"type":43,"tag":327,"props":3564,"children":3565},{"style":1172},[3566],{"type":48,"value":3474},{"type":43,"tag":327,"props":3568,"children":3569},{"style":3333},[3570],{"type":48,"value":3571}," [input",{"type":43,"tag":327,"props":3573,"children":3574},{"style":1159},[3575],{"type":48,"value":226},{"type":43,"tag":327,"props":3577,"children":3578},{"style":3333},[3579],{"type":48,"value":3580},"prompt]",{"type":43,"tag":327,"props":3582,"children":3583},{"style":1159},[3584],{"type":48,"value":1204},{"type":43,"tag":327,"props":3586,"children":3587},{"class":329,"line":385},[3588,3593,3597,3601,3605,3609,3613,3617,3621,3626,3630,3634],{"type":43,"tag":327,"props":3589,"children":3590},{"style":3387},[3591],{"type":48,"value":3592},"  initialState",{"type":43,"tag":327,"props":3594,"children":3595},{"style":1159},[3596],{"type":48,"value":857},{"type":43,"tag":327,"props":3598,"children":3599},{"style":1159},[3600],{"type":48,"value":3469},{"type":43,"tag":327,"props":3602,"children":3603},{"style":1172},[3604],{"type":48,"value":3474},{"type":43,"tag":327,"props":3606,"children":3607},{"style":3333},[3608],{"type":48,"value":879},{"type":43,"tag":327,"props":3610,"children":3611},{"style":1159},[3612],{"type":48,"value":3483},{"type":43,"tag":327,"props":3614,"children":3615},{"style":3397},[3616],{"type":48,"value":3400},{"type":43,"tag":327,"props":3618,"children":3619},{"style":1159},[3620],{"type":48,"value":857},{"type":43,"tag":327,"props":3622,"children":3623},{"style":1159},[3624],{"type":48,"value":3625}," \"\"",{"type":43,"tag":327,"props":3627,"children":3628},{"style":1159},[3629],{"type":48,"value":3341},{"type":43,"tag":327,"props":3631,"children":3632},{"style":3333},[3633],{"type":48,"value":3532},{"type":43,"tag":327,"props":3635,"children":3636},{"style":1159},[3637],{"type":48,"value":1204},{"type":43,"tag":327,"props":3639,"children":3640},{"class":329,"line":393},[3641,3646,3650],{"type":43,"tag":327,"props":3642,"children":3643},{"style":3397},[3644],{"type":48,"value":3645},"  streamConfig",{"type":43,"tag":327,"props":3647,"children":3648},{"style":1159},[3649],{"type":48,"value":857},{"type":43,"tag":327,"props":3651,"children":3652},{"style":1159},[3653],{"type":48,"value":3186},{"type":43,"tag":327,"props":3655,"children":3656},{"class":329,"line":402},[3657,3662,3666,3670,3675,3679],{"type":43,"tag":327,"props":3658,"children":3659},{"style":3397},[3660],{"type":48,"value":3661},"    mode",{"type":43,"tag":327,"props":3663,"children":3664},{"style":1159},[3665],{"type":48,"value":857},{"type":43,"tag":327,"props":3667,"children":3668},{"style":1159},[3669],{"type":48,"value":1189},{"type":43,"tag":327,"props":3671,"children":3672},{"style":1192},[3673],{"type":48,"value":3674},"aggregate",{"type":43,"tag":327,"props":3676,"children":3677},{"style":1159},[3678],{"type":48,"value":1180},{"type":43,"tag":327,"props":3680,"children":3681},{"style":1159},[3682],{"type":48,"value":1204},{"type":43,"tag":327,"props":3684,"children":3685},{"class":329,"line":411},[3686,3691,3695,3699,3704,3708,3713,3717,3721],{"type":43,"tag":327,"props":3687,"children":3688},{"style":3387},[3689],{"type":48,"value":3690},"    onChunk",{"type":43,"tag":327,"props":3692,"children":3693},{"style":1159},[3694],{"type":48,"value":857},{"type":43,"tag":327,"props":3696,"children":3697},{"style":1159},[3698],{"type":48,"value":879},{"type":43,"tag":327,"props":3700,"children":3701},{"style":3555},[3702],{"type":48,"value":3703},"chunk",{"type":43,"tag":327,"props":3705,"children":3706},{"style":1159},[3707],{"type":48,"value":2591},{"type":43,"tag":327,"props":3709,"children":3710},{"style":3555},[3711],{"type":48,"value":3712}," ctx",{"type":43,"tag":327,"props":3714,"children":3715},{"style":1159},[3716],{"type":48,"value":3532},{"type":43,"tag":327,"props":3718,"children":3719},{"style":1172},[3720],{"type":48,"value":3474},{"type":43,"tag":327,"props":3722,"children":3723},{"style":1159},[3724],{"type":48,"value":3186},{"type":43,"tag":327,"props":3726,"children":3727},{"class":329,"line":420},[3728,3733,3737,3742,3746,3751,3756,3761],{"type":43,"tag":327,"props":3729,"children":3730},{"style":3333},[3731],{"type":48,"value":3732},"      ctx",{"type":43,"tag":327,"props":3734,"children":3735},{"style":1159},[3736],{"type":48,"value":226},{"type":43,"tag":327,"props":3738,"children":3739},{"style":3333},[3740],{"type":48,"value":3741},"state",{"type":43,"tag":327,"props":3743,"children":3744},{"style":1159},[3745],{"type":48,"value":226},{"type":43,"tag":327,"props":3747,"children":3748},{"style":3333},[3749],{"type":48,"value":3750},"stdout",{"type":43,"tag":327,"props":3752,"children":3753},{"style":1159},[3754],{"type":48,"value":3755}," +=",{"type":43,"tag":327,"props":3757,"children":3758},{"style":3333},[3759],{"type":48,"value":3760}," chunk",{"type":43,"tag":327,"props":3762,"children":3763},{"style":1159},[3764],{"type":48,"value":3364},{"type":43,"tag":327,"props":3766,"children":3767},{"class":329,"line":429},[3768],{"type":43,"tag":327,"props":3769,"children":3770},{"style":1159},[3771],{"type":48,"value":1489},{"type":43,"tag":327,"props":3773,"children":3774},{"class":329,"line":438},[3775],{"type":43,"tag":327,"props":3776,"children":3777},{"style":1159},[3778],{"type":48,"value":688},{"type":43,"tag":327,"props":3780,"children":3781},{"class":329,"line":446},[3782,3787,3791,3795,3800,3804,3808,3812,3816,3821,3825,3829,3833,3837,3841,3845,3849,3854,3859,3864,3869,3873,3877],{"type":43,"tag":327,"props":3783,"children":3784},{"style":3387},[3785],{"type":48,"value":3786},"  getResult",{"type":43,"tag":327,"props":3788,"children":3789},{"style":1159},[3790],{"type":48,"value":857},{"type":43,"tag":327,"props":3792,"children":3793},{"style":1159},[3794],{"type":48,"value":879},{"type":43,"tag":327,"props":3796,"children":3797},{"style":3555},[3798],{"type":48,"value":3799},"ctx",{"type":43,"tag":327,"props":3801,"children":3802},{"style":1159},[3803],{"type":48,"value":3532},{"type":43,"tag":327,"props":3805,"children":3806},{"style":1172},[3807],{"type":48,"value":3474},{"type":43,"tag":327,"props":3809,"children":3810},{"style":3333},[3811],{"type":48,"value":879},{"type":43,"tag":327,"props":3813,"children":3814},{"style":1159},[3815],{"type":48,"value":3483},{"type":43,"tag":327,"props":3817,"children":3818},{"style":3397},[3819],{"type":48,"value":3820}," result",{"type":43,"tag":327,"props":3822,"children":3823},{"style":1159},[3824],{"type":48,"value":857},{"type":43,"tag":327,"props":3826,"children":3827},{"style":3333},[3828],{"type":48,"value":3712},{"type":43,"tag":327,"props":3830,"children":3831},{"style":1159},[3832],{"type":48,"value":226},{"type":43,"tag":327,"props":3834,"children":3835},{"style":3333},[3836],{"type":48,"value":3741},{"type":43,"tag":327,"props":3838,"children":3839},{"style":1159},[3840],{"type":48,"value":226},{"type":43,"tag":327,"props":3842,"children":3843},{"style":3333},[3844],{"type":48,"value":3750},{"type":43,"tag":327,"props":3846,"children":3847},{"style":1159},[3848],{"type":48,"value":226},{"type":43,"tag":327,"props":3850,"children":3851},{"style":3387},[3852],{"type":48,"value":3853},"trim",{"type":43,"tag":327,"props":3855,"children":3856},{"style":3333},[3857],{"type":48,"value":3858},"() ",{"type":43,"tag":327,"props":3860,"children":3861},{"style":1159},[3862],{"type":48,"value":3863},"||",{"type":43,"tag":327,"props":3865,"children":3866},{"style":1159},[3867],{"type":48,"value":3868}," null",{"type":43,"tag":327,"props":3870,"children":3871},{"style":1159},[3872],{"type":48,"value":3341},{"type":43,"tag":327,"props":3874,"children":3875},{"style":3333},[3876],{"type":48,"value":3532},{"type":43,"tag":327,"props":3878,"children":3879},{"style":1159},[3880],{"type":48,"value":1204},{"type":43,"tag":327,"props":3882,"children":3883},{"class":329,"line":455},[3884,3888,3892],{"type":43,"tag":327,"props":3885,"children":3886},{"style":1159},[3887],{"type":48,"value":3527},{"type":43,"tag":327,"props":3889,"children":3890},{"style":3333},[3891],{"type":48,"value":3532},{"type":43,"tag":327,"props":3893,"children":3894},{"style":1159},[3895],{"type":48,"value":3364},{"type":43,"tag":51,"props":3897,"children":3898},{},[3899,3904],{"type":43,"tag":73,"props":3900,"children":3902},{"className":3901},[],[3903],{"type":48,"value":92},{"type":48,"value":857},{"type":43,"tag":317,"props":3906,"children":3908},{"className":1147,"code":3907,"language":1149,"meta":321,"style":321},"{\n  \"adapters\": { \"echo\": \".\u002Fadapters\u002Fecho.ts\" },\n  \"scenarios\": \".\u002Fscenarios\",\n  \"agents\": [{ \"agent\": \"echo\" }]\n}\n",[3909],{"type":43,"tag":73,"props":3910,"children":3911},{"__ignoreMap":321},[3912,3919,3975,4010,4065],{"type":43,"tag":327,"props":3913,"children":3914},{"class":329,"line":330},[3915],{"type":43,"tag":327,"props":3916,"children":3917},{"style":1159},[3918],{"type":48,"value":336},{"type":43,"tag":327,"props":3920,"children":3921},{"class":329,"line":339},[3922,3926,3930,3934,3938,3942,3946,3950,3954,3958,3962,3967,3971],{"type":43,"tag":327,"props":3923,"children":3924},{"style":1159},[3925],{"type":48,"value":1169},{"type":43,"tag":327,"props":3927,"children":3928},{"style":1172},[3929],{"type":48,"value":2142},{"type":43,"tag":327,"props":3931,"children":3932},{"style":1159},[3933],{"type":48,"value":1180},{"type":43,"tag":327,"props":3935,"children":3936},{"style":1159},[3937],{"type":48,"value":857},{"type":43,"tag":327,"props":3939,"children":3940},{"style":1159},[3941],{"type":48,"value":3330},{"type":43,"tag":327,"props":3943,"children":3944},{"style":1159},[3945],{"type":48,"value":1189},{"type":43,"tag":327,"props":3947,"children":3948},{"style":2414},[3949],{"type":48,"value":3444},{"type":43,"tag":327,"props":3951,"children":3952},{"style":1159},[3953],{"type":48,"value":1180},{"type":43,"tag":327,"props":3955,"children":3956},{"style":1159},[3957],{"type":48,"value":857},{"type":43,"tag":327,"props":3959,"children":3960},{"style":1159},[3961],{"type":48,"value":1189},{"type":43,"tag":327,"props":3963,"children":3964},{"style":1192},[3965],{"type":48,"value":3966},".\u002Fadapters\u002Fecho.ts",{"type":43,"tag":327,"props":3968,"children":3969},{"style":1159},[3970],{"type":48,"value":1180},{"type":43,"tag":327,"props":3972,"children":3973},{"style":1159},[3974],{"type":48,"value":2618},{"type":43,"tag":327,"props":3976,"children":3977},{"class":329,"line":348},[3978,3982,3986,3990,3994,3998,4002,4006],{"type":43,"tag":327,"props":3979,"children":3980},{"style":1159},[3981],{"type":48,"value":1169},{"type":43,"tag":327,"props":3983,"children":3984},{"style":1172},[3985],{"type":48,"value":1175},{"type":43,"tag":327,"props":3987,"children":3988},{"style":1159},[3989],{"type":48,"value":1180},{"type":43,"tag":327,"props":3991,"children":3992},{"style":1159},[3993],{"type":48,"value":857},{"type":43,"tag":327,"props":3995,"children":3996},{"style":1159},[3997],{"type":48,"value":1189},{"type":43,"tag":327,"props":3999,"children":4000},{"style":1192},[4001],{"type":48,"value":1195},{"type":43,"tag":327,"props":4003,"children":4004},{"style":1159},[4005],{"type":48,"value":1180},{"type":43,"tag":327,"props":4007,"children":4008},{"style":1159},[4009],{"type":48,"value":1204},{"type":43,"tag":327,"props":4011,"children":4012},{"class":329,"line":357},[4013,4017,4021,4025,4029,4033,4037,4041,4045,4049,4053,4057,4061],{"type":43,"tag":327,"props":4014,"children":4015},{"style":1159},[4016],{"type":48,"value":1169},{"type":43,"tag":327,"props":4018,"children":4019},{"style":1172},[4020],{"type":48,"value":22},{"type":43,"tag":327,"props":4022,"children":4023},{"style":1159},[4024],{"type":48,"value":1180},{"type":43,"tag":327,"props":4026,"children":4027},{"style":1159},[4028],{"type":48,"value":857},{"type":43,"tag":327,"props":4030,"children":4031},{"style":1159},[4032],{"type":48,"value":2842},{"type":43,"tag":327,"props":4034,"children":4035},{"style":1159},[4036],{"type":48,"value":1189},{"type":43,"tag":327,"props":4038,"children":4039},{"style":2414},[4040],{"type":48,"value":3009},{"type":43,"tag":327,"props":4042,"children":4043},{"style":1159},[4044],{"type":48,"value":1180},{"type":43,"tag":327,"props":4046,"children":4047},{"style":1159},[4048],{"type":48,"value":857},{"type":43,"tag":327,"props":4050,"children":4051},{"style":1159},[4052],{"type":48,"value":1189},{"type":43,"tag":327,"props":4054,"children":4055},{"style":1192},[4056],{"type":48,"value":3444},{"type":43,"tag":327,"props":4058,"children":4059},{"style":1159},[4060],{"type":48,"value":1180},{"type":43,"tag":327,"props":4062,"children":4063},{"style":1159},[4064],{"type":48,"value":2908},{"type":43,"tag":327,"props":4066,"children":4067},{"class":329,"line":367},[4068],{"type":43,"tag":327,"props":4069,"children":4070},{"style":1159},[4071],{"type":48,"value":758},{"type":43,"tag":96,"props":4073,"children":4075},{"id":4074},"reading-axis-reports",[4076],{"type":48,"value":4077},"Reading AXIS reports",{"type":43,"tag":51,"props":4079,"children":4080},{},[4081,4083,4089],{"type":48,"value":4082},"For interpreting reports, comparing runs, finding regressions, or explaining scores, use the companion skill ",{"type":43,"tag":73,"props":4084,"children":4086},{"className":4085},[],[4087],{"type":48,"value":4088},"using-axis",{"type":48,"value":4090},". It covers the report file layout, dimension semantics, calibration, and citation rules in depth. This skill stays focused on authoring.",{"type":43,"tag":96,"props":4092,"children":4094},{"id":4093},"rules-you-must-follow",[4095],{"type":48,"value":4096},"Rules you must follow",{"type":43,"tag":57,"props":4098,"children":4099},{},[4100,4117,4122,4142,4147,4152,4172,4184,4203,4228,4316,4321,4358],{"type":43,"tag":61,"props":4101,"children":4102},{},[4103,4105,4109,4111,4115],{"type":48,"value":4104},"Refer to the score as the ",{"type":43,"tag":65,"props":4106,"children":4107},{},[4108],{"type":48,"value":217},{"type":48,"value":4110},", never \"AXIS Score\" (which reads as \"score score\"). The acronym is ",{"type":43,"tag":65,"props":4112,"children":4113},{},[4114],{"type":48,"value":224},{"type":48,"value":4116},", never \"eXperience\".",{"type":43,"tag":61,"props":4118,"children":4119},{},[4120],{"type":48,"value":4121},"Do not use em dashes in any prose, comment, or judge check you author. Use a comma, semicolon, colon, parenthesis, or a new sentence instead.",{"type":43,"tag":61,"props":4123,"children":4124},{},[4125,4127,4133,4134,4140],{"type":48,"value":4126},"Do not invent fields. The authoritative schemas live at ",{"type":43,"tag":73,"props":4128,"children":4130},{"className":4129},[],[4131],{"type":48,"value":4132},"src\u002Ftypes\u002Fscenario.ts",{"type":48,"value":849},{"type":43,"tag":73,"props":4135,"children":4137},{"className":4136},[],[4138],{"type":48,"value":4139},"src\u002Ftypes\u002Fconfig.ts",{"type":48,"value":4141}," in the netlify\u002Faxis repo. If you are unsure whether a field exists, omit it and tell the user where to look.",{"type":43,"tag":61,"props":4143,"children":4144},{},[4145],{"type":48,"value":4146},"Judge checks must be specific and verifiable. Prefer \"Agent wrote a file named X with property Y\" over \"Agent did well at the task\".",{"type":43,"tag":61,"props":4148,"children":4149},{},[4150],{"type":48,"value":4151},"The default per-scenario time limit is 15 minutes. Only override it when the task warrants a different ceiling.",{"type":43,"tag":61,"props":4153,"children":4154},{},[4155,4157,4162,4164,4170],{"type":48,"value":4156},"For ",{"type":43,"tag":73,"props":4158,"children":4160},{"className":4159},[],[4161],{"type":48,"value":1002},{"type":48,"value":4163}," entries, pick the simplest form that works: prefer a local path during development, GitHub shorthand (",{"type":43,"tag":73,"props":4165,"children":4167},{"className":4166},[],[4168],{"type":48,"value":4169},"owner\u002Frepo",{"type":48,"value":4171},") for public skills, full URLs only when needed.",{"type":43,"tag":61,"props":4173,"children":4174},{},[4175,4177,4182],{"type":48,"value":4176},"When ",{"type":43,"tag":73,"props":4178,"children":4180},{"className":4179},[],[4181],{"type":48,"value":267},{"type":48,"value":4183}," is a weighted array, sum your weights to 1.0 (or leave some unweighted to split the remainder; do not exceed 1.0).",{"type":43,"tag":61,"props":4185,"children":4186},{},[4187,4189,4194,4196,4201],{"type":48,"value":4188},"Variant names match ",{"type":43,"tag":73,"props":4190,"children":4192},{"className":4191},[],[4193],{"type":48,"value":1127},{"type":48,"value":4195},". Scenario keys are derived from the file path; do not set ",{"type":43,"tag":73,"props":4197,"children":4199},{"className":4198},[],[4200],{"type":48,"value":243},{"type":48,"value":4202}," for file-based scenarios.",{"type":43,"tag":61,"props":4204,"children":4205},{},[4206,4212,4213,4219,4221,4227],{"type":43,"tag":73,"props":4207,"children":4209},{"className":4208},[],[4210],{"type":48,"value":4211},"beforeAll",{"type":48,"value":849},{"type":43,"tag":73,"props":4214,"children":4216},{"className":4215},[],[4217],{"type":48,"value":4218},"afterAll",{"type":48,"value":4220}," only fire from the CLI. Do not rely on them when the user runs AXIS programmatically via ",{"type":43,"tag":73,"props":4222,"children":4224},{"className":4223},[],[4225],{"type":48,"value":4226},"run()",{"type":48,"value":226},{"type":43,"tag":61,"props":4229,"children":4230},{},[4231,4233,4238,4240,4246,4248,4254,4256,4262,4263,4269,4271,4277,4278,4284,4286,4291,4293,4299,4300,4306,4308,4314],{"type":48,"value":4232},"In an isolated AXIS scenario workspace, do NOT try to verify your authored file by executing it, importing it, or cross-checking it against an installed copy of ",{"type":43,"tag":73,"props":4234,"children":4236},{"className":4235},[],[4237],{"type":48,"value":3355},{"type":48,"value":4239},". The workspace is intentionally minimal: no ",{"type":43,"tag":73,"props":4241,"children":4243},{"className":4242},[],[4244],{"type":48,"value":4245},"node_modules",{"type":48,"value":4247},", no git history. That means: no ",{"type":43,"tag":73,"props":4249,"children":4251},{"className":4250},[],[4252],{"type":48,"value":4253},"tsc",{"type":48,"value":4255},", no ",{"type":43,"tag":73,"props":4257,"children":4259},{"className":4258},[],[4260],{"type":48,"value":4261},"node -e \"require(...)\"",{"type":48,"value":4255},{"type":43,"tag":73,"props":4264,"children":4266},{"className":4265},[],[4267],{"type":48,"value":4268},"git diff",{"type":48,"value":4270}," or ",{"type":43,"tag":73,"props":4272,"children":4274},{"className":4273},[],[4275],{"type":48,"value":4276},"git status",{"type":48,"value":4255},{"type":43,"tag":73,"props":4279,"children":4281},{"className":4280},[],[4282],{"type":48,"value":4283},"npm install",{"type":48,"value":4285},", and no reading or grepping the globally-installed ",{"type":43,"tag":73,"props":4287,"children":4289},{"className":4288},[],[4290],{"type":48,"value":3355},{"type":48,"value":4292}," package outside the workspace (paths like ",{"type":43,"tag":73,"props":4294,"children":4296},{"className":4295},[],[4297],{"type":48,"value":4298},"\u002Fusr\u002Flocal\u002Flib\u002Fnode_modules\u002F@netlify\u002Faxis",{"type":48,"value":253},{"type":43,"tag":73,"props":4301,"children":4303},{"className":4302},[],[4304],{"type":48,"value":4305},"\u002Fopt\u002Fhomebrew\u002F...\u002Fnode_modules\u002F@netlify\u002Faxis",{"type":48,"value":4307},", or any ",{"type":43,"tag":73,"props":4309,"children":4311},{"className":4310},[],[4312],{"type":48,"value":4313},"node_modules\u002F@netlify\u002Faxis",{"type":48,"value":4315}," you did not put there yourself). Every such command fails or wastes interactions and tanks the environment and agent dimensions. Write the file once, correctly, against the schema you already know from this skill. The AXIS judge inspects your output directly; you do not need to prove it works first.",{"type":43,"tag":61,"props":4317,"children":4318},{},[4319],{"type":48,"value":4320},"When asked to make a targeted edit (add a field, fix a single bug), edit ONLY what the prompt specifies. Do not reorganize, reformat, or add unrelated fields. Preserve every field the prompt did not name. The judge often checks \"original X and Y fields are preserved unchanged\".",{"type":43,"tag":61,"props":4322,"children":4323},{},[4324,4326,4332,4334,4340,4342,4348,4350,4356],{"type":48,"value":4325},"Minimize unnecessary tool calls. Every tool call is evaluated as an agent decision; redundant ",{"type":43,"tag":73,"props":4327,"children":4329},{"className":4328},[],[4330],{"type":48,"value":4331},"ls",{"type":48,"value":4333},", repeated ",{"type":43,"tag":73,"props":4335,"children":4337},{"className":4336},[],[4338],{"type":48,"value":4339},"cat",{"type":48,"value":4341}," of the same file, exploratory ",{"type":43,"tag":73,"props":4343,"children":4345},{"className":4344},[],[4346],{"type":48,"value":4347},"find",{"type":48,"value":4349}," that you do not act on, all tank the agent dimension via the ",{"type":43,"tag":73,"props":4351,"children":4353},{"className":4352},[],[4354],{"type":48,"value":4355},"necessity",{"type":48,"value":4357}," sub-dimension. Read each file you need once. Write each edit once. Stop when the task is done.",{"type":43,"tag":61,"props":4359,"children":4360},{},[4361,4363,4368,4370,4376,4377,4383,4384,4390,4391,4396,4397,4403,4404,4410,4412,4418,4420,4425,4427,4433,4434,4440,4441,4447,4448,4454,4455,4461,4462,4468,4469,4475,4476,4482,4483,4489,4490,4496],{"type":48,"value":4362},"Field-name discipline. AXIS uses snake_case in all JSON config fields: ",{"type":43,"tag":73,"props":4364,"children":4366},{"className":4365},[],[4367],{"type":48,"value":1009},{"type":48,"value":4369}," not ",{"type":43,"tag":73,"props":4371,"children":4373},{"className":4372},[],[4374],{"type":48,"value":4375},"mcpServers",{"type":48,"value":253},{"type":43,"tag":73,"props":4378,"children":4380},{"className":4379},[],[4381],{"type":48,"value":4382},"time_minutes",{"type":48,"value":4369},{"type":43,"tag":73,"props":4385,"children":4387},{"className":4386},[],[4388],{"type":48,"value":4389},"timeMinutes",{"type":48,"value":253},{"type":43,"tag":73,"props":4392,"children":4394},{"className":4393},[],[4395],{"type":48,"value":2434},{"type":48,"value":4369},{"type":43,"tag":73,"props":4398,"children":4400},{"className":4399},[],[4401],{"type":48,"value":4402},"runScript",{"type":48,"value":4270},{"type":43,"tag":73,"props":4405,"children":4407},{"className":4406},[],[4408],{"type":48,"value":4409},"shell",{"type":48,"value":4411},". The deprecated alias ",{"type":43,"tag":73,"props":4413,"children":4415},{"className":4414},[],[4416],{"type":48,"value":4417},"rubric",{"type":48,"value":4419}," exists for backwards compat; prefer ",{"type":43,"tag":73,"props":4421,"children":4423},{"className":4422},[],[4424],{"type":48,"value":267},{"type":48,"value":4426},". Other commonly-invented names that are WRONG: ",{"type":43,"tag":73,"props":4428,"children":4430},{"className":4429},[],[4431],{"type":48,"value":4432},"criteria",{"type":48,"value":253},{"type":43,"tag":73,"props":4435,"children":4437},{"className":4436},[],[4438],{"type":48,"value":4439},"success_criteria",{"type":48,"value":253},{"type":43,"tag":73,"props":4442,"children":4444},{"className":4443},[],[4445],{"type":48,"value":4446},"expected",{"type":48,"value":253},{"type":43,"tag":73,"props":4449,"children":4451},{"className":4450},[],[4452],{"type":48,"value":4453},"tasks",{"type":48,"value":253},{"type":43,"tag":73,"props":4456,"children":4458},{"className":4457},[],[4459],{"type":48,"value":4460},"evaluators",{"type":48,"value":253},{"type":43,"tag":73,"props":4463,"children":4465},{"className":4464},[],[4466],{"type":48,"value":4467},"models",{"type":48,"value":253},{"type":43,"tag":73,"props":4470,"children":4472},{"className":4471},[],[4473],{"type":48,"value":4474},"timeout",{"type":48,"value":253},{"type":43,"tag":73,"props":4477,"children":4479},{"className":4478},[],[4480],{"type":48,"value":4481},"maxTokens",{"type":48,"value":253},{"type":43,"tag":73,"props":4484,"children":4486},{"className":4485},[],[4487],{"type":48,"value":4488},"tokenLimit",{"type":48,"value":253},{"type":43,"tag":73,"props":4491,"children":4493},{"className":4492},[],[4494],{"type":48,"value":4495},"timeoutMinutes",{"type":48,"value":226},{"type":43,"tag":96,"props":4498,"children":4500},{"id":4499},"validation",[4501],{"type":48,"value":4502},"Validation",{"type":43,"tag":51,"props":4504,"children":4505},{},[4506],{"type":48,"value":4507},"After authoring or editing, ask the user to run:",{"type":43,"tag":317,"props":4509,"children":4513},{"className":4510,"code":4512,"language":48},[4511],"language-text","npx @netlify\u002Faxis run --help\n",[4514],{"type":43,"tag":73,"props":4515,"children":4516},{"__ignoreMap":321},[4517],{"type":48,"value":4512},{"type":43,"tag":51,"props":4519,"children":4520},{},[4521],{"type":48,"value":4522},"to confirm the CLI is installed, then:",{"type":43,"tag":317,"props":4524,"children":4527},{"className":4525,"code":4526,"language":48},[4511],"npx @netlify\u002Faxis run\n",[4528],{"type":43,"tag":73,"props":4529,"children":4530},{"__ignoreMap":321},[4531],{"type":48,"value":4526},{"type":43,"tag":51,"props":4533,"children":4534},{},[4535],{"type":48,"value":4536},"The config loader validates the file on load and prints actionable errors (missing required fields, unknown adapter names, malformed limits, invalid skill sources, etc.). Fix any reported errors before declaring the work done.",{"type":43,"tag":96,"props":4538,"children":4540},{"id":4539},"reference",[4541],{"type":48,"value":4542},"Reference",{"type":43,"tag":165,"props":4544,"children":4545},{},[4546,4559,4571,4582],{"type":43,"tag":61,"props":4547,"children":4548},{},[4549,4551],{"type":48,"value":4550},"Documentation site: ",{"type":43,"tag":4552,"props":4553,"children":4557},"a",{"href":4554,"rel":4555},"https:\u002F\u002Faxis.run",[4556],"nofollow",[4558],{"type":48,"value":4554},{"type":43,"tag":61,"props":4560,"children":4561},{},[4562,4564,4569],{"type":48,"value":4563},"Scenario schema: ",{"type":43,"tag":73,"props":4565,"children":4567},{"className":4566},[],[4568],{"type":48,"value":4132},{"type":48,"value":4570}," in the netlify\u002Faxis repo",{"type":43,"tag":61,"props":4572,"children":4573},{},[4574,4576,4581],{"type":48,"value":4575},"Config schema: ",{"type":43,"tag":73,"props":4577,"children":4579},{"className":4578},[],[4580],{"type":48,"value":4139},{"type":48,"value":4570},{"type":43,"tag":61,"props":4583,"children":4584},{},[4585,4587],{"type":48,"value":4586},"Validator (source of truth for accepted shapes): ",{"type":43,"tag":73,"props":4588,"children":4590},{"className":4589},[],[4591],{"type":48,"value":4592},"src\u002Fconfig\u002Fvalidator.ts",{"type":43,"tag":96,"props":4594,"children":4596},{"id":4595},"installing-this-skill",[4597],{"type":48,"value":4598},"Installing this skill",{"type":43,"tag":51,"props":4600,"children":4601},{},[4602,4604,4610],{"type":48,"value":4603},"To make this skill available to your AI tool in a project, drop it under ",{"type":43,"tag":73,"props":4605,"children":4607},{"className":4606},[],[4608],{"type":48,"value":4609},".claude\u002Fskills\u002F",{"type":48,"value":857},{"type":43,"tag":317,"props":4612,"children":4615},{"className":4613,"code":4614,"language":48},[4511],"mkdir -p .claude\u002Fskills\u002Fconfigure-axis\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002Fnetlify\u002Faxis\u002Fmain\u002Fskills\u002Fconfigure-axis\u002FSKILL.md \\\n  -o .claude\u002Fskills\u002Fconfigure-axis\u002FSKILL.md\n",[4616],{"type":43,"tag":73,"props":4617,"children":4618},{"__ignoreMap":321},[4619],{"type":48,"value":4614},{"type":43,"tag":4621,"props":4622,"children":4623},"style",{},[4624],{"type":48,"value":4625},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4627,"total":472},[4628,4635,4646,4664,4679,4694,4711,4728,4738,4753,4766,4781],{"slug":4,"name":4,"fn":5,"description":6,"org":4629,"tags":4630,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4631,4632,4633,4634],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":4088,"name":4088,"fn":4636,"description":4637,"org":4638,"tags":4639,"stars":23,"repoUrl":24,"updatedAt":4645},"run and interpret AXIS reports","Run AXIS, read its reports, navigate its project layout, and interpret scores. Use when the user asks to run AXIS, invoke the CLI, compare runs, explain a score, find a regression, manage baselines, or understand where AXIS writes its files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4640,4643,4644],{"name":4641,"slug":4642,"type":15},"CLI","cli",{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:40:13.443461",{"slug":4647,"name":4647,"fn":4648,"description":4649,"org":4650,"tags":4651,"stars":535,"repoUrl":4662,"updatedAt":4663},"netlify-access-control","manage Netlify site access control","Use when the task involves controlling who can reach a Netlify site, or telling Netlify Identity apart from Secure Access. Trigger whenever the user wants to lock a site or deploy to their company\u002Fteam, restrict access to employees only, build an internal or employees-only app, set up password protection, SSO, or SAML, asks \"who can access my site\", or is confused about Netlify Identity vs Secure Access vs team login vs OAuth providers. Routes the request to the right layer — app-level Identity, site-visitor Password Protection, the Auth0 extension, or Team\u002FOrg SAML SSO — and explains the two-layer (perimeter + in-app identity) pattern and its double-login tradeoff. For building the app-level auth itself, use the netlify-identity skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4652,4655,4656,4659],{"name":4653,"slug":4654,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":4657,"slug":4658,"type":15},"Permissions","permissions",{"name":4660,"slug":4661,"type":15},"Security","security","https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-14T05:40:29.082149",{"slug":4665,"name":4665,"fn":4666,"description":4667,"org":4668,"tags":4669,"stars":535,"repoUrl":4662,"updatedAt":4678},"netlify-agent-runner","run AI agent tasks on Netlify","Run AI agent tasks remotely on Netlify using Claude, Codex, or Gemini. Use when the user wants to run an AI agent on their site, get a second opinion from another model, or delegate development tasks to run remotely against their repo.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4670,4671,4674,4677],{"name":21,"slug":22,"type":15},{"name":4672,"slug":4673,"type":15},"Automation","automation",{"name":4675,"slug":4676,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":4680,"name":4680,"fn":4681,"description":4682,"org":4683,"tags":4684,"stars":535,"repoUrl":4662,"updatedAt":4693},"netlify-ai-gateway","route AI requests via Netlify AI Gateway","Reference for Netlify AI Gateway — the managed proxy that routes calls to OpenAI, Anthropic, and Google Gemini SDKs without provider API keys. Use this skill any time the user wants to add AI on a Netlify site (chat, completion, reasoning, image generation, image-to-image edit\u002Fstylize), choose or change a model, wire up the OpenAI \u002F Anthropic \u002F @google\u002Fgenai SDK, decide which provider to use for an image-gen feature (it's Gemini-only on the gateway), or debug \"model not found\" \u002F \"API key missing\" against the gateway. Required reading before pinning a model — the gateway exposes a curated subset, not every provider model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4685,4688,4691,4692],{"name":4686,"slug":4687,"type":15},"AI Infrastructure","ai-infrastructure",{"name":4689,"slug":4690,"type":15},"API Development","api-development",{"name":4675,"slug":4676,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":4695,"name":4695,"fn":4696,"description":4697,"org":4698,"tags":4699,"stars":535,"repoUrl":4662,"updatedAt":4710},"netlify-blobs","manage file storage with Netlify Blobs","Guide for using Netlify Blobs for file and asset storage — images, documents, uploads, exports, cached binary artifacts. Covers getStore(), CRUD operations, metadata, listing, deploy-scoped vs site-scoped stores, and local development. Do NOT use Blobs as a dynamic data store — use Netlify Database for that.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4700,4703,4706,4707],{"name":4701,"slug":4702,"type":15},"Backend","backend",{"name":4704,"slug":4705,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":4708,"slug":4709,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":4712,"name":4712,"fn":4713,"description":4714,"org":4715,"tags":4716,"stars":535,"repoUrl":4662,"updatedAt":4727},"netlify-caching","configure CDN caching on Netlify","Guide for controlling caching on Netlify's CDN. Use when configuring cache headers, setting up stale-while-revalidate, implementing on-demand cache purge, or understanding Netlify's CDN caching behavior. Covers Cache-Control, Netlify-CDN-Cache-Control, cache tags, durable cache, and framework-specific caching patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4717,4720,4723,4724],{"name":4718,"slug":4719,"type":15},"Caching","caching",{"name":4721,"slug":4722,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":4725,"slug":4726,"type":15},"Performance","performance","2026-07-14T05:40:20.066717",{"slug":4729,"name":4729,"fn":4730,"description":4731,"org":4732,"tags":4733,"stars":535,"repoUrl":4662,"updatedAt":4737},"netlify-config","configure Netlify site settings","Reference for netlify.toml configuration and site environment variables. Use when configuring build settings, redirects, rewrites, headers, deploy contexts, the `[dev]` block that controls `netlify dev` (command, port, targetPort, framework), or any site-level configuration — and when managing environment variables or secrets with the Netlify CLI, including scoping values to specific deploy contexts. Covers the complete netlify.toml syntax including redirects with splats\u002Fconditions, headers, deploy contexts, functions config, edge functions config, and the `[dev]` block (including when `framework` must be `\"#custom\"` — required when both a custom `command` and `targetPort` are set).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4734,4735,4736],{"name":13,"slug":14,"type":15},{"name":4721,"slug":4722,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:21.284801",{"slug":4739,"name":4739,"fn":4740,"description":4741,"org":4742,"tags":4743,"stars":535,"repoUrl":4662,"updatedAt":4752},"netlify-database","provision and manage Netlify Database","Guide for using Netlify Database — the GA managed Postgres product built into Netlify. Use when a project needs any kind of dynamic, structured, or relational data. Covers provisioning via @netlify\u002Fdatabase, Drizzle ORM (@beta) setup, migrations, preview branching, and safe production data handling. Blobs is only for file\u002Fasset storage — any dynamic data belongs in the database.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4744,4745,4748,4749],{"name":4701,"slug":4702,"type":15},{"name":4746,"slug":4747,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":4750,"slug":4751,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",{"slug":4754,"name":4754,"fn":4755,"description":4756,"org":4757,"tags":4758,"stars":535,"repoUrl":4662,"updatedAt":4765},"netlify-deploy","deploy and host projects on Netlify","Deploy, host, and publish web projects on Netlify with the Netlify CLI. Use when the user wants to deploy a site or repository to Netlify, link a local project to a Netlify site, ship a production or preview\u002Fdraft deploy, set up Git-based continuous deployment, run a manual or local deploy, configure CI deploys, or troubleshoot a failed or misconfigured deploy. Also use to view or tail a deployed site's runtime logs — function and edge-function output, deploy logs — via `netlify logs` when debugging what a live site is doing (recent errors, recent activity, streaming output).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4759,4760,4761,4762],{"name":4641,"slug":4642,"type":15},{"name":4721,"slug":4722,"type":15},{"name":9,"slug":8,"type":15},{"name":4763,"slug":4764,"type":15},"Web Development","web-development","2026-07-17T05:30:14.218977",{"slug":4767,"name":4767,"fn":4768,"description":4769,"org":4770,"tags":4771,"stars":535,"repoUrl":4662,"updatedAt":4780},"netlify-edge-functions","write Netlify Edge Functions","Guide for writing Netlify Edge Functions. Use when building middleware, geolocation-based logic, request\u002Fresponse manipulation, authentication checks, A\u002FB testing, or any low-latency edge compute. Covers Deno runtime, context.next() middleware pattern, geolocation, and when to choose edge vs serverless.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4772,4775,4778,4779],{"name":4773,"slug":4774,"type":15},"Edge Functions","edge-functions",{"name":4776,"slug":4777,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},{"name":4725,"slug":4726,"type":15},"2026-07-14T05:40:34.147865",{"slug":4782,"name":4782,"fn":4783,"description":4784,"org":4785,"tags":4786,"stars":535,"repoUrl":4662,"updatedAt":4795},"netlify-forms","handle HTML forms with Netlify","Guide for using Netlify Forms for HTML form handling. Use when adding contact forms, feedback forms, file upload forms, or any form that should be collected by Netlify. Covers the data-netlify attribute, spam filtering, AJAX submissions, file uploads, notifications, and the submissions API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4787,4790,4793,4794],{"name":4788,"slug":4789,"type":15},"Forms","forms",{"name":4791,"slug":4792,"type":15},"HTML","html",{"name":9,"slug":8,"type":15},{"name":4763,"slug":4764,"type":15},"2026-07-14T05:40:16.075367",{"items":4797,"total":339},[4798,4805],{"slug":4,"name":4,"fn":5,"description":6,"org":4799,"tags":4800,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4801,4802,4803,4804],{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"slug":4088,"name":4088,"fn":4636,"description":4637,"org":4806,"tags":4807,"stars":23,"repoUrl":24,"updatedAt":4645},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4808,4809,4810],{"name":4641,"slug":4642,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15}]