Undercut for Windsurf
Undercut is a free, MIT-licensed routing policy delivered through AGENTS.md, which Windsurf's Cascade agent reads automatically with zero configuration — cheap tier first, escalate only on evidence, never on a vibe. Windsurf was acquired by Cognition; its docs and product now live under the Devin Desktop umbrella, and its own rules path (.windsurf/rules/) works too. See Install below for exactly what's confirmed and what isn't.
How this maps onto Windsurf
Windsurf was acquired by Cognition, and its documentation now lives under docs.devin.ai, branded as part of Devin Desktop — docs.windsurf.com redirects there. Per that documentation, Windsurf's Cascade agent now prefers workspace rules from .devin/rules/*.md, with .windsurf/rules/*.md and the legacy single-file .windsurfrules kept as fallbacks for backward compatibility. Global rules live at ~/.codeium/windsurf/memories/global_rules.md (capped at 6,000 characters; workspace rules files cap at 12,000). Separately, Cascade also reads a root-level AGENTS.md automatically — documented as location-scoped rules with zero configuration required, which is the most portable of the confirmed paths and doesn't depend on which of the rules-file conventions your workspace already uses.
Windsurf doesn't have a model family of its own the way Claude Code or Codex do — it's a multi-model IDE, wired up to whichever provider(s) you've configured in Cascade's model picker. Undercut's tier names — cheap, standard, frontier, apex — are generic on purpose for exactly this case. models.md gives the rule of thumb rather than a fixed mapping: cheap resolves to the smallest/fastest model you have access to in Cascade, standard to your default work model, frontier to the highest-reasoning model on offer, and apex to a single batched tie-break call on the strongest model available.
Nothing about this sits between Cascade and its model backend. It's a Markdown file Cascade reads at dispatch time — no proxy, no network hop, nothing to route around if you delete the block.
Install for Windsurf
Cascade reads a root-level AGENTS.md automatically, with no rules-file setup required — this is the path we're most confident about, and it doesn't depend on which of Windsurf's own rules conventions your workspace uses.
If you'd rather keep it inside Windsurf's own convention, drop it under .devin/rules/ — the preferred path per current docs since the Devin Desktop rebrand — or the legacy fallback location, .windsurf/rules/. Both are confirmed in Windsurf's documentation.
Want it applied to every workspace instead of one repo? Copy the same content into ~/.codeium/windsurf/memories/global_rules.md — note that file caps out at 6,000 characters (workspace rules files cap at 12,000), so check the raw SKILL.md fits before relying on the global copy.
Update: Cascade has its own Agent Skills path, confirmed. Per Cascade's own skills docs, Windsurf does not share Devin CLI's .devin/skills/ path — it discovers skills from .windsurf/skills/<name>/ (workspace) and ~/.codeium/windsurf/skills/<name>/ (global), plus the cross-agent .agents/skills/ convention. That means cp -r firstpass/skills/firstpass ./.windsurf/skills/firstpass is now a confirmed, direct install path too — AGENTS.md (Option 1) remains the most portable if you're already using it across other tools.
testing/README.md and the raw JSON in testing/results/node src/main.js --mockZero lock-in. It's Markdown text Cascade reads — delete the file or the block 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 on Windsurf specifically, Cascade has its own confirmed skill-discovery path (.windsurf/skills/, distinct from Devin CLI's .devin/skills/ — see Install above), but that's a documented path, not a session we ran ourselves, so treat the live behavior as unverified until tested. Cascade'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. And it doesn't promise a dollar figure for your workload. 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 Cascade is currently doing with mechanical work.