DEV Community

bestbee
bestbee

Posted on

Should a Squad Graduate a Free Coding Path When Review Time Inverts? Use This 5-Field Gate

Forty extra review minutes can erase a zero invoice. I keep seeing that inversion in platform reviews, and it almost never shows up on a pricing page.

Last quarter I sat with an EM who was proud the coding path had no bill. The review queue was two days deep. Agent-shaped PRs were landing faster. Humans were not. So I asked the only question that can reverse a “keep it, it’s free” call: what happens if review minutes per merged change stay inverted for two more sprints?

This is not a buy-the-tool essay. It is a graduation gate. Free hosted models and a free server can be a rational row in the table. They can also become a shadow platform with no owner, no expiry, and a switch cost you will hate later.

The wrong unit is still “free”

Invoice line is a terrible proxy for coding-path cost. A zero invoice hides three cash-like drains: extra review minutes, dual-workflow tax, and the day you must move.

Paid seats can be the wrong unit too. Self-hosting can be the wrong unit if you price hardware and ignore the human who now owns uptime. I want one question on the whiteboard: should this squad keep, graduate, or kill the free coding path?

Keep means the free path stays default for a named scope. Graduate means you move that scope to paid or self-hosted on a date. Kill means you archive the path and write down what you will not do again. Which of those three is actually on your calendar today?

Define five fields before anyone argues

Treat this scorecard as a conversation tool, not objective truth. Fill it with your numbers. If a field is blank, you do not have a decision. You have a vibe.

Field Definition Unit Who measures
Review-minute inversion (RMI) Extra human review minutes per merged PR vs the squad’s baseline for similar diffs minutes / merged PR EM + a rotating reviewer
Secret surface (SS) Whether prompts, repo context, or secrets leave the team’s control boundary inside / mixed / leaves Security + platform
Switch cost (SC) Calendar days to move the same workflow to paid or self-hosted without freezing shipping days Tech lead
Dual-path tax (DPT) Hours per week lost to two coding paths, two prompt styles, two “how we do agents” docs hours / week EM
Owner + expiry (OE) Named human plus a date when keep/graduate/kill is re-decided name + ISO date Director or platform lead

Hard rule: if OE is empty, the path is not free. It is unowned infrastructure.

I score keep vs graduate vs kill with gates, not with a weighted average that pretends precision. Averages hide a single red gate. You already know that from incident reviews. Why would a coding path be different?

Proposed measurement, not a benchmark

Do not invent velocity theater. Pull a small, boring sample. Thirty merged PRs. Two weeks. Label the method as a proposal until you actually run it.

# Proposed measurement — run on YOUR repo; this is not a result set.
# Baseline: human-authored PRs. Treatment: PRs that used the free coding path.
gh pr list --state merged --limit 30 \
  --json number,title,author,createdAt,mergedAt,reviews,labels \
  > /tmp/pr-sample.json

# Then tag each row in a sheet: baseline | free_path
# RMI = median(review_minutes_free) - median(review_minutes_baseline)
Enter fullscreen mode Exit fullscreen mode

Review minutes are not “time to first comment.” Use time from ready-for-review to first approving review, minus known blockers. If you cannot get that from your tool, sit with two reviewers for one standup and reconstruct ten PRs. Ugly beats fake precision.

A tiny ledger keeps the argument honest:

# decision_record.yaml — proposal, unexecuted
question: graduate_free_coding_path
scope: squad_orion_service_repo
baseline_window: 2026-08-25/2026-09-12
fields:
  rmi_minutes: null          # fill from sample
  secret_surface: mixed      # inside | mixed | leaves
  switch_cost_days: 10       # paid vs self-host may differ; pick the real alternative
  dual_path_tax_hours: 3
  owner: "A. Chen, EM"
  expiry: "2026-10-10"
gates:
  secrets_must_stay_inside: true
  named_owner_required: true
  rmi_kill_threshold_minutes: 40
  rmi_streak_sprints: 2
Enter fullscreen mode Exit fullscreen mode

If rmi_minutes stays null, stop the meeting. You are bargaining about a feeling.

Hypothetical: Squad Orion, not a case study

I am not claiming this squad exists. I am filling the tool so you can see the arithmetic. Copy the structure. Replace every number.

Squad Orion: eight engineers, one service repo, one “no invoice” coding path for boilerplate and tests. Baseline review for a similar PR: 25 minutes. Free-path PRs: 70 minutes, because the diffs are wide, the tests are shallow, and reviewers do not trust the agent loop. RMI = 45. Secret surface = mixed (prompts leave the laptop, secrets are supposed to stay). Switch cost to a paid path = 6 days of policy and seat work. Switch cost to self-host = 18 days including on-call. Dual-path tax = 4 hours/week of “which path did you use?” Slack. Owner exists. Expiry is blank.

What does the gate say?

  1. OE fails. No expiry means keep-by-inertia. That is a stop, not a keep.
  2. RMI is 45 against a 40-minute kill line. One sprint is a smell. Two sprints is a graduation trigger.
  3. SS is mixed. If the next SOC questionnaire asks where repo context went, “it was free” is not an answer.
  4. SC is the real comparison. Six days to a paid path vs eighteen to self-host. Free vs paid is not the same decision as free vs self-host. Write both.

Weekly human cost of the inversion, labeled as arithmetic on the hypothetical:

  • 12 merged free-path PRs / week × 45 extra minutes = 9 hours of senior review.
  • Plus 4 hours of dual-path tax = 13 hours / week.
  • At a fully loaded $120/hour (your finance number, not mine), that is $1,560 / week of “free.”

Would you still call it free if the invoice arrived as review load? I wouldn’t. Not past expiry. Not with mixed secret surface.

Sensitivity: which number flips you?

Hold every field still and move one. That is the whole point of a gate.

  • If RMI drops to 12 minutes after you ban agent loops from auth and migrations, keep can survive — with an expiry.
  • If RMI stays at 45 for two sprints, graduate the default path even if the invoice is still zero.
  • If SS becomes “leaves” for a regulated repo, free hosted is out regardless of RMI. That is a hard gate, not a score.
  • If SC to paid is 6 days and SC to self-host is 18, do not let a hardware enthusiast skip the cheaper graduation. Self-host is a product choice, not a moral one.
  • If DPT hits 8 hours/week, you already have two platforms. Pick one default. The second path becomes an expiring exception, not a culture.

Break-even on the hypothetical: extra review minutes × PRs per week = the “free” surplus. At 12 PRs/week, a 40-minute RMI is 8 hours. If your paid alternative’s true add-on (seats, admin, extra process) is less than those 8 hours, graduation wins on P&L even before secrets. If the paid add-on is 15 hours/week of ceremony, keep the free path and fix the review protocol instead. See how fast the answer moves? That is why a single vendor narrative is useless.

Where a free hosted row belongs

You still need a concrete row for “stay on a free hosted path.” Empty rows get filled by whoever is loudest.

Disclosure: This article was prepared as part of MonkeyCode's product outreach. MonkeyCode is an open-source project that currently offers free model access and a free server option. I am using those two availability claims as operator-supplied inputs to the table — not as a TCO conclusion, a benchmark, or a promise about models, quotas, hardware, or how long the offer lasts.

Put that row next to “paid hosted” and “self-host.” Then run SS and SC. A free hosted path is a fit when secret surface can stay inside policy, RMI is measured, a named owner exists, and expiry is on a calendar. It is a poor fit when the squad is already using the path as default infra for anything that can page production.

If you want a free hosted row to score against your own review sample, try MonkeyCode and then fill RMI from your last thirty PRs — not from a landing page.

Hard gates, owner, expiry, exit

Gates are binary. Miss one and you do not “average it out.”

Keep is allowed only if all of these are true:

  • Named owner on the decision record.
  • Expiry ≤ 45 days from today (pick your number; write it).
  • SS is inside, or mixed with a written exception that names the repos that are in and out.
  • RMI is below your kill line, or above it for at most one sprint with a dated fix.
  • Default path is scoped (for example: tests and docs, not auth).

Graduate when:

  • RMI ≥ kill line for two consecutive sprints, or
  • DPT ≥ 6 hours/week, or
  • a paid path’s switch cost is lower than the next two sprints of inverted review.

Kill when:

  • SS is “leaves” on a repo that cannot leave, or
  • no owner will put their name on OE, or
  • the path is the only way anyone knows how to change the service.

Exit criteria should be boring. Archive the prompts. Close the free-path default in the team README. Move the exception list to a gist or an internal RFC with an expiry. Say out loud what happens to in-flight agent sessions on the expiry date. If you cannot describe the Tuesday after expiry, you do not have an exit. You have hope.

Owner is not “platform.” Owner is a person who can stop the path. Expiry is not “when we know more.” Expiry is an ISO date that creates a meeting even if nobody wants it.

Who should not use this approach

Skip this gate if you do not merge through review. There is no RMI without a reviewer. Also skip it if legal already forbids any hosted prompt path; you already have the answer, and a scorecard would be theater.

Do not use a free hosted path as a stealth self-host delay for teams that need an on-call owner tomorrow. Do not use self-host as a purity move when your actual pain is review protocol. And do not run this as a founder-only spreadsheet while the EM who eats the queue is out of the room. The queue is the P&L.

Limitations

This model ignores model quality as a single number because I will not invent win rates. Quality shows up as RMI and as rollback rate. If you have a rollback delta, add a sixth field. If you do not, do not fake one.

The 40-minute kill line is a conversation starter. Finance might want dollars. Security might want a binary SS and nothing else. Good. Bring them into the same document. The failure mode I care about is a squad that keeps a free path because the invoice is quiet while seniors drown in wide diffs.

I also cannot tell you that free model access or a free server will still be there on your expiry date. Price switch cost as if the row can vanish. That is just TCO hygiene.

So here is the question I actually want back: which field would reverse your keep — RMI, secret surface, or switch cost — and what number did you write next to it? If you cannot name the number, you are not deciding. You are hoping the invoice stays zero long enough that the queue feels like someone else’s problem.

Top comments (0)