Undercut for Devin
Undercut is a free, MIT-licensed policy file Devin (CLI or Desktop) follows as an Agent Skill — cheap tier first, escalate only on evidence, never on a vibe. Devin has no built-in cost dial of its own to compare against; this exists because the same overpay-by-default pattern we measured elsewhere in the agent ecosystem (see the Claude Code page) shows up anywhere an agent defaults every task to its strongest model.
How this maps onto Devin
Devin CLI and Desktop support Agent Skills at .devin/skills/<name>/SKILL.md (project-scoped) or a user-level directory — ~/.config/devin/skills/ on macOS/Linux, %APPDATA%\devin\skills\ on Windows — per Devin's own skills docs. Devin also reads a root AGENTS.md automatically and treats it as always-on; Devin's docs specifically recommend Skills over piling everything into Rules for anything task-conditional, which a routing policy is. That makes Agent Skills the closer fit for Undercut — see Install below for the exact path.
Per Devin's own rules docs, Devin also auto-reads CLAUDE.md, the legacy .windsurfrules file, and — for cross-tool compatibility — .cursor/rules/*.md, .windsurf/rules/*.md, and .claude/ directory files if present in the repo. So if you've already put the policy in front of Claude Code, Cursor, or Windsurf in the same repo, Devin may pick it up with nothing extra installed. Worth checking before you add a second copy.
Undercut's tier names — cheap, standard, frontier, apex — stay generic on purpose. Devin runs its own orchestration across a set of underlying models rather than exposing one vendor's fixed lineup the way a single-model host does, so models.md gives a rule of thumb here rather than a fixed mapping: cheap resolves to the fastest/lightest path Devin has available, standard to its default working behavior, frontier to the highest-reasoning path, and apex to a single batched tie-break call. Nothing here sits between Devin and its model backend — it's a skill Devin reads at dispatch time, no proxy, no network hop.
Install for Devin
Clone or download undercutsh/firstpass, then copy skills/firstpass/ into .devin/skills/firstpass/ at the project root — the folder Devin's own docs list for project-scoped Agent Skills.
Devin also reads a user-level skills directory, so it doesn't need to live in each project: ~/.config/devin/skills/ on macOS/Linux, %APPDATA%\devin\skills\ on Windows.
Already have it for Claude Code or Cursor? Devin auto-reads CLAUDE.md, the legacy .windsurfrules file, .cursor/rules/*.md, .windsurf/rules/*.md, and .claude/ directory files if any are present in the repo, per Devin's own docs. If one of those already carries the policy, Devin may pick it up with nothing extra installed — check before adding a second copy under .devin/skills/.
testing/README.md and the raw JSON in testing/results/node src/main.js --mockZero lock-in. It's a policy Devin follows — remove the skill and you're back to status quo.
How it works
The Undercut Rubric · v1This is a named, versioned spec — not internal logic we could quietly change. When the rubric changes (a new flag, a different cap), the version number moves and the changelog says why.
Every unit of work gets scored against six flags, then assigned the cheapest tier that can plausibly handle it. It only moves up a tier when something objective proves it needs to — a failed check, a measured disagreement, an explicit uncertainty flag. It never moves up on a guess, and it never moves back down mid-task.
0 flags → cheap · 1–2 → standard · 3+ or any ownership/judgment call → frontier. Apex only when you can write one sentence stating why the marginal intelligence pays for the cost.
Cheap-to-verify ⇒ cheap-to-generate. If output can be checked mechanically, it starts at the lowest tier regardless of how hard it looks — verification catches failure. Only unverifiable work needs to start high.
The next tier up gets only the failed or uncertain items, plus verification notes. It resolves the residue — it never redoes the batch.
Never de-escalate mid-task. Max one retry per tier. Anything still unresolved goes to a single batched apex tie-break call. One hard file in a 700-file job doesn't drag the other 699 up a tier.
unit of work
|
6-flag rubric
|
+---+----+
| 0 flags|--> cheap
| 1-2 |--> standard
| 3+/own |--> frontier
+---+----+
| fail x2 / disagree / uncertain
v
escalate +1 tier
(residue only)
|
still unresolved?
v
single batched
apex tie-break
Why it holds up
Even when the rubric flags are scored imperfectly, the escalator still routes work to the right tier almost every time — because a wrong flag only ever costs one extra cheap attempt, never a wrong answer or a big bill.
A stock dispatcher model reproduces the rubric flags imperfectly — Haiku hits 90% agreement, Sonnet 93%. The weakest flag (format-strict) is only 60%. None of that matters: under the shipped policy, both dispatchers still route 100% of units to the correct tier. A wrong flag changes the ladder cap, never the base tier — worst case, one extra cheap attempt.
Every rule is a property of the unit of work — verifiable, ambiguous, blast-radius — never a specific model's known weakness. Vendor cards go stale as models change; work properties don't. It's also hard-won — a format-strict rule that worked on Anthropic backfired on Gemini, which is exactly why the rubric no longer encodes per-vendor behavior.
Honest limits
Not a proxy, not a gateway, doesn't auto-flag in production — and Devin's own reliability at scoring the flags hasn't been separately measured the way Claude Code's has (see above); treat that as unverified until tested. Doesn't promise a dollar figure for your workload, and the AGENTS.md/CLAUDE.md auto-pickup described above is documented behavior we haven't independently confirmed end-to-end. Full list of general limits, with the finance/procurement note and the paid-tier disclosure, is on the main page.
Nothing about this page expires. What does keep happening is the token bill, one session at a time, on whatever Devin is currently doing with mechanical work.