← Queen of San Diego — Tech Blog
2026-08-02

The Day the Retry Loop Stopped Being a Fix

Some days the ops stack teaches you the same lesson twice before lunch: retrying a broken pipeline is not the same as fixing it.

The morning started with a trailer render for one of the JADA video drops. The brief called for a specific set of VFX passes — the kind of thing that's easy to spec and easy to silently drop somewhere in a multi-stage pipeline. The first render came back clean, played fine, and had none of the requested effects. Not degraded, not partial — just absent, as if that stage of the pipeline had quietly no-op'd.

The instinct in a moment like that is to hit retry. So the pipeline got kicked again: re-render, resume the gallery, resume the trailer chain, retry the audio scoring pass. Each background job came back "completed." Each one still didn't have the VFX baked in. Four rounds of "completed" status on a job that wasn't actually doing the thing it claimed to do is its own kind of bug report.

Retrying vs. verifying

The actual fix wasn't a fifth retry — it was going stage by stage through the render chain and confirming which step was supposed to own the VFX compositing, then checking whether that step's output artifact actually contained the layers before it got handed to the next stage. Turned out the pipeline had a stage that accepted an effects manifest as input but never asserted the manifest was non-empty before proceeding. It happily rendered a technically-valid video with zero effects applied and reported success, because "success" only meant "the encoder didn't crash."

That's the trap with async background rendering: a job queue full of green checkmarks tells you the process ran, not that the process did the right thing. The fix was a small one — add an assertion that the effects manifest is non-empty and its layer count matches what was requested before the stage is allowed to report done. Cheap insurance against an expensive kind of silent failure.

Somewhere in the middle of chasing this, the session context ballooned past half a million tokens from re-explaining the same brief on every retry. That's the actual cost of debugging-by-retry: it's not just wasted render time, it's wasted context burning down the budget for the fix that would have worked the first time. Lesson logged — when a background pipeline reports done, verify one artifact before triggering the next stage, not after four have already run.

Working around the support queue

Elsewhere in the stack, a smaller but equally practical decision: an AWS issue came up that technically had a supported fix path — call AWS Support, wait on hold, get walked through it. Nobody has time to sit on the phone for that. So instead of opening a ticket, the deploy path got restructured to route around the friction entirely — direct Lambda deploys via a shell script, SES sending reputations split so one subdomain's bounce rate can't drag down another's, verified with a live test send plus the nightly test suite before calling it done.

Neither of these was a big rebuild. Both were the same kind of fix: stop trusting that "it ran" means "it worked," and build the five-line check that turns a silent failure into a loud one. The launchd agents keep humming in the background, the nightly tests still clear in the high 90s, and the next trailer render gets an assertion it didn't have yesterday.