AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
검증을 통과하는 가장 저렴한 모델로 모든 작업을 실행해 공개 벤치마크에서 비용을 최대 95% 절감하면서 동등하거나 더 높은 통과율을 유지합니다
Runs every unit of work at the cheapest model that can pass verification. Measured up to −95% cost on public benchmarks at equal-or-better pass rate.
개발 도구HTML · JavaScriptGitHub @undercutsh온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Confidence-gated model routing for coding agents — run work at the cheapest model that can pass verification. SKILL.md, MIT.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Undercut the top-tier model. Never the quality bar.
Run every unit of work at the cheapest model that can pass verification.
Escalate on evidence, not vibes.
The install slug is tiered-dispatch; the product is Undercut.
Measured, not promised: up to −71% cost on public benchmarks, equal-or-better
quality, across 4 model families. Every number below is reproducible from the
raw data in testing/.README 전문 보기 ↗Run every unit of work at the cheapest model that can pass verification. Escalate on evidence, not vibes.
The install slug is
tiered-dispatch; the product is Undercut.
Measured, not promised: up to −71% cost on public benchmarks, equal-or-better
quality, across 4 model families. Every number below is reproducible from the
raw data in testing/.
We A/B-tested the skill against "one model for everything" on third-party, MIT-licensed benchmarks — official test cases, not ours. Each cell: same tasks, same grader, only the routing policy changes.
| Model family | all-standard | tiered | cost | quality |
|---|---|---|---|---|
| OpenAI | 241/250 | 249/250 | −71% | +8 correct |
| Gemini | 250/250 | 248/250 | −59% | −2 (noise) |
| Anthropic | 249/250 | 250/250 | −4% | +1 |
| Model family | all-standard | tiered | cost | quality |
|---|---|---|---|---|
| Gemini | 100/100 | 100/100 | −95% | = |
| Anthropic | 100/100 | 100/100 | −61% | = |
| OpenAI | 100/100 | 100/100 | NA* | = |
*NA — OpenAI's cheap tier can't write Python, so there's no cost headroom on code for that family. Quality is still preserved (the escalator works).
testing/results/ — every
cell re-verifiable, every attempt trace included.Full tables, the flagging-reliability study, and reproduction steps:
testing/README.md.
Coding agents route almost everything to the most expensive model available, by default and by habit. The "ask the model how confident it is, then route" fix doesn't work — self-reported model confidence is poorly calibrated. A model that's wrong is frequently just as "confident" as one that's right.
If a task's output is cheap to verify mechanically — tests, schema validation, a diff, a spot-check — it is safe to attempt at the cheapest tier regardless of how hard the task looks. Escalation should happen on verification failure, not on predicted difficulty. Only unverifiable judgment work needs to start on an expensive model. This gap is the single biggest lever in the system.
Base tier: a 6-flag rubric. Score each unit on whether it's unverifiable, ambiguous, high blast radius (irreversible, money, auth, user data), cross-cutting, novel, or format-strict. 0 flags → cheap. 1–2 → standard. 3+, or any ownership/judgment call → frontier.
3 objective escalation triggers, one tier at a time:
uncertain.Residue-only escalation. A higher tier sees only the items that failed or were flagged — never the whole batch.
Hysteresis. Never de-escalate mid-task. One retry per tier, max. Everything unresolved goes to a single batched apex-tier tie-break call — never per-item apex calls.
Flags steer; verification + escalation decide. Wrong flags cost at most one extra cheap attempt. A stock dispatcher reproduced only 90% of rubric flags yet still routed 100% of units to the correct tier.
Every non-trivial dispatch narrates the tier it landed on and why, right in the transcript — no hooks, no opt-in step required:
Two payrolls hide in every request. Only one gets tiered.
"Build me a minimum-viable CRM I can use for my small business" isn't one job — it's a planning phase (what should this even do, which tradeoffs matter) billed at judgment rates, then an execution phase (the schema, the endpoints, the screens, the tests) that doesn't need to be. The rubric above tiers the second phase. It has no opinion on the first, and judgment tokens are usually the expensive half to begin with.
Stop doing this: one frontier model handles the PRD, the schema, and every CRUD screen and test — a staffing mistake before it's a cost one. Sending one model both jobs means every token, from the ambiguous tradeoff to the boilerplate screen, gets billed at the rate of the hardest decision in the project.
Do this instead: the judgment slice (PRD, ambiguous schema tradeoffs) stays at frontier — nobody's claiming otherwise, that's still expensive. The execution slice — usually most of the token volume — gets tiered like every other verifiable unit: cheap by default, escalated only on evidence.
| Judgment tokens | Execution tokens | Blended | |
|---|---|---|---|
| Share of the request | 50% | 50% | 100% |
| Does the rubric apply? | not yet proven | yes | — |
| Measured reduction (GSM8K/OpenAI) | 0% | 71% | ~36% |
The measured up to −71% is on execution work. Half your tokens at that reduction is ~36% off the whole session — not 71%. Skew more execution-heavy than 50/50 and the blended number moves toward 71%; more planning-heavy, and it moves toward 0%. Whichever way your workload leans, the number you get is the honest one — not the headline one.
testing/README.md.Requirements: none beyond the coding agent itself. npx skills add
needs Node.js/npm (for npx) and network access to the skills.sh registry;
the manual cp -r copy below needs neither. No API key, no account, no
build step.
Claude Code can also install via plugin (this repo doubles as its own marketplace):
/plugin marketplace add undercutsh/firstpass
/plugin install firstpass@firstpass
Every other client — and Claude Code too, if you'd rather skip the plugin — uses the generic installer:
npx skills add undercutsh/firstpass
Or copy skills/firstpass/ into your agent's skills directory by hand.
Every client uses its own directory:
.claude/skills/firstpass/.agents/skills/firstpass/.cursor/skills/firstpass/.github/copilot-instructions.md or AGENTS.mdFull install steps for these plus OpenCode, Gemini CLI, Windsurf, JetBrains
Junie, Amp, Devin, and 24 more clients (Cline, Zed, Warp, Cody, Continue,
Roo Code, Kiro, Void, Trae, Bolt, Factory, Lovable, Qoder, Tabnine, Jules,
JetBrains AI Assistant, Amazon Q Developer, Firebase Studio, Aider,
OpenHands, Kilo Code, Augment Code, Goose, and Replit Agent) —
exact commands, a verify-your-install prompt, and troubleshooting — are in
AGENTS.md → Client install matrix.
For AI coding agents working in this repo: see AGENTS.md
for build/test commands and repo conventions.
For developers looking for an API or MCP server: see
getundercut.sh/developers — a read-only
JSON API (OpenAPI 3.1) and a read-only
MCP server at https://getundercut.sh/mcp serve the data this repo already
publishes (claude mcp add --transport http undercut https://getundercut.sh/mcp).
Neither routes or runs model calls; there is no auth, write endpoint, or SDK.
Optional, for Undercut Pro — cli/: @undercut/cli pairs a
machine with a Pro account and syncs the signed policy file that overrides
models.md. status and logout work today with no network calls;
login and sync are real, tested control flow pointed at a backend that
hasn't shipped yet, and fail with a clear error rather than pretending to
succeed. Not yet published to npm — run it from a clone in the meantime.
Full command reference: getundercut.sh/cli.md
or cli/README.md.
For Claude Code — hooks/: installed with the plugin
(hooks/hooks.json), on by default, one command to turn off. It guarantees
the rubric is in context every session, prints a session-end receipt with
real token/cost data (never a guess), shows a status line, and adds a small
"Routed-With: Undercut" trailer to commits and a one-line footer with a
badge to pull requests. None of it phones home: the ledger, the receipt and
the status line are local files and local output. Turn any piece off with
undercut config <setting> off, or every byline and tip at once with
undercut config branding off — see hooks/README.md
for the full list. Anything you have already configured in
~/.claude/settings.json (attribution, status line, spinner verbs) is left
alone. The core skill works exactly as described above whether or not you
keep any of this. The one byline that reaches our servers is the PR badge
image, which GitHub's viewers fetch from getundercut.sh; see
getundercut.sh/data.
This is policy the orchestrating agent follows at dispatch time. It is not a proxy, and it does not enforce anything at the network layer. It composes with gateways: route first, compress second.
Tier-based subagent routing isn't new. This skill's contribution is the objective escalation loop: measured disagreement instead of self-reported confidence, hysteresis so a run can't thrash between tiers, residue-only escalation with a structured handoff payload, and a calibration feedback loop that turns each run's misses back into rubric edits. Plus — unlike the alternatives — published, reproducible A/B results for whether it works.
cd evals
export OPENROUTER_API_KEY=sk-or-...
node src/main.js --verify-only
node src/main.js --policy probe --seeds 5
node src/main.js --benchmark gsm8k,humaneval --policy probe --seeds 5
node src/main.js --flagtest --policy probe
node src/main.js --compare testing/results/run-a.json testing/results/run-b.json
MIT · founded by Justin Winter · getundercut.sh