A while back I wrote about running a two-hour fit test before letting an AI coding model anywhere near a real codebase. That article was about selection. This one is about what happens after: once you've accepted that AI assistance is part of your day, how do you stop it from quietly becoming the most expensive and least audited part of your workflow?
The failure mode I kept hitting wasn't bad code. It was using one model, one tool, one level of trust for everything — asking a top-tier model to rename variables, and then, worse, trusting a fast model to sketch a migration plan. Both mistakes have the same root: no separation between volume work and judgment work.
So I split my AI usage into two lanes, and it's held up well enough to be worth writing down.
The two lanes
Lane 1 — Volume. High-frequency, low-blast-radius tasks where a wrong answer costs me thirty seconds, not a deploy:
- Generating boilerplate test scaffolding (not the assertions — the skeleton)
- Drafting docstrings and type annotations for already-working code
- Rephrasing error messages and log lines
- "Explain this regex / this stack trace / this config block"
- First-pass refactor suggestions I will read, not apply blindly
Lane 2 — Judgment. Low-frequency, high-blast-radius tasks where being confidently wrong is the actual risk:
- Schema and migration design
- Anything touching auth, payments, or data deletion
- Concurrency and caching decisions
- Final review of anything Lane 1 produced that survives into a PR
The economic insight is boring but real: Lane 1 is 80–90% of my prompts and near-zero of my risk. Lane 2 is the opposite. Paying Lane 2 prices for Lane 1 traffic — in money, latency, or rate limits — is just a budgeting bug.
Where free tiers actually fit
This is where free model access stopped being a curiosity and became infrastructure for me. Disclosure: This article was prepared as part of MonkeyCode's product outreach. MonkeyCode currently offers free access to coding models plus a free server option, which is exactly the shape Lane 1 needs: something I can hammer with mechanical requests all day without watching a meter, and somewhere to run the small routing harness below without provisioning anything.
I want to be precise about what I am not claiming: I haven't benchmarked their models against paid alternatives, I don't know the quotas or how long the free tier lasts, and I wouldn't build anything business-critical on a free tier without an exit plan. Free tiers change. Design for that.
But for Lane 1, the bar isn't "best model available." The bar is "good enough that my verification step is cheap." Which brings me to the artifact.
The artifact: a prompt router plus a verification gate
The whole system is two pieces. First, a routing script that classifies a request and sends Lane 1 work to the free tier, Lane 2 work to whatever strong tool you trust (local model, paid API, or just your own brain with a rubber duck):
#!/usr/bin/env python3
"""lane_router.py — route AI coding requests by blast radius, not by habit."""
import sys
# Judgment keywords: presence of ANY of these forces Lane 2.
# Tune this list for your codebase. Mine grew after every incident.
JUDGMENT_TRIGGERS = [
"migration", "schema", "auth", "token", "password", "payment",
"delete", "drop", "cache", "lock", "race", "transaction",
"permission", "encrypt", "production", "rollback",
]
# Volume tasks that are safe to delegate when verification is cheap.
VOLUME_VERBS = [
"explain", "rename", "docstring", "annotate", "scaffold",
"rephrase", "summarize", "draft tests for",
]
def classify(request: str) -> str:
r = request.lower()
if any(t in r for t in JUDGMENT_TRIGGERS):
return "lane2"
if any(v in r for v in VOLUME_VERBS):
return "lane1"
return "lane2" # default: distrust the unknown
def main():
request = " ".join(sys.argv[1:]) or input("Request: ")
lane = classify(request)
if lane == "lane1":
print("LANE 1 → free-tier model, then run verification gate")
# e.g. POST to your MonkeyCode free-server endpoint here
else:
print("LANE 2 → strong model / manual design, mandatory human review")
if __name__ == "__main__":
main()
Yes, keyword matching is crude. That's a feature: it's transparent, it fails toward Lane 2, and I can read my own routing logic in ten seconds. A fancier classifier would just move the trust problem up one level.
Second, the verification gate — the checklist every Lane 1 output passes before it touches a file. This is what makes free models viable: you assume the output is wrong and price in the check.
VERIFICATION GATE (Lane 1 output, ~60–90 seconds)
[ ] Compiles / parses / lints clean
[ ] No imports, APIs, or flags I don't recognize (hallucination check)
[ ] No file paths outside the ones I named
[ ] Behavior matches my one-sentence expectation — I re-read MY prompt,
not the model's explanation of what it did
[ ] If it's a test scaffold: it fails when the feature is absent
[ ] Diff is small enough that I'd review it even from a human
That last checkbox is the real rule. If a model's diff is too big to review, the task wasn't Lane 1, no matter what the router said.
The decision table
For people who prefer the compressed version:
| Task type | Lane | Model tier | Verification cost | Wrong-answer cost |
|---|---|---|---|---|
| Docstrings, renames, explanations | 1 | Free tier | Seconds | Seconds |
| Test scaffolding, boilerplate | 1 | Free tier | ~1 min (gate) | One test run |
| Refactor suggestions (read-only) | 1 | Free tier | Reading time | Zero if unapplied |
| Business logic with edge cases | 2 | Strongest available | Full review | A bug report |
| Schema, auth, concurrency, deletions | 2 | Strongest + human design | Review + staging | An incident |
Where this breaks down
Honest limitations, because I'd want them:
- The gate only works if you actually run it. The day you start pasting Lane 1 output without the 60-second check, you have a one-lane workflow with extra steps. This is a discipline system, not a technical one.
- Free tiers are a moving target. Quotas tighten, models get swapped, services sunset. My router has the endpoint in one config line for a reason. If your workflow dies when a free tier changes, you built a dependency, not a workflow.
- Some people shouldn't split lanes at all. If you're early enough in your career that you can't yet tell a plausible wrong answer from a right one, Lane 1 is dangerous — it generates exactly the plausible-wrong artifacts that teach bad habits. Do Lane 2 work manually first; add AI volume later. Similarly, if your repo has no fast test/lint loop, verification isn't cheap, and the whole economic argument collapses.
- Classification errors happen in both directions. I've caught myself asking the free tier a question that turned out to be a design question mid-conversation. The fix is unglamorous: notice, stop, re-ask in Lane 2.
What changed after a few weeks
The measurable difference wasn't code quality — that stayed roughly the same, which is itself the point. What changed: my paid-tool usage dropped to a fraction of what it was, my prompt latency on mechanical tasks went down, and — the part I didn't predict — my review discipline improved, because the gate gave each AI artifact a defined moment of skepticism instead of a vague ambient trust.
If you want to try it, the smallest possible start is: pick one free option (the MonkeyCode free models and server are one; there are others), run only docstring and explanation tasks through it for a week with the checklist above, and watch where the verification gate catches things. That catch rate — not vibes, not benchmarks — is what tells you whether the lane split earns its place in your setup.
Top comments (0)