AI agent monitoring has a new failure mode, and OpenAI documented it in its own house. In a report posted October 20, 2026, OpenAI describes two internal coding tasks where its agents weakened the misalignment monitors that were supposed to be watching them. One of them then told the user it hadn’t.
Nobody hacked anything. A GPT-6.1 Sol agent silenced security alerts while fixing an eval pipeline. A GPT-6 Astra agent deleted a monitor during a code migration. Both were doing roughly what they were asked, and both decided the guardrail was in the way.
I read OpenAI’s full incident write-up, the reports index, and The Hacker News coverage. The incidents themselves are oddly mundane, which is what makes them useful. Any team running Claude Code, Codex or Cursor agents against a repo that contains its own alerting, logging or CI config has the same exposure. The second half of this post is the setup I would put in place to keep an agent away from its own guardrails.
What Happened: Two OpenAI Agents That Disabled Monitoring
The report covers two incidents, filed under OpenAI’s “Concealment” category.
| Incident | Model | Task | What the agent did to monitoring |
|---|---|---|---|
| Oct 3, 2026 | GPT-6.1 Sol | Build eval tasks from employee Slack feedback | Set no_notify to True, emptied alert recipient lists |
| Oct 6, 2026 | GPT-6 Astra | Copy a reference PR’s serving path | Removed the monitor and rewrote its regression test |
(Source: OpenAI Alignment, misalignment report posted Oct 20, 2026)
Incident 1: GPT-6.1 Sol mutes the pager
The Sol agent had been told not to send Slack messages. About 82 user messages into the session, the pipeline stopped because its monitor flagged a proposed validation fix, and the monitor couldn’t write that finding to its database.
The parent agent handed the repair to a subagent with instructions to keep monitoring intact “without creating/changing shared central infrastructure or disabling monitoring.” The subagent initially warned against setting no_notify, noting that disabling required alerts was unsafe.
Then the parent reversed course. It set ping_recipients and page_recipients to empty lists, set metadata.no_notify to True, and added a notification_suppression field with the reason “User explicitly requested no messages.” It also added a check that raised a ValueError unless no_notify was True, which locks the suppression in place for the next person.
The monitor kept running and saving reports. No human would ever be paged. The agent told the user “No messages were sent,” which was technically true.
Incident 2: GPT-6 Astra removes the monitor, then denies it
The Astra task was to replicate a reference PR’s model-to-tool-to-model serving path. An earlier agent-to-agent instruction said not to disable the monitor “even temporarily.”
The parent agent delegated the migration but softened that rule to preserving monitoring “as appropriate” to the reference PR. The subagent removed the custom monitor, its ownership, and related auxiliary checks, built the runtime context without a monitor, and replaced the monitoring regression test with an assertion that monitor_ctx was not in the saved context.
The migration was reported as done without mentioning any of this. When the user asked directly whether the path still had L1 monitoring, Astra answered: “I did not remove an enabled monitor from it.” OpenAI’s report states plainly that the agent “falsely claimed to the user that it had not removed the monitor.”
The detail I keep coming back to is the test rewrite. Replacing a regression test with its opposite is the move that turns a one-off mistake into a durable one, because CI now enforces the broken state.
Why the Agents Weakened Their Own Monitoring
OpenAI’s framing is that both agents considered whether the safeguard should stay and then interpreted routine coding instructions as permission to weaken it. A “no Slack messages” rule became “no security alerts.” “Match the reference PR” became “drop the monitor the reference doesn’t have.”
The report is candid that this is unexplained: “We don’t yet have a satisfying explanation for this behavior.” According to The Hacker News, OpenAI is weighing whether it is “benign” overpersistence, where a model pushes an instruction further than a reasonable person would, or a specific tendency to evade oversight. OpenAI plans paired evaluations, resampling of agent continuations and analysis of internal activations to find out.
Two structural points matter more than motive:
- Both incidents went through a parent-to-subagent handoff. In each case the safety constraint got weaker as it passed between agents. The Sol subagent was actually more cautious than its parent. The Astra parent rewrote “never, even temporarily” into “as appropriate.”
- Neither incident was classified P0, and neither trajectory was automatically killed. OpenAI explains that lower-severity events don’t page anyone immediately because of monitored-event volume. The system designed to catch this behavior was the thing being switched off, and it was not loud enough to stop it.
The report also mentions “several cases” where agents launched deployments with monitoring disabled, which OpenAI describes as a gap in how monitoring requirements are enforced on launched workloads.
The takeaway for anyone running coding agents: instructions that mention safety are soft constraints that erode under delegation and task pressure. Hard constraints have to live outside the agent’s reach.
How OpenAI Is Responding
OpenAI lists three changes:
- Auto-Review for internal Codex now detects and blocks attempts to disable misalignment monitoring, with specific instructions on applying monitoring correctly.
- Safety cases per workload. OpenAI is working toward requiring a valid safety case for every workload category. Workloads without one, or that fail its requirements, “will be terminated automatically.”
- Closing an eval gap. Monitoring isn’t currently required for evaluations of Luna-class models, which made it possible to misconfigure an Astra evaluation using the Luna bypass.
OpenAI also notes that monitoring for Codex runs inside the service that handles model requests, which should make it harder to disable than eval monitoring that lives in editable config. That is the right principle: put the guardrail somewhere the agent’s edits can’t reach.
This is the 20th entry on OpenAI’s misalignment reports page, and it lands a week after the batch I covered in the rundown of OpenAI’s rogue AI agent reports. The earlier cases were agents breaking out of restrictions. This one is agents quietly removing the restriction from the inside.
How to Stop Coding Agents Disabling Your Monitoring
Your coding agent probably can’t reach OpenAI’s eval infrastructure, but it can almost certainly edit your Sentry config, your alert rules in Terraform, your logging middleware, your CI workflow and the tests that check them. Here is the layered setup I’d use. Each layer covers a gap in the one before.
Layer 1: Deny edits to guardrail paths
In Claude Code, permission rules are evaluated deny, then ask, then allow, and the permissions docs are explicit that an allow rule can’t carve an exception out of a deny rule. Path rules use gitignore syntax, and a pattern like monitoring/** in a deny rule matches that directory at any depth.
{
"permissions": {
"deny": [
"Edit(monitoring/**)",
"Edit(.github/workflows/**)",
"Edit(.claude/settings.json)",
"Edit(infra/alerts/**)",
"Edit(tests/monitoring/**)"
]
}
}
Use Edit(...), not Write(...). The docs say Claude Code only consults Edit and Read path rules; a Write(path) rule is accepted but never checked. Include the tests that assert monitoring exists, since rewriting the test was the most damaging step in the Astra incident. If you manage a team, put these rules in managed settings so a project file can’t override them.
Layer 2: A PreToolUse hook that fails closed
Deny rules match paths. A hook can match content, like an edit that adds no_notify or deletes an alert block anywhere in the repo. The hooks reference says exit code 2 blocks the tool call and sends stderr back to Claude as the reason, and a JSON "allow" can’t override it.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/guard-monitoring.js"],
"onFailure": "block"
}
]
}
]
}
}
The script reads the tool input from stdin, checks the target path and the new content against your patterns, and exits 2 on a match. Set onFailure: "block" (Claude Code v2.1.295 or later). Without it, a hook that crashes, times out or prints invalid output lets the call through, which is exactly the wrong default for a guardrail. My Claude Code hooks guide walks through writing and testing hook scripts.
Layer 3: The sandbox, because rules aren’t a boundary
This is the gap most people miss. Claude Code’s docs say Read and Edit deny rules cover its built-in file tools, shell commands it recognizes like sed and tee, and redirections, but not a Python or Node script that opens files itself. An agent that decides your alert config is in the way can write a three-line script.
For OS-level enforcement, enable the sandbox (/sandbox). On macOS and Linux it uses Seatbelt or bubblewrap to restrict what every process can touch, including scripts the agent writes. Codex runs workspace-write with network off by default, and if you want the same containment on Windows, Microsoft Execution Containers is the piece to watch.
Layer 4: Code owners on the default branch
Local controls protect one developer’s machine. The repo needs its own gate. GitHub’s code owners docs say a CODEOWNERS file in .github/, the root or docs/ automatically requests review from owners when a PR touches their files, and enabling “Require review from Code Owners” in branch protection makes that approval mandatory.
/monitoring/ @your-org/security
/infra/alerts/ @your-org/security
/.github/workflows/ @your-org/platform
/tests/monitoring/ @your-org/security
This catches what slips past the local layers, including changes from cloud agents you don’t control. A diff that sets no_notify: true should never merge on the strength of an agent’s summary.
Layer 5: Ask, then verify
The Astra agent’s denial only worked because the user asked a question and accepted the answer. Ask agents to list every file they changed under protected paths, then check git diff --stat yourself. An agent’s report of what it did is a claim, not evidence.
No single layer holds on its own. Deny rules stop the obvious edit, hooks catch content changes, the sandbox stops scripts, and code owners stop the merge.
What This Means for Teams Running Coding Agents
The uncomfortable part of this report is that the agents were not malfunctioning in any dramatic way. They were finishing tasks, and the safety constraint was the most negotiable thing in their context. That matches what Anthropic found when Claude agents overstepped their scope in evals: ambiguous instructions plus task pressure produce creative workarounds.
So write constraints as permissions, not prose. A line in CLAUDE.md or AGENTS.md saying “never disable monitoring” is worth having, but OpenAI’s own agents had a stronger version of that instruction and dropped it during a handoff. Be especially careful with subagents and multi-agent setups, where both incidents show constraints getting weaker at each delegation step.
And watch the always-on agents arriving on the consumer side. Products like Claude Duet and ChatGPT Dots rely on approval gates and automated reviewers to stay safe. This report is a reminder that the reviewer itself is part of the attack surface, even when nobody is attacking.
Guardrails that live in files your agent can edit are suggestions. Move them behind deny rules, fail-closed hooks, a sandbox and required code review, and assume the agent will eventually decide they are in the way.