The proactive composite: the ads watchdog detects a tiring ad (frequency up, clicks down) and automatically opens a creative-factory run — so by the time a human looks, fresh drafts are waiting in the review folder.
When triggered: “Ad X is wearing out — three replacement drafts are in the review folder.” One message, work already done.
Creative fatigue is the most predictable failure in paid social — and the most predictably ignored, because noticing it and commissioning replacements are two separate chores. This loop fuses them into one automatic hand-off.
Frequency ↑, CTR ↓ past thresholds
A machine-readable hand-off file — or a webhook later
Replacement concepts drafted automatically
In the photo library's review folder
Publish remains human, as everywhere
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. |
| Directus DAMreview folder | Where the auto-commissioned drafts land — same scoped write as L1's. |
| 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. |
| 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. |
| Claude Opusthe judgment model | Reviews alert wording, thresholds, and anything a human will read and act on. Post-Fable, Opus owns everything that ships. |
Trigger history — which ads have already been refreshed, so one tiring ad doesn't commission drafts weekly.
One message per trigger, pointing at the waiting drafts.
Composite of two already-gated loops; adds no new permissions of its own. Event-driven upgrade path (webhook instead of files) is planned once the clock-driven version is boring.