signal_collector
Reads live performance per ad-group, search-term volume, audience overlap, and conversion lag. Builds the rolling window every cycle starts from.
// writes
performance_window
// campaign specialist
Eight specialist skills wired into a planner-judge-executor loop — per campaign, per channel. Every move judged against policy, gated by rate limits, recorded as an ad_decision_log row with one-click reversal.
cycle : 2026-05-25T09:00Z
channel : google_ads
campaign : pmax 'EU/Linen/Throws'
planner : 3 candidate moves
├─ ADJUST_BUDGET +18%
├─ BID_STRATEGY → target_roas
└─ NEGATIVE_TERMS +4
judge : score 0.91 (above 0.85 floor)
policy_mode = autonomous
rate_limits = within bounds
executor : applying 1/3
→ ADJUST_BUDGET applied
─ BID_STRATEGY queued (24h)
─ NEGATIVE_TERMS queued (judge2)
logged : ad_decision_log#21498
next_cycle : 2026-05-25T13:00Z// eight skills
Reads live performance per ad-group, search-term volume, audience overlap, and conversion lag. Builds the rolling window every cycle starts from.
// writes
performance_window
Adjusts budget caps and bid strategies inside policy windows. Reasons cited by anomaly headroom — never pace-blind raises.
// writes
ADJUST_BUDGET · BID_STRATEGY
Detects creative fatigue per ad-group via decay slope. Briefs fresh angles — RSAs, image concepts, copy variants — before the budget bleeds.
// writes
CREATIVE_BRIEF
Turns briefs into ready assets — gpt-image-1 for images, on-brand RSA copy, naming conventions enforced. Stored in Supabase, ready for push.
// writes
creative_assets
Uploads through AssetService and links via AdGroupAssetService. Idempotent — re-runs never duplicate, every push leaves an ad_decision_log row.
// writes
Google Ads · Meta
Maintains Customer Match lists via OfflineUserDataJobService — refunder exclusion, complaint cohorts, high-LTV repeaters, all rebuilt nightly.
// writes
AUDIENCE_WRITE
Subscribes to Catalog Specialist transitions. When a SKU becomes ON_DISCOUNT, its ads update copy + bid; when DRAFTED, ads pause. No human relay.
// writes
cross-agent bus
Watches for spend spikes, conversion drops, MER breaks. Auto-pauses inside rate-limit bounds, files the evidence, pings the operator with the row.
// writes
PAUSE · RESUME
// channels
google-ads-api (Python)
Marketing API v19
Marketing API
Microsoft Advertising
// customer match
Anyone refunded twice in 90d, excluded from prospecting.
Top decile LTV, repeat customers — fed as lookalike seed and lifecycle retargeting.
Customers who triggered escalations, suppressed from acquisition until resolved.
Bought within 48h of a discount window — primed for clearance offers, suppressed from full-price.
// how it works
Every list ships with a counterpart suppression list — your refunders never see a prospecting ad again.
// ad_decision_log
agent : campaign
skill : bid_pacing
channel : google_ads
target : pmax 'EU/Linen/Throws'
action : ADJUST_BUDGET
delta : +18% daily cap (€640 → €755)
window : 14d perf window
reason : MER 4.1 → 4.8 (↑17%)
search-impr-share headroom = 38%
competitor-overlap delta = −9%
evidence : [signal_window#11203,
anomaly_check#771,
judge_score=0.91,
policy_mode=autonomous]
rate_limit : budget_changes_per_week 3/8 (ok)
applied_at : 2026-05-25T09:14:02Z
applied_by : campaign_agent.bid_pacing.v3
status : APPLIED
reversal : ADJUST_BUDGET delta=−18% (1-click)// llm cost tracking
// llm_monthly_cap_usd
$240
Per store, configurable per channel.
// purpose tags
18 unique
Every call attributed to a skill, never anonymous spend.
// auto-degrade
read-only
Over cap → cease generative writes, alert operator.
// campaign specialist
OAuth your ad accounts and the Campaign Specialist will run its first plan-judge cycle in dry-run inside an hour. Flip the policy mode to autonomous when you trust what you see.
Rate-limited · Reversible · Append-only