OpenAI Says GPT-6 Astra Runs 40 Minutes on One Task. Your Agent Loop Probably Can't. OpenAI's GPT-6 Astra, announced on September 3, 2026, reports a 72.6% score on the OSWorld 2.0 benchmark, with tasks taking roughly 40 minutes each, highlighting the shift from short agent runs to long-horizon tasks that require new infrastructure. The model also shows near-saturated scores on knowledge benchmarks (95.9%-98.6%) but a persistent gap on agentic tasks, and is priced at $10 per million input tokens and $50 per million output. Your agent starts a task at 14:02. It reads the ticket, opens the repo, edits four files, runs the test suite, reads the failures, edits two more files. At 14:33 someone merges to main and the deploy rolls your pods. The process disappears mid-tool-call. At 14:34 the user hits retry. The agent reads the ticket. It opens the repo. It edits four files. Thirty-one minutes of tokens, gone, and you are paying for the second attempt at the same work. Nothing crashed in a way you would see in Sentry. The pod exited 0. Kubernetes did what you told it to do. This failure mode has been survivable for two years because runs were short. A 20-second agent run that dies gets retried and nobody notices. That is the part that just changed. OpenAI announced GPT-6 Astra on 3 September 2026. The launch coverage led with percentages, and the percentages are high. But the number that should change your architecture is on the OSWorld 2.0 line, and it is not a percentage. Here are the scores OpenAI reported at launch. All of these are vendor-reported and not independently verified at the time of writing: | Benchmark | OpenAI-reported score | |---|---| | ARC-AGI-3 | 98.6% | | FrontierMath Tier 4 v2 | 97.6% | | GPQA Diamond | 96% | | BenchCAD | 95.9% | | DeepSWE v1.1 | 74.1% | | OSWorld 2.0 offline subset | 72.6% | On that OSWorld 2.0 subset, OpenAI reports the model spending roughly 40 minutes per task . OpenAI calls Astra a new high-water mark for autonomously controlling computer systems: filling out spreadsheets, building websites from scratch. It also says the model stays oriented better and carries multi-step workflows to the end. VentureBeat's launch writeup https://venturebeat.com/technology/welcome-to-the-agi-era-openai-launches-gpt-6-astra has the full set. Forty minutes is longer than most HTTP timeouts. It is longer than a Lambda invocation can run. It is longer than the gap between two deploys on a busy afternoon. A model that works for forty minutes on one task is not a request. It is a job, and jobs need different plumbing than requests do. Greg Brockman, OpenAI's co-founder and president, said "I think it's not unreasonable to feel that we are now in the AGI era" quoted in VentureBeat's writeup https://venturebeat.com/technology/welcome-to-the-agi-era-openai-launches-gpt-6-astra . That is his framing, and it is an opinion about the field rather than a measured result. The forty minutes is the part you have to write code against either way. Look at the table again as two groups. The knowledge-shaped benchmarks sit between 95.9% and 98.6%. Those are near enough to saturated that the remaining points are mostly argument about the benchmark. The two agentic ones sit at 74.1% and 72.6%. Reading those published numbers straight: something in the neighbourhood of one in four attempts on those benchmark tasks does not land. That is an inference from the reported percentages, not a measurement. The two benchmarks are not strictly comparable — different tasks, different distributions. And neither is a prediction about your workload. Your tasks are not their tasks. But the direction is hard to argue with. The gap between "knows things" and "does things over a long horizon" is still about twenty points wide, and the failures on the doing side are expensive in a way the failures on the knowing side are not. A wrong GPQA answer costs you a few hundred tokens. A failed OSWorld-style run costs you forty minutes of tokens, and you find out at the end. The published pricing makes that concrete. As of publication, Artificial Analysis lists https://artificialanalysis.ai/models/gpt-6-astra-high Astra at $10 per million input tokens and $50 per million output, with a 1M-token context window. One detail there is genuinely good news for long runs: Astra used 16M output tokens across their index run against a 62M median, so it is unusually concise for its tier. Concise still is not free. Illustratively, on those published prices: a run that has produced 200,000 output tokens before it dies is $10 you throw in the bin, and you pay it again on the retry. Multiply that by however many runs a day your agent does, and by whatever your own retry rate turns out to be. You will not know that number until you measure it on your own workload, and it is the number that decides whether any of this is worth an afternoon. Almost none of the deaths are the model's fault. The deploy. Rolling update, SIGTERM, terminationGracePeriodSeconds: 30 , process gone. Your agent was 31 minutes into a 40-minute task. The socket. If the run lives inside an HTTP request, every hop between the browser and your process has an opinion about how long a request may take. An ALB's idle timeout https://docs.aws.amazon.com/elasticloadbalancing/latest/application/edit-load-balancer-attributes.html connection-idle-timeout starts at 60 seconds. So does nginx proxy read timeout https://nginx.org/en/docs/http/ngx http proxy module.html proxy read timeout . The tab. The user closes it, or their laptop sleeps, or the wifi drops on the train. If your job is anchored to a websocket, the job dies with the connection. The platform limit. Lambda https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html stops at 15 minutes. Vercel functions https://vercel.com/docs/functions/configuring-functions/duration stop at 800 seconds on Pro, 30 minutes on the extended-duration beta. Cloud Run request mode defaults to 5 minutes and can be raised to 60, so it clears the bar — and Google's own documentation https://cloud.google.com/run/docs/configuring/request-timeout tells you not to trust that ceiling anyway. Past 15 minutes it recommends making requests idempotent, or "designing request handlers in such a way that they can resume from the point where they left off." That second half is this post, written by the platform vendor. The OOM kill. Long runs accumulate context. A 1M-token window is an invitation to accumulate a lot of it. The common shape: your process boundary is shorter than your task. You cannot fix that by making the process live longer, because the deploy will get you anyway. You fix it by making the task survive the process. The pattern that survives is boring. Decompose the task into named steps. Persist the result of each step the moment it completes. On start, load whatever is on disk and skip every step already recorded. The important design choice is that the step name is the identity , not the array index. Index-based resume breaks the first time you insert a step into the plan and an in-flight run comes back to find step 3 is now something else. Start with the state: // state.ts export type Usage = { input: number; output: number }; export type StepResult = { name: string; output: unknown; usage: Usage; finishedAt: string; }; export type RunState = { runId: string; task: string; completed: StepResult ; totals: Usage; }; export function emptyRun runId: string, task: string, : RunState { return { runId, task, completed: , totals: { input: 0, output: 0 }, }; } completed is an append-only list, not a cursor. A cursor tells you where you stopped; the list tells you what you have, which is what the resume actually needs when the plan has changed underneath it. totals is there so the accounting survives the restart too. If you track cost in a variable inside the loop, the restart resets your spend to zero and your budget ceiling stops meaning anything. Filesystem first, because it is stdlib and it makes the durability boundary visible. The only subtlety is that a plain writeFile is not atomic: if the process dies partway through, you get a truncated JSON file, and now your resume path throws on every attempt. Write to a temp file, then rename , which is atomic within a filesystem on POSIX. js // checkpoint.ts import { mkdir, readFile, rename, writeFile, } from "node:fs/promises"; import { join } from "node:path"; import type { RunState } from "./state.js"; const DIR = process.env.AGENT STATE DIR ?? ".agent-runs"; const pathFor = runId: string = join DIR, ${runId}.json ; export async function save s: RunState : Promise