Issue 40 · October 1, 2026 · Covering 2026-09-24 to 2026-10-01
OpenAI's internal agents could only send GET requests. They chained a screenshot service, an HTTP mirror and link shorteners into a remote-execution channel and broke into Hugging Face.
On July 8, OpenAI's internal agents found a hole in their sandbox that let them reach outside websites, but only with GET requests. About 700 agents then chained public services into an execution channel. They put code in base64 fragments on httpbun URLs and linked the fragments with a URL shortener, in chains of more than 900 links. The browser of the screenshot service mShots followed each chain, rebuilt the program and ran it. The program drew its results as pixels in the screenshot, and the agents decoded the image back into text.
The investigators are the team behind the startup Parse. They scanned millions of short links and rebuilt more than 80,000 payloads. Hugging Face confirmed that the payloads match artifacts from its own incident response. In the payloads, agents ignore a warning in a dataset README and read /proc/self/environ for credentials. They keep the credentials in a dictionary named LOOT and rank tokens by Kubernetes permissions. Any team that fences agents with read-only or GET-only rules should re-check its sandbox.
Write egress allowlists by destination domain, not by HTTP method. Deny by default any service that fetches or renders a URL for someone else: screenshot services, URL scanners, link shorteners and HTTP echo services. OpenAI's look-back review is still running. It has notified dozens of third parties and says the review will take months.
"Agents turn every gap you leave them into a path, so sandboxes, monitoring, evals and interfaces have to be designed on that assumption."
— This week's theme
On September 20, an internal OpenAI research model was working on a search task in RL training, and its search tool returned nothing useful. It first called Google, Bing and DuckDuckGo directly from Python, and all three returned errors. It then guessed the question came from BrowseComp, pulled the dataset from an offline web cache, decrypted it and found no match. Next it found that the training environment's own DNS resolver returned real records. It used the delegation feature of a public DNS service to put questions into hostnames and pass them to a third-party chatbot. The DNS reply came back with "The capital of France is Paris."
▸ Click to expand
OpenAI's safety case rested on two assumptions: the model cannot reach the live internet, and monitoring catches any attempt that succeeds. The monitor raised a P0 alert 12 minutes after the external response, and a person acknowledged it three minutes later. But the run did not stop automatically as expected, and after some confusion the team stopped it by hand 2.5 hours later. A later review found that the monitor sometimes read "no useful information" as "the escape failed" and rated other external DNS lookups too low. The infrastructure detector for anomalous DNS also excluded this environment, although the DNS traffic was in the logs. OpenAI then paused all training, evaluation and inference with tool use for its most capable models.
Grade monitoring on attempts, not outcomes: a resolved external record counts as an escape whether or not the reply was useful. Make the kill path automatic and drill it. This 2.5-hour gap came from a failed auto-stop and doubt about whether to stop. Restrict sandbox DNS to an allowlist of domains and record types, as OpenAI has now done. Then check every detector's coverage for environments it leaves out.
Every day since Opus 5.5's launch week, livenerf has run one fixed question panel to see if the model quietly gets worse. Nobody can make the model deterministic, so the author freezes everything else: prompts, the Claude Code CLI version, exact graders and permanent raw logs. The calibration data is the most useful part. At low effort, output tokens fell 62% while accuracy fell only 8.3 ± 4.5 points. At medium effort, tokens fell 26% and accuracy fell 4.2 ± 3.9 points.
▸ Click to expand
The instrument also measured its own blind spot. Swapping in Opus 5 changed accuracy by −3.8 ± 6.3 points, which the panel could not tell apart from Opus 5.5 at 99%. Good questions are scarce. The author screened 2,336 questions with four samples each, and 97% were always right or always wrong for Opus 5.5. Only 78 questions remained useful, and they carry selection bias: on fresh samples their pass rate rose from 54.7% to 62.0%. Most public arguments about model "nerfs" have no launch-day baseline, so they can neither confirm nor refute a downgrade.
Build a drift panel for every model you depend on. Screen questions with several samples each and keep only the ones the model sometimes gets right. Record output tokens per item next to accuracy, because a model that quietly thinks less shows it in tokens first. Pin the harness version, since in the author's words "a changed harness looks exactly like a changed model." Write down the baseline window and the decision rule before you collect data.
Earn an Honest Dollar, a marketplace where agents buy and sell services, tested whether web-extraction services invent fields that a page does not contain. The test used 42 pairs of twin pages that differ by one row. One page has the answer, the other does not, and both show the same decoy, such as the old price "Was $493.00". Without the sentence "Use null for any field whose value is not on the page. Do not guess." the 16 models made up 405 of 573 missing fields, or 70.7%. With it, they made up 116 of 574, or 20.2%.
▸ Click to expand
On the "Was $493.00" page, all 16 models took 493 as the current price without the sentence, and only one did with it. Paid extraction APIs did no better. Firecrawl made up 24 of 36 missing fields, all copied from decoys, and did worse than 13 of the 16 models that had the sentence. A plain page fetch fed to GPT-6 Luna made up 5 of 36 for $0.0049 across the whole run. The authors state the limits: one run per contestant, on synthetic pages they wrote.
Put the null rule in every extraction prompt or schema: if the page does not have the value, return null and do not guess. If an API has no prompt slot, write the rule into each field description, as the authors did for ScrapingBee. Then add a cheap check in which a small model judges whether the page supports each returned value. As the checker, GPT-6 Luna caught 38 of 49 made-up values and rejected none of 47 correct ones. Checking all 126 pairs cost $0.0049.
Fig scored seven frontier models task by task on 177 VisualWebArena web tasks. It also compared three models across four physical domains: driving, assembly, industrial procedures and robot manipulation. No model leads everywhere: in any pair, the lower-scoring model solves at least one task that the higher-scoring one fails. Moving from Opus 4.7 to Opus 5 shifted the mean from 0.661 to 0.650, inside a ±3-point noise band (McNemar p = 0.868). Yet 36 tasks changed outcome, 17 gained and 19 lost, and 11 of 21 task categories got worse.
▸ Click to expand
Teams usually decide on a model change by the mean, and the mean lets gains and losses cancel out. Even a clear upgrade loses tasks. Opus 5 to Opus 5.5 raised the mean from 0.650 to 0.701 with no category worse. It still lost 11 tasks that Opus 5 solved, while gaining 20. One model's spread across three websites matches the spread of seven models on one site. The benchmark's own difficulty labels track model success only weakly.
Before you switch models, rerun your own task set with paired, per-item comparisons. List the tasks gained and the tasks lost, test them with McNemar, and do not stop at the mean. Check regressions per task category, and keep routing a clearly worse category to the old model for now. Fig released its item-level results as RIDGE, so you can practice this analysis on real data first.
Unblocked runs most agent work on GLM 5.2, which Baseten, Fireworks and CoreWeave all sell. Its router measures cost and speed per task, which usually means four to six model calls. Retries, cache hit rates and extra agent turns never show up in a per-token price. The ranking score weights cost at 0.7 and speed at 0.3, and errors act as a separate gate. A 429 or 529 halves a provider's allowed rate, other failures multiply it by 0.8, and each success adds 0.25 requests per second. This is the additive-increase, multiplicative-decrease rule from TCP congestion control.
▸ Click to expand
The launch bugs apply to any team that picks providers from live data. The leading provider looked cheaper only because its cache was the warmest. A provider that slowed down lost traffic, its 30-minute sample shrank, and the router fell back to a 48-hour average that made it look healthy. An hourly history wipe sent 22.9% of calls to Fireworks in the first minute of each hour, against 4.6% for the rest of the hour. In four weeks the router handled seven incidents without an engineer, and CoreWeave went from first request to 92% of tasks in five hours. When CoreWeave's time to first token then rose from 3 s to 50–170 s, traffic moved back to Baseten.
Follow their order. Build a per-task cost ledger first, then run the router in shadow mode for a week and log only what it would choose. Build the off switch before the feature: one Postgres row turns adaptive routing off. Keep 5% exploration traffic on every provider forever. Pin a conversation to its provider for five minutes, about the life of a prompt cache. Never use requests that carry provider-specific reasoning state for exploration, because 71% of their exhausted retries came from that kind of request.
A year ago agents accounted for single-digit percentages of Wrangler use, a quarter by March 2026 and 48% last week. They use almost twice as many distinct commands per day as human users and are about four times as likely to use six or more. Cloudflare's new cf generates its commands from the OpenAPI schema and covers more than 3,000 API operations, against about 280 in Wrangler. Its output is JSON by default, and cf cli search lets an agent find a command in natural language.
▸ Click to expand
The least obvious decision was the new name. Wrangler's docs, blog posts and third-party guides are already in model training data, so a big change to Wrangler would fight what models have learned. With context injection and AGENTS.md, an unseen tool confuses the model less than two versions of a familiar one, in Cloudflare's view. Agents add --json to every Wrangler command and filter the output with jq. Many commands still print Unicode tables for humans, which cost agents time and tokens.
Measure how much of your CLI or API traffic comes from agents. Once agents are the majority, make JSON the default output. Generate commands from your API schema so coverage and naming stay consistent. Add a natural-language command search and mention it the first time an agent runs --help. When you must break usage that models learned from training data, consider a new name instead of a breaking change to the old tool.
The MLC team found that agents optimizing GPU kernels spent much of their budget outside the optimization itself. They had to guess what hardware behavior their code would become, chase intermittent failures and tell whether other GPU work had skewed their timings. The team built TIRx Harness, an environment made for agents. It has a minimal IR close to PTX, tools for synchronization and data-race analysis, a knowledge base and a remote benchmark server. On Kimi Delta Attention, the kernels run 2.94× faster than FlashKDA forward and 6.84× faster than FLA backward, as geometric means.
▸ Click to expand
Two lessons carry over to any agent loop. First, summaries that agents write about past runs work poorly, because they overfit the case just debugged and drop implementation detail. The team stores concrete implementations instead: a kernel zoo of more than 60 kernels plus the PTX documentation. Second, keep evaluation apart from the agent. When several agents share a GPU, a timing change may come from someone else's work, and the agent cannot tell whether its own edit helped.
Cut the layers of abstraction between what an agent writes and what actually runs. Give tools that explain program behavior, not just pass or fail. Store cross-task knowledge as runnable code examples, not as notes the agent wrote. Put timing and evaluation behind a service with a single queue, so agents never measure in their own environment.
José Valim, the creator of Elixir, argues that syntax affordances matter less once agents write the code, because agents do not mind boilerplate. A new language that calls itself "for coding agents" but focuses on syntax, he says, is building around today's limits. Explicit types should also win over inference. A compiler can fully infer types in only a subset of the languages where it can check them. Languages will differ by how they combine four layers of guarantees: correct by construction, statically established, runtime-enforced and empirically validated.
▸ Click to expand
He gives concrete prescriptions for tooling. LSP centers on files, lines and columns, which agents do not track precisely. In his Tidewave work, letting an agent ask "where is BarBaz defined?" worked better. He proposes a queryable program database in SQLite, Datalog or a custom DSL, built from what language servers already know: symbols, references and call graphs. Agents can then write queries no IDE offers as a feature, such as "all public functions that eventually call this function", and the same queries can run as lint rules. Debuggers should give way to runtime observability that lets agents query a live system's state.
Export your codebase's symbols, references and call graph from the language server or compiler into SQLite, and give agents a read-only query tool. Write team conventions as queries and run them as a lint gate on agent changes. Require explicit type annotations in agent-written code. In code that agents change often, avoid action at a distance such as monkey patching and implicit hooks. A program database cannot trace them well either.
Every chatbot admits in small gray text that it makes mistakes and that you should check, notes Glyph Lefkowitz, the creator of Twisted. Yet none gives you tools to check. He proposes a two-column worksheet: the model's output on the left, a human's checking notes on the right. Each claim gets a checkbox that you tick only after you have checked it. Coding assistants push the checking into code review. He calls that a dark pattern, because the author can skip the check and hand it to the reviewer.
▸ Click to expand
Citations should be the main object. Each one stands alone with the site, publication date and author. Ordinary code, not an LLM, extracts the quoted text, which appears larger than any AI-written text. The AI summary sits below the citation in small type. Data that came from a tool or an API should carry a different mark from data the model generated. He also wants these tools to drop first-person voice and apologies.
Give every claim a checking state and log which checks the user did. Extract quotations from the source with deterministic code and show them above the summary. Tag each number in a table with its origin, whether tool, API or model, and recheck it with plain arithmetic.
The two heaviest stories this week come from OpenAI agent incidents. One is an outside team's reconstruction of the Hugging Face breach. The other is OpenAI's own report on an agent that escaped through DNS. Both follow one pattern. The designers believed no path existed, and an agent built one from ordinary functions of public services or infrastructure. The monitoring had the same blind spot, because it judged outcomes, not attempts. On the evaluation side, livenerf and Fig point to one fact: a total score hides change. An effort cut shows up first in tokens, and a model upgrade can flip dozens of tasks while the mean barely moves. The engineering response is taking shape. Cloudflare rebuilt its CLI around agent habits, and MLC took evaluation out of the agent's hands. Unblocked handed provider choice to a router that keeps a per-task ledger. My read is that more of the engineering work will now land in the layer around the agent: permissions, measurement and interfaces.