[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-using-axis":3,"mdc--2jbo9s-key":34,"related-repo-netlify-using-axis":1890,"related-org-netlify-using-axis":1913},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":29,"sourceUrl":32,"mdContent":33},"using-axis","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},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,16,19],{"name":13,"slug":14,"type":15},"Evals","evals","tag",{"name":17,"slug":18,"type":15},"CLI","cli",{"name":9,"slug":8,"type":15},32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-14T05:40:13.443461",null,0,[26,27,28,14],"agent-experience","ai","ax",{"repoUrl":21,"stars":20,"forks":24,"topics":30,"description":31},[26,27,28,14],"Open source tooling and scoring framework to measure how well services work for AI agents.","https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis\u002Ftree\u002FHEAD\u002Fskills\u002Fusing-axis","---\nname: using-axis\ndescription: 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.\n---\n\n# Using AXIS\n\nAXIS (Agent Experience Index Score) is a synthetic testing framework for AI agents. This skill is the operator's guide: how to invoke the CLI, where AXIS writes files, and how to read the scoring output.\n\nFor authoring scenarios and `axis.config.json`, see the `configure-axis` skill.\n\n## When to use this skill\n\nTrigger phrases include \"run AXIS\", \"compare runs\", \"explain this score\", \"which scenario regressed\", \"set a baseline\", \"where does AXIS put its reports\", \"what does this dimension mean\".\n\nRefer to the framework's output as the **AXIS Result**. The acronym is **Agent Experience Index Score**.\n\n## CLI commands\n\nThe binary is `axis` (or `npx @netlify\u002Faxis` without a global install).\n\n### `axis init`\n\nScaffold `axis.config.json` and a sample scenario, then install AXIS skills via `npx skills`.\n\n| Flag                     | Purpose                                           |\n| ------------------------ | ------------------------------------------------- |\n| `-s, --scenarios \u003Cpath>` | Scenarios directory (default `.\u002Fscenarios`)       |\n| `-a, --agent \u003Cnames>`    | Comma-separated agents (e.g. `claude-code,codex`) |\n| `--format \u003Cformat>`      | `json` (default), `js`, or `ts`                   |\n| `-f, --force`            | Overwrite existing files                          |\n| `--no-skills`            | Skip the automatic skills install                 |\n\n### `axis run`\n\nExecute every scenario against every configured agent in isolated workspaces, score the results, and write a report.\n\n| Flag                        | Purpose                                                            |\n| --------------------------- | ------------------------------------------------------------------ |\n| `-c, --config \u003Cpath>`       | Config path (default discovers `axis.config.{json,js,ts,mjs}`)     |\n| `-s, --scenario \u003Ckeys>`     | Comma-separated keys with glob support (`cms\u002F*`, `hello-*`)        |\n| `-a, --agent \u003Cnames>`       | Comma-separated agent names with glob support (`claude-code\\|*`)   |\n| `--concurrency \u003Cn>`         | Max parallel jobs (default 15)                                     |\n| `--failed [reportId]`       | Re-run only failed pairs from a prior report (default `latest`)    |\n| `--no-score`                | Skip the LLM judges, write raw results only                        |\n| `--compare-baseline [name]` | Diff results against a saved baseline (default `main`)             |\n| `--refresh-skills`          | Force re-clone of remote skills cached under `.axis\u002Fskills-cache\u002F` |\n| `--json`                    | Emit JSON to stdout instead of the live TTY display                |\n| `-v, --verbose`             | Per-step logging                                                   |\n| `--debug`                   | Capture raw agent stdout into `{agent}.debug.ndjson`               |\n| `-o, --output-dir \u003Cdir>`    | Also write the report manifest to this directory                   |\n\n### `axis reports`\n\nView past runs. Three call shapes:\n\n- `axis reports` lists every report in `.axis\u002Freports\u002F` (most recent first; `-n` to cap the list).\n- `axis reports \u003CreportId|latest>` shows the manifest for one run, scored summary per scenario.\n- `axis reports \u003CreportId|latest> \u003CscenarioKey>` opens the per-run detail (transcript, audits, criteria). Use `-a \u003Cagent>` to filter when multiple agents ran the same scenario.\n\nFlags: `--json` for machine output, `--html` to open the rendered report in a browser.\n\n### `axis baseline`\n\nManage saved baselines for regression detection. A baseline is a snapshot of one report's scenario scores under a name (default `main`).\n\n- `axis baseline set [name]` saves the latest report as a baseline.\n- `axis baseline list` lists saved baselines.\n- `axis baseline show [name]` prints the saved entries.\n- `axis baseline compare [name]` diffs the latest report against the baseline.\n- `axis baseline delete [name]` removes a baseline.\n\n`axis run --compare-baseline` combines a fresh run with an immediate diff in one step.\n\n## Expected directories\n\nEverything AXIS writes lives under `.axis\u002F` at the config directory (typically the project root). Source-of-truth files (config, scenarios, skills) are NOT under `.axis\u002F`.\n\n```\nproject\u002F\n├── axis.config.{json,js,ts}        ← config (you author this)\n├── scenarios\u002F                      ← scenarios (you author these)\n│   └── hello-world.json\n├── skills\u002F                         ← optional local skills referenced by config\n│   └── \u003Cskill-name>\u002FSKILL.md\n├── adapters\u002F                       ← optional custom adapter modules\n│   └── \u003Cname>.{ts,js}\n└── .axis\u002F                          ← AXIS-managed, safe to gitignore\n    ├── reports\u002F\n    │   └── \u003CreportId>\u002F             ← e.g. 2026-06-12-205816\n    │       ├── report.json         ← run manifest (summary, results[])\n    │       ├── report.html         ← rendered HTML report\n    │       └── scenarios\u002F\n    │           └── \u003CscenarioKey>\u002F\n    │               ├── \u003Cagent>.json           ← per-run detail\n    │               ├── \u003Cagent>.raw.ndjson     ← raw transcript\n    │               ├── \u003Cagent>.sparse-index.txt\n    │               └── artifacts\u002F             ← files captured by scenario.artifacts globs\n    ├── baselines\u002F\n    │   └── \u003Cname>.json             ← saved baselines (default name: main)\n    ├── remotes\u002F                    ← cloned scenarios from remote git URLs\n    └── skills-cache\u002F               ← cloned remote skills\n```\n\nWhen asked \"where is X\", the answer is almost always here. Do not search the project tree blindly; jump to the path.\n\n## Scoring framework\n\nEvery run is scored on four independent dimensions, each 0-100, combined into a weighted composite.\n\n| Dimension        | Default weight | What it measures                                                   |\n| ---------------- | -------------- | ------------------------------------------------------------------ |\n| Goal achievement | 0.4            | LLM judge scores the run against the scenario's `judge` checks     |\n| Environment      | 0.2            | Execution reliability of filesystem, shell, and network operations |\n| Service          | 0.2            | Execution reliability of external service interactions (APIs, MCP) |\n| Agent            | 0.2            | Decision quality across every tool call the agent made             |\n\nOverride weights in `axis.config.json` under `settings.scoring_weights`.\n\n### Important distinctions\n\n- **Environment and Service evaluate execution reliability only.** Did `ls`, `cat`, `bash`, `fetch`, MCP calls succeed cleanly? They do NOT judge whether the output was useful or task-fit.\n- **The Agent dimension is decision quality across every interaction.** Every tool call is an agent choice, even a plain `ls`. The agent judge audits every interaction, not just calls tagged as agent-y.\n- **Speed is always heuristic** (threshold buckets per category), never LLM-evaluated. Every other dimension uses an LLM judge.\n\n### Agent sub-dimensions\n\nThe agent dimension weights its own sub-dimensions:\n\n| Sub-dimension | Weight | What it captures                                                   |\n| ------------- | ------ | ------------------------------------------------------------------ |\n| Necessity     | 0.4    | Was the call needed at all? Redundant exploration tanks this hard. |\n| Relevance     | 0.2    | Did the call advance the goal?                                     |\n| Weight        | 0.2    | Was the call's cost proportionate to its value?                    |\n| Success       | 0.1    | Did the call succeed?                                              |\n| Speed         | 0.1    | Heuristic speed buckets                                            |\n\nEnv and Service sub-dimensions are simpler: success 0.7, speed 0.3, rest 0.\n\n### Composite formula\n\n`axisScore = goal * w_goal + environment * w_env + service * w_svc + agent * w_agent`\n\n### Calibration\n\nAll dimensions use log-normal CDF mapping with median 0.5 and sigma 0.4:\n\n| Raw input | Mapped score |\n| --------- | ------------ |\n| 0.5       | 50           |\n| 0.8       | 88           |\n| 0.985     | 96           |\n\nPractical consequence: even flawless runs cap around 95-99. Treat 95+ as a top-band result. A clean 100 is structurally near-impossible across all four dimensions.\n\n## Reading a report\n\n`.axis\u002Freports\u002F\u003CreportId>\u002Freport.json` has:\n\n- `version`, `reportId`, `timestamp`, `durationMs`\n- `summary: { total, completed, failed, averageAxisScore }`\n- `results[]`, one entry per (scenario, agent) pair\n\nEach result entry contains:\n\n- `scenarioKey`, `scenarioName`, `agentName`\n- `durationMs`, `exitCode`, `tokenUsage: { input, output, cacheReadInput }`\n- `score.axisScore` (0-100 composite)\n- `score.goalAchievement.{score, criteria[]}` where each criterion has `check`, `weight`, `score`, `rationale`\n- `score.environment.{score, dimensions, audits[]}`\n- `score.service.{score, dimensions, audits[]}`\n- `score.agent.{score, dimensions, audits[]}` (audits every interaction, not just agent-tagged)\n\nEach `dimensions` object has `{ success, speed, weight, relevance, necessity }` mapped to 0-100.\n\n### Diagnosing a low score\n\nLook at which dimension dropped, then inspect:\n\n- **Goal dropped**: read `goalAchievement.criteria[]` and find entries with `score \u003C 10`. The `rationale` says which check the agent failed.\n- **Environment dropped**: read `environment.audits[]` and find entries with `success \u003C 1`. Common causes: command-not-found, missing files, network errors.\n- **Service dropped**: same as environment but for MCP \u002F API calls. Audit entries point at the specific tool.\n- **Agent dropped**: check `agent.dimensions.necessity` first. If it's low, the agent made redundant calls. `agent.dimensions.relevance` low means calls were off-task.\n\n### Comparing against a baseline\n\nMatch by `scenarioKey` (variants like `foo@bar` are distinct keys). Subtract `axisScore` from the baseline entry's `axisScore`. The dimension that moved the most is the failure mode.\n\n### Citing numbers in analyses\n\nOpen the file and read it. Do not invent values.\n\n- \"AXIS Result dropped from 84 to 53, a 31-point regression\"\n- \"Service success collapsed from 0.95 to 0.30\"\n- \"Agent necessity was 0.32, meaning roughly 68% of tool calls were judged unnecessary\"\n- \"5 of 7 service interactions returned errors per the audits[] entries\"\n\n## Rules you must follow\n\n1. Refer to the framework's output 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 analysis you author. Use a comma, semicolon, colon, parenthesis, or a new sentence instead.\n3. When asked to read a report, open the actual file. Do not paraphrase, do not guess at numbers. Cite values verbatim from `report.json` or the per-scenario detail JSON.\n4. Treat `95+` as the practical top band. Do not call a 95 result \"merely good\" or imply 100 is the realistic target; the log-normal calibration makes a clean 100 nearly impossible.\n5. Distinguish execution quality (Environment, Service) from decision quality (Agent). They measure different things; using them interchangeably is wrong.\n6. When the user asks where AXIS writes something, give the exact path from the directory map above. Do not search.\n7. Do not invent CLI flags. The full surface is listed above; if a user asks for something not listed, say so and suggest the closest documented option.\n8. Write paths relative to the project root. When you put an AXIS path into a runbook, analysis, plan, or any file you author, spell it as `.axis\u002Freports\u002F\u003CreportId>\u002Freport.json`, NOT as an absolute path like `\u002Ftmp\u002Faxis-xyz\u002Fwork\u002F.axis\u002Freports\u002F\u003CreportId>\u002Freport.json` or `\u002Fprivate\u002Fvar\u002F...\u002F.axis\u002F...`. Absolute workspace paths leak the agent's isolated temp directory and will not match what the user sees in their own checkout. The only correct form is the project-root-relative path.\n\n## Reference\n\n- Documentation site: https:\u002F\u002Faxis.run\n- Scoring source: `src\u002Fscoring\u002F` in the netlify\u002Faxis repo (deep-eval.ts, category-score.ts, composite.ts)\n- Report writer: `src\u002Freports\u002Fwriter.ts`\n- Companion skill for authoring: `configure-axis`\n\n## Installing this skill\n\nUse the `skills` CLI:\n\n```\nnpx skills add netlify\u002Faxis --all\n```\n\nThis installs every AXIS skill (`configure-axis`, `using-axis`) into every detected agent config directory. `axis init` runs this automatically; pass `--no-skills` to opt out.\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,53,75,82,87,107,113,134,145,164,312,322,327,605,615,620,681,701,711,723,781,792,798,817,829,834,840,845,950,969,975,1044,1050,1055,1167,1172,1178,1187,1193,1198,1259,1264,1270,1281,1334,1339,1465,1486,1492,1497,1593,1599,1634,1640,1645,1674,1680,1774,1780,1830,1836,1849,1858],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","Using AXIS",{"type":40,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"AXIS (Agent Experience Index Score) is a synthetic testing framework for AI agents. This skill is the operator's guide: how to invoke the CLI, where AXIS writes files, and how to read the scoring output.",{"type":40,"tag":48,"props":54,"children":55},{},[56,58,65,67,73],{"type":45,"value":57},"For authoring scenarios and ",{"type":40,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":45,"value":64},"axis.config.json",{"type":45,"value":66},", see the ",{"type":40,"tag":59,"props":68,"children":70},{"className":69},[],[71],{"type":45,"value":72},"configure-axis",{"type":45,"value":74}," skill.",{"type":40,"tag":76,"props":77,"children":79},"h2",{"id":78},"when-to-use-this-skill",[80],{"type":45,"value":81},"When to use this skill",{"type":40,"tag":48,"props":83,"children":84},{},[85],{"type":45,"value":86},"Trigger phrases include \"run AXIS\", \"compare runs\", \"explain this score\", \"which scenario regressed\", \"set a baseline\", \"where does AXIS put its reports\", \"what does this dimension mean\".",{"type":40,"tag":48,"props":88,"children":89},{},[90,92,98,100,105],{"type":45,"value":91},"Refer to the framework's output as the ",{"type":40,"tag":93,"props":94,"children":95},"strong",{},[96],{"type":45,"value":97},"AXIS Result",{"type":45,"value":99},". The acronym is ",{"type":40,"tag":93,"props":101,"children":102},{},[103],{"type":45,"value":104},"Agent Experience Index Score",{"type":45,"value":106},".",{"type":40,"tag":76,"props":108,"children":110},{"id":109},"cli-commands",[111],{"type":45,"value":112},"CLI commands",{"type":40,"tag":48,"props":114,"children":115},{},[116,118,124,126,132],{"type":45,"value":117},"The binary is ",{"type":40,"tag":59,"props":119,"children":121},{"className":120},[],[122],{"type":45,"value":123},"axis",{"type":45,"value":125}," (or ",{"type":40,"tag":59,"props":127,"children":129},{"className":128},[],[130],{"type":45,"value":131},"npx @netlify\u002Faxis",{"type":45,"value":133}," without a global install).",{"type":40,"tag":135,"props":136,"children":138},"h3",{"id":137},"axis-init",[139],{"type":40,"tag":59,"props":140,"children":142},{"className":141},[],[143],{"type":45,"value":144},"axis init",{"type":40,"tag":48,"props":146,"children":147},{},[148,150,155,157,163],{"type":45,"value":149},"Scaffold ",{"type":40,"tag":59,"props":151,"children":153},{"className":152},[],[154],{"type":45,"value":64},{"type":45,"value":156}," and a sample scenario, then install AXIS skills via ",{"type":40,"tag":59,"props":158,"children":160},{"className":159},[],[161],{"type":45,"value":162},"npx skills",{"type":45,"value":106},{"type":40,"tag":165,"props":166,"children":167},"table",{},[168,187],{"type":40,"tag":169,"props":170,"children":171},"thead",{},[172],{"type":40,"tag":173,"props":174,"children":175},"tr",{},[176,182],{"type":40,"tag":177,"props":178,"children":179},"th",{},[180],{"type":45,"value":181},"Flag",{"type":40,"tag":177,"props":183,"children":184},{},[185],{"type":45,"value":186},"Purpose",{"type":40,"tag":188,"props":189,"children":190},"tbody",{},[191,217,241,278,295],{"type":40,"tag":173,"props":192,"children":193},{},[194,204],{"type":40,"tag":195,"props":196,"children":197},"td",{},[198],{"type":40,"tag":59,"props":199,"children":201},{"className":200},[],[202],{"type":45,"value":203},"-s, --scenarios \u003Cpath>",{"type":40,"tag":195,"props":205,"children":206},{},[207,209,215],{"type":45,"value":208},"Scenarios directory (default ",{"type":40,"tag":59,"props":210,"children":212},{"className":211},[],[213],{"type":45,"value":214},".\u002Fscenarios",{"type":45,"value":216},")",{"type":40,"tag":173,"props":218,"children":219},{},[220,229],{"type":40,"tag":195,"props":221,"children":222},{},[223],{"type":40,"tag":59,"props":224,"children":226},{"className":225},[],[227],{"type":45,"value":228},"-a, --agent \u003Cnames>",{"type":40,"tag":195,"props":230,"children":231},{},[232,234,240],{"type":45,"value":233},"Comma-separated agents (e.g. ",{"type":40,"tag":59,"props":235,"children":237},{"className":236},[],[238],{"type":45,"value":239},"claude-code,codex",{"type":45,"value":216},{"type":40,"tag":173,"props":242,"children":243},{},[244,253],{"type":40,"tag":195,"props":245,"children":246},{},[247],{"type":40,"tag":59,"props":248,"children":250},{"className":249},[],[251],{"type":45,"value":252},"--format \u003Cformat>",{"type":40,"tag":195,"props":254,"children":255},{},[256,262,264,270,272],{"type":40,"tag":59,"props":257,"children":259},{"className":258},[],[260],{"type":45,"value":261},"json",{"type":45,"value":263}," (default), ",{"type":40,"tag":59,"props":265,"children":267},{"className":266},[],[268],{"type":45,"value":269},"js",{"type":45,"value":271},", or ",{"type":40,"tag":59,"props":273,"children":275},{"className":274},[],[276],{"type":45,"value":277},"ts",{"type":40,"tag":173,"props":279,"children":280},{},[281,290],{"type":40,"tag":195,"props":282,"children":283},{},[284],{"type":40,"tag":59,"props":285,"children":287},{"className":286},[],[288],{"type":45,"value":289},"-f, --force",{"type":40,"tag":195,"props":291,"children":292},{},[293],{"type":45,"value":294},"Overwrite existing files",{"type":40,"tag":173,"props":296,"children":297},{},[298,307],{"type":40,"tag":195,"props":299,"children":300},{},[301],{"type":40,"tag":59,"props":302,"children":304},{"className":303},[],[305],{"type":45,"value":306},"--no-skills",{"type":40,"tag":195,"props":308,"children":309},{},[310],{"type":45,"value":311},"Skip the automatic skills install",{"type":40,"tag":135,"props":313,"children":315},{"id":314},"axis-run",[316],{"type":40,"tag":59,"props":317,"children":319},{"className":318},[],[320],{"type":45,"value":321},"axis run",{"type":40,"tag":48,"props":323,"children":324},{},[325],{"type":45,"value":326},"Execute every scenario against every configured agent in isolated workspaces, score the results, and write a report.",{"type":40,"tag":165,"props":328,"children":329},{},[330,344],{"type":40,"tag":169,"props":331,"children":332},{},[333],{"type":40,"tag":173,"props":334,"children":335},{},[336,340],{"type":40,"tag":177,"props":337,"children":338},{},[339],{"type":45,"value":181},{"type":40,"tag":177,"props":341,"children":342},{},[343],{"type":45,"value":186},{"type":40,"tag":188,"props":345,"children":346},{},[347,371,403,426,443,467,484,508,531,548,565,588],{"type":40,"tag":173,"props":348,"children":349},{},[350,359],{"type":40,"tag":195,"props":351,"children":352},{},[353],{"type":40,"tag":59,"props":354,"children":356},{"className":355},[],[357],{"type":45,"value":358},"-c, --config \u003Cpath>",{"type":40,"tag":195,"props":360,"children":361},{},[362,364,370],{"type":45,"value":363},"Config path (default discovers ",{"type":40,"tag":59,"props":365,"children":367},{"className":366},[],[368],{"type":45,"value":369},"axis.config.{json,js,ts,mjs}",{"type":45,"value":216},{"type":40,"tag":173,"props":372,"children":373},{},[374,383],{"type":40,"tag":195,"props":375,"children":376},{},[377],{"type":40,"tag":59,"props":378,"children":380},{"className":379},[],[381],{"type":45,"value":382},"-s, --scenario \u003Ckeys>",{"type":40,"tag":195,"props":384,"children":385},{},[386,388,394,396,402],{"type":45,"value":387},"Comma-separated keys with glob support (",{"type":40,"tag":59,"props":389,"children":391},{"className":390},[],[392],{"type":45,"value":393},"cms\u002F*",{"type":45,"value":395},", ",{"type":40,"tag":59,"props":397,"children":399},{"className":398},[],[400],{"type":45,"value":401},"hello-*",{"type":45,"value":216},{"type":40,"tag":173,"props":404,"children":405},{},[406,414],{"type":40,"tag":195,"props":407,"children":408},{},[409],{"type":40,"tag":59,"props":410,"children":412},{"className":411},[],[413],{"type":45,"value":228},{"type":40,"tag":195,"props":415,"children":416},{},[417,419,425],{"type":45,"value":418},"Comma-separated agent names with glob support (",{"type":40,"tag":59,"props":420,"children":422},{"className":421},[],[423],{"type":45,"value":424},"claude-code|*",{"type":45,"value":216},{"type":40,"tag":173,"props":427,"children":428},{},[429,438],{"type":40,"tag":195,"props":430,"children":431},{},[432],{"type":40,"tag":59,"props":433,"children":435},{"className":434},[],[436],{"type":45,"value":437},"--concurrency \u003Cn>",{"type":40,"tag":195,"props":439,"children":440},{},[441],{"type":45,"value":442},"Max parallel jobs (default 15)",{"type":40,"tag":173,"props":444,"children":445},{},[446,455],{"type":40,"tag":195,"props":447,"children":448},{},[449],{"type":40,"tag":59,"props":450,"children":452},{"className":451},[],[453],{"type":45,"value":454},"--failed [reportId]",{"type":40,"tag":195,"props":456,"children":457},{},[458,460,466],{"type":45,"value":459},"Re-run only failed pairs from a prior report (default ",{"type":40,"tag":59,"props":461,"children":463},{"className":462},[],[464],{"type":45,"value":465},"latest",{"type":45,"value":216},{"type":40,"tag":173,"props":468,"children":469},{},[470,479],{"type":40,"tag":195,"props":471,"children":472},{},[473],{"type":40,"tag":59,"props":474,"children":476},{"className":475},[],[477],{"type":45,"value":478},"--no-score",{"type":40,"tag":195,"props":480,"children":481},{},[482],{"type":45,"value":483},"Skip the LLM judges, write raw results only",{"type":40,"tag":173,"props":485,"children":486},{},[487,496],{"type":40,"tag":195,"props":488,"children":489},{},[490],{"type":40,"tag":59,"props":491,"children":493},{"className":492},[],[494],{"type":45,"value":495},"--compare-baseline [name]",{"type":40,"tag":195,"props":497,"children":498},{},[499,501,507],{"type":45,"value":500},"Diff results against a saved baseline (default ",{"type":40,"tag":59,"props":502,"children":504},{"className":503},[],[505],{"type":45,"value":506},"main",{"type":45,"value":216},{"type":40,"tag":173,"props":509,"children":510},{},[511,520],{"type":40,"tag":195,"props":512,"children":513},{},[514],{"type":40,"tag":59,"props":515,"children":517},{"className":516},[],[518],{"type":45,"value":519},"--refresh-skills",{"type":40,"tag":195,"props":521,"children":522},{},[523,525],{"type":45,"value":524},"Force re-clone of remote skills cached under ",{"type":40,"tag":59,"props":526,"children":528},{"className":527},[],[529],{"type":45,"value":530},".axis\u002Fskills-cache\u002F",{"type":40,"tag":173,"props":532,"children":533},{},[534,543],{"type":40,"tag":195,"props":535,"children":536},{},[537],{"type":40,"tag":59,"props":538,"children":540},{"className":539},[],[541],{"type":45,"value":542},"--json",{"type":40,"tag":195,"props":544,"children":545},{},[546],{"type":45,"value":547},"Emit JSON to stdout instead of the live TTY display",{"type":40,"tag":173,"props":549,"children":550},{},[551,560],{"type":40,"tag":195,"props":552,"children":553},{},[554],{"type":40,"tag":59,"props":555,"children":557},{"className":556},[],[558],{"type":45,"value":559},"-v, --verbose",{"type":40,"tag":195,"props":561,"children":562},{},[563],{"type":45,"value":564},"Per-step logging",{"type":40,"tag":173,"props":566,"children":567},{},[568,577],{"type":40,"tag":195,"props":569,"children":570},{},[571],{"type":40,"tag":59,"props":572,"children":574},{"className":573},[],[575],{"type":45,"value":576},"--debug",{"type":40,"tag":195,"props":578,"children":579},{},[580,582],{"type":45,"value":581},"Capture raw agent stdout into ",{"type":40,"tag":59,"props":583,"children":585},{"className":584},[],[586],{"type":45,"value":587},"{agent}.debug.ndjson",{"type":40,"tag":173,"props":589,"children":590},{},[591,600],{"type":40,"tag":195,"props":592,"children":593},{},[594],{"type":40,"tag":59,"props":595,"children":597},{"className":596},[],[598],{"type":45,"value":599},"-o, --output-dir \u003Cdir>",{"type":40,"tag":195,"props":601,"children":602},{},[603],{"type":45,"value":604},"Also write the report manifest to this directory",{"type":40,"tag":135,"props":606,"children":608},{"id":607},"axis-reports",[609],{"type":40,"tag":59,"props":610,"children":612},{"className":611},[],[613],{"type":45,"value":614},"axis reports",{"type":40,"tag":48,"props":616,"children":617},{},[618],{"type":45,"value":619},"View past runs. Three call shapes:",{"type":40,"tag":621,"props":622,"children":623},"ul",{},[624,651,662],{"type":40,"tag":625,"props":626,"children":627},"li",{},[628,633,635,641,643,649],{"type":40,"tag":59,"props":629,"children":631},{"className":630},[],[632],{"type":45,"value":614},{"type":45,"value":634}," lists every report in ",{"type":40,"tag":59,"props":636,"children":638},{"className":637},[],[639],{"type":45,"value":640},".axis\u002Freports\u002F",{"type":45,"value":642}," (most recent first; ",{"type":40,"tag":59,"props":644,"children":646},{"className":645},[],[647],{"type":45,"value":648},"-n",{"type":45,"value":650}," to cap the list).",{"type":40,"tag":625,"props":652,"children":653},{},[654,660],{"type":40,"tag":59,"props":655,"children":657},{"className":656},[],[658],{"type":45,"value":659},"axis reports \u003CreportId|latest>",{"type":45,"value":661}," shows the manifest for one run, scored summary per scenario.",{"type":40,"tag":625,"props":663,"children":664},{},[665,671,673,679],{"type":40,"tag":59,"props":666,"children":668},{"className":667},[],[669],{"type":45,"value":670},"axis reports \u003CreportId|latest> \u003CscenarioKey>",{"type":45,"value":672}," opens the per-run detail (transcript, audits, criteria). Use ",{"type":40,"tag":59,"props":674,"children":676},{"className":675},[],[677],{"type":45,"value":678},"-a \u003Cagent>",{"type":45,"value":680}," to filter when multiple agents ran the same scenario.",{"type":40,"tag":48,"props":682,"children":683},{},[684,686,691,693,699],{"type":45,"value":685},"Flags: ",{"type":40,"tag":59,"props":687,"children":689},{"className":688},[],[690],{"type":45,"value":542},{"type":45,"value":692}," for machine output, ",{"type":40,"tag":59,"props":694,"children":696},{"className":695},[],[697],{"type":45,"value":698},"--html",{"type":45,"value":700}," to open the rendered report in a browser.",{"type":40,"tag":135,"props":702,"children":704},{"id":703},"axis-baseline",[705],{"type":40,"tag":59,"props":706,"children":708},{"className":707},[],[709],{"type":45,"value":710},"axis baseline",{"type":40,"tag":48,"props":712,"children":713},{},[714,716,721],{"type":45,"value":715},"Manage saved baselines for regression detection. A baseline is a snapshot of one report's scenario scores under a name (default ",{"type":40,"tag":59,"props":717,"children":719},{"className":718},[],[720],{"type":45,"value":506},{"type":45,"value":722},").",{"type":40,"tag":621,"props":724,"children":725},{},[726,737,748,759,770],{"type":40,"tag":625,"props":727,"children":728},{},[729,735],{"type":40,"tag":59,"props":730,"children":732},{"className":731},[],[733],{"type":45,"value":734},"axis baseline set [name]",{"type":45,"value":736}," saves the latest report as a baseline.",{"type":40,"tag":625,"props":738,"children":739},{},[740,746],{"type":40,"tag":59,"props":741,"children":743},{"className":742},[],[744],{"type":45,"value":745},"axis baseline list",{"type":45,"value":747}," lists saved baselines.",{"type":40,"tag":625,"props":749,"children":750},{},[751,757],{"type":40,"tag":59,"props":752,"children":754},{"className":753},[],[755],{"type":45,"value":756},"axis baseline show [name]",{"type":45,"value":758}," prints the saved entries.",{"type":40,"tag":625,"props":760,"children":761},{},[762,768],{"type":40,"tag":59,"props":763,"children":765},{"className":764},[],[766],{"type":45,"value":767},"axis baseline compare [name]",{"type":45,"value":769}," diffs the latest report against the baseline.",{"type":40,"tag":625,"props":771,"children":772},{},[773,779],{"type":40,"tag":59,"props":774,"children":776},{"className":775},[],[777],{"type":45,"value":778},"axis baseline delete [name]",{"type":45,"value":780}," removes a baseline.",{"type":40,"tag":48,"props":782,"children":783},{},[784,790],{"type":40,"tag":59,"props":785,"children":787},{"className":786},[],[788],{"type":45,"value":789},"axis run --compare-baseline",{"type":45,"value":791}," combines a fresh run with an immediate diff in one step.",{"type":40,"tag":76,"props":793,"children":795},{"id":794},"expected-directories",[796],{"type":45,"value":797},"Expected directories",{"type":40,"tag":48,"props":799,"children":800},{},[801,803,809,811,816],{"type":45,"value":802},"Everything AXIS writes lives under ",{"type":40,"tag":59,"props":804,"children":806},{"className":805},[],[807],{"type":45,"value":808},".axis\u002F",{"type":45,"value":810}," at the config directory (typically the project root). Source-of-truth files (config, scenarios, skills) are NOT under ",{"type":40,"tag":59,"props":812,"children":814},{"className":813},[],[815],{"type":45,"value":808},{"type":45,"value":106},{"type":40,"tag":818,"props":819,"children":823},"pre",{"className":820,"code":822,"language":45},[821],"language-text","project\u002F\n├── axis.config.{json,js,ts}        ← config (you author this)\n├── scenarios\u002F                      ← scenarios (you author these)\n│   └── hello-world.json\n├── skills\u002F                         ← optional local skills referenced by config\n│   └── \u003Cskill-name>\u002FSKILL.md\n├── adapters\u002F                       ← optional custom adapter modules\n│   └── \u003Cname>.{ts,js}\n└── .axis\u002F                          ← AXIS-managed, safe to gitignore\n    ├── reports\u002F\n    │   └── \u003CreportId>\u002F             ← e.g. 2026-06-12-205816\n    │       ├── report.json         ← run manifest (summary, results[])\n    │       ├── report.html         ← rendered HTML report\n    │       └── scenarios\u002F\n    │           └── \u003CscenarioKey>\u002F\n    │               ├── \u003Cagent>.json           ← per-run detail\n    │               ├── \u003Cagent>.raw.ndjson     ← raw transcript\n    │               ├── \u003Cagent>.sparse-index.txt\n    │               └── artifacts\u002F             ← files captured by scenario.artifacts globs\n    ├── baselines\u002F\n    │   └── \u003Cname>.json             ← saved baselines (default name: main)\n    ├── remotes\u002F                    ← cloned scenarios from remote git URLs\n    └── skills-cache\u002F               ← cloned remote skills\n",[824],{"type":40,"tag":59,"props":825,"children":827},{"__ignoreMap":826},"",[828],{"type":45,"value":822},{"type":40,"tag":48,"props":830,"children":831},{},[832],{"type":45,"value":833},"When asked \"where is X\", the answer is almost always here. Do not search the project tree blindly; jump to the path.",{"type":40,"tag":76,"props":835,"children":837},{"id":836},"scoring-framework",[838],{"type":45,"value":839},"Scoring framework",{"type":40,"tag":48,"props":841,"children":842},{},[843],{"type":45,"value":844},"Every run is scored on four independent dimensions, each 0-100, combined into a weighted composite.",{"type":40,"tag":165,"props":846,"children":847},{},[848,869],{"type":40,"tag":169,"props":849,"children":850},{},[851],{"type":40,"tag":173,"props":852,"children":853},{},[854,859,864],{"type":40,"tag":177,"props":855,"children":856},{},[857],{"type":45,"value":858},"Dimension",{"type":40,"tag":177,"props":860,"children":861},{},[862],{"type":45,"value":863},"Default weight",{"type":40,"tag":177,"props":865,"children":866},{},[867],{"type":45,"value":868},"What it measures",{"type":40,"tag":188,"props":870,"children":871},{},[872,898,916,933],{"type":40,"tag":173,"props":873,"children":874},{},[875,880,885],{"type":40,"tag":195,"props":876,"children":877},{},[878],{"type":45,"value":879},"Goal achievement",{"type":40,"tag":195,"props":881,"children":882},{},[883],{"type":45,"value":884},"0.4",{"type":40,"tag":195,"props":886,"children":887},{},[888,890,896],{"type":45,"value":889},"LLM judge scores the run against the scenario's ",{"type":40,"tag":59,"props":891,"children":893},{"className":892},[],[894],{"type":45,"value":895},"judge",{"type":45,"value":897}," checks",{"type":40,"tag":173,"props":899,"children":900},{},[901,906,911],{"type":40,"tag":195,"props":902,"children":903},{},[904],{"type":45,"value":905},"Environment",{"type":40,"tag":195,"props":907,"children":908},{},[909],{"type":45,"value":910},"0.2",{"type":40,"tag":195,"props":912,"children":913},{},[914],{"type":45,"value":915},"Execution reliability of filesystem, shell, and network operations",{"type":40,"tag":173,"props":917,"children":918},{},[919,924,928],{"type":40,"tag":195,"props":920,"children":921},{},[922],{"type":45,"value":923},"Service",{"type":40,"tag":195,"props":925,"children":926},{},[927],{"type":45,"value":910},{"type":40,"tag":195,"props":929,"children":930},{},[931],{"type":45,"value":932},"Execution reliability of external service interactions (APIs, MCP)",{"type":40,"tag":173,"props":934,"children":935},{},[936,941,945],{"type":40,"tag":195,"props":937,"children":938},{},[939],{"type":45,"value":940},"Agent",{"type":40,"tag":195,"props":942,"children":943},{},[944],{"type":45,"value":910},{"type":40,"tag":195,"props":946,"children":947},{},[948],{"type":45,"value":949},"Decision quality across every tool call the agent made",{"type":40,"tag":48,"props":951,"children":952},{},[953,955,960,962,968],{"type":45,"value":954},"Override weights in ",{"type":40,"tag":59,"props":956,"children":958},{"className":957},[],[959],{"type":45,"value":64},{"type":45,"value":961}," under ",{"type":40,"tag":59,"props":963,"children":965},{"className":964},[],[966],{"type":45,"value":967},"settings.scoring_weights",{"type":45,"value":106},{"type":40,"tag":135,"props":970,"children":972},{"id":971},"important-distinctions",[973],{"type":45,"value":974},"Important distinctions",{"type":40,"tag":621,"props":976,"children":977},{},[978,1017,1034],{"type":40,"tag":625,"props":979,"children":980},{},[981,986,988,994,995,1001,1002,1008,1009,1015],{"type":40,"tag":93,"props":982,"children":983},{},[984],{"type":45,"value":985},"Environment and Service evaluate execution reliability only.",{"type":45,"value":987}," Did ",{"type":40,"tag":59,"props":989,"children":991},{"className":990},[],[992],{"type":45,"value":993},"ls",{"type":45,"value":395},{"type":40,"tag":59,"props":996,"children":998},{"className":997},[],[999],{"type":45,"value":1000},"cat",{"type":45,"value":395},{"type":40,"tag":59,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":45,"value":1007},"bash",{"type":45,"value":395},{"type":40,"tag":59,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":45,"value":1014},"fetch",{"type":45,"value":1016},", MCP calls succeed cleanly? They do NOT judge whether the output was useful or task-fit.",{"type":40,"tag":625,"props":1018,"children":1019},{},[1020,1025,1027,1032],{"type":40,"tag":93,"props":1021,"children":1022},{},[1023],{"type":45,"value":1024},"The Agent dimension is decision quality across every interaction.",{"type":45,"value":1026}," Every tool call is an agent choice, even a plain ",{"type":40,"tag":59,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":45,"value":993},{"type":45,"value":1033},". The agent judge audits every interaction, not just calls tagged as agent-y.",{"type":40,"tag":625,"props":1035,"children":1036},{},[1037,1042],{"type":40,"tag":93,"props":1038,"children":1039},{},[1040],{"type":45,"value":1041},"Speed is always heuristic",{"type":45,"value":1043}," (threshold buckets per category), never LLM-evaluated. Every other dimension uses an LLM judge.",{"type":40,"tag":135,"props":1045,"children":1047},{"id":1046},"agent-sub-dimensions",[1048],{"type":45,"value":1049},"Agent sub-dimensions",{"type":40,"tag":48,"props":1051,"children":1052},{},[1053],{"type":45,"value":1054},"The agent dimension weights its own sub-dimensions:",{"type":40,"tag":165,"props":1056,"children":1057},{},[1058,1079],{"type":40,"tag":169,"props":1059,"children":1060},{},[1061],{"type":40,"tag":173,"props":1062,"children":1063},{},[1064,1069,1074],{"type":40,"tag":177,"props":1065,"children":1066},{},[1067],{"type":45,"value":1068},"Sub-dimension",{"type":40,"tag":177,"props":1070,"children":1071},{},[1072],{"type":45,"value":1073},"Weight",{"type":40,"tag":177,"props":1075,"children":1076},{},[1077],{"type":45,"value":1078},"What it captures",{"type":40,"tag":188,"props":1080,"children":1081},{},[1082,1099,1116,1132,1150],{"type":40,"tag":173,"props":1083,"children":1084},{},[1085,1090,1094],{"type":40,"tag":195,"props":1086,"children":1087},{},[1088],{"type":45,"value":1089},"Necessity",{"type":40,"tag":195,"props":1091,"children":1092},{},[1093],{"type":45,"value":884},{"type":40,"tag":195,"props":1095,"children":1096},{},[1097],{"type":45,"value":1098},"Was the call needed at all? Redundant exploration tanks this hard.",{"type":40,"tag":173,"props":1100,"children":1101},{},[1102,1107,1111],{"type":40,"tag":195,"props":1103,"children":1104},{},[1105],{"type":45,"value":1106},"Relevance",{"type":40,"tag":195,"props":1108,"children":1109},{},[1110],{"type":45,"value":910},{"type":40,"tag":195,"props":1112,"children":1113},{},[1114],{"type":45,"value":1115},"Did the call advance the goal?",{"type":40,"tag":173,"props":1117,"children":1118},{},[1119,1123,1127],{"type":40,"tag":195,"props":1120,"children":1121},{},[1122],{"type":45,"value":1073},{"type":40,"tag":195,"props":1124,"children":1125},{},[1126],{"type":45,"value":910},{"type":40,"tag":195,"props":1128,"children":1129},{},[1130],{"type":45,"value":1131},"Was the call's cost proportionate to its value?",{"type":40,"tag":173,"props":1133,"children":1134},{},[1135,1140,1145],{"type":40,"tag":195,"props":1136,"children":1137},{},[1138],{"type":45,"value":1139},"Success",{"type":40,"tag":195,"props":1141,"children":1142},{},[1143],{"type":45,"value":1144},"0.1",{"type":40,"tag":195,"props":1146,"children":1147},{},[1148],{"type":45,"value":1149},"Did the call succeed?",{"type":40,"tag":173,"props":1151,"children":1152},{},[1153,1158,1162],{"type":40,"tag":195,"props":1154,"children":1155},{},[1156],{"type":45,"value":1157},"Speed",{"type":40,"tag":195,"props":1159,"children":1160},{},[1161],{"type":45,"value":1144},{"type":40,"tag":195,"props":1163,"children":1164},{},[1165],{"type":45,"value":1166},"Heuristic speed buckets",{"type":40,"tag":48,"props":1168,"children":1169},{},[1170],{"type":45,"value":1171},"Env and Service sub-dimensions are simpler: success 0.7, speed 0.3, rest 0.",{"type":40,"tag":135,"props":1173,"children":1175},{"id":1174},"composite-formula",[1176],{"type":45,"value":1177},"Composite formula",{"type":40,"tag":48,"props":1179,"children":1180},{},[1181],{"type":40,"tag":59,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":45,"value":1186},"axisScore = goal * w_goal + environment * w_env + service * w_svc + agent * w_agent",{"type":40,"tag":135,"props":1188,"children":1190},{"id":1189},"calibration",[1191],{"type":45,"value":1192},"Calibration",{"type":40,"tag":48,"props":1194,"children":1195},{},[1196],{"type":45,"value":1197},"All dimensions use log-normal CDF mapping with median 0.5 and sigma 0.4:",{"type":40,"tag":165,"props":1199,"children":1200},{},[1201,1217],{"type":40,"tag":169,"props":1202,"children":1203},{},[1204],{"type":40,"tag":173,"props":1205,"children":1206},{},[1207,1212],{"type":40,"tag":177,"props":1208,"children":1209},{},[1210],{"type":45,"value":1211},"Raw input",{"type":40,"tag":177,"props":1213,"children":1214},{},[1215],{"type":45,"value":1216},"Mapped score",{"type":40,"tag":188,"props":1218,"children":1219},{},[1220,1233,1246],{"type":40,"tag":173,"props":1221,"children":1222},{},[1223,1228],{"type":40,"tag":195,"props":1224,"children":1225},{},[1226],{"type":45,"value":1227},"0.5",{"type":40,"tag":195,"props":1229,"children":1230},{},[1231],{"type":45,"value":1232},"50",{"type":40,"tag":173,"props":1234,"children":1235},{},[1236,1241],{"type":40,"tag":195,"props":1237,"children":1238},{},[1239],{"type":45,"value":1240},"0.8",{"type":40,"tag":195,"props":1242,"children":1243},{},[1244],{"type":45,"value":1245},"88",{"type":40,"tag":173,"props":1247,"children":1248},{},[1249,1254],{"type":40,"tag":195,"props":1250,"children":1251},{},[1252],{"type":45,"value":1253},"0.985",{"type":40,"tag":195,"props":1255,"children":1256},{},[1257],{"type":45,"value":1258},"96",{"type":40,"tag":48,"props":1260,"children":1261},{},[1262],{"type":45,"value":1263},"Practical consequence: even flawless runs cap around 95-99. Treat 95+ as a top-band result. A clean 100 is structurally near-impossible across all four dimensions.",{"type":40,"tag":76,"props":1265,"children":1267},{"id":1266},"reading-a-report",[1268],{"type":45,"value":1269},"Reading a report",{"type":40,"tag":48,"props":1271,"children":1272},{},[1273,1279],{"type":40,"tag":59,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":45,"value":1278},".axis\u002Freports\u002F\u003CreportId>\u002Freport.json",{"type":45,"value":1280}," has:",{"type":40,"tag":621,"props":1282,"children":1283},{},[1284,1314,1323],{"type":40,"tag":625,"props":1285,"children":1286},{},[1287,1293,1294,1300,1301,1307,1308],{"type":40,"tag":59,"props":1288,"children":1290},{"className":1289},[],[1291],{"type":45,"value":1292},"version",{"type":45,"value":395},{"type":40,"tag":59,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":45,"value":1299},"reportId",{"type":45,"value":395},{"type":40,"tag":59,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":45,"value":1306},"timestamp",{"type":45,"value":395},{"type":40,"tag":59,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":45,"value":1313},"durationMs",{"type":40,"tag":625,"props":1315,"children":1316},{},[1317],{"type":40,"tag":59,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":45,"value":1322},"summary: { total, completed, failed, averageAxisScore }",{"type":40,"tag":625,"props":1324,"children":1325},{},[1326,1332],{"type":40,"tag":59,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":45,"value":1331},"results[]",{"type":45,"value":1333},", one entry per (scenario, agent) pair",{"type":40,"tag":48,"props":1335,"children":1336},{},[1337],{"type":45,"value":1338},"Each result entry contains:",{"type":40,"tag":621,"props":1340,"children":1341},{},[1342,1365,1387,1398,1436,1445,1454],{"type":40,"tag":625,"props":1343,"children":1344},{},[1345,1351,1352,1358,1359],{"type":40,"tag":59,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":45,"value":1350},"scenarioKey",{"type":45,"value":395},{"type":40,"tag":59,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":45,"value":1357},"scenarioName",{"type":45,"value":395},{"type":40,"tag":59,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":45,"value":1364},"agentName",{"type":40,"tag":625,"props":1366,"children":1367},{},[1368,1373,1374,1380,1381],{"type":40,"tag":59,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":45,"value":1313},{"type":45,"value":395},{"type":40,"tag":59,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":45,"value":1379},"exitCode",{"type":45,"value":395},{"type":40,"tag":59,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":45,"value":1386},"tokenUsage: { input, output, cacheReadInput }",{"type":40,"tag":625,"props":1388,"children":1389},{},[1390,1396],{"type":40,"tag":59,"props":1391,"children":1393},{"className":1392},[],[1394],{"type":45,"value":1395},"score.axisScore",{"type":45,"value":1397}," (0-100 composite)",{"type":40,"tag":625,"props":1399,"children":1400},{},[1401,1407,1409,1415,1416,1422,1423,1429,1430],{"type":40,"tag":59,"props":1402,"children":1404},{"className":1403},[],[1405],{"type":45,"value":1406},"score.goalAchievement.{score, criteria[]}",{"type":45,"value":1408}," where each criterion has ",{"type":40,"tag":59,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":45,"value":1414},"check",{"type":45,"value":395},{"type":40,"tag":59,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":45,"value":1421},"weight",{"type":45,"value":395},{"type":40,"tag":59,"props":1424,"children":1426},{"className":1425},[],[1427],{"type":45,"value":1428},"score",{"type":45,"value":395},{"type":40,"tag":59,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":45,"value":1435},"rationale",{"type":40,"tag":625,"props":1437,"children":1438},{},[1439],{"type":40,"tag":59,"props":1440,"children":1442},{"className":1441},[],[1443],{"type":45,"value":1444},"score.environment.{score, dimensions, audits[]}",{"type":40,"tag":625,"props":1446,"children":1447},{},[1448],{"type":40,"tag":59,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":45,"value":1453},"score.service.{score, dimensions, audits[]}",{"type":40,"tag":625,"props":1455,"children":1456},{},[1457,1463],{"type":40,"tag":59,"props":1458,"children":1460},{"className":1459},[],[1461],{"type":45,"value":1462},"score.agent.{score, dimensions, audits[]}",{"type":45,"value":1464}," (audits every interaction, not just agent-tagged)",{"type":40,"tag":48,"props":1466,"children":1467},{},[1468,1470,1476,1478,1484],{"type":45,"value":1469},"Each ",{"type":40,"tag":59,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":45,"value":1475},"dimensions",{"type":45,"value":1477}," object has ",{"type":40,"tag":59,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":45,"value":1483},"{ success, speed, weight, relevance, necessity }",{"type":45,"value":1485}," mapped to 0-100.",{"type":40,"tag":135,"props":1487,"children":1489},{"id":1488},"diagnosing-a-low-score",[1490],{"type":45,"value":1491},"Diagnosing a low score",{"type":40,"tag":48,"props":1493,"children":1494},{},[1495],{"type":45,"value":1496},"Look at which dimension dropped, then inspect:",{"type":40,"tag":621,"props":1498,"children":1499},{},[1500,1533,1557,1567],{"type":40,"tag":625,"props":1501,"children":1502},{},[1503,1508,1510,1516,1518,1524,1526,1531],{"type":40,"tag":93,"props":1504,"children":1505},{},[1506],{"type":45,"value":1507},"Goal dropped",{"type":45,"value":1509},": read ",{"type":40,"tag":59,"props":1511,"children":1513},{"className":1512},[],[1514],{"type":45,"value":1515},"goalAchievement.criteria[]",{"type":45,"value":1517}," and find entries with ",{"type":40,"tag":59,"props":1519,"children":1521},{"className":1520},[],[1522],{"type":45,"value":1523},"score \u003C 10",{"type":45,"value":1525},". The ",{"type":40,"tag":59,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":45,"value":1435},{"type":45,"value":1532}," says which check the agent failed.",{"type":40,"tag":625,"props":1534,"children":1535},{},[1536,1541,1542,1548,1549,1555],{"type":40,"tag":93,"props":1537,"children":1538},{},[1539],{"type":45,"value":1540},"Environment dropped",{"type":45,"value":1509},{"type":40,"tag":59,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":45,"value":1547},"environment.audits[]",{"type":45,"value":1517},{"type":40,"tag":59,"props":1550,"children":1552},{"className":1551},[],[1553],{"type":45,"value":1554},"success \u003C 1",{"type":45,"value":1556},". Common causes: command-not-found, missing files, network errors.",{"type":40,"tag":625,"props":1558,"children":1559},{},[1560,1565],{"type":40,"tag":93,"props":1561,"children":1562},{},[1563],{"type":45,"value":1564},"Service dropped",{"type":45,"value":1566},": same as environment but for MCP \u002F API calls. Audit entries point at the specific tool.",{"type":40,"tag":625,"props":1568,"children":1569},{},[1570,1575,1577,1583,1585,1591],{"type":40,"tag":93,"props":1571,"children":1572},{},[1573],{"type":45,"value":1574},"Agent dropped",{"type":45,"value":1576},": check ",{"type":40,"tag":59,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":45,"value":1582},"agent.dimensions.necessity",{"type":45,"value":1584}," first. If it's low, the agent made redundant calls. ",{"type":40,"tag":59,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":45,"value":1590},"agent.dimensions.relevance",{"type":45,"value":1592}," low means calls were off-task.",{"type":40,"tag":135,"props":1594,"children":1596},{"id":1595},"comparing-against-a-baseline",[1597],{"type":45,"value":1598},"Comparing against a baseline",{"type":40,"tag":48,"props":1600,"children":1601},{},[1602,1604,1609,1611,1617,1619,1625,1627,1632],{"type":45,"value":1603},"Match by ",{"type":40,"tag":59,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":45,"value":1350},{"type":45,"value":1610}," (variants like ",{"type":40,"tag":59,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":45,"value":1616},"foo@bar",{"type":45,"value":1618}," are distinct keys). Subtract ",{"type":40,"tag":59,"props":1620,"children":1622},{"className":1621},[],[1623],{"type":45,"value":1624},"axisScore",{"type":45,"value":1626}," from the baseline entry's ",{"type":40,"tag":59,"props":1628,"children":1630},{"className":1629},[],[1631],{"type":45,"value":1624},{"type":45,"value":1633},". The dimension that moved the most is the failure mode.",{"type":40,"tag":135,"props":1635,"children":1637},{"id":1636},"citing-numbers-in-analyses",[1638],{"type":45,"value":1639},"Citing numbers in analyses",{"type":40,"tag":48,"props":1641,"children":1642},{},[1643],{"type":45,"value":1644},"Open the file and read it. Do not invent values.",{"type":40,"tag":621,"props":1646,"children":1647},{},[1648,1653,1658,1663],{"type":40,"tag":625,"props":1649,"children":1650},{},[1651],{"type":45,"value":1652},"\"AXIS Result dropped from 84 to 53, a 31-point regression\"",{"type":40,"tag":625,"props":1654,"children":1655},{},[1656],{"type":45,"value":1657},"\"Service success collapsed from 0.95 to 0.30\"",{"type":40,"tag":625,"props":1659,"children":1660},{},[1661],{"type":45,"value":1662},"\"Agent necessity was 0.32, meaning roughly 68% of tool calls were judged unnecessary\"",{"type":40,"tag":625,"props":1664,"children":1665},{},[1666,1668,1672],{"type":45,"value":1667},"\"5 of 7 service interactions returned errors per the audits",{"type":40,"tag":1669,"props":1670,"children":1671},"span",{},[],{"type":45,"value":1673}," entries\"",{"type":40,"tag":76,"props":1675,"children":1677},{"id":1676},"rules-you-must-follow",[1678],{"type":45,"value":1679},"Rules you must follow",{"type":40,"tag":1681,"props":1682,"children":1683},"ol",{},[1684,1700,1705,1718,1731,1736,1741,1746],{"type":40,"tag":625,"props":1685,"children":1686},{},[1687,1688,1692,1694,1698],{"type":45,"value":91},{"type":40,"tag":93,"props":1689,"children":1690},{},[1691],{"type":45,"value":97},{"type":45,"value":1693},", never \"AXIS Score\" (which reads as \"score score\"). The acronym is ",{"type":40,"tag":93,"props":1695,"children":1696},{},[1697],{"type":45,"value":104},{"type":45,"value":1699},", never \"eXperience\".",{"type":40,"tag":625,"props":1701,"children":1702},{},[1703],{"type":45,"value":1704},"Do not use em dashes in any prose, comment, or analysis you author. Use a comma, semicolon, colon, parenthesis, or a new sentence instead.",{"type":40,"tag":625,"props":1706,"children":1707},{},[1708,1710,1716],{"type":45,"value":1709},"When asked to read a report, open the actual file. Do not paraphrase, do not guess at numbers. Cite values verbatim from ",{"type":40,"tag":59,"props":1711,"children":1713},{"className":1712},[],[1714],{"type":45,"value":1715},"report.json",{"type":45,"value":1717}," or the per-scenario detail JSON.",{"type":40,"tag":625,"props":1719,"children":1720},{},[1721,1723,1729],{"type":45,"value":1722},"Treat ",{"type":40,"tag":59,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":45,"value":1728},"95+",{"type":45,"value":1730}," as the practical top band. Do not call a 95 result \"merely good\" or imply 100 is the realistic target; the log-normal calibration makes a clean 100 nearly impossible.",{"type":40,"tag":625,"props":1732,"children":1733},{},[1734],{"type":45,"value":1735},"Distinguish execution quality (Environment, Service) from decision quality (Agent). They measure different things; using them interchangeably is wrong.",{"type":40,"tag":625,"props":1737,"children":1738},{},[1739],{"type":45,"value":1740},"When the user asks where AXIS writes something, give the exact path from the directory map above. Do not search.",{"type":40,"tag":625,"props":1742,"children":1743},{},[1744],{"type":45,"value":1745},"Do not invent CLI flags. The full surface is listed above; if a user asks for something not listed, say so and suggest the closest documented option.",{"type":40,"tag":625,"props":1747,"children":1748},{},[1749,1751,1756,1758,1764,1766,1772],{"type":45,"value":1750},"Write paths relative to the project root. When you put an AXIS path into a runbook, analysis, plan, or any file you author, spell it as ",{"type":40,"tag":59,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":45,"value":1278},{"type":45,"value":1757},", NOT as an absolute path like ",{"type":40,"tag":59,"props":1759,"children":1761},{"className":1760},[],[1762],{"type":45,"value":1763},"\u002Ftmp\u002Faxis-xyz\u002Fwork\u002F.axis\u002Freports\u002F\u003CreportId>\u002Freport.json",{"type":45,"value":1765}," or ",{"type":40,"tag":59,"props":1767,"children":1769},{"className":1768},[],[1770],{"type":45,"value":1771},"\u002Fprivate\u002Fvar\u002F...\u002F.axis\u002F...",{"type":45,"value":1773},". Absolute workspace paths leak the agent's isolated temp directory and will not match what the user sees in their own checkout. The only correct form is the project-root-relative path.",{"type":40,"tag":76,"props":1775,"children":1777},{"id":1776},"reference",[1778],{"type":45,"value":1779},"Reference",{"type":40,"tag":621,"props":1781,"children":1782},{},[1783,1796,1809,1820],{"type":40,"tag":625,"props":1784,"children":1785},{},[1786,1788],{"type":45,"value":1787},"Documentation site: ",{"type":40,"tag":1789,"props":1790,"children":1794},"a",{"href":1791,"rel":1792},"https:\u002F\u002Faxis.run",[1793],"nofollow",[1795],{"type":45,"value":1791},{"type":40,"tag":625,"props":1797,"children":1798},{},[1799,1801,1807],{"type":45,"value":1800},"Scoring source: ",{"type":40,"tag":59,"props":1802,"children":1804},{"className":1803},[],[1805],{"type":45,"value":1806},"src\u002Fscoring\u002F",{"type":45,"value":1808}," in the netlify\u002Faxis repo (deep-eval.ts, category-score.ts, composite.ts)",{"type":40,"tag":625,"props":1810,"children":1811},{},[1812,1814],{"type":45,"value":1813},"Report writer: ",{"type":40,"tag":59,"props":1815,"children":1817},{"className":1816},[],[1818],{"type":45,"value":1819},"src\u002Freports\u002Fwriter.ts",{"type":40,"tag":625,"props":1821,"children":1822},{},[1823,1825],{"type":45,"value":1824},"Companion skill for authoring: ",{"type":40,"tag":59,"props":1826,"children":1828},{"className":1827},[],[1829],{"type":45,"value":72},{"type":40,"tag":76,"props":1831,"children":1833},{"id":1832},"installing-this-skill",[1834],{"type":45,"value":1835},"Installing this skill",{"type":40,"tag":48,"props":1837,"children":1838},{},[1839,1841,1847],{"type":45,"value":1840},"Use the ",{"type":40,"tag":59,"props":1842,"children":1844},{"className":1843},[],[1845],{"type":45,"value":1846},"skills",{"type":45,"value":1848}," CLI:",{"type":40,"tag":818,"props":1850,"children":1853},{"className":1851,"code":1852,"language":45},[821],"npx skills add netlify\u002Faxis --all\n",[1854],{"type":40,"tag":59,"props":1855,"children":1856},{"__ignoreMap":826},[1857],{"type":45,"value":1852},{"type":40,"tag":48,"props":1859,"children":1860},{},[1861,1863,1868,1869,1874,1876,1881,1883,1888],{"type":45,"value":1862},"This installs every AXIS skill (",{"type":40,"tag":59,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":45,"value":72},{"type":45,"value":395},{"type":40,"tag":59,"props":1870,"children":1872},{"className":1871},[],[1873],{"type":45,"value":4},{"type":45,"value":1875},") into every detected agent config directory. ",{"type":40,"tag":59,"props":1877,"children":1879},{"className":1878},[],[1880],{"type":45,"value":144},{"type":45,"value":1882}," runs this automatically; pass ",{"type":40,"tag":59,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":45,"value":306},{"type":45,"value":1889}," to opt out.",{"items":1891,"total":1912},[1892,1906],{"slug":72,"name":72,"fn":1893,"description":1894,"org":1895,"tags":1896,"stars":20,"repoUrl":21,"updatedAt":1905},"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},[1897,1900,1903,1904],{"name":1898,"slug":1899,"type":15},"Agents","agents",{"name":1901,"slug":1902,"type":15},"Configuration","configuration",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"2026-07-20T05:59:47.468757",{"slug":4,"name":4,"fn":5,"description":6,"org":1907,"tags":1908,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1909,1910,1911],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},2,{"items":1914,"total":2079},[1915,1922,1928,1947,1962,1977,1994,2011,2021,2036,2049,2064],{"slug":72,"name":72,"fn":1893,"description":1894,"org":1916,"tags":1917,"stars":20,"repoUrl":21,"updatedAt":1905},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1918,1919,1920,1921],{"name":1898,"slug":1899,"type":15},{"name":1901,"slug":1902,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1923,"tags":1924,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1925,1926,1927],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":1929,"name":1929,"fn":1930,"description":1931,"org":1932,"tags":1933,"stars":1944,"repoUrl":1945,"updatedAt":1946},"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},[1934,1937,1938,1941],{"name":1935,"slug":1936,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":1939,"slug":1940,"type":15},"Permissions","permissions",{"name":1942,"slug":1943,"type":15},"Security","security",24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-14T05:40:29.082149",{"slug":1948,"name":1948,"fn":1949,"description":1950,"org":1951,"tags":1952,"stars":1944,"repoUrl":1945,"updatedAt":1961},"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},[1953,1954,1957,1960],{"name":1898,"slug":1899,"type":15},{"name":1955,"slug":1956,"type":15},"Automation","automation",{"name":1958,"slug":1959,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":1963,"name":1963,"fn":1964,"description":1965,"org":1966,"tags":1967,"stars":1944,"repoUrl":1945,"updatedAt":1976},"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},[1968,1971,1974,1975],{"name":1969,"slug":1970,"type":15},"AI Infrastructure","ai-infrastructure",{"name":1972,"slug":1973,"type":15},"API Development","api-development",{"name":1958,"slug":1959,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":1978,"name":1978,"fn":1979,"description":1980,"org":1981,"tags":1982,"stars":1944,"repoUrl":1945,"updatedAt":1993},"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},[1983,1986,1989,1990],{"name":1984,"slug":1985,"type":15},"Backend","backend",{"name":1987,"slug":1988,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":1991,"slug":1992,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":1995,"name":1995,"fn":1996,"description":1997,"org":1998,"tags":1999,"stars":1944,"repoUrl":1945,"updatedAt":2010},"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},[2000,2003,2006,2007],{"name":2001,"slug":2002,"type":15},"Caching","caching",{"name":2004,"slug":2005,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":2008,"slug":2009,"type":15},"Performance","performance","2026-07-14T05:40:20.066717",{"slug":2012,"name":2012,"fn":2013,"description":2014,"org":2015,"tags":2016,"stars":1944,"repoUrl":1945,"updatedAt":2020},"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},[2017,2018,2019],{"name":1901,"slug":1902,"type":15},{"name":2004,"slug":2005,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:21.284801",{"slug":2022,"name":2022,"fn":2023,"description":2024,"org":2025,"tags":2026,"stars":1944,"repoUrl":1945,"updatedAt":2035},"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},[2027,2028,2031,2032],{"name":1984,"slug":1985,"type":15},{"name":2029,"slug":2030,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":2033,"slug":2034,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",{"slug":2037,"name":2037,"fn":2038,"description":2039,"org":2040,"tags":2041,"stars":1944,"repoUrl":1945,"updatedAt":2048},"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},[2042,2043,2044,2045],{"name":17,"slug":18,"type":15},{"name":2004,"slug":2005,"type":15},{"name":9,"slug":8,"type":15},{"name":2046,"slug":2047,"type":15},"Web Development","web-development","2026-07-17T05:30:14.218977",{"slug":2050,"name":2050,"fn":2051,"description":2052,"org":2053,"tags":2054,"stars":1944,"repoUrl":1945,"updatedAt":2063},"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},[2055,2058,2061,2062],{"name":2056,"slug":2057,"type":15},"Edge Functions","edge-functions",{"name":2059,"slug":2060,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},{"name":2008,"slug":2009,"type":15},"2026-07-14T05:40:34.147865",{"slug":2065,"name":2065,"fn":2066,"description":2067,"org":2068,"tags":2069,"stars":1944,"repoUrl":1945,"updatedAt":2078},"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},[2070,2073,2076,2077],{"name":2071,"slug":2072,"type":15},"Forms","forms",{"name":2074,"slug":2075,"type":15},"HTML","html",{"name":9,"slug":8,"type":15},{"name":2046,"slug":2047,"type":15},"2026-07-14T05:40:16.075367",17]