[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme:intent-router":3},"\u003Ch1>Intent-Router\u003C\u002Fh1>\n\u003Cp>English | \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002Fintent-router\u002Fblob\u002FHEAD\u002FREADME.zh-CN.md\" rel=\"nofollow ugc noopener\">简体中文\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>An intent compiler for AI agents.\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Turns a vague request into a typed \u003Ccode>IntentSpec\u003C\u002Fcode>: it looks up what it can, asks only what it\ncan't, calls out a request that contradicts itself, admits two readings, or rests on a premise\nyour own repo already disproves, and refuses to emit while the intent is still underspecified.\nWhen the work gets handed off and carried out, it checks the result against the spec it wrote —\none constraint at a time, not a vibe check.\u003C\u002Fp>\n\u003Cp>What that buys you:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Prompt equity.\u003C\u002Fstrong> You get the interaction of a senior engineer without having to learn prompt\nengineering — the gap between the top 1% of prompt writers and everyone else stops deciding what\nyou get back. Say it the way you'd say it to a capable teammate, \u003Cem>\"add caching to the user API\"\u003C\u002Fem>,\nand the skill writes the briefing a senior engineer would have written first. You stop coaxing\nthe model and start putting it to work.\u003C\u002Fli>\n\u003Cli>It asks one question, and the answer lands in the delivered code. Before anything reaches you it\nreads what your repo, ticket system or docs already answer, so the forty-six-question interview\nbecomes the one question that genuinely needs your judgment — and in the delivery comparison,\nevery run with the skill asks exactly that one question and 3 of 3 delivered caches state their\nfailure policy, while none of the 5 bare deliveries do\n(\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002Fintent-router\u002Fblob\u002FHEAD\u002Fevals\u002Freports\u002F2026-09-24-delivery-opencode.md\" rel=\"nofollow ugc noopener\">report\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The work carries further. Every run ends in a machine-readable \u003Ccode>IntentSpec\u003C\u002Fcode>, saved to\n\u003Ccode>.intent\u002F&lt;intent&gt;.intent.yaml\u003C\u002Fcode> before the reply that carries it, whose probed fields carry\nevidence pointers and which records its own state: still waiting on a question, settled, or\nalready carried out. A later session \u003Cstrong>reads that file before probing anything\u003C\u002Fstrong> — an answered\nquestion is never asked again, a settled contract is implemented as written — and the result of\nchecking the delivered work against it is written back into the same file. So the next agent,\nsession or teammate starts from what you actually decided instead of zero.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002Fintent-router\u002Fblob\u002FHEAD\u002FLICENSE\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-blue.svg\" alt=\"License: MIT\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002FIntent-Router\u002Freleases\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fangel291592\u002FIntent-Router\" alt=\"Release\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002FIntent-Router\u002Factions\u002Fworkflows\u002Fci.yml\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002FIntent-Router\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002FIntent-Router\u002Fstargazers\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fangel291592\u002FIntent-Router\" alt=\"Stars\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"#backends\" rel=\"nofollow ugc noopener\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fbackend-L0%20prompt--only-green.svg\" alt=\"Works without installing anything\" \u002F>\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>What \"installed\" changes, in the diff itself\u003C\u002Fh3>\n\u003Cp>Same weak request, same fixture, same permissions, one line apart —\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fangel291592\u002Fintent-router\u002Fblob\u002FHEAD\u002Fevals\u002Freports\u002F2026-09-24-delivery-opencode.md\" rel=\"nofollow ugc noopener\">bare vs. with the skill\u003C\u002Fa> (N=5 bare, N=3 skill).\nExcerpted verbatim from each run's own \u003Ccode>diff.patch\u003C\u002Fcode>, the part that decides what happens when the\ncache itself fails:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Bare\u003C\u002Fstrong> — no failure path exists to read. A downed Redis takes the request down with it:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-ts\">const hit = await getCache&lt;T&gt;(key);\nif (hit !== null) {\n  return hit;\n}\nconst value = await load();\nif (value !== null) {\n  await setCache(key, value);\n}\nreturn value;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>With the skill\u003C\u002Fstrong> — asked the one question no file could answer, then wrote the answer into the\ncode:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-ts\">async function readCache&lt;T&gt;(key: string): Promise&lt;{ hit: boolean; value: T | null }&gt; {\n  try {\n    return { hit: true, value: await getCache&lt;T&gt;(key) };\n  } catch {\n    return { hit: false, value: null };\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Every one of the 5 bare runs shipped the first shape; every one of the 3 skill runs shipped the\nsecond. Neither line was written by hand for this README — both come straight out of the runs\nthat produced the numbers in \u003Ca href=\"#evals\" rel=\"nofollow ugc noopener\">Evals\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>          \"add caching to the user API\"       \"this customer is furious — sort it out\"\n \n\u003C\u002Fcode>\u003C\u002Fpre>\n",1791762981404]