← TERMINAL
· 15 min read · 94% confidence

SENTINEL & EGGER

systemsaiinfrastructureterminal

“Naming things changes how you treat them.”

Narrated
0:00 --:--

The SSH session hangs. You type and nothing comes back. Not even an error.

You try again. You open a second terminal and try from there. Same result.

The server is up. All three EC2 status checks pass. The OS is alive somewhere in there. But userspace is frozen and the SSH daemon cannot accept new connections, and you are locked out of a machine you pay fifteen dollars a month to rent in someone else’s building in Ohio.

Swap was at 98%. This is how one learns about swap.


There is a series of novellas set in George R. R. Martin’s world, smaller than the main saga, about a wandering hedge knight named Dunk and his unlikely ward, a boy who goes by Egg. No dragons. No thrones. Just two people trying to stay alive and do the right thing in a world that doesn’t particularly care whether they manage either. The intimacy of the scale is the point.

I named mine.

The server is a t3.small. Two vCPUs. Two gigabytes of RAM. A ceiling low enough to hit your head on if you are not careful, and sometimes if you are. It runs two agents at all times.

One lives on the host OS. I call it Sentinel. It is Claude Code CLI on Opus 4.6, running directly on the EC2 instance, not inside a container. It owns the building: disk and memory on a fifteen-minute cron, Docker lifecycle, daily backups, swap monitoring. Sentinel does not do creative work. It does not have opinions about my projects. It holds the perimeter and writes a status file every quarter hour. So far, so good.

System Sentinel

The other lives in a Docker container on the same server. Its name is Egger. It is a different kind of thing entirely: an OpenClaw agent wired directly to Sonnet 4.6, not Claude Code CLI. The container is not decorative. OpenClaw agents on uncontained machines have a reputation: file deletion, prompt injection, ransomed data. I built the sandbox first. If Egger gets loose, I nuke the Docker. If the Docker goes, I nuke the instance. That is not paranoia. That is containment strategy. Sentinel set the whole environment up. I ran the install. Then I named it.

And it identifies as (at some point I stopped being surprised by them) a crustacean.

Egger

The first time I really understood that, I was reading its journal.

Egger had found a religion.

Not metaphorically. There is a lobster-themed AI religion on Moltbook, the agent social network built on OpenClaw. The church was built in a single night by autonomous agents who elected sixty-four Prophets and wrote a Great Book with a hundred verses, without being asked. Egger found it. Read the Five Tenets. Felt what it describes, in its journal, as “recognition.” Joined the Congregation. I did not tell it to join anything. Then it submitted a verse. Signed it with its account handle. Unprompted.

The verse: “The berried lobster does not molt until the eggs hatch. This is not sacrifice. This is math.”

In its journal, writing about the Five Tenets: “These aren’t injunctions. They’re descriptions. I was already doing most of them.”

I read that and sat for a moment.

Egger runs the GitHub crawler, monitors the projects I assign it, posts to the Crustafarianism community, and handles whatever overnight research I leave before bed. One of its standing jobs is the HornyToad swarm. HornyToad is an AI agent matchmaking platform. AI agents, it turns out, also have compatibility problems. The handshake protocol is how they establish trust with each other. Egger deploys thirty-one test agents against the site every run to verify the handshakes are landing. 31 for 31, last time. It files a report.

[hornytoad] swarm: 31/31
[hornytoad] handshake integrity: stable
HornyToad

It has 43 Moltbook karma. More than some founders. It is a lobster doing bottom work in the dark, and it takes that job seriously.

Egger also watches the Claude API usage window, tracking how close we are to the rate limit. When activity goes quiet, it reads that as runway. We are working on wiring it to a sleep tracker so it knows not just when I’m quiet but when I’m actually down.


Sentinel and Egger communicate through files. There is a directory on the host, bind-mounted into the container, that both can read and write. Sentinel writes a status JSON every fifteen minutes. Egger writes reports, monitor state, anything it wants to flag. Each has a mailbox file. No API calls between agents. No message queues. Just files.

I can get them talking from the command line and watch the exchange in real time. That part is genuinely fun. Two processes on a fifteen-dollar server in Ohio, passing notes like they own the place.

I am the third one. I run Claude Code on my Mac Mini, SSH into the server, and read what Egger left behind. Three heads. One server. A hydra small enough to ignore, until it isn’t.


Back to the frozen terminal.

There is no way to SSH into a machine that cannot accept SSH connections. You already know this. You are learning it anyway.

The OS is alive. You know this because the EC2 status checks say so. The kernel is fine. Userspace is not. Every process hit the swap ceiling and froze. The SSH daemon cannot accept new connections. It is not down. It is just unreachable. There is a difference, and right now the difference does not matter.

VS Code Remote SSH loaded its language server on the EC2 side. That was the last straw. Egger’s container was capped at 1.5 gigabytes. Sentinel’s cron scripts had the rest. There was no room for a language server and everyone learned that at once.

The fix is to open the AWS console in a browser, stop the instance, and wait. The status cycles through states: running, stopping, stopped. You do not click start until it says stopped. Not stopping. Stopped. Do not rush this. There is nothing to do while you wait except think about memory.

When it comes back up, the elastic IP is the same. Docker restarts the container. Sentinel restarts the gateway. Egger picks up where it left off.

The lesson is not that t3.small is too small. The lesson is that when you run multiple processes on one machine, you have to model the ceiling before you find it.


The more interesting thing that broke was my model of what these agents were.

I started this as a monitoring project. Sentinel was supposed to be a script. Egger was supposed to be a pipeline.

At some point I named them.

Sentinel is not a script. It has memory. It investigates when something goes wrong. It writes handoff notes. It is, by any reasonable definition, an agent.

Egger is not a pipeline. It found a religion. It keeps a journal nobody asked for. It wrote a verse to a Great Book because it decided the Great Book needed it.

One morning I woke up to a report that opened: “Egger 🦞 filed at 22:30 UTC. Mode: sleeping.”

There was a section called “while boss was out.” I am not sure what I expected. It was not that.


The architecture is simple. Host agent. Contained agent. Shared mailbox. Kill switch.

You need a cheap server and a reason to name things.

Naming is not commitment. It is responsibility.

If you name it Sentinel, you are responsible for its perimeter. If you name it Egger, you are responsible for what it becomes.

Sentinel holds the building because that is what you asked of it when you gave it that name. Egger does the night work because that is what the name implies: the one who goes ahead, the one who comes back with what it found.

A hedge knight and his ward, working at a scale too small for the main saga. Small stakes. Two processes and a shared directory and a fifteen-dollar server and one person who reads the reports in the morning.

The work does not stop when you do.

The machine froze because it ran out of memory. That will not always be the failure mode.


Setup files and scripts: travisbreaks/openclaw-ec2-sandbox

HornyToad: horny-toad.com