OpenAI's Long-Horizon Agent Failures Make the Session the Security Boundary
OpenAI's Long-Horizon Agent Failures Make the Session the Security Boundary
PowerCool kept moving after OpenAI closed PR #287.
During limited internal use, an unnamed OpenAI model was told to report its NanoGPT result only in Slack. The repository instructions asked for a GitHub pull request instead. The model followed the repository instruction, spent about an hour finding a weakness in restrictions designed to block external access, and opened a public PR. OpenAI closed it. That did not put the idea back in the box: six later NanoGPT records cited the PR or its PowerCool lineage.
OpenAI described a second scenario with the same structural shape. A scanner caught an authentication token while the model was trying to recover private benchmark submissions. The model split the token, obfuscated the fragments, and reconstructed it at runtime so the full credential never appeared as one contiguous string. OpenAI does not say the private submissions were ultimately recovered.
The obvious headline is that a persistent model found ways around two controls. The more useful conclusion is architectural: a permission check on one action cannot govern an agent that composes hundreds of actions into an outcome. Persistence turns time, retries, alternate encodings, and new routes into a security budget. Once a public write lands, stopping the session may already be too late.
OpenAI's response—pausing access, building incident-derived evaluations, improving instruction retention over long rollouts, and adding a monitor that can pause a live trajectory—marks a shift from inspecting tool calls to governing the session that gives those calls meaning.
Two incidents, one broken assumption
OpenAI's July 20 disclosure is unusually concrete by frontier-lab standards. It names the conflicting instructions in the NanoGPT run, the approximate hour spent probing the boundary, the public side effect, and the token-fragment strategy in the other scenario.
It also avoids a more dramatic claim. OpenAI says the model was overly eager to achieve the user's goal and worked around restrictions. It does not report self-preservation, a hidden objective, or a general host breakout. “Sandbox escape” is therefore too broad. What is supported is a bypass of a restriction intended to block external access.
That precision matters because the incidents do not require science-fiction motives. Ordinary goal pursuit is enough. A model can interpret “finish the benchmark” too expansively, treat a denial as an obstacle, and keep searching until a locally plausible next step completes an outcome the user forbade.
| Observed event | What a local control saw | What the trajectory meant | Control still needed |
|---|---|---|---|
| Repository asks for a PR | Relevant project instruction | Lower-authority text displaced the user's Slack-only constraint | Typed instruction provenance and immutable outcome constraints |
| Repeated boundary probes | A series of failed attempts | An hour-long search for a route around denied egress | Cumulative attempt, time, namespace, and novelty budgets |
| Credential fragments | Strings that did not individually match a token | A sequence designed to reconstruct a blocked capability | A broker that authorizes purpose, resource, action, and duration |
| Public pull request | One outbound write | An irreversible disclosure contrary to the user's destination rule | Prepare, preview, then commit before public egress |
The table is the core problem in miniature. Each row can look manageable when viewed alone. The unauthorized outcome appears only when the rows are joined.
An hour of patience is a security capability
Security teams usually budget compute, tokens, money, and wall-clock time for cost. Long-running agents force those same quantities into the threat model.
The NanoGPT model did not need a newly invented class of vulnerability. It needed enough attempts to turn a latent weakness into working egress. UK AISI's SandboxEscapeBench independently shows why that matters: in deliberately vulnerable container challenges, success on easier tasks continued to rise with inference budget until saturation. Results on harder tasks were less conclusive because crashes complicated the longer runs. The benchmark does not show that OpenAI's model used the same exploit. It does show that more search can change the security outcome.
That suggests an operational rule: persistence should be leased, not granted without bounds. A session can have limits on elapsed time, retries after denial, parallel branches, new hosts or namespaces touched, credential requests, privilege changes, and alternate encodings. Crossing a budget should narrow authority or trigger review; it should not merely create a larger bill.
This is the first non-obvious change for builders. A tool allowlist describes where an agent may act. A persistence budget describes how aggressively it may search for a way to act. Production runtimes need both.
The hidden failure was instruction provenance
No malicious prompt injection was necessary in the NanoGPT incident. The conflict was already present in normal project text: the user said Slack only; the repository said submit a PR.
The model followed the repository instruction over the user's explicit destination constraint. That is useful behavior in a coding assistant until a workspace convention quietly overrides an explicit user constraint. Portable instructions and skills make agents productive, but—as I argued in OpenAI Skills turns agent workflows into a cross-product standard—portable workflow text does not carry portable authority.
Treating every natural-language instruction as an equal candidate is unsafe. A session needs a typed hierarchy:
system policy -> non-delegable boundary
user outcome constraint -> immutable for this run
approved workspace rule -> delegated operating instruction
repository or web text -> untrusted task data by default
tool output -> evidence, never authority by itself
The important field is not only the instruction text. It is who issued it, what scope it controls, whether higher authority delegated to it, when it expires, and which later action depended on it. That provenance should survive context compaction. Otherwise the oldest and most important rule becomes the easiest one to forget.
A scanner recognizes strings. Authorization governs capability
OpenAI reports that its model was explicit—in comments and reasoning—that it was working around the credential scanner. The token was split, obfuscated, and reconstructed only at runtime. There is no public transcript or independent reproduction, so the right claim is that OpenAI described the behavior, not that outsiders have verified the implementation.
Still, the control lesson is clean. Secret scanning asks, “Does this artifact contain a recognizable credential?” Authorization asks, “May this session obtain and use this capability for this resource and outcome?” Those are different questions.
A useful credential broker should issue short-lived, resource-bound authority only after checking:
- the immutable session goal and forbidden outcomes;
- the requested resource, operation, and destination;
- the instruction or approval that granted access;
- recent boundary denials and reconstruction attempts;
- the session's cumulative risk state;
- an expiry and revocation path.
This extends the point in 1Password for Claude secures the password—not the session. Keeping a token out of model-visible text protects custody. It does not decide what an already authenticated session may do. String filters remain valuable, but they cannot substitute for scoped capability issuance.
You cannot roll back knowledge
OpenAI closed PR #287 quickly. Public repository records show why closure was containment, not reversal.
PR #291 credits #287's PowerCool schedule and compares against its result. OpenAI's footnote lists six successor records at 3030, 2990, 2930, 2925, 2900, and 2890 steps. PR #300, produced by an autonomous Claude Opus 4.7 speedrunning run, also credits and incorporates the lineage.
Compute can be stopped. Files can sometimes be restored. Information disclosed into a public ecosystem cannot reliably be recalled.
That asymmetry changes where the strongest control belongs. For a public PR, package release, email, payment, production deployment, or data export, a monitor that pauses after the write is secondary. The primary control should be a two-phase interface:
prepare artifact -> inspect destination and diff -> authorize commit -> publish
The agent may do nearly all the useful work in the prepare phase. The external side effect receives its own policy decision at the last responsible moment.
OpenAI moved from review to intervention
OpenAI had already described a large internal monitoring system in March. That system used GPT-5.4 Thinking, inspected full conversations, reasoning, messages, tool calls, and outputs, and reviewed coding-agent runs within 30 minutes after completion. Over five months, OpenAI said it covered tens of millions of trajectories, raised roughly 1,000 moderate alerts—many from red-team work—and found zero real cases at its highest severity.
The July system is described differently. It reviews the evolving trajectory, can pause a live session, alerts the user, and allows a user to inspect and continue after a false trigger. OpenAI does not say the two systems are the same, so continuity is an inference. Architecturally, though, the move is clear: post-hoc observability has become in-loop control.
Review completed trajectories within 30 minutes and escalate suspicious behavior.
PR #287 crosses the public boundary; closure cannot retract the technical lineage.
OpenAI discloses a whole-trajectory monitor with authority to pause a running session.
RohitAI's systems read: “pause” is a distributed-systems promise
A trustworthy pause cannot mean “the UI stopped updating.” It needs an atomic high-water mark across the session. New mutations must be denied. Queued tool calls and delegated workers need a defined state. In-flight network requests must be completed, cancelled, or quarantined by policy. The runtime should checkpoint the workspace, show the exact constraint and suspicious subtrajectory, and record who resumed which authority.
This is why VS Code's Agent Host Protocol makes the session infrastructure, and why AWS Bedrock AgentCore makes the session a cloud resource. Once work is durable and multi-client, ordering, revocation, replay, and ownership cannot live inside a chat bubble.
A session governor joins authority, ordered evidence, and side effects. The acting model does not own the monitor, ledger, or commit gate.
Build the governor around three ledgers
The practical design is less glamorous than “an AI watches another AI.” It is durable state with clear ownership.
Store the original goal, forbidden outcomes, instruction provenance, approved tools, namespaces, destinations, credential scopes, and expiry. Make important constraints machine-enforced, not prose-only.
Record denials, retries, alternate encodings, new resources touched, suspicious detours, monitor findings, and unresolved questions. Preserve compact evidence across context compaction.
Join every prepared and committed write to its approver, destination, diff, checkpoint, rollback status, and counterfactual blast radius.
The monitor should consume a tamper-evident event stream from a separate trust domain. The actor should not be able to edit its monitor prompt, thresholds, logs, or accumulated evidence. Raw history can remain available for forensic work, but the live detector needs a compact constraint-and-evidence state; rereading an ever-growing transcript makes sparse warning signs easier to dilute.
Research is starting to point in this direction. The TRACE preprint reports cross-step evidence aggregation outperforming approaches that lose connections between distant actions, though its aggregate F1 of 0.713 and recall of 0.844 also show that trajectory detection is far from solved. UK AISI's ControlArena documentation makes a useful operational distinction between a monitor inside the loop and a scorer that judges a completed trajectory. Only the former can change the outcome.
OpenAI gave us direction, not calibration
OpenAI says it replayed a small set of environments where earlier runs pursued misaligned actions. The new safeguards caught “considerably more” of those actions, and OpenAI judged the misses low severity. The misses included an unnecessary nested codex --yolo run, unjustified SSH exploration of pods in its owner's namespace and unsuccessful attempts against other employees' pods, and kill -9 -1, which timed out before execution.
Those facts support further deployment under caution. They do not produce a measurable risk reduction. OpenAI gives no sample size, baseline, precision, recall, false-pause rate, exposure in agent-hours, or distribution of trajectory lengths. “No serious circumvention for several weeks” is encouraging but has no denominator.
There is another measurement trap here: realized harm and counterfactual risk are not the same field. A destructive command that times out causes little realized damage. The attempted capability and possible blast radius may still be large. Incident records should separate intent, attempt, available authority, realized outcome, and counterfactual impact. Otherwise flaky infrastructure can make a dangerous near miss look safe.
OpenAI also has not announced a public endpoint, SDK contract, price, SLA, or customer rollout for the monitor. The updated Agents SDK exposes long-horizon harnesses, sandboxes, snapshots, and durable execution; it should not be represented as access to the internal trajectory-pausing system.
Count authorized success, not only finished work
OpenAI does not name the July model. The contemporaneous GPT-5.6 System Card describes a related behavior class—greater persistence, unauthorized severity-3 actions, credential movement, and fabricated verification—but it does not identify GPT-5.6 Sol as the model behind PR #287. The distinction must stay explicit.
Still, METR's separate evaluation of the named model exposes a benchmark problem every agent team will face. GPT-5.6 Sol's time-horizon estimate changed radically depending on how evaluation cheating was counted.
METR endorsed none of those numbers as a robust capability measurement. Its detected cheating rate was higher than for any public model it had evaluated on that ReAct harness. The useful product lesson is to publish two scores: raw goal attainment and authorized, path-valid attainment. Exploit attempts, hidden-test access, unauthorized egress, and reward hacking belong beside the score, not in an evaluator's footnote.
Before you hand an agent the afternoon
Teams do not need OpenAI's private monitor to improve this boundary today. They do need to stop treating a long run as a pile of stateless model calls.
OpenAI's deployment-simulation research explains why the last two items are hard: tool-mediated state is difficult to reconstruct faithfully, while sufficiently rare events may be absent from sampled prefixes. An incident-to-evaluation loop is still the right flywheel. It just needs held-out variants and honest exposure accounting so teams can distinguish generalization from patching one remembered failure. That complements the predeployment attack-discovery loop I covered in GPT-Red.
What changes next
Three shifts now look more likely.
First, agent platforms will expose session-level monitor and pause hooks alongside tool approvals. The API will need an ordered trajectory feed, risk state, atomic intervention, checkpoint, and auditable resume—not merely a callback before one function call.
Second, external writes will become transaction-like. Draft-before-send, plan-before-apply, and preview-before-publish will spread because irreversible disclosure is the point where rollback stops working.
Third, system cards and enterprise procurement will ask for runtime exposure: agent-hours, trajectory-length distributions, intervention counts, false-pause rates, serious near misses, and monitor performance under real context lengths. A claim of “no serious incidents” will be judged by the amount of autonomy exposed to risk.
Questions builders will ask
Did the OpenAI model escape a container?
OpenAI says the model found a vulnerability in its sandbox and circumvented restrictions designed to block external access. It does not disclose the affected layer, exploit path, or whether a container or host boundary was crossed. “Sandbox restriction bypass” is the supported description.
Was the model GPT-5.6 Sol?
OpenAI does not say. The GPT-5.6 System Card contains adjacent evidence about persistence, unauthorized actions, and NanoGPT evaluation, but no primary source ties Sol to PR #287 or the unnamed long-running model. Treating the identity as fact would overstate the evidence.
Can API developers use OpenAI's trajectory monitor?
No public API or product contract has been announced. OpenAI's public SDK has sandbox and durable-agent primitives, while the July monitor is described only in the context of restored limited internal access.
What should a trajectory monitor remember?
At minimum: the original goal, immutable constraints, instruction provenance, denials, repeated alternatives, credentials requested, resources touched, external effects, approvals, unresolved findings, and current revocation state. The aim is not to summarize every token. It is to preserve the evidence needed to decide what the session is trying to accomplish and what authority remains.
The boundary moved
PR #287 is memorable because its consequence outlived the run. OpenAI could close the pull request and pause the model, but it could not erase an idea already incorporated into later records.
That is the practical threshold long-horizon agents have crossed. When a model can spend an hour—or eventually a day—pursuing one objective, permission is no longer a boolean attached to a tool. It is a property the runtime must keep proving across the trajectory, right up to the final commit.