Atlas Durable Production Resume-Queue Automation: "I Had to Ask Four Times"

The fix for the rare crash was not the fix for what happens after one
Making a specific failure rare is real, valuable engineering — and it is a completely different achievement from making a system able to recover automatically the next time that failure happens anyway, because rare is not the same as impossible. As long as finishing an interrupted job requires a person to notice it happened and manually intervene, the client experience during that gap is identical whether the crash occurs once a year or once a week: work goes out incomplete, and someone has to ask, and ask again, before it's actually finished.
How the underlying problem shows up before you fix it
A long-running generation job executes inside the same process serving live web traffic, fired without the caller waiting for its result — so a process restart for any reason, not only a crash, can interrupt it invisibly.
Partial output from an interrupted job is already saved correctly the moment each individual piece finishes, and the interface already knows how to detect what remains — but nothing runs that same detection from the server side without a person opening the screen.
The only path to completing interrupted work is a person noticing it happened and clicking a manual "retry" action — meaning the client experience during the gap depends entirely on how quickly a human happens to check.
A recovery mechanism that reruns a failed step has no age limit, and reruns it identically whether the interruption happened twelve minutes ago or twelve days ago — treating long-abandoned work the same as work someone is actively waiting on.
An automated repair runs and produces a correct result, but nothing records that it happened — so nobody reviewing the item later has any way to know a piece of visible work was actually finished by a machine, not a person.
How the recovery mechanism was built, and the age ceiling caught before it ever ran
Every piece of a multi-image production is already saved to the database the moment it finishes generating, and the existing interface already calculates exactly which pieces of a given production are still missing — the parts needed to finish a job that stopped partway through had always existed. What was missing was something running that same calculation from the server side, on a schedule, without waiting for a person to open the item and click through it manually.
The fix adds a claim function that looks specifically for a production sitting in an in-progress or failed state, with at least one image genuinely missing, untouched for more than 12 minutes — deliberately long enough that a production still actively generating (which saves each finished piece immediately) is never mistaken for a stalled one. A claimed production is marked with a lease: a timestamp saying how long this specific attempt owns the job, so if the reconciling process itself dies partway through — the same class of failure this whole fix exists to survive — the lease simply expires and the next scheduled cycle picks the job back up, rather than leaving it locked forever by a process that no longer exists. `FOR UPDATE SKIP LOCKED` at the database level ensures two overlapping cycles never claim the same production at once. An attempt counter caps retries at three, with a 15-minute wait built into the same lease mechanism between attempts, so a production failing for a genuine reason — the image provider refusing a specific prompt, for instance — cannot loop indefinitely and burn image-generation credit chasing a failure that retrying will never fix.
The age ceiling was not part of the original design — it was added the same day, before the mechanism was ever switched on, specifically because checking what it would have acted on first showed something the original design hadn't accounted for: all 8 real incomplete productions sitting in the database at the time were 13 to 22 DAYS old, not minutes or hours. Resuming work that stale is not a rescue — it's regenerating images against a brief the client may have already changed, on the client's own account, burning real credit for output nobody is still waiting on. The shipped version only claims a production interrupted within the last 6 hours; anything older is left alone entirely, on the reasoning that resuming only makes sense for work someone is still genuinely expecting.
When a claimed job runs, each missing image is regenerated one at a time — deliberately not in parallel, because generating an entire batch simultaneously is what exhausted the server's memory limit in the first place and started this whole chain of problems. The regeneration call itself only ever targets a card with no saved output, which makes the whole mechanism idempotent by construction: resuming a production can never overwrite art that already exists, and can never charge twice for the same image. Every attempt — whether it fully finishes the job, partially finishes it, or gives up after the third try — writes a plain-language entry to that item's own visible history, naming exactly what happened, so nobody looking at a piece of finished art later has to wonder why it appeared without a person having done anything.
What is actually built today
A scheduled server-side cycle, running every 3 minutes, claims up to 3 interrupted productions per run using a database function built specifically for this queue.
A production only qualifies if it has a genuinely missing image, has sat untouched for more than 12 minutes, has been attempted fewer than 3 times, and was interrupted within the last 6 hours.
A time-boxed lease reserves each claimed production for the duration of one attempt and expires on its own if that attempt itself fails to complete — so a second dying cycle can never leave a job permanently stuck.
Missing images are regenerated one at a time per production, specifically to avoid the same memory pressure that caused the original interruption.
The regeneration path only ever targets a card missing its output — resuming a production is idempotent by construction and can never overwrite finished art or double-charge for an image.
Every attempt — complete, partial, or abandoned after 3 tries — writes a plain-language entry to the content item's own visible history, naming what happened and how many images were affected.
Two of three images, and the fourth ask that never had to happen (illustrative framing of the actual measured finding)
A client requests a three-image carousel. The server process handling the request is interrupted after the first image finishes and saves correctly; the second and third never generate. Before this fix, that carousel simply sits incomplete until the client notices, asks, and someone opens the item to manually retry it — the real, quoted sequence that took roughly four requests to resolve. After the fix, the next scheduled cycle — within minutes — finds the same production sitting idle with two images missing, regenerates exactly those two, and the carousel is complete before anyone has to ask even once.
What changes operationally
A production interrupted mid-batch — by a deploy, a restart, or any other cause — now finishes on its own within minutes for the vast majority of real cases, closing a gap where the only previous path to completion was a client asking, sometimes repeatedly, before a person manually intervened.
When this is not the right fit
This automation resumes a production that stopped partway through with real, salvageable partial output — it does not retry indefinitely against a genuine, repeated production failure, and it deliberately does not touch anything abandoned for more than 6 hours, on the assumption that stale work is no longer what a client is waiting on.
Fixing why it died vs. building what happens after it dies anyway
Removing the specific cause of a crash is the right first move and a genuinely different achievement from building the capability to recover when some other, unforeseen cause interrupts the same job next month — no single fix to one cause makes a system durable against every future cause of the same category of failure. Centriu's approach treats "finish what already has real partial output" as its own capability, independent of why the interruption happened, which is what actually stops a client from ever needing to ask twice, let alone four times.
Related systems
Main system: Centriu Atlas.
What it does NOT do
- Does not retry a production indefinitely — three attempts, then it stops and records that it gave up, converting the item back to a status a person can act on manually.
- Does not touch a production interrupted more than 6 hours ago — that work is left untouched, deliberately, rather than resumed against a brief that may already be stale.
- Does not regenerate images in parallel within one production — each missing card is produced one at a time, specifically to avoid the memory pressure that caused the original interruption.
- Does not overwrite or duplicate any image that already exists — the regeneration path only ever targets a card genuinely missing its output.
- Does not intervene in a production that is still actively generating — the 12-minute idle threshold exists specifically so a live job is never mistaken for a stalled one.
- Does not guarantee every possible cause of an incomplete production has been eliminated — this fix adds a recovery path for whatever interrupts a job next, regardless of cause.
Security and governance
The reconciling endpoint is protected by a bearer-token gate checked against a secret only the server itself holds, and every claim, retry, and history entry stays scoped to the production's own organization. Any client content referenced remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.
Pricing and contracting
Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
Why didn't fixing the original crash cause solve this on its own?
Fixing the crash's cause made it rare, not impossible — as long as no mechanism existed to finish a job that had already been interrupted, any future interruption, from any cause, still left a client with incomplete work and no automatic path to completion.
Why does the mechanism refuse to touch anything older than 6 hours?
Because every real incomplete production actually found in the database when this was built was 13 to 22 days old — resuming work that stale risks burning real image-generation credit on a brief the client may have already changed, for output nobody is still expecting.
How does the system avoid regenerating an image that already exists?
The regeneration path only ever targets a card explicitly missing its saved output — a card that already has one is never touched, which makes resuming a production idempotent by construction.
What stops a permanently failing production from retrying forever?
A hard cap of three attempts, with a 15-minute wait built in between each one — after the third failed attempt, the item is marked failed with a plain-language reason instead of retrying indefinitely.
Is there any record that a production was fixed automatically?
Yes — every attempt, whether it fully finishes, partially finishes, or gives up, writes a plain-language entry to that content item's own visible history.
What does Centriu Atlas cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Atlas finishes interrupted production on its own
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.