Loop HUX-L5 · Marketing — Huxberry.com · reports to Sherif

When an ad wears out, replacements are already drafted.

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.

Built — awaiting credentialsWave 4🕐 Event-driven⚙️ Composite of L3 + L1
Part 1 — the plain-english view

Detection to draft with zero human effort. Publishing still needs a tap.

What it watches
  • The ads watchdog's fatigue flags: frequency creep + CTR decline crossing thresholds together
  • Nothing else — it's wiring between two proven loops, not new machinery
When & how it speaks

When triggered: “Ad X is wearing out — three replacement drafts are in the review folder.” One message, work already done.

Why it exists

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.

2 signals
must agree before a trigger: frequency creep AND click-through decline
0 effort
from detection to drafts-in-folder — the human only judges the result
1 month
of clean L1 + L3 operation required before this wiring switches on
📉

L3 flags fatigue

Frequency ↑, CTR ↓ past thresholds

🔗

Trigger fires

A machine-readable hand-off file — or a webhook later

🎨

L1 run opens

Replacement concepts drafted automatically

📁

Drafts land

In the photo library's review folder

Sherif approves

Publish remains human, as everywhere

What it will never doNever publishes; never edits the running ad. It only makes replacements exist earlier.
Where it stands today · July 2026Built and fixture-proven as part of the ads quartet: L3's hand-off file drives the refresh trigger, thresholds tested including deliberate non-triggers, and a degraded upstream (no data) propagates honestly instead of guessing. Switches on after L1 and L3 have a clean month.
Part 2 — under the hood

How it's wired: systems, models, and the path a number takes.

For implementers and the technically curious. The full build sheet — verified queries, thresholds, and build notes — lives on the specs page.

ReadsL3 hand-off file
Fatigue flags with evidence
Stephux_l5_refresh_trigger.py
Threshold check: both signals, sustained
StepL1 creative run
Auto-opened with the tiring ad's brief context
StateDAM review folder
Drafts waiting before anyone asked
Human gateSherif
Approves; humans publish
System we read Automated step State / memory Human decision
SystemRole in this loop
Ads adapter layerads_common.pyOne 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 folderWhere the auto-commissioned drafts land — same scoped write as L1's.
Hermesagent runtime on our serverThe 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.comThe 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 / brainWhat it does here
None at run timedeterministic scriptA 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 modelReviews alert wording, thresholds, and anything a human will read and act on. Post-Fable, Opus owns everything that ships.
State & memory

Trigger history — which ads have already been refreshed, so one tiring ad doesn't commission drafts weekly.

Delivery

One message per trigger, pointing at the waiting drafts.

Safety rails

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.

Before it can run for real
  • L1 and L3 live with a clean month each
  • Then: wire the trigger (it's wiring, not new machinery)
Full build sheet →