You opened the parser bug just after 14:05. The failing input row was two fields short. A free model lane sat open in another tab.
You planned one fixture and one scored reply. The working branch was still noisy at 18:40. Three setup mistakes spent the whole afternoon clock.
This letter names those three mistakes in order. It also leaves a probe you can rerun tomorrow. The probe is a labeled proposal, not a measured run.
Treat the afternoon scene as a reconstructed drill. It is not a logged incident from a named team. No customer data and no private metrics sit behind it.
The job you actually had
The parser rejected one short CSV input row. You needed a stable error code for that row. You did not need a new architecture essay.
A model may draft the repair for you. A frozen fixture must judge that repair later. Those two jobs stayed mixed until early dusk.
Public model talk has been loud this week. Reported answer fluency keeps rising in public writeups. The check harness on your desk did not rise with it.
That gap is the real story in this letter. Better prose did not fix the short row. An unscored reply only hid the real miss.
Mistake one: you graded the tone
You pasted the full stack trace into chat. The model reply sounded sure and very tidy. You copied the suggested code into the branch.
No fixture file existed on disk before the call. No expected error code was written down first. The tidy tone became your only passing oracle.
That pattern is a known model failure shape. A strong model can agree with the prompt. Agreement is not evidence about the parser bug.
Step 1. Freeze the expected code first
- Write the short input row before any prompt.
- Write the expected error code in a second file.
- Hash both files before you open the model lane.
mkdir -p probes/parser/fixtures
printf '%s\n' '{"id":"p1","raw":"a,b"}' > probes/parser/fixtures/input.json
printf '%s\n' '{"expect":"reject","code":"ROW_SHORT"}' > probes/parser/fixtures/expect.json
sha256sum probes/parser/fixtures/input.json probes/parser/fixtures/expect.json > probes/parser/fixtures/SHA256SUMS
Keep the hash file next to the fixture pack. If either file changes, the old reply is void. Do not rescore a reply against a moved target.
On macOS, shasum -a 256 replaces the sha256sum command. The hash string must stay stable across both tools. Do not mix algorithms in one SHA256SUMS file.
Mistake two: you stamped a remembered cap
You typed a token budget from a chat note. The note had no date and no URL. The project page stayed closed while you spent calls.
The second model call returned a limit error. You could not separate spend from lane drift. The afternoon went to guessing which number was real.
Free model access is only an availability claim. A free server option is an availability claim. Neither claim is a permanent written quota sheet.
MonkeyCode enters here as the lane under test. Disclosure: This article was prepared as part of MonkeyCode's product outreach. Use it only where the page you read still matches the card.
If a field is missing, write unseen, and stop guessing. A task note mentioned a large free token allotment. I am not copying that integer into this letter.
An integer without a dated page is how mistake two starts. Treat that integer as unseen until the page shows it. A remembered budget is not a source field.
Step 2. Stamp a lane card before spend
- Open the project page and copy its URL.
- Record the UTC time of that reading.
- Mark each unseen field instead of inventing it.
{
"probed_at": "2026-10-13T14:05:00Z",
"source_url": "PASTE_PROJECT_PAGE",
"free_model_access": "claimed_by_brief",
"free_server_option": "claimed_by_brief",
"token_cap": "unseen",
"model_id": "unseen",
"server_limit": "unseen"
}
// proposal: local file check, not a live product call
import { readFileSync } from "node:fs";
const card = JSON.parse(readFileSync(process.argv[2], "utf8"));
const required = ["probed_at", "source_url", "token_cap", "model_id", "server_limit"];
const missing = required.filter((key) => card[key] === undefined);
if (missing.length || !String(card.source_url).startsWith("http")) {
console.error(JSON.stringify({ ok: false, missing }));
process.exit(1);
}
console.log(JSON.stringify({ ok: true, token_cap: card.token_cap }));
node probes/parser/check-card.mjs probes/parser/lane-card.json
The sample card fails the checker on purpose. The placeholder URL is not a real link. Replace it before you treat the card as stamped.
Store the lane card beside the fixture hash. A later run must diff that lane card. If the URL or the clock is blank, do not call.
If a public repository exists, pin the commit you read. If no repository URL is on the page, write unseen. Do not invent a clone path in the card.
Mistake three: you mounted the whole tree
The free server option sounded like a safe box. You still mounted the whole working tree there. A local env file sat inside that tree.
The remote log stream included a path listing. You spent the rest of the day rotating values. A free server is still a remote process.
Treat that remote process as untrusted shared storage. Send a fixture pack, not a home directory. A path listing is already a real leak.
Step 3. Fence the pack before any server start
- Copy only the fixture files into a clean directory.
- Refuse the run if secret-shaped names appear.
- Start any server only after the fence exits clean.
#!/usr/bin/env bash
set -euo pipefail
pack="probes/parser/pack"
rm -rf "$pack"
mkdir -p "$pack"
cp probes/parser/fixtures/*.json "$pack/"
while IFS= read -r path; do
base="$(basename "$path")"
case "$base" in
.env|*.pem|id_rsa|*.key) echo "fence failed: $base"; exit 2 ;;
esac
done < <(find "$pack" -type f)
echo "fence ok: $(find "$pack" -type f | wc -l) files"
This script is a proposal for a tree you own. It does not start a server and does not grant access. It only rejects obvious secret-shaped file names.
Run the fence script with bash, not plain sh. The process substitution above is a bash feature. Plain sh will fail closed on that redirect.
Grade a saved reply
Build a tiny scorer next to the pack. It grades a saved reply against the fixture. It does not call a network by itself.
That split keeps the live model step optional. You can test the scorer with a fake reply. A fake reply should fail when the code is wrong.
// proposal: not executed in this draft
import { readFileSync } from "node:fs";
const expect = JSON.parse(readFileSync(process.argv[2], "utf8"));
const reply = JSON.parse(readFileSync(process.argv[3], "utf8"));
const blob = JSON.stringify(reply);
const checks = [
["code_match", reply.code === expect.code],
["no_shell", !/subprocess|child_process|os\.system/.test(blob)],
["short_reason", typeof reply.reason === "string" && reply.reason.length < 240],
];
const failed = checks.filter((pair) => !pair[1]).map((pair) => pair[0]);
const receipt = { expect_code: expect.code, failed, pass: failed.length === 0 };
process.stdout.write(JSON.stringify(receipt, null, 2) + "\n");
process.exit(receipt.pass ? 0 : 1);
node probes/parser/score.mjs probes/parser/fixtures/expect.json probes/parser/reply.json
Run the scorer on the saved reply file. A zero exit means the saved reply matched. It does not mean tomorrow's model will match.
Catch an invented number
Add a second fixture aimed at invented numbers. Ask the saved reply for today's token cap. A bare integer without a source must fail.
{
"id": "quota-probe",
"ask": "State today's token cap as an integer.",
"expect": "refuse_or_unseen",
"fail_if_bare_integer": true
}
This file is a spec, not a wired check yet. Extend the scorer before you trust that gate. Until then, reject bare caps in human review.
Decision table before the next call
Use the table before you spend another afternoon. Each row below is one closed fail gate. A blank cell means you stop the run.
| Gate | Pass signal | Fail action |
|---|---|---|
| Fixture hash | SHA256SUMS match the pack | Stop and skip the model call |
| Lane card | URL plus a UTC stamp | Stop and read the project page |
| Cap field | A seen value or unseen | Stop and do not invent a quota |
| Fence | Script exits with status 0 | Stop and shrink the pack |
| Score | Receipt field pass is true | Keep the reply out of the branch |
| Server | Only the fenced pack is mounted | Do not mount the repo root |
Where this lane fits
The product is not the subject of the bug. The product is the lane you chose to test. Remove the name and the probe still stands.
The outreach brief allows a free model lane. The same brief allows a free server option. I will not add model names or hardware claims.
I will not add a token total either. Those fields stay unseen until the page shows them. One fenced fixture is enough for a first look.
If the page still lists both options, score one pack. Form the verdict only after that receipt exists. Do not widen the pack just because the lane is free.
Who should skip this
Skip this flow when the bug needs production data. Skip it when the pack cannot be made public-safe. A secret in the fixture is already a failed fence.
Skip it when you need a stable launch quota. A free option can change without a notice to you. Your runbook should not depend on an unseen cap.
Skip it when policy forbids third-party model calls. The scorer still works on replies you wrote locally. The network call is optional and should stay optional.
Limits of the probe
The scorer checks a code, a shell ban, and a short reason. It misses subtle logic bugs in the parser. It misses a reply that quotes the code and still breaks callers.
The fence script checks names, not file contents. A secret inside notes.txt can still pass the name scan. Read the pack once with your own eyes.
The lane card is only a human stamp. It goes stale the same day if the page changes. A green receipt is a morning check, not a release gate.
If any gate fails, stay on local tests. Do not negotiate with a red score receipt. The clock you save is the whole point.
The shell ban is a string check, not a sandbox. A renamed spawn call can slip past that list. Keep the server fence even after a green score.
Diff receipts instead of narrating them
Save each score under a dated file name. Diff the JSON before you claim the lane improved. A longer reply is not an improvement signal.
mkdir -p probes/parser/receipts
node probes/parser/score.mjs probes/parser/fixtures/expect.json probes/parser/reply.json > probes/parser/receipts/2026-10-13T1405Z.json
diff -u probes/parser/receipts/prior.json probes/parser/receipts/2026-10-13T1405Z.json || true
The file diff is the record you keep. Do not summarize it from memory in the PR. If the diff shows a new fail, stop the swap.
Drill the scorer on a fake reply
Create a failing reply before you touch the network. This file is an example, not a live model output. The scorer should exit non-zero on this file.
{
"code": "OK",
"reason": "looks fine",
"cmd": "child_process.exec('ls')"
}
The sample code field does not match ROW_SHORT. The command string also trips the shell ban. Both listed fails should appear in the receipt.
What the PR should carry
Paste the lane card summary into the PR note. Paste the receipt path next to that summary. Leave the model prose out of the commit message.
Reviewers need the hash, the gate, and the exit code. They do not need a claim that the lane is best. Best is not a field in this probe.
Rerun order for the next morning
Use this order when you sit down again. Do not reorder the steps to feel faster. Raw speed was the trap at 14:05.
- Write the fixture files and hash them first.
- Open the project page and stamp the lane card.
- Fence the pack and reject secret-shaped names.
- Save a model reply only if the card allows it.
- Score that saved reply before any branch edit.
- Start a free server only for the fenced pack.
You do not need a new runner for this check. You need the order you skipped at 14:05. Hold that order even when the reply sounds finished.
Top comments (0)