ANTIGRAVITY LABJP
Articles/Integrations
Integrations/2026-05-24Advanced

Catching "Running but Doing Nothing" Antigravity Subagents — A 3-Layer Observability Pattern Across Six Production Apps

Running Antigravity subagents across six production apps surfaced more than ten silent failures every month — exits clean, logs green, but nothing actually happened. Here is the Heartbeat / Output Trace / Decision Log pattern I now use to catch them inside 60 seconds, with code, GCP costs, and four months of running numbers.

antigravity429observability18subagent3bigquery4cloud-scheduleroperations22

Premium Article

At 2 a.m. the Cloud Scheduler dashboard was a wall of green "success" rows, and yet when I opened the App Store in the morning, nothing on the storefront had changed since the night before. During the first month of running Antigravity subagents across six of my apps, this happened eleven times. There were no exceptions in the logs. Exit codes were all zero. The agents had "run" — they just hadn't actually done anything.

I have been running a personal app business since 2014 (a little over 50 million cumulative downloads across six apps), and the silent failure mode that Antigravity's Background Agents and subagents added to my operations was a different animal from the crashes I was used to. Crashes you can see. These ones you cannot. My grandfather, who was a temple carpenter, used to say that a beam with a visible crack is far less scary than a beam that returns the wrong sound when you tap it. I really started thinking about that quote again around month four of agent operations.

This article is the implementation memo of the three-layer Observability stack I rebuilt afterward (Heartbeat / Output Trace / Decision Log), the GCP setup that keeps it under $7 a month, and the numbers from four months of running it across six production apps. It is the design I now use to keep "running but doing nothing" out of production — the failure mode Antigravity's own logs do not surface.

The Three Archetypes of Silent Failure — stale context / no-op loop / silent retry

Before any of the layers, it is worth pulling apart what "silent failure" actually means here. Run Antigravity Background Agents and subagents long enough and you will hit these three flavors.

stale context — treating an old snapshot as ground truth

The agent does exactly what you asked, but the repository snapshot, AdMob cache, or Firestore document it is looking at is hours or even days old. It concludes "nothing has changed" and exits cleanly. The annoying part is that real "nothing changed" days exist too, so you cannot simply equate "zero output" with "failure."

no-op loop — tasks advance but no side effect ever fires

Tool calls happen, but they are all read-only — grep, read_file, that kind of thing. The agent reaches "conclusion: no issues" and terminates normally. The write-side tools you actually wanted to fire — write_file, gh pr create, an update against your backend — were never invoked.

silent retry — internal retries swallow real errors

The Antigravity subagent's own retry policy quietly re-runs an external API call when it sees a 5xx. After three tries, it returns the same stale value the first attempt got, and exits "successfully." The logs say success, but the data you took action on never reflected the API's current state.

Each of the three shows up differently, so the detection logic has to be split out per archetype. My first attempt was a single catch-all alert, and the false-positive rate hit 22% inside a month. Operations was unrunnable. So I broke it apart.

The 3-Layer Picture, and Why the Stacking Order Matters

To catch silent failures you need three independent sources of truth, layered outside the agent itself. The order I now use across six apps is:

  1. Layer 1 Heartbeat — measure, from the outside, whether the agent actually started and finished
  2. Layer 2 Output Trace — hash the artifacts to confirm something actually changed
  3. Layer 3 Decision Log — record tool calls so you can answer "why didn't anything change?"

The order is non-negotiable. If you build Decision Log first, the volume explodes and the data becomes unreadable, and you abandon the whole thing. Heartbeat + Output Trace alone catches about 78% of failures, so my recommendation is to ship those two as a minimal product, then close the remaining 22% with Decision Log.

Cloud Scheduler (cron)
    ↓ HTTP POST (start_token)
Antigravity Subagent (your workload)
    ├─ [Layer 1] Heartbeat probe → BigQuery (latency, exit_code)
    ├─ [Layer 2] Output hash diff → BigQuery (changed?, bytes)
    └─ [Layer 3] Decision log JSON → BigQuery (tool calls, reasoning)
                            ↓
              Scheduled query (every 5 min via Cloud Scheduler)
                            ↓
         Slack #ops (low severity) / PagerDuty (high severity)

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A minimal Heartbeat + result-hash setup that catches "clean exit, zero output" failures inside 60 seconds
Three silent-failure archetypes (stale context / no-op loop / silent retry) and the rule each one needs to be caught
A Cloud Scheduler + BigQuery Streaming Insert + Slack/PagerDuty stack that runs for under $7/month, with retention windows that actually scale
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Integrations2026-07-08
When Successful Automation Quietly Stops Earning Its Keep: Designing for Value Decay and Retirement
A dashboard full of green success logs often hides the most dangerous kind of failure. Here is a design — with working code — for surfacing automations that keep succeeding while producing no value, and deciding whether to retire, repair, or keep them.
Integrations2026-06-16
When a Cloud Nightly Batch Drifts From Yesterday's Result — An Input Contract and Snapshot Design for Reproducibility
When you push a batch to a cloud ephemeral worker via the Managed Agents API, the environment assumptions you took for granted locally vanish. Here is a three-layer design — environment snapshot, input contract, seed pinning — that keeps the same input producing the same result.
Integrations2026-05-19
Three Weeks of Letting Antigravity Run wrangler tail Across Six Cloudflare Workers
I run six Cloudflare Workers in parallel — four Lab sites and two storytelling blogs — and the morning log review was quietly eating an hour and a half every day. Here is what changed when I handed wrangler tail interpretation to Antigravity's Inline Agent for three weeks, what I trusted it with, and what I kept for myself.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →