Did your last free agent run on a model? Or did it run on a host? Those are not the same resource. People smash them into one sentence anyway.
I hear this claim all week. "I ran it for free." Free what, exactly? Tokens? A shell? Both? Neither?
This FAQ is a myth check. It is not a product tour. You will leave with a receipt script. You will also leave with a decision table.
Why one transcript hides two meters
A chat UI shows one scrollback. Your brain wants one object. The scrollback still hides two meters.
One meter is the model. It turns prompts into tokens. The other meter is the host. It turns commands into syscalls.
Can you name both meters out loud? If you cannot, you did not test both.
Myth 1: A free model means free compute
People say the model was free. Then they skip the machine. That leap is the whole myth.
A model can answer without exec. A host can exec without a clever model. Mixing them hides the real failure.
Ask this out loud, twice. Did a decoder run at all? Did a kernel run at all?
If you only have a paragraph, you have a story. Price of tokens is not price of CPU. Write both names in the log.
Myth 2: The free host borrowed my laptop PATH
The reply mentions pytest. You have pytest locally. So you relax too fast.
Did the remote PATH contain pytest? Maybe the model remembered your setup. Memory is not an environment.
A remembered command is not an installed binary. I treat PATH as hostile until printed. Print it on the claimed host.
command -v pytest || echo "pytest: missing"
echo "PATH=$PATH"
uname -n
whoami
If those four lines never hit a real shell, you tested a vibe. You did not test a toolchain.
Myth 3: localhost in the reply is your laptop
Agents love the word localhost. It sounds close and safe. It is not geography.
localhost on a free server is that server. localhost on your laptop is your laptop. The string does not travel with you.
If a log says "listening on localhost:8000", stop. Ask which NIC. Ask which pid.
hostname
hostname -I 2>/dev/null || ip -4 addr
ps -o pid,cmd -C python || true
No pid, no bind. A sentence is not a socket. Do you still trust that URL?
Myth 4: The model remembered pip, so the box kept the venv
Chat history is sticky. Disk is not obligated to be. A free server can be a fresh filesystem.
A fresh filesystem does not owe you site-packages. "I already installed django" is a claim about the past.
Which inode held it? Which prefix? Which user? Recap in chat is not a snapshot.
Corrected model: installs live on a host snapshot. Write a marker file. Hash it. If the next session lacks that hash, the box moved.
Myth 5: One successful reply proves both meters
Green text feels like a receipt. It is not. Confident prose is still only text.
You need two independent proofs. Proof A names the model slot you selected. Proof B names the host you bound.
If either proof is missing, stop talking. Do not merge the story into one win.
I sometimes check that split in MonkeyCode. It offers free model access. It also offers a free server option. Disclosure: This article was prepared as part of MonkeyCode's product outreach. I still run the receipt below on whatever host I claim.
The artifact: a two-meter receipt
Do not trust a paragraph. Emit a file. The file must contain a nonce you chose.
The nonce must exist before the model speaks. This is a bind test. It is not a timed benchmark.
I am not quoting latency. I am not quoting a GPU SKU. I am quoting a host you can cat.
Step 0 — mint a nonce on your laptop
# Run this on the machine you sit at.
NONCE="$(openssl rand -hex 16)"
echo "$NONCE" > /tmp/agent-nonce.txt
echo "nonce=$NONCE"
Keep that value. Do not let the model invent it. If the model invents it, the receipt is fan fiction.
Step 1 — copy the nonce into the claimed host
The host must write a receipt that includes your nonce. If it cannot write, it cannot claim disk.
# host_receipt.sh — run inside the claimed server
set -euo pipefail
NONCE="${1:?nonce required}"
OUT="${2:-$PWD/host-receipt.txt}"
{
echo "nonce=$NONCE"
echo "utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "host=$(hostname)"
echo "user=$(whoami)"
echo "pwd=$PWD"
echo "uname=$(uname -srm)"
echo "shell=$SHELL"
echo "python=$(command -v python3 || true)"
echo "node=$(command -v node || true)"
echo "pytest=$(command -v pytest || true)"
echo "git=$(command -v git || true)"
echo "path_head=$(printf '%s' "$PATH" | cut -c1-200)"
} > "$OUT"
if command -v sha256sum >/dev/null; then
sha256sum "$OUT" | tee "$OUT.sha256"
else
shasum -a 256 "$OUT" | tee "$OUT.sha256"
fi
cat "$OUT"
Pass your nonce as argv. Never let the model pick it. Why would you outsource the only secret that proves you?
Step 2 — read the receipt back with cat
cat host-receipt.txt
cat host-receipt.txt.sha256
If cat never runs, you do not have a host. You have a description of a host. Descriptions do not bind ports.
Step 3 — compare against your laptop
echo "laptop_host=$(hostname)"
echo "laptop_user=$(whoami)"
echo "laptop_pwd=$PWD"
diff -u \
<(echo "nonce=$(cat /tmp/agent-nonce.txt)") \
<(grep '^nonce=' host-receipt.txt) || true
Mismatch on hostname is a feature. It means you actually left the laptop. Match on hostname means you never left.
Which result would you rather debug at 2 a.m.?
Decision table
Use this table before you say "it works for free." Tick boxes with files. Do not tick boxes with feelings.
| Chat claim | Proof that counts | If you only have prose |
|---|---|---|
| I used a free model | The selected model slot is in the UI or log | You used a vibe |
| I used a free server | Receipt hostname is not your laptop hostname | You used your laptop |
| The command ran | Receipt file contains your nonce | The model narrated |
| pytest existed |
command -v pytest line in the receipt |
PATH bleed |
| localhost was mine | pid plus host address on that box | Word games |
| The venv survived | Same nonce file still hashes | Chat memory |
| Both meters were free | You named both resources in writing | One word did too much work |
Print the table. Fill it once per session. Then you can argue with evidence.
A tiny pytest that refuses a missing receipt
This test does not grade the model. It grades your bind story. Label it as a local check you run after the receipt exists.
# test_host_receipt.py
from pathlib import Path
import os
RECEIPT = Path("host-receipt.txt")
NONCE_ENV = "AGENT_NONCE"
def test_receipt_exists():
assert RECEIPT.is_file(), "no host receipt on disk"
def test_nonce_matches_operator():
expected = os.environ.get(NONCE_ENV, "")
assert expected, "set AGENT_NONCE from your laptop"
text = RECEIPT.read_text(encoding="utf-8")
assert f"nonce={expected}" in text
def test_host_field_is_not_empty():
lines = RECEIPT.read_text(encoding="utf-8").splitlines()
host_lines = [ln for ln in lines if ln.startswith("host=")]
assert host_lines, "host= missing"
value = host_lines[0].split("=", 1)[1].strip()
assert value, "host= empty"
assert value.lower() not in {"localhost", "unknown"}
Run it like this:
export AGENT_NONCE="$(cat /tmp/agent-nonce.txt)"
pytest -q test_host_receipt.py
A passing test still does not prove model quality. It only proves you bound a host. It also proves you kept a nonce.
What this does not prove
This workflow is rude on purpose. It is also narrow. Do not stretch it into a platform claim.
- It does not score model answers.
- It does not measure latency or tokens.
- It does not certify multi-tenant isolation.
- It does not freeze a free server forever.
- It does not replace production change control.
Clocks can lie if you do not control the box. Hostnames can be spoofed in a joke VM. A receipt is evidence, not a court.
I am not claiming a quota. I am not naming a GPU. I am not inventing a hardware SKU. Those details change. The two-meter split does not.
Who should not use this approach
Skip this if you already have attested runners. Skip this if policy forbids unknown free hosts. Skip this if you need signed vendor provenance.
Also skip this for secret material. A free server is still a server. Do not paste production keys into a receipt.
Do not echo AWS_SECRET_ACCESS_KEY "just to check." If you cannot tolerate a host disappearing, do not build on unlabeled free compute. Use a machine you can name in an incident doc.
The mental model I actually want
Stop saying "I ran it for free." Say a pair instead.
"I selected this model slot. I bound this hostname." Two sentences. Two files. Then you can debug without folklore.
Did the decoder fail? Look at the prompt and the slot. Did the syscall fail? Look at the receipt and the kernel.
If your FAQ answer cannot point at a hostname, you mixed the meters. Mix less.
If you run the receipt on a free model plus a free server, paste the hostname mismatch. Do not paste a screenshot of green text.
Top comments (0)