A platform lead told a room the AI coding bill was zero. Then someone opened the revert log. Fourteen reverts in eleven working days. That is not a free path. That is an unpriced one.
I keep seeing the same inversion. Finance scores seats and token stickers. Incident review scores hours you cannot get back. Which unit should actually assign the work?
This is a routing guide, not a vendor sermon. I will price three lanes with one equation, fill a labeled example, and show which variable flips the call. The scorecard is a conversation tool. It is not objective truth.
The bad proxy hiding in the standup
Teams still ask, "Is the model free?" That question is incomplete. Free of invoice is not free of review, revert, or context setup.
A token sticker also lies in the other direction. A paid seat can look expensive while it quietly deletes two rollback hours a week. Self-host can look virtuous while it burns a platform engineer on GPU babysitting that never shows up on the AI budget line.
So I stopped asking which tool is cheaper. I ask which workstream belongs on which lane.
Three lanes, one workstream at a time
Do not make a team-wide license call. Route tickets.
- Free lane: zero invoice, shared or hosted-for-you runtime, weakest guarantee that the path will still look the same next quarter.
- Paid lane: invoice you can forecast, vendor on the hook for uptime and policy knobs, still not your metal.
- Self-host lane: you own the runtime, the logs, and the failure. You also own the idle capacity.
A changelog draft and an authz middleware change should not share a lane just because they share a repo. Why would they?
Variable definitions
Write these on the top of the sheet before anyone argues about brands.
| Symbol | Meaning | Unit |
|---|---|---|
R |
Fully loaded cost of one rollback hour (author + reviewer + wait) | currency / hour |
H |
Extra rollback hours this workstream is expected to create per week on that lane | hours / week |
I |
Invoice for that lane, allocated to this workstream | currency / week |
C |
Amortized context and policy setup (rules, allowlists, eval fixtures) | currency / week |
G |
Governance drag (legal, security, procurement) that actually fires | currency / week |
K |
Hard kill switch. If true, cost math does not get a vote | boolean |
Weekly lane cost:
LaneCost = I + R * H + C + G
If K is true, you do not pick the cheapest number. You leave the lane. Secrets, production-adjacent writes without an owner, and unauditable training-data questions are K events in most orgs I advise. Your legal team may add more. They should write them down.
The rollback-hour router
I score each workstream against all three lanes. Lowest LaneCost wins unless a kill switch fires.
Copy this YAML and fill it in the staff meeting, not after the vendor demo.
# proposal: conversation tool, not a benchmark
workstream: billing-api-tests
owner: platform-lead
expires_on: 2026-10-14
r_rollback_hour: 180 # labeled assumption, fully loaded
lanes:
free:
I: 0
H: 3.5
C: 40
G: 0
K: false
paid:
I: 220
H: 1.2
C: 25
G: 30
K: false
self_host:
I: 90 # allocated idle capacity, not cash if already owned
H: 1.0
C: 70
G: 15
K: false
exit:
freeze_free_if: "H_free > 2.0 for 2 consecutive weeks"
rescore_after_tickets: 20
Then run the arithmetic so the argument has a denominator.
# unlabeled brands on purpose. plug in your numbers.
from dataclasses import dataclass
@dataclass
class Lane:
name: str
invoice: float
extra_rollback_h: float
setup: float
governance: float
kill: bool
R = 180.0 # labeled assumption: $/rollback-hour
lanes = [
Lane("free", 0, 3.5, 40, 0, False),
Lane("paid", 220, 1.2, 25, 30, False),
Lane("self_host", 90, 1.0, 70, 15, False),
]
for lane in lanes:
cost = lane.invoice + R * lane.extra_rollback_h + lane.setup + lane.governance
status = "BLOCKED" if lane.kill else f"{cost:.0f}"
print(f"{lane.name:10} LaneCost={status}")
Expected print for the labeled example:
free LaneCost=670
paid LaneCost=491
self_host LaneCost=355
Self-host wins on this sheet. Change R or H and it may not. That is the point.
A filled squad example (labeled, not a customer claim)
Take an eight-person platform squad. Three workstreams. I am not citing a named company. These are working numbers so you can disagree with a digit instead of a vibe.
Assumptions I want challenged: R = $180. Reviewer time is in the number. Calendar time waiting on a broken deploy is not, unless you add it.
-
Release notes and internal runbooks.
H_free = 0.3,I_free = 0,K = false. Free lane cost ≈$54 + setup. Paid cannot win unless setup on free is chaotic. Keep it free. Put a human on the merge. -
Billing API tests that touch fixtures, not secrets.
H_free = 3.5,H_paid = 1.2,I_paid = $220 / weekallocated. From the script above, paid beats free (491vs670). Self-host beats both if you already have idle capacity. If you do not, setI_self_hostto the real weekly carry and re-run. -
Authz middleware.
K = trueon any path you cannot log, restrict, or turn off. Cost math is commentary. Self-host or a paid tenant with a written data path. Not a shared free box.
Notice what I did not do. I did not average the three workstreams into one "AI ROI." Averages hide the kill switch.
Sensitivity: which number reverses you?
Hold everything else still and move one lever.
| Lever | Direction | What flips |
|---|---|---|
R falls from 180 to 50 |
rollback is cheap | billing tests fall back to free (0 + 50*3.5 + 40 = 215 vs paid 220 + 50*1.2 + 55 = 335) |
H_free falls from 3.5 to 1.0 |
reviewers actually catch the mess | free wins on billing tests even at R = 180
|
I_paid jumps because you allocated the whole invoice to one squad |
paid looks toxic | you are doing allocation theater; split I by tickets, not by pride |
| Idle GPUs already exist |
I_self_host near zero |
self-host wins more often, until on-call hours leak into C
|
| Legal says prompts leave the tenant | K = true |
free lane dies regardless of LaneCost
|
If no lever can reverse you, you are not running a model. You are defending a purchase.
Crude telemetry helps you stop guessing H. This is a proxy, not science.
# last 14 days, revert-shaped commits on one service
git log --since="14 days ago" --grep="revert" --oneline -- services/billing-api | wc -l
# optional: minutes between bad merge and revert, if your messages are disciplined
git log --since="14 days ago" --grep="revert" --format="%ct %s" -- services/billing-api
Count is not hours. Multiply by your median revert duration from the incident doc, then divide by two weeks. If you do not have that median, you are not ready to claim the free lane is "working."
Hard gates, owner, expiry, exit
Gates that skip the equation:
- Secrets or customer PII in prompt, repo context, or traces. No free shared runtime.
- Production-adjacent write tools without a named blast-radius owner. No lane at all until the owner exists.
- No merge human. If the path can open a PR, a person still ships it. Automation without a neck is not a lane. It is a leak.
Owner: the platform lead who can freeze a lane without a steering committee. If that person does not exist, you do not have a router. You have a Slack poll.
Expiry: 30 days or 20 tickets, whichever comes first. Write the date in the YAML. An expired score with last quarter's H is fan fiction.
Exit: freeze the free lane for that workstream when H_free beats your break-even for two consecutive weeks, or when a K event fires once. Unfreezing needs a new sheet, not a vibe that "the model got better."
Break-even extra rollback hours for free versus paid:
H_free_break_even = H_paid + (I_paid + C_paid + G_paid - C_free - G_free) / R
Plug the labeled billing-test numbers:
H_free_break_even = 1.2 + (220 + 25 + 30 - 40 - 0) / 180
= 1.2 + 235 / 180
= 2.51 hours/week
If free is adding more than ~2.5 rollback hours a week on that stream, the sticker price of zero has already lost. That threshold moves the moment R moves. Put the formula next to the YAML so people argue the input, not the brand.
Where a free model path still belongs
I do not route every spike to a credit card. Internal docs, throwaway probes, and new-hire sandboxes often lose when you force a paid tenant before anyone knows whether the workflow sticks.
Disclosure: This article was prepared as part of MonkeyCode's product outreach.
MonkeyCode is an open-source project with free model access and a free server option. That pair maps to the free lane in this router: useful when K is false and H is still a guess. It does not map to authz middleware, and I will not pretend a free runtime is a production owner. If you try it, score the workstream in the YAML first. Then look at revert hours, not at whether the chat felt fast.
A free server also fails a different way than a free chat box. Someone still has to patch it, restrict network egress, and decide who can paste logs into the prompt. If that someone is "whoever found the link," C and G are lying on your sheet.
Who should not use this router
Skip it if you are a solo hobbyist. Your R is weekend mood, not payroll.
Skip it if a regulator or a customer contract already names the runtime. The equation will only decorate a decision you are not allowed to make.
Skip it if you cannot name a median revert duration. You would be stuffing H with optimism. That is how "free" paths become silent headcount taxes.
And skip any scorecard that outputs a single company-wide winner. Workstreams do not consent to that average.
What I would challenge on your sheet
Would a 30-point drop in R send billing tests back to free? If yes, your paid lane is a rollback hedge, not a quality religion. Price it that way.
Would one K event — a secret in a prompt, a prod write with no owner — wipe the free lane even when LaneCost looks pretty? It should.
I want the argument on those two questions. Not on whether the token sticker was zero.
Top comments (1)
The 14 reverts in eleven days is the number that matters here.
In pricing theory, an unhedged short position looks free right up until volatility spikes and the borrow fee comes due. That is exactly what an unpriced "free" coding lane is doing to the platform budget. The upfront token invoice is zero, but the engineering team is shorting the rollback distribution. You capture a small convenience dividend on routine boilerplate while underwriting an un-modeled tail risk on developer triage and revert hours.
Setting R at $180 per rollback hour makes that liability explicit. The moment you define H as an expected variance rather than a freak accident, the free lane loses its apparent cost advantage on any high-touch service. Splitting the decision by ticket blast radius rather than buying an org-wide seat license is the only way to keep the denominator honest.