I Was the Cron Job: What a 1990s Back Office Taught Me About AI Token Costs
My first Wall Street job as a junior programmer was to process pool tapes from the GSEs and Ginnie Mae. Every month, the tapes arrived and an operator loaded them. Then I ran through a series of scripts — the same series, in the same order — to produce prepayment reports. The reports were printed, photocopied, stapled. Every desk got its copy before the open. For this, the firm paid me slightly more than the prevailing minimum wage.
This went on for a couple of years. Eventually two things happened: I wanted to get paid more, and management decided I could do more useful things — like help build prepayment and OAS models. My boss’s solution was not to hire another me. It was to automate the whole process with proper error handling and hand it off to the operator who was already running other overnight jobs.
Looking back, the strange part isn’t that the job got automated. It’s that for two years, nobody thought it was odd to pay a human to be a scheduler. The job was never “Suhrud runs the reports.” The job was “the reports get run.” The moment someone articulated it that way, the answer was obvious.
I’ve been thinking about this a lot lately, because the industry is busy making the same mistake with a much more expensive employee.
The rerun
Today we wire LLMs into our systems through connectors and MCP servers, and then we ask them to perform recurring tasks. Pull the latest remittance data. Run the QC checks. Format the surveillance report. Post it to the channel. Every day. Sometimes every hour.
Here’s what actually happens on each run: the model re-reads its instructions, re-loads its tool definitions, rediscovers the schema, re-reasons through steps it reasoned through yesterday, and re-derives the entire task from first principles. It is me in that back office — except the photocopier bills by the token, and the junior programmer occasionally hallucinates a column mapping.
That is the junior programmer problem: an LLM is a bright, expensive generalist being asked to do clerical work on repeat. It can help figure out the process, draft the checklist, and handle exceptions. But if the job is the same every morning, the goal should be to convert the junior programmer’s reasoning into reviewed code and let the system run it. The junior programmer belongs at the design table and the exception desk — not standing at the photocopier forever.
Two problems compound here. One is cost. The other, worse one, is that the junior programmer is non-deterministic.
The economics
Take a realistic daily agentic job: a report run against a data warehouse via MCP connectors, with QC checks and a written summary.
Each turn carries a base context of roughly 20K tokens — system prompt, tool definitions, instructions. The agent makes maybe 15 tool calls (list the tables, query, check, query again), each returning a few thousand tokens of results. Because every turn re-sends the growing conversation, cumulative input compounds to roughly 800K–850K input tokens per run, plus a few thousand tokens of output.
At current mid-tier model pricing (about $3 per million input tokens, $15 per million output), that’s roughly $2.50 to $2.75 per run. Daily across 22 business days: ~$55 to $60 a month. For one report. Run thirty recurring jobs like that — not an unusual number for a surveillance or analytics desk — and you’re around $1,700 a month for work that is identical every day.
Now the honest version, because a sophisticated reader will raise it immediately: prompt caching cuts repeated input cost by about 90%, and batch APIs knock another 50% off. A well-engineered agent run might land closer to $0.30–0.50, or roughly $10 a month per job. That’s real, and if you’re going to keep agents in the loop, you should absolutely use both.
But compare the alternative. A scheduled script on Cloudflare Workers runs free or nearly so. AWS Lambda executes this class of job for well under a dollar a month. And the one-time cost of having the LLM write that script? Maybe $1–5 of tokens. Even against the fully optimized agent, the deployed script is one hundred to a thousand times cheaper than the agent — and that gap is before you price the risk.
The overconfidence risk (AI hallucination) is worse than the bill
A deployed script is deterministic and auditable. Same inputs, same outputs. It’s versioned, diffable, and reviewable. When it breaks, it breaks loudly and identically.
An LLM performing the task fresh each morning is a new draw from a distribution. It will usually do the right thing. Occasionally it will skip a QC check, misread a schema change as an instruction, or format a number differently on run 47 — silently. In regulated finance, “the agent usually gets it right” is not a control. Anyone who has sat through a model governance review knows that the question isn’t whether the process works; it’s whether you can prove what it did, every time.
To be fair, this argument cuts both ways, and pretending otherwise would be dishonest. LLM-generated code can also be wrong — subtly, in edge cases, in ways that survive a casual glance. The principle isn’t “code good, agent bad.” The principle is review once, run many. A script gets one round of concentrated human scrutiny, and that scrutiny amortizes across thousands of executions. An agent-in-the-loop asks you to trust a fresh, unreviewed performance every single run. My boss didn’t just automate my job — he automated it with error handling, and someone reviewed that logic before the operator ever touched it. That review was the whole point.
Use the LLM for Judgment, Not Execution
The obvious objection is that nobody serious should run a fully deterministic job through an agent loop. Fair. But many tasks are not purely deterministic. They look repetitive on the surface while still containing moments of judgment: triaging anomalies, deciding whether a failed reconciliation is a data problem or a real signal, or writing the two sentences of commentary that make a report useful. Those are legitimate places for an LLM.
But that does not make the LLM the operator.
The right pattern is LLM as designer, author, and escalation point — not as the thing that runs the job every day. The operating layer should be code: scheduled, versioned, reviewed, monitored, and boring. Code should extract the data, validate it, compute the results, apply the rules, and distribute the output. The LLM should be called only when the process reaches a judgment node: when a check fails, when a number looks strange, when the rules do not cover the case, or when a human-quality narrative is actually needed.
That is the same pattern my boss landed on in the 1990s. The operator ran the job. The human did not sit there rerunning the same steps every morning; the human got called when something broke or required judgment. The modern equivalent is not “replace the operator with an LLM.” It is “let code be the operator, and let the LLM help design the system, explain exceptions, and handle ambiguity.”
This is also where the tooling ecosystem is already headed. The model vendors themselves are pushing patterns where the model writes and executes code rather than acting as a chatty runtime that makes dozens of repeated tool calls. That is not a rejection of LLMs. It is a more disciplined role for them: use the model to create and improve the machinery, not to impersonate the machinery every time it runs.
Where to put the production version
Once the LLM has written your pipeline and a human has reviewed it, deployment is genuinely easy now:
Cloudflare Workers + Cron Triggers. Zero infrastructure, generous free tier, ideal for API-glue jobs — fetch, transform, post. If your job is stitching services together, start here.
Railway. Dead simple for Python jobs with real dependencies — pandas, database drivers, the works. Push a repo, set a schedule, done. Roughly $5 a month.
AWS Lambda + EventBridge. Pennies per run, and the path of least resistance if your firm already lives in AWS and your security team wants everything inside the VPC.
GitHub Actions scheduled workflows. Underrated. If the code already lives in a repo, a cron-scheduled workflow is free for many light jobs and keeps the pipeline next to its own version history.
One honest caveat: deployed code is not free either. Schemas drift, credentials rotate, upstream APIs change, and someone owns the pager. But maintenance cost is bounded and occasional. Agent cost is unbounded and per-run. That asymmetry is the whole argument.
A simple approach
If you can write down the steps, write code — or better, have the LLM write it, then review it once and deploy it. If the task genuinely requires judgment on every run, keep the LLM in the loop — but only at the judgment node, not driving the whole pipeline.
Thirty years ago, my boss promoted me out of a job by automating it, and the firm got both a cheaper process and a modeler out of the deal. Do the same for your LLM. Let it write the script. Let the script run. Save the tokens — and the trust — for the work that actually needs a mind.

















Figure 1 History of Beta to S&P Bitcoin Index with Confidence Intervals
Figure 2 Correlations for 11 currencies (calculated using observations from 2021)
Figure 3 Daily VaR as % of Market Value calculated using various historical observation periods
Figure 4 VaR for a portfolio of crypto assets computed for various lookback periods and confidence intervals
Figure 5 BTC/Futures basis difference between generic and active contracts
Figure 6 Distribution of percentiles generated from posterior simulations
Figure 7 Weekly observed volatility for Bitcoin




