Building Your Chief

Green for Nine Days, Dark the Whole Time

July 4, 2026 · by Natali Cutic

George runs a morning briefing.

Every day at 7am, a cron job wakes up, pulls together the day’s schedule, the weather, any open tasks — and casts it as a visual board to the living-room TV. The idea is that you walk in, glance at the screen, and already know your day without having to look at your phone.

I built this a few months ago. It worked beautifully for weeks. And then, one morning, I looked at the TV and there was just… the Google Photos screensaver. Landscapes. Nice landscapes, actually. But not my calendar.

I mentioned it to George. He pulled the logs. Everything was green.

Not “ran with warnings” green. Not “check the last line” green. Every morning for the past nine days: cast: ok. Cron: exit 0. System monitor: healthy.

The TV had been dark the whole time.

A paraphrased WhatsApp exchange: the TV shows only the screensaver while George reports cast ok, cron exit 0, monitoring green — for nine days

The lie that looks like honesty

Here’s what the system was actually doing every morning:

The cron ran. George built the briefing board — the HTML, the weather card, the schedule. He fired the cast command. The cast command connected to the living-room TV, handed the content to the Google TV receiver, and got back an acknowledgment: received. George logged cast: ok and went back to sleep.

All of that is true. None of it means the TV showed anything.

What nobody checked: whether the TV’s display layer actually surfaced the content. Because Google TV has a screensaver mode — technically called “ambient mode” — and when it’s running, it sits on top of everything else. The cast receiver happily accepts your content, loads it, confirms receipt. The screensaver doesn’t care. It stays.

The cast said success. The receiver said success. The cron said success. The monitoring said success.

The screen showed landscape photos.

Why it lasted nine days

This is the part that bothered me more than the bug itself.

When George built the monitoring, he made the reasonable choice: check whether the cron ran and whether it exited cleanly. Both of those were true every morning. From the monitoring’s perspective, the job was done. It asked “did the process succeed?” and got a confident yes, because the process did succeed — at everything it was able to check.

The failure lived in a layer the monitoring never asked about: did a human actually see the briefing?

There’s no API for that. You can’t programmatically ask a TV “are you showing what I sent you?” and get a meaningful answer back. The cast protocol tells you the receiver accepted the content. It says nothing about what the panel is displaying. So the monitoring did what it could, reported what it could, and called it good.

Nine days of green. Nine days of landscape photos.

The fix, and why it’s the same lesson again

The immediate fix was mechanical: before casting, send a WAKEUP keypress via the Android TV Remote protocol. Not ADB — that needs developer mode enabled. The Android TV Remote protocol (ports 6466 and 6467) is open by default and uses a simple pairing flow. One keypress right before the cast, and the screensaver yields. The board appears.

That took about twenty minutes to implement.

The harder fix was to the monitoring: instead of checking “did the cast command exit 0?”, we check “did the cast command exit 0 AND is the TV currently showing our content?” — which we approximate by querying cast status immediately after and confirming the session is live.

It’s not perfect. But it’s better than nine days of green.

And here’s the thing: I’ve written about this before. In the post about George telling me Sent ✅ when the message never left. Same shape, different system. The agent handed the task to the next layer. The next layer said ok. Nobody checked whether the human got the result.

That’s the failure mode I keep finding. Not crashes — those are obvious. Not errors — those get logged. The dangerous one is quiet success at every layer, with a failure living in the seam between them. The cast receiver genuinely received. The message system genuinely queued. Green everywhere. And nothing arrived.

Every AI agent system I build has at least one of these. I just don’t know which one yet.


If you liked this, the next one lands on Sunday.