Daily: spend pacing, disapprovals, and threshold breaches. Weekly: the full audit ritual a $300K/month agency runs — zero-conversion search terms, creative fatigue, audience saturation, quality scores, and a written “what moved and what I'd do”.
Daily one-liner when something breaches; the full weekly audit every Monday with a written narrative — what moved, and what a competent media buyer would do about it.
The AED 720K ran for 14 months without any of these checks existing. The weekly ritual is adopted verbatim from a proven playbook run at $300K/month of managed spend — we didn't invent the checklist, we adopted a battle-tested one.
Two cadences, one loop
Read-only: spend, results, terms, frequencies
Daily breaches; Monday's five-check audit
Breaches same-day; narrative weekly
Fatigue flags → creative refresh; junk terms → the janitor
For implementers and the technically curious. The full build sheet — verified queries, thresholds, and build notes — lives on the specs page.
| System | Role in this loop |
|---|---|
| Ads adapter layerads_common.py | One shared, environment-gated adapter for Google and Meta data, used by all four ads loops. It has a fixture mode, so every threshold was provable with synthetic data before any credential existed. |
| Agent Vaultcredential store | Where API keys live. Loops get read-only credentials from the vault; nothing is hardcoded in scripts. |
| Hermesagent runtime on our server | The scheduler that wakes the loop up. Each loop is a cron job under a Hermes profile; the planned bizops profile will host the business digests (IT loops run under vpsops). |
| Healthcheckshealthchecks.huxapps.com | The dead-man's switch. The loop pings it only after a clean run — if the loop dies or errors, the ping stops and Healthchecks raises the alarm independently. This is how 'never silent' is enforced by machinery, not promises. |
| Email renderer + gwsrender_email.py | All digests pass through one shared renderer: Huxberry-branded HTML, tables for repeated rows, a coral 'needs your response' box when the loop has questions, and an arrow link on every record. Sent from the loops mailbox via the Google Workspace CLI. |
| Loop chassisloop_common.py | Shared plumbing every loop reuses instead of reinventing: state files, run-over-run diffing, Metabase drill-down link building, quiet-on-green notify logic. |
| Credential-expiry watchdogexisting loop | The Meta long-lived token dies ~2 months in, silently — it's wired into the expiry check from day one or this loop dies quietly at week 8. |
| Model / brain | What it does here |
|---|---|
| None at run timedeterministic script | A normal cycle is a plain Python script — no AI tokens are spent unless a diagnosis or judgment step is actually needed. AI wrote the script; the script does the rounds. |
| GPT-5.5 via Codexthe bulk-work model | Wrote and maintains the mechanical parts — SQL, diffing, digest assembly. Effectively free on our existing subscription, so routine cycles cost almost nothing. |
| Claude Opusthe judgment model | Reviews alert wording, thresholds, and anything a human will read and act on. Post-Fable, Opus owns everything that ships. |
Account history per campaign/ad set — pacing, CTR and frequency baselines that make “fatigue” and “saturation” computable.
Daily breach one-liners; Monday's full audit with the written narrative. Every finding carries its numbers.
Read-only credentials from the vault. Only meaningful after the tracking foundation — before that, “results” would be a lie, so it waits.