Around the end of April 2026, my Tuesday morning routine looked like this: wake up at 6:30, walk to the kitchen, and before the coffee was ready, type wrangler tail claudelab-net into a terminal. I run four Lab sites on Cloudflare Workers — Claude Lab, Gemini Lab, Antigravity Lab, Rork Lab — plus two storytelling blogs (Lacrima and Mystery) that share the same edge-runtime habits. Six Workers in total. Errors the overnight content pipeline left behind, a 5xx spike at 3 a.m., a Stripe webhook that retried itself into a 400. None of these could be ignored, and walking through them one log stream at a time was quietly draining ninety minutes from every morning for three months.
I have been running an indie app business as Dolice since 2014, and I am used to treating server-log reading as an investment. The wallpaper and mindfulness apps I publish have crossed 50 million downloads cumulatively, and checking AdMob behavior and Crashlytics traces every morning has been part of the rhythm for years. But once the four Lab sites and the two blogs started running in parallel, log interpretation had clearly outgrown one human's morning. What follows is a record of three weeks during which I handed log interpretation to Antigravity's Inline Agent and Background Agent, step by step.
When morning log review was eating ninety minutes
The trigger was a Monday in mid-April. Three consecutive runs of the Claude Lab autopublish schedule had returned 500, and I caught it four hours after the first failure. Cloudflare's Email Notifications do arrive, but with six Workers worth of mail piling up in the morning inbox, the ones that actually need action get buried. Softer anomalies — "quota burn is higher than usual today," "ASSETS-binding fetches are intermittently failing" — never show up in email at all.
Running wrangler tail one session at a time gives you real-time visibility, but opening six terminal splits makes the screen unreadable. You can pipe through grep, but the filter expression is different for every kind of incident. A naive 5\d\d filter pulls in Cloudflare's own health-check traffic and washes the real signal away.
My grandfathers were both temple carpenters in Japan, and there is a line they used to repeat: "Keep the parts that need attention where you can see them every day." This was the opposite situation — the parts were visible, but the cost of looking was too high. Around April 20, I accepted that this was the kind of work where a first-pass triage should happen before a human's eye gets involved.
The setup: have Antigravity drive wrangler tail from the terminal
Antigravity's Inline Agent can run terminal commands and read their stdout. I fed wrangler tail --format json into it and let the agent parse the JSON line by line. The actual command I hand it is short:
# Stream logs from all six sites in parallel
for SITE in claudelab-net gemilab-net antigravitylab-net rorklab-net lacrima-jp the-mystery-org; do
wrangler tail "$SITE" --format json &
done
# Collect for 30 seconds, then stop
sleep 30 && kill $(jobs -p)I described this in the project's AGENTS.md as: "First thirty seconds of the morning, capture recent logs across six sites and return the count of level === 'error' records plus the count of outcome === 'exceededCpu' records, along with representative samples." During the first few days the agent occasionally opened a terminal session in the wrong working directory and couldn't find wrangler. Adding one sentence — "always start the terminal from .dolice-labs/ops/ at the project root" — fixed that for good.
I deliberately use the Inline Agent rather than a Background Agent for this. Two reasons: I wanted the run to overlap with the four minutes it takes me to make coffee, and I wanted to be able to ask the agent follow-up questions immediately. "These three 400s on the Stripe webhook — is that the test-mode toggle I flipped last night, or is it real traffic?" was a question that needed context only I could provide.
What I trusted the agent with, and what I kept
After three weeks the split between "delegable" and "non-delegable" sharpened.
I came to trust the agent with three classes of work.
- Status-code summarization. From a few hundred lines of log streamed over thirty seconds, return counts by 2xx / 4xx / 5xx and surface three representative 5xx URLs. The Inline Agent does this reliably and well.
- Filtering known noise. Cloudflare's health-checks,
/.well-known/crawler traffic, bot 404s — the kind of thing labeled "safe to ignore." If I keep an "ignore list" in AGENTS.md as bullet points, the agent reproduces the same judgment every morning. - Cleaning up exception stacks from Worker internals. My code throws exceptions with mixed Japanese and English messages because of localization, and they wrap badly in a terminal. Asking the agent to "reformat as a bulleted list with filename, line number, and exception message" makes the result genuinely readable.
The two things I did not delegate were:
- Rollback decisions. The agent can speculate about whether the most recent deploy is the cause, but the authority to run
wrangler rollbackis reserved. I have not yet written my own rollback heuristics into AGENTS.md in a way I would trust unattended. - Stripe webhook interpretation. Whether a webhook 400 means "a test-mode rehearsal" or "a real payment we missed" cannot be inferred from the log alone. It depends on the format of the payment ID and on what state the Stripe dashboard is in. That is still a human task.
Three walls I ran into
It was not all smooth.
Wall 1: wrangler tail JSON schema varies by Worker type. Exactly one of the six sites had Smart Placement enabled, and its log records put the request URL in a slightly different field, plus there was extra smartPlacement metadata. For the first few days the agent kept replying "I cannot find the URL." Adding a one-line pseudo-snippet to AGENTS.md — event.request.url ?? event.url ?? '(unknown)' — resolved it.
Wall 2: Terminal sessions time out. The Inline Agent's terminal session sometimes closes mid-collection, and kill: command not found leaks into the output. Switching from parallel streaming across six sites to serial streaming, five seconds per site, stabilized the run. Parallel looks more efficient on paper, but when the agent has to parse a much larger blob at once, accuracy slips.
Wall 3: "Not-quite-anomalies." The morning after a Lacrima post went viral, there were no 5xx errors at all, but CPU usage spiked to eight times the baseline. That sits on the boundary of what counts as an anomaly. The agent reports "anomaly detected," but to me it is "expected popularity surge." Encoding this kind of context-dependent judgment into AGENTS.md is harder than I thought, and I am still iterating.
Numbers that changed, and what stayed the same
Subjectively, the time I spend on morning log review dropped from about 90 minutes to about 25. Of those 25, roughly 5 are conversation with Antigravity, and 20 are decisions and action based on the agent's report. The 20 minutes of decision-and-action probably will not shrink further. If anything, the three weeks reinforced the sense that human judgment should remain the bottleneck.
Concrete numbers I have been keeping:
- Morning Worker log review time: ~90 min → ~25 min
- Average lag from first error to my own first-pass triage: ~3–4 hours → ~30 min (because the shorter review enabled a second pass mid-day)
- Unread Cloudflare email notifications in the morning inbox: 40–60 → under 10 (anything the agent labels "ignore" got muted at the Cloudflare Dashboard notification settings)
What did not change: nighttime incidents still require a human (me) to wake up and respond, and the final "is this actually an anomaly" call still belongs to a person. In 1997, at sixteen, I first encountered the internet and learned that posting a question to an overseas forum and waiting for an answer meant my system was still my responsibility to watch over. Twenty-nine years later, the tools have changed but the underlying feeling has not. The agent raises the resolution of "watching over," but it is not the watching itself.
What I want to try next
Two experiments are on the list for the next three weeks.
The first is a transition to the Background Agent. The Inline Agent is conversational and pleasant, but it only runs when I am at the machine. Instead of "Inline Agent reads through the overnight backlog when I sit down in the morning," I would rather have the Background Agent perform first-pass triage through the night and hand me a summary at breakfast. I am holding off until the permission model and the Slack notification rules feel solid.
The second is folding the AdMob and Crashlytics morning routines into the same agent conversation. The metrics I check for the app business every morning, and the six-site Worker logs, should be readable in a single sequence. That means unifying AGENTS.md from two separate setups today into one shared configuration.
I want my children — who live apart from me — to be able to ask one day, "How did you run all of this?" and find an honest record. "I gradually replaced time spent looking at logs with time spent on judgment" is the answer I want to be able to point to. These three weeks were one rung in that direction.
If any of this is useful to your own setup, I would be glad. Thank you for reading.