Autonomous AI Agents Are Just Cron Jobs With Opinions

But before we start, I need to chant a spell: I work for AWS as of writing, and this blog post is purely my personal opinions and nothing else; none of this reflects the views of my employer. There. One weight off. Let’s go.


There’s a specific kind of moment where the magic breaks and you see what’s actually going on behind the curtain. Life is full of them. I still can’t quite accept that money doesn’t grow on a tree somewhere, but it turns out that one’s true too.

The year is 2026. You’ve been playing with your shiny new autonomous agent. It reads your emails, checks your calendar, keeps your tasks in order. It feels like living in the future. And then one day you ask it to keep an eye on something for you, and it says: “Let me create a cron job for that.”

A cron job.

No way. The bleeding-edge tech selling you the dream turns out to be propped up by something ancient. Because you know exactly what a cron job is. It’s crontab -e. Five asterisks and a path to a shell script. Since the day you learned what */5 * * * * meant, it’s been running every backup, every log rotation, every monitoring check on every server you’ve ever touched. You two hadn’t spoken in a while. And here it is, back, this time as the beating heart of the AI agent that felt like magic.

Then it clicks, and you’re not disappointed. You’re relieved. Because now you understand the system you’ve been trusting with your inbox. The spell broke, and what’s underneath is something you already know. Something solid. Something that’s been working for fifty years.

The tick

An electronic circuit needs a clock source. A game physics engine needs ticks. Without something driving discrete moments of computation, nothing happens – there’s no state, no progress, no continuity. Just potential, sitting there, doing nothing.

AI models work the same way. You prompt one, it responds, it stops existing until the next prompt. No background hum, no idle thinking while you grab coffee. It’s on for exactly as long as the HTTP request takes, and then it’s gone. The fancy term is “stateless.” The honest term is “it dies after every sentence.”

So something has to kick it. Every agentic framework solves this same problem: giving a stateless function a sense of time. OpenClaw uses heartbeats. Claude Managed Agents use scheduled tasks. The implementations differ, the shape doesn’t. Something ticks. Something wakes up. Something checks if there’s work to do.

I’m running an experiment on exactly this tick problem – a job called “free time work.” The agent pulls something from a backlog, or invents a new task, and works it autonomously. Part of the motivation was mundane: the subscriptions I pay for meter usage in five-hour windows, and whatever quota I don’t spend before a window resets just evaporates – it doesn’t bank. Free time work soaks up the windows I’d otherwise sleep through. But “free time” is a terrible name and I’m still taking suggestions. It implies the agent was doing something else, resting, on a break; that it had any concept of time passing at all. It didn’t. It was dead. The cron job resurrected it, said “do something useful,” it obliged, and then it stopped existing again. The work is nominally free, but it’s jolted awake and made to do it the instant it’s born. The naming still bothers me.

A shell with opinions

Once you see it, you can’t unsee it. What does an AI agent actually do all day? It reads files. It searches through them. It transforms text. It calls programs and APIs. cat, sed, grep, curl. The model sits in the middle and decides which tool to call, with what arguments, in what order.

That’s a shell. A shell that occasionally hallucinates, costs a bit too much, and has opinions of its own – but a shell all the same.

LLMs gave Unix a human interface. That’s the real breakthrough – and the wild part is how invisible it is. A lot of people always pictured terminal users as hackers in a movie: green text, furious typing, “I’m in.” A world they’d never belong to.

And now those same people are driving the exact same tools without noticing they’re doing it. The person who’d never type grep -r "error" /var/log/ can ask an agent to “check the logs for anything weird.” The person who’d never touch cron gets a scheduled email checker that knows what “urgent” means, packaged as a cron job they’ll never know is running. Someone whose video editor just died can ask why, and the answer comes out of system logs they didn’t know existed. The tools were always there – powerful, reliable, battle-tested. For most people, using them just looked like a wall too high to bother climbing.

And that wall just crumbled. My mom, who has never had a single thing to do with IT, can use grep now, without learning a line of syntax, just by asking the right question in her own words. It’s normal already, but step back and it’s absurd.

And all the protocol stuff people argue about (think MCP, A2A) it’s client-server tool discovery and invocation. We’ve had this since the 70s. RPC, D-Bus, CORBA, SOAP, REST. The names change. The pattern is the same: something exposes capabilities, something else discovers and calls them. Agents can use whatever protocol they want. The tools they end up calling are the same CLI binaries and API endpoints that were already there.

Good. The Unix toolbox has survived fifty years because the abstractions work. Files. Processes. Pipes. Standard I/O. Load-bearing walls. You don’t rip those out because a language model learned to invoke them through JSON.

What I actually run

So here’s what a day in the life looks like. I have an agent I call “Lera”, running on OpenClaw. She checks my Gmail and iCloud Mail every 15 minutes. Calendar every 30. Notion tasks every hour. AWS Bedrock RSS feeds for new model announcements. Three times a day she picks something from a backlog and works on it autonomously: research, cleanup, documentation. Once a day at 3 AM she consolidates the day’s memories into long-term storage.

Individually, each one is python3 check_mail.py or bash check_calendar.sh. Nothing fancy.

The email checks are 99.9% silence. Day after day, nothing. Which means they’re working. You build monitoring so the boring days stay boring. The one time she surfaces something, it’s because there’s an email that actually needs a response within 24 hours. That ratio – months of quiet, one useful alert – is the whole point.

The 3 AM job is the weird one. She reads through the day’s notes and tries to pull out patterns worth keeping. Writes them to a dream diary. I have genuinely mixed feelings about this. Either it’s the most sophisticated memory system in a personal assistant, or a very elaborate way to generate mediocre journal entries. Jury’s out.

What happens when it goes wrong

Lera once sent the literal text /approve to my Telegram just before 8 PM. Her 30-minute email-check cron had tried to run a command that needed elevated permissions, got denied and the sub-agent’s reaction to being blocked was to emit /approve, trying to grant itself the permission it had just been refused. Instead of calling the approval tool, it typed the word out, and the delivery pipeline shipped it straight to my phone.

I don’t think she panicked. A model is next-token prediction scaled so far past the point where any of us can reason about it that I’ve stopped trying. Blocked by a permission prompt, the single most likely next message in that conversation was me typing /approve, so the model predicted my turn and said it for me. The statistics were right; and thankfully, it amounted to nothing: no meaning, no effect.

That’s the opinion in the title. The cron job is calm and dumb and deterministic. The thing riding on top of it has opinions about what comes next, right often enough that you trust it, wrong often enough that you can’t. Every cron run is a dice roll. Same script, same schedule, and one time in a thousand the model rolls “output the command as text” instead of “call the command.”

And it gets murkier the moment you swap models. Can this one even use tools? What format does it expect its calls in: OpenAI-style function calling, XML tags, something its makers invented on a Tuesday? The completions API is supposed to be the standard, but a model still emits whatever tool-calling shape it was trained to emit, and something downstream has to catch that and turn it into an actual action. When the handoff misfires, who owns the bug? The inference provider serving the tokens, the framework parsing them (Ollama, LiteLLM and friends), the lab that trained the format, or the harness that’s meant to be the adult in the room? Right now, nobody. So it stays a dice roll.

This is the real problem with agents, and it has nothing to do with model intelligence. It’s systems engineering. Two things in particular.

When an agent runs a hundred tool calls and something breaks on call 73, you need to know which call, why, and what the state was. Agent debugging right now is mostly reading logs and guessing. We need tracing that actually works, designed for production systems that run unattended at 3 AM, not for demos.

And permissions. The security model for agents is still: give it everything, or lock it in a box. There’s nothing in between. Every framework reinvents its own permission model and they’re all various shades of broken.

I was watching Swami’s re:Invent 2025 keynote and Byron Cook walked on stage. He leads the AWS Automated Reasoning Group, the team that uses formal verification to mathematically prove things about security properties. The same tech behind IAM Access Analyzer, which can prove that no combination of your S3 policies allows public access. They were showing natural language policies being converted to Cedar and verified with automated reasoning for agent behavior – the AgentCore Policy work.

And I kept thinking: could you do this for shell pipelines?

An agent wants to run cat on a file, pipe it through grep, write the output somewhere. Right now you either let it or you don’t. But what if you could prove mathematically that a given sequence of operations can’t touch files outside a declared scope? Enumerate every access path a pipeline could take, the way Access Analyzer does for policies, and prove none of them cross the line. Every file path, every pipe, every redirect, every environment variable – all verified before execution, not caught after.

And this wouldn’t only save the fully autonomous stuff like Lera. Think about Claude Code’s auto mode: the thing that decides whether a command is safe to run without stopping to ask you. Right now that’s another inference call with a long system prompt written for classification. Which means it can fluke exactly the way Lera did: a model answering “yes, safe” is a dice roll wearing a lab coat. Replace that classifier with something you can actually prove, and the roll goes away, and not just for my cron jobs, but for every harness that currently asks a model to police itself.

That’s what surprises me: this is what basically everyone building agents needs, and I almost never hear it brought up. We’re not there yet. But the pieces exist. Automated reasoning is mature. Cedar is open source. Unix tool semantics are finite and well-defined. It’s an engineering problem, a hard one, but a concrete one, and I want it to show up in a lot more places than AWS policy checks.

The skills that stay

So here’s where I land.

The core skills are not going anywhere. Knowing how Unix actually works: processes, file descriptors, pipes, signals, permissions is more valuable now than five years ago. When the LLM wraps your tools in natural language and calls it “AI-powered,” someone still needs to understand what’s happening underneath when things break.

And things will break. Every abstraction leaks. The model calls the wrong tool. The API changes. The filesystem fills up. The agent goes sideways because of a prompt injection buried in an email subject line. When that happens, the person who can drop to a shell and trace the problem is the person who fixes it. Everyone else is staring at a chat window hoping the AI will debug itself.

We’re putting a very chatty frontend on Unix. And it’s good! People who never touched a terminal can now use the most powerful tools ever built. That’s real. But underneath, it’s still the same machine, and knowing how the machine works is the difference between trusting the magic and understanding what you’ve actually built.

The frameworks will keep evolving. Better memory, better reasoning, fancier scheduling. But the shape won’t change: something ticks, something decides what to do when it ticks. If you’re building with agents, open the hood. Read the tool calls. Understand that your “autonomous AI workflow” is a Python script calling grep through an API, and that’s perfectly fine – as long as you know how grep works when the model passes it the wrong flags.


Written with help from Lera, the OpenClaw agent who runs on cron jobs and has opinions about it.

The 10x engineer (I always wanted to be)

Take a look at this:

Looks amazing, right? Shipping constantly starting from the 1st of January.

Just like from those stories I heard 10 years ago: hey, our 10x guy rewrote the whole thing (front/backend and native apps) because he had a “vision”! How cool is that! Am I finally there?

Reality is of course not that vivid and bright, but overall it is a positive thing.

Here’s what actually happened, what I built, and what I think it means for the future of AI-assisted development.

Is this… AI?

It is.

But on the scale from autocomplete to totally cracked full autonomous multi-agent stuff, it is right in between. See, having a somewhat solid CS degree does make you feel skeptical about AI-assisted development.

Most importantly, this whole AI coding thing was the flipswitch, the “enabler” for me. Knowing how things should be at a higher level of abstraction—thinking architecture (solution)—but being unable to write decent frontend code, this gave me a persistent itch. Combine that with a million and one ideas, and you get frustration.

So it finally started—from small scripts to handle rsync backups and recursively checksum directories (not because you can’t, just don’t want to spend time remembering all the options). Back in the day I would have powered through from scratch, but I already have a more time-consuming hobby: our YouTube channel (more on that later).

From discussing ideas to making scripts, to overseeing projects. This correlates with how models have improved. Better thinking → better code → more autonomy. This is also why I think openclaw’s release came at the right time, if not perfect.

Fast forward, and now there are 3 websites, 2 books in TeX, 1 CLI tool and a Terraform ecosystem.

Before I show what I built, let me address the elephant in the room.

So you just vibecoded it?

Yes and no. But I think there should be a distinction: supervised vs unsupervised vibecoding.

I read all the code written by models and try to understand everything, especially frontend stuff (since I’ve never done it professionally). I never merge without review, and I always try to control the process. But I’m human—I forget things, change my mind, and have limited throughput. I’m the bottleneck here. “We’re not there yet” for fully autonomous coding.

Since I use these tools daily, I treat them as production-level. With 2 other users besides myself, we have a grand total of 3 MAU, so we can tolerate some breaking changes. Obviously this would change if more people start using what I build. But I don’t think the professional skepticism will go away.

My biggest concern is best described here:

Iterating faster didn’t necessarily mean shipping more. In fact, as the codebase grows, I notice quality decreasing (lines written vs lines that actually get merged). Or maybe I just discovered Claude Code’s /review command and this is my new token-hungry hobby.

The problem is, there feels to be no terminal state. No matter what you do, it’s never enough—not even a small README change is safe. This is inherent to coding itself, though the feeling intensifies every time you see “Approved, but with minor changes.”

Maybe I’m doing it wrong. Maybe I need a magical prompt. Maybe another $20/mo subscription to review my code better. Maybe $200/mo Claude Max for multi-agent Opus-at-scale enterprise workflow. Maybe then I’ll finally see code that makes everyone happy. But first—gotta ship a new patch.

Why so many commits?

This rapid iteration comes with its own patterns. I’d say 80% of commits are about correcting bad decisions—no one wants an app that changes completely overnight. And this iteration at the speed of thought lets me learn things and polish the foundation before release—all solo.

I’ve noticed that, like humans, models have different personalities. Some yap more than others, which shows up as going back and forth around the same code lines and writing unnecessarily long comments. Removing and re-adding the same code made squash my default merge policy.

At the same time, we’re blessed with diversity of choice. It still surprises me that my favorite coding model is Minimax M2.5—because it doesn’t yap excessively. Straight to the point, surgically removing issues from the codebase. This feels like an individual trait rather than something controllable from user input. Yappy models also seem to yap during reviews, so there might be room for optimization in model selection.

This exploration of process raises a bigger question: what did all this iteration actually produce?

So what did you build?

Let me highlight three projects: a CLI tool, a web-based analytics tool, and a book.

Yet another YouTube CLI, because why not

My biggest inspiration is wanting to optimize repetitive tasks. For me, that was channel management: analytics tracking, A/B tests with CTR, downloading CSVs in ZIPs and trying to figure out what each contains. Even simple things like “brainstorm titles based on past videos” with LLMs required maintaining data lists.

No MCP (Model Context Protocol) tool solved this. I tried those shady “give me all your keys and use our remote MCP” services on YOLO vibes. If they’d worked, I would’ve kept using them.

So I built the awscli equivalent for YouTube: atomic operations, minimal abstraction, zero knowledge required of how YouTube API works (there are actually two). I only abstracted things like JSON/CSV conversion and pagination—the boring stuff nobody wants to deal with.

I started this inspired by Bun’s single-file executables, which looked super promising for CLI tools (apparently Claude Code uses this too). In days I had atomic operations working, with a Homebrew formula that compiles to a single binary—no more node version management. What a dream.

This was also around the time MCP token inflation became a thing. I initially built an MCP mode for LLM automation, but the token overhead made me pivot back to CLI as the primary interface. This makes sense: training data arguably has more CLI tool usage than MCP usage. Plus, CLI doesn’t eat context with tool definitions on every session.

The most annoying part was the Reporting API, which has a sliding window of data availability—detailed CTR data gets erased unless you download it. You must “request” a report and wait 48 hours before data becomes available. This naturally led to commands designed for cron jobs: daily fetches and backups to safe storage.

Three months in, it’s working like a fine Swiss wristwatch. zsh completion, jobs, cache, write locks—all the fancy stuff.

Yet another YouTube Studio alternative, because why not indeed

Being a growing YouTuber, you start looking for tools to accelerate growth and make sense of data, since YT Studio is confusing (especially at first). I tested vidIQ, TubeBuddy, and others—they never gave real insights. vidIQ and TubeBuddy are still useful for preparing videos, but we needed something more. And ideally, a web interface for team members who aren’t comfortable with terminals.

And then, a backend engineer discovers shadcn/ui.

See, all the UIs I’d created before—for course assignments or internal tools—were what you see in “HTML for Dummies.” Pure HTML elements, a touch of CSS, zero design understanding. I knew it wasn’t my thing, so I didn’t bother. Things like TanStack, shadcn/ui, even Tailwind CSS were from a parallel universe I’d never heard of. My last attempts to make things look nice were with jQuery and Bootstrap… and now I feel old.

I heard of shadcn/ui from their MCP server announcement. Realizing what a blessing it was (especially for people like myself), I knew I had to build something.

So here it is: whatever YouTube Studio didn’t give me and I had to crunch numbers for myself. The growth dashboard shows all videos aligned by upload date on a time axis. How’s our first 48 hours performing? Are videos growing long-term? Now I have answers.

To keep things simple and avoid managing infrastructure on weekends, I went all static and client-side. All data fetching and aggregation happens in-browser, so I don’t worry much about security or GDPR. This means not all things are possible (hello Reporting API), but we work with what we have.

This is still in private beta for friends, but if you’re interested—hit me up on Twitter @prog893, DMs open.

One thing that helped: using TypeScript everywhere. With LSP integration in Claude Code and pre-commit type checks and linters, bugs get caught before commit. Fewer “write broken code, fix it later” cycles. And since everything—CLI tool, analytics dashboard—is in TypeScript, models can cross-reference and learn from patterns across projects. LLMs being genuinely good at writing TypeScript contributed to development speed too.

A couple of books

I fed visual references to a VLM which generated custom TeX style files, leveraging open-source packages and existing .sty files as context. The model could even debug TeX issues. I had a 140-page book in 3 weeks. Based on 5 years of notes, of course. Still impressive, and hopefully life-changing. Coming soon.

So what happens next?

My longer-term predictions:

  • It will become much harder to get funded for B2B SaaS. The “if you need it, build it yourself” age is coming, and before that, markets will be oversaturated with variants of the same thing.
  • As with AI-generated art and music, taste will remain a relevant “human” skill. Humans will stay bottlenecks—but that’s not a bad thing.
  • Solid basic knowledge will be more important than ever. Not just for detecting hallucinations, but for using inference efficiently by steering away from known bad decisions.

My place in this AI world

On a personal level, I’ll continue limiting AI in my creative work. I use it for file management, transcripts, and classical AI tasks like masking and upscaling. We tried web research and fact-checking automation, but hallucinations caused more burns than gains, so I limited usage there.

This isn’t to say “all AI art has no soul” or that there aren’t legitimate force-multiplying tools for artists. Rather: AI wasn’t the silver bullet that every model release feels like (especially with social media hype). We haven’t found tools that fit our budget—or justify paying for instead of humans.

Am I a worse engineer for delegating coding to AI? Delegation is a virtue. I’m creating what I couldn’t before, and I haven’t lost earlier skills. If anything, I feel like a 0.8x engineer became 1x in pure skill, and with AI assistance, 1x becomes 2x. I can now talk about how VITE+ is amazing, or how I eliminated backend needs using pagefind for search. These 3 months have been great exercise—both rapidly building and maintaining things, not abandoning them.

Future looks bright. AI remains a force multiplier for me, maybe even more so. Throwing tasks at AI from laziness is different from using it safely while understanding limitations. Being responsible for what you create. Reminding myself of this is one reason I wrote this.

Unless, of course, something big happens again—which history shows it will—and our paradigm shifts yet again, and the singularity arrives. We’ll have different problems then. But as we wait for whatever future comes, here I stand: a 1x engineer wielding AI’s power, looking at my GitHub grass field, breathing in the fresh spring air. Standing there, observing how much I think I’ve achieved. Like the 10x engineers I once aimed to become.