Back to News & Insights
JavaScript September 22, 2026 · 6 min read

The Senior Parked Staging After the Model Invented /v2/purge

The pairing room had one shared terminal and a blue sticky note on the bezel: no staging writes. The...

The Senior Parked Staging After the Model Invented /v2/purge

The pairing room had one shared terminal and a blue sticky note on the bezel: no staging writes. The junior had already pasted a coding-assistant transcript. It claimed the generated client would exercise billing the way production does.

The senior did not open the client. The senior opened the transcript and counted HTTP verbs. Four GET lines. One DELETE. Nobody had typed DELETE into the prompt.

That was the session. Not a model bake-off. A decision about who is allowed to dial a network.

The note below is a reconstructed pairing log, not a named-tenant postmortem. Paths are fixtures. No production host is quoted as live.

The team needed a replayable check that a billing client still spoke a known API. The check had to fail in CI when a path vanished. It did not need to generate load. It did not need to discover endpoints.

The junior treated the assistant as a live caller. The senior treated it as a text generator that sometimes emits HTTP.

Those are different jobs. Mixing them is how a pairing session burns a staging tenant.

The senior spoke in a flat list. The junior typed answers under each line. Which host the cassette is allowed to touch. Which verbs exist in the production client today. Whether any call mutates, even behind an idempotency key. What the assistant may invent: bodies, paths, or neither. Where the dry-run runs, and who owns the logs.

The junior had answers for the first two. The rest was hand-waving. The session stopped being about trying a hosted coding model. It became about a gate that fails closed.

The junior added a system line: never send writes. The assistant agreed. It also emitted a helper named safeRequest.

safeRequest still accepted a method argument. The first regenerated sample passed DELETE and /v2/purge. The comment above the call said the cleanup would make the next GET deterministic.

The senior kept the comment as evidence. The senior deleted the call. A promise in a chat window is not an allowlist. It is a string the next sample can ignore.

The next patch added ?dryrun=true to every URL. The assistant said the server would no-op.

They did not believe it. They checked the service’s public docs for a dry-run flag on destructive routes. None existed on anything resembling /v2/purge. A query string the API ignores is not a sandbox. It is a write with extra noise.

The junior asked to run the generated script against staging once, to capture headers. The senior refused. Capture is write-adjacent if the client follows redirects or retries with a body.

They needed a host that could not reach billing. They needed the model off the socket. The shared terminal stayed on a laptop with no staging credentials in the environment.

The pair wrote a tiny gate in JavaScript. It does not call billing. It reads a cassette of intended requests and an allowlist of method-plus-path templates. It exits non-zero when a transcript or a generated script proposes a call outside the list.

POST /preview is treated as read-shaped only because the real service documents it as non-persisting. That exception is written down. It is not inferred by a model.

Want to discuss this further?

Book a free strategy call with our team to see how these insights apply to your specific business goals.

Book a consultation