Slow work belongs in a job
Giant Context does a great deal of work no one is waiting on. Pages that take minutes to build, sites to crawl and import, its own recurring maintenance. None of it fits in a web request, so I stopped treating a job as a call and started treating it as a record. A row in a Postgres table, claimed with FOR UPDATE SKIP LOCKED, retried in the same row, and broken into a graph of dependent tasks. Fire-and-forget is a way of losing work without ever finding out.