cd /news/developer-tools/is-the-spec-optional-if-the-model-is… · home topics developer-tools article
[ARTICLE · art-122336] src=dev.to ↗ pub= topic=developer-tools verified=true sentiment=· neutral

Is the Spec Optional If the Model Is Free?

A developer argues that free coding models and remote servers do not eliminate the need for specifications and tests. The post warns that free compute does not purchase a behavioral contract and that retrying agents until code compiles is not proof of correctness. It recommends committing failing tests before agent runs and using git bundles to preserve work from ephemeral hosts.

read8 min views1 publishedSep 7, 2026

Is the spec optional if the model is free? I keep seeing that assumption in pull requests.

A free coding model shows up in the workflow. A free remote server shows up beside it. Then people drop the checklist without a fight.

Why write a failing test for a cheap loop? Just rerun the agent until something compiles, right? That mental model is quietly expensive for teams.

Free compute does not purchase a behavioral contract. It only purchases another place to be wrong. This FAQ names five claims I still hear.

Each entry has the claim, the evidence, and a corrected model. Then I attach a small artifact you can run. None of this needs paid quotas I will not invent.

You already ship product patches with coding agents. You also distrust a fluent chat transcript from agents. You want a workflow that survives a free box vanishing.

Skip this path if you need a hard SLA. Skip it if the box will hold production secrets. Skip it if "works on the agent host" is the release bar.

I am talking about a narrow, boring stack. You can call a coding model without a purchase. You can use a remote server without a purchase.

I use MonkeyCode when I want that pairing in one place. Disclosure: This article was prepared as part of MonkeyCode's product outreach.

I will not name models, hardware, or duration. Those details move, and the myths do not. The method still works on a laptop you already own.

The free box is optional in every step below. The spec is not optional in any step.

It's free, so I can loop until the tree compiles.

Compilation is not behavior, and it never was. A green compiler can still ship the wrong function. Retrying a prompt does not freeze an oracle for later.

Did that extra retry actually get cheaper for you? The sample got cheaper, but no assertion appeared.

The failing test is the spec you keep. The agent is a patch generator you distrust. Free retries stay cheap samples, not proofs.

Do this before you open any model tab.

def test_parse_window_rejects_empty_frame():
    from parser import parse_window
    try:
        parse_window(b"")
    except ValueError as exc:
        assert "empty frame" in str(exc)
        return
    raise AssertionError("empty frame must raise ValueError")

Run it and watch it fail on purpose. Then commit that failure before the agent starts.

python -m pytest test_spec.py -q
git add test_spec.py
git commit -m "test: empty frame must raise"

Did the agent finish in some chat bubble? Ask pytest instead of trusting that chat bubble. The free loop can continue all night long. The spec does not move because the loop is cheap.

Leave the files on the box because I will remember.

Free servers go away without a memorial service. Scratch disks get recycled between those quiet sessions. Your memory is not a replica of /tmp.

If the only copy lives remotely, you lost the patch. You only have a rumor with a hostname.

Git remains the notebook you can actually replay. The box is a scratch filesystem you can lose. Treat every useful byte as untrusted at first. It becomes trusted on a remote you control.

git status --short
git diff --stat
git rev-parse --short HEAD

Copy the branch off the box before you close anything.

git bundle create /tmp/work.bundle HEAD main

What survives a reboot of a free host? Your /tmp tree will not survive that reboot. The model's rolling context window dies too. A bundle on your laptop might still survive.

The box is throwaway, so a local .env is fine.

Throwaway for you is still a disk for someone. Agents still read files you forgot were present. Shell logs capture export lines you pasted in a hurry.

Is free really a synonym for private here? Free is not a synonym for private here. A recycled disk is not a shredder with a certificate.

The blast radius matches any other developer host. A free host is still a host with a filesystem. If the token cannot live in CI logs, it cannot live here either.

if git ls-files | grep -E '(^|/)\.env$|\.pem$|id_rsa'; then
  echo "refusing to start agent; secret files are tracked"
  exit 1
fi

Also scan the prompt you are about to send. Did you paste a token just this once? Then the transcript is now a secret store.

Rotate that token and do not debate the transcript. The model will not unremember it for you.

The box is disposable, so why pin Python at all?

Your CI runners are not disposable in the same way. Your laptop is not disposable in that way either. An unpinned python3 on the free server is a different interpreter tomorrow morning.

The agent fixed a world that will not exist at merge time. That souvenir is not a fix at merge.

Pin the world the test will actually meet. The box may be free to discard later. The language version is not a vibe you negotiate later.

Capture this every session beside the branch. Keep the fingerprint file next to that branch.

#!/usr/bin/env bash
set -euo pipefail
{
  printf 'utc=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
  printf 'kernel=%s\n' "$(uname -srm)"
  command -v python3 >/dev/null && python3 - <<'PY'
import sys, platform
print(f"python={sys.version.split()[0]}")
print(f"impl={platform.python_implementation()}")
PY
  command -v node >/dev/null && printf 'node=%s\n' "$(node -v)"
  command -v go >/dev/null && printf 'go=%s\n' "$(go env GOVERSION 2>/dev/null || true)"
  git rev-parse HEAD >/dev/null 2>&1 && printf 'head=%s\n' "$(git rev-parse HEAD)"
} | tee env.fingerprint

Compare fingerprints across runs before any merge. If Python moved, the patch is a different patch. Do not merge on vibes from a dead box.

I can reconstruct this later from the saved prompt.

Free model routing changes without sending you a calendar invite. Hidden system prompts change on you without warning. Your cached context is gone when the tab closes.

Is a saved prompt really a build input? A prompt is a wish that has syntax. Wishes like that do not replay later.

Replay is a test plus a patch in git. It is not a prompt file in Downloads. If you cannot git checkout the result, you cannot replay the result.

git checkout -B replay/check
python -m pytest test_spec.py -q
git revert --no-edit HEAD
python -m pytest test_spec.py -q

Are you still tempted to archive the chat? Save it as notes inside the ticket only. Never treat it as the artifact that ships.

Question If yes If no
Is there a failing test first? Let the agent patch Write the test
Can I copy the git bundle off-box? Use the free server Stay local
Are secrets in the tree? Stop the session Continue
Does env.fingerprint match CI? Merge candidate Re-pin, then re-run
Can pytest replay without the model? Keep the patch Discard the session

Read it top to bottom on every run. The free stack is a maybe, not a default. The table is the gate that does not care about price.

Here is the exact loop I want used. Treat it as a proposal, not a benchmark.

env.fingerprint now. That is eight steps with no paid model required. That is eight steps with no paid server required. All eight still require a spec you wrote first.

Where does the free stack help in practice? Steps four and five get cheaper to sample. You can throw many more patches away now. You should throw most of those patches away.

This FAQ is not a performance study of vendors. I did not time models against each other. I did not rank free servers as hardware.

Free access can vanish between two quiet mornings. Free servers can reset without a useful diff. Fingerprints can match while behavior still drifts under you.

Tests can be wrong in a confident voice. Agents can cheat tests you wrote too narrowly. A green pytest run is still necessary here. It is not sufficient for production traffic.

Do not use this approach for these cases:

git status as optional ceremony If your org forbids remote developer boxes, stay on the laptop. The five myths still apply there. Price was never the real bug.

Steal the order, not another vendor slogan. Keep this order: test, fingerprint, guard, patch, replay. Do not start with prompt, hope, and another free retry.

Is the spec optional if the model is free? The spec was never optional for this work. The price of the model never paid for the oracle.

Run the table on a free box this week. Then tell me which row failed first. I care about that failing row most. I do not care which logo sat on the box.

── more in #developer-tools 4 stories · sorted by recency
── more on @monkeycode 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/is-the-spec-optional…] indexed:0 read:8min 2026-09-07 ·