"A request that owns hours of work is a job you can kill by closing a laptop."
The Tempting Mistake
The obvious way to build 'transcribe this archive' is a request handler that does it: the browser calls an endpoint, the handler loops over videos transcribing each, and returns when the archive is done. It works in a demo. It is a disaster in production, because a request is the most fragile owner imaginable. Its lifetime is tied to a TCP connection, a browser tab, a hotel Wi-Fi signal, a laptop lid. Any of those ends and your multi-hour job dies mid-flight, half-done, with no clean way to resume.
The deeper problem isn't the timeout. It's ownership. If the request owns the work, then the work only exists as long as the request does — and requests are designed to be short. You've put hours of value inside a container built to be disposable.
Plan, Enqueue, Observe — Never Own
Recall inverts it. A request never runs the transcription. It does one of three cheap, fast things and returns immediately:
- Plan — compute what a run would do (which videos, how many) without spending anything.
- Enqueue — create a durable batch and its queued jobs in the database, then return a batch id. Milliseconds.
- Observe — read the current status, progress, and ETA of a batch that's already running.
The actual hours of transcription are owned by a persistent worker — a process kept alive by the operating system's service manager, independent of any request. It claims queued jobs and grinds through them whether or not anyone is watching. This is why disconnecting the operator's laptop, or killing the status command, does nothing to the batch. The work was never in the request. The request just wrote a durable intention and walked away.
The Test: Close the Laptop
Here's the one-line test for whether you got this right: start the work, then close the laptop. Does it keep going? If yes, the work lives in a durable queue owned by a persistent worker. If no, some request is secretly holding the job hostage, and the first flaky network will lose hours of it. Recall passes this test by design: the request's only job is to durably record what should happen; a worker that outlives every request makes it happen.