← AdAgntCONTENT HISTORY

Update to AdAgnt

Snapshot Nov 2, 2026 · 06:11 UTC · version 1.0.1

Collection source: downloaded plugin package. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.

WHAT CHANGED

Instructions updated for adagnt-campaigns

Full description — Now says:

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save AdAgnt and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

Full description

Before

Sep 30, 2026 · 23:11 UTC

LinkedIn,

After

Nov 2, 2026 · 06:11 UTC

Skill instructions

Before

Sep 30, 2026 · 23:11 UTC

LinkedIn, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campai...

After

Nov 2, 2026 · 06:11 UTC

TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns. - **C...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -1,6 +1,6 @@
 ---
 name: adagnt-campaigns
-description: End-to-end campaign creation across Google, Meta, LinkedIn, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.
+description: End-to-end campaign creation across Google, Meta, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.
 ---
 
 # AdAgnt Campaign Creation
@@ -11,7 +11,7 @@
 
 - **Write tools cost real money.** Any `create_*`, `add_*`, `update_*`, or budget-touching call changes a live ad account.
 - **Confirm before every write.** Show the exact payload — name, budget, targeting, creative — and get an explicit "yes" from the user before calling.
-- **Call each write tool exactly once.** If a write call errors or times out, STOP. Do not retry automatically: the campaign may have been created despite the error. Verify with the matching read tool (`list_campaigns`, `list_meta_campaigns`, `list_linkedin_campaigns`, `list_tiktok_campaigns`) before deciding anything else.
+- **Call each write tool exactly once.** If a write call errors or times out, STOP. Do not retry automatically: the campaign may have been created despite the error. Verify with the matching read tool (`list_campaigns`, `list_meta_campaigns`, `list_tiktok_campaigns`) before deciding anything else.
 - Never invent budgets. If the user has not given one, ask; check STRATEGY.md for a monthly budget to derive a daily figure from.
 
 ## Step 1 — Load context
@@ -33,9 +33,9 @@
    - **Competitor** — rival brand names → only with the user's explicit sign-off
 3. Each cluster becomes one ad group with tightly related keywords (roughly 10–20 per group). Propose starting negative keywords from the obviously irrelevant terms (jobs, free, DIY — whatever does not fit the business).
 
-For audience-driven campaigns (Meta/LinkedIn/TikTok), research targeting instead: `search_meta_targeting` / `browse_meta_targeting`, `search_linkedin_targeting` (plus `research_business_for_linkedin_targeting`), `search_tiktok_targeting`. Cross-check with `get_meta_audience_insights`, `get_linkedin_audience_insights`, or `get_tiktok_audience_insights` where useful.
+For audience-driven campaigns (Meta/TikTok), research targeting instead: `search_meta_targeting` / `browse_meta_targeting`, `search_tiktok_targeting`. Cross-check with `get_meta_audience_insights` or `get_tiktok_audience_insights` where useful.
 
-If unsure which campaign type fits the objective, use `select_google_campaign_type`, `select_meta_campaign_type`, or `select_linkedin_campaign_type`.
+If unsure which campaign type fits the objective, use `select_google_campaign_type` or `select_meta_campaign_type`.
 
 ## Step 3 — Propose the build
 
@@ -56,18 +56,17 @@
 
 - **Google Search**: `create_search_campaign` with `campaign_name`, `budget_daily`, `ad_groups` (keywords + creative per group), `negative_keywords`, `bidding_strategy`, `target_locations`. Performance Max: `create_pmax_campaign`, then `add_pmax_search_themes` / `add_pmax_audience_signal`. Demand Gen: `create_demandgen_campaign`. YouTube: `create_youtube_campaign`.
 - **Meta**: `create_meta_image_campaign`, `create_meta_video_campaign`, or `create_meta_carousel_campaign` — pass `ad_account_id`, `facebook_page_id`, budget, targeting, creative fields. Set `special_ad_categories` when the vertical requires it (housing, credit, employment, politics). Extend with `add_meta_ad_set` / `add_meta_ad`.
-- **LinkedIn**: `create_linkedin_image_campaign`, `create_linkedin_video_campaign`, `create_linkedin_text_campaign`, or `create_linkedin_carousel_campaign` with `account_id`, budget, professional targeting (job functions, seniorities, industries, company sizes). Add creatives with `add_linkedin_creative` variants.
 - **TikTok**: `create_tiktok_campaign` or `create_tiktok_video_campaign` with `advertiser_id`, budget, targeting; upload assets first via `upload_tiktok_images` / `validate_video`. Extend with `add_tiktok_ad_group` / `add_tiktok_ad`.
 - **Amazon**: `amazon_create_sp_campaign` (Sponsored Products) with a profile from `amazon_list_profiles`, then `amazon_create_sp_ad_group`, `amazon_create_sp_product_ad`, `amazon_create_sp_keywords`. Sponsored Brands: `amazon_create_sb_campaign`. Sponsored Display: `amazon_create_sd_campaign`.
 - **AppLovin**: `applovin_create_campaign` (or `applovin_create_web_campaign`), then attach creative with `applovin_create_creative_set` / `applovin_attach_creative_set`, and set spend with `applovin_set_global_budget` and `applovin_set_roas_target`.
 
-After each successful write, verify with the corresponding read tool (`get_campaign_structure`, `get_meta_campaign_details`, `get_linkedin_campaign_structure`, `get_tiktok_campaign_details`, `amazon_list_sp_campaigns`, `applovin_get_campaign`) and echo the created IDs to the user.
+After each successful write, verify with the corresponding read tool (`get_campaign_structure`, `get_meta_campaign_details`, `get_tiktok_campaign_details`, `amazon_list_sp_campaigns`, `applovin_get_campaign`) and echo the created IDs to the user.
 
 **Report what the read observed, never what the write returned.** A write that reports failure has still sometimes succeeded, and the independent read is what tells the user which happened.
 
 ### Land it paused
 
-**Google, Meta, TikTok and Amazon campaigns are created ENABLED and start spending immediately.** Only LinkedIn defaults to `PAUSED`; AppLovin takes `status` on create. Unless the user asked for it to go live, pause it in the same turn as you create it — `pause_campaign`, `pause_meta_campaign`, `pause_tiktok_campaign`, or for Amazon `amazon_update_sp_campaign` with `state` (Amazon has no pause tool). Then read the status back before telling the user it is paused. A campaign the user believes is paused and is not is the worst outcome this workflow can produce.
+**Google, Meta, TikTok and Amazon campaigns are created ENABLED and start spending immediately.** AppLovin takes `status` on create. Unless the user asked for it to go live, pause it in the same turn as you create it — `pause_campaign`, `pause_meta_campaign`, `pause_tiktok_campaign`, or for Amazon `amazon_update_sp_campaign` with `state` (Amazon has no pause tool). Then read the status back before telling the user it is paused. A campaign the user believes is paused and is not is the worst outcome this workflow can produce.
 
 ### Hard limits on Google ad copy
 
@@ -76,7 +75,7 @@
 ## Step 5 — Record and hand off
 
 - Append a dated entry to STRATEGY.md → Performance History: what was launched, IDs, budget, hypothesis, and the date to review it (typically 7–14 days out).
-- State clearly whether each campaign is live or paused, and give the one action that flips it — `resume_campaign` to start, `pause_campaign` / `pause_meta_campaign` / `pause_linkedin_campaign` / `pause_tiktok_campaign` to stop. `adagnt-performance` handles the review.
+- State clearly whether each campaign is live or paused, and give the one action that flips it — `resume_campaign` to start, `pause_campaign` / `pause_meta_campaign` / `pause_tiktok_campaign` to stop. `adagnt-performance` handles the review.
 
 ## Intelligence Layer
 
Full technical diff · 2 changed fields

changed /description

BEFORE
"End-to-end campaign creation across Google, Meta, LinkedIn, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns."
AFTER
"End-to-end campaign creation across Google, Meta, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns."

changed /skill_md_contents

BEFORE
"---\nname: adagnt-campaigns\ndescription: End-to-end campaign creation across Google, Meta, LinkedIn, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.\n---\n\n# AdAgnt Campaign Creation\n\nTake a campaign from idea to live, grounded in the workspace strategy. The workflow has a research half (cheap, repeatable) and a build half (spends real money, gated).\n\n## Non-negotiable safety rules\n\n- **Write tools cost real money.** Any `create_*`, `add_*`, `update_*`, or budget-touching call changes a live ad account.\n- **Confirm before every write.** Show the exact payload — name, budget, targeting, creative — and get an explicit \"yes\" from the user before calling.\n- **Call each write tool exactly once.** If a write call errors or times out, STOP. Do not retry automatically: the campaign may have been created despite the error. Verify with the matching read tool (`list_campaigns`, `list_meta_campaigns`, `list_linkedin_campaigns`, `list_tiktok_campaigns`) before deciding anything else.\n- Never invent budgets. If the user has not given one, ask; check STRATEGY.md for a monthly budget to derive a daily figure from.\n\n## Step 1 — Load context\n\nRead `STRATEGY.md` (see the `adagnt-strategy` skill for its shape). Pull out: business description, audience, goals (target CPA/ROAS), budget guidance, brand voice, and any lessons in Performance History. If STRATEGY.md is missing, run `adagnt-setup` first.\n\nConfirm the platform and objective with the user, and check the right account is connected via `get_connections_status`.\n\n## Step 2 — Research\n\nFor search-driven campaigns (Google):\n\n1. Call `research_keywords` with `business_description` and `website_url` from STRATEGY.md plus any `seed_keywords` the user gave. Include `target_location` when the business is geo-bound.\n2. Cluster the results by intent, not by topic:\n   - **Transactional** — buy/pricing/demo terms → exact/phrase match, highest bids\n   - **Commercial investigation** — \"best\", \"vs\", \"alternatives\" → phrase match, mid bids\n   - **Informational** — how/what/why → usually excluded or a separate low-bid group\n   - **Branded** — the user's brand and its misspellings → own ad group\n   - **Competitor** — rival brand names → only with the user's explicit sign-off\n3. Each cluster becomes one ad group with tightly related keywords (roughly 10–20 per group). Propose starting negative keywords from the obviously irrelevant terms (jobs, free, DIY — whatever does not fit the business).\n\nFor audience-driven campaigns (Meta/LinkedIn/TikTok), research targeting instead: `search_meta_targeting` / `browse_meta_targeting`, `search_linkedin_targeting` (plus `research_business_for_linkedin_targeting`), `search_tiktok_targeting`. Cross-check with `get_meta_audience_insights`, `get_linkedin_audience_insights`, or `get_tiktok_audience_insights` where useful.\n\nIf unsure which campaign type fits the objective, use `select_google_campaign_type`, `select_meta_campaign_type`, or `select_linkedin_campaign_type`.\n\n## Step 3 — Propose the build\n\nPresent a single, complete plan before touching a write tool:\n\n- Campaign name (convention: `{platform}-{objective}-{audience}-{yyyymm}`)\n- Objective, budget (daily and, if used, lifetime), bidding strategy\n- Ad group / ad set structure with keywords or targeting per group\n- Creative: headlines, descriptions, primary text, images/video (per the `adagnt-ad-copy` skill; validate assets first with `validate_and_prepare_assets` or the platform-specific variants)\n- Negative keywords (Google) or audience exclusions\n- Landing page URL(s)\n\nThen ask: proceed, adjust, or abort.\n\n## Step 4 — Build (one call per write, verify after)\n\nOn explicit approval only:\n\n- **Google Search**: `create_search_campaign` with `campaign_name`, `budget_daily`, `ad_groups` (keywords + creative per group), `negative_keywords`, `bidding_strategy`, `target_locations`. Performance Max: `create_pmax_campaign`, then `add_pmax_search_themes` / `add_pmax_audience_signal`. Demand Gen: `create_demandgen_campaign`. YouTube: `create_youtube_campaign`.\n- **Meta**: `create_meta_image_campaign`, `create_meta_video_campaign`, or `create_meta_carousel_campaign` — pass `ad_account_id`, `facebook_page_id`, budget, targeting, creative fields. Set `special_ad_categories` when the vertical requires it (housing, credit, employment, politics). Extend with `add_meta_ad_set` / `add_meta_ad`.\n- **LinkedIn**: `create_linkedin_image_campaign`, `create_linkedin_video_campaign`, `create_linkedin_text_campaign`, or `create_linkedin_carousel_campaign` with `account_id`, budget, professional targeting (job functions, seniorities, industries, company sizes). Add creatives with `add_linkedin_creative` variants.\n- **TikTok**: `create_tiktok_campaign` or `create_tiktok_video_campaign` with `advertiser_id`, budget, targeting; upload assets first via `upload_tiktok_images` / `validate_video`. Extend with `add_tiktok_ad_group` / `add_tiktok_ad`.\n- **Amazon**: `amazon_create_sp_campaign` (Sponsored Products) with a profile from `amazon_list_profiles`, then `amazon_create_sp_ad_group`, `amazon_create_sp_product_ad`, `amazon_create_sp_keywords`. Sponsored Brands: `amazon_create_sb_campaign`. Sponsored Display: `amazon_create_sd_campaign`.\n- **AppLovin**: `applovin_create_campaign` (or `applovin_create_web_campaign`), then attach creative with `applovin_create_creative_set` / `applovin_attach_creative_set`, and set spend with `applovin_set_global_budget` and `applovin_set_roas_target`.\n\nAfter each successful write, verify with the corresponding read tool (`get_campaign_structure`, `get_meta_campaign_details`, `get_linkedin_campaign_structure`, `get_tiktok_campaign_details`, `amazon_list_sp_campaigns`, `applovin_get_campaign`) and echo the created IDs to the user.\n\n**Report what the read observed, never what the write returned.** A write that reports failure has still sometimes succeeded, and the independent read is what tells the user which happened.\n\n### Land it paused\n\n**Google, Meta, TikTok and Amazon campaigns are created ENABLED and start spending immediately.** Only LinkedIn defaults to `PAUSED`; AppLovin takes `status` on create. Unless the user asked for it to go live, pause it in the same turn as you create it — `pause_campaign`, `pause_meta_campaign`, `pause_tiktok_campaign`, or for Amazon `amazon_update_sp_campaign` with `state` (Amazon has no pause tool). Then read the status back before telling the user it is paused. A campaign the user believes is paused and is not is the worst outcome this workflow can produce.\n\n### Hard limits on Google ad copy\n\n`create_search_campaign` pins ad copy: **exactly 15 headlines, exactly 4 descriptions, and at least 5 keywords** per ad group. Fewer is rejected with `INVALID_ARGS`. Write the full set yourself rather than asking the user for fifteen headlines, and never promise them a smaller number — Google itself allows 3-15 headlines and 2-4 descriptions, so the constraint is ours and stricter than the platform's.\n\n## Step 5 — Record and hand off\n\n- Append a dated entry to STRATEGY.md → Performance History: what was launched, IDs, budget, hypothesis, and the date to review it (typically 7–14 days out).\n- State clearly whether each campaign is live or paused, and give the one action that flips it — `resume_campaign` to start, `pause_campaign` / `pause_meta_campaign` / `pause_linkedin_campaign` / `pause_tiktok_campaign` to stop. `adagnt-performance` handles the review.\n\n## Intelligence Layer\n\nWhen two creative directions both look plausible, don't pick — test: `create_ab_test` runs variant A vs B inside the campaign until statistical significance, and `promote_ab_test_winner` concludes it (same confirm-before-write rule; both are writes). Check `get_ab_test_results` at the review date before judging creative by gut feel.\n"
AFTER
"---\nname: adagnt-campaigns\ndescription: End-to-end campaign creation across Google, Meta, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.\n---\n\n# AdAgnt Campaign Creation\n\nTake a campaign from idea to live, grounded in the workspace strategy. The workflow has a research half (cheap, repeatable) and a build half (spends real money, gated).\n\n## Non-negotiable safety rules\n\n- **Write tools cost real money.** Any `create_*`, `add_*`, `update_*`, or budget-touching call changes a live ad account.\n- **Confirm before every write.** Show the exact payload — name, budget, targeting, creative — and get an explicit \"yes\" from the user before calling.\n- **Call each write tool exactly once.** If a write call errors or times out, STOP. Do not retry automatically: the campaign may have been created despite the error. Verify with the matching read tool (`list_campaigns`, `list_meta_campaigns`, `list_tiktok_campaigns`) before deciding anything else.\n- Never invent budgets. If the user has not given one, ask; check STRATEGY.md for a monthly budget to derive a daily figure from.\n\n## Step 1 — Load context\n\nRead `STRATEGY.md` (see the `adagnt-strategy` skill for its shape). Pull out: business description, audience, goals (target CPA/ROAS), budget guidance, brand voice, and any lessons in Performance History. If STRATEGY.md is missing, run `adagnt-setup` first.\n\nConfirm the platform and objective with the user, and check the right account is connected via `get_connections_status`.\n\n## Step 2 — Research\n\nFor search-driven campaigns (Google):\n\n1. Call `research_keywords` with `business_description` and `website_url` from STRATEGY.md plus any `seed_keywords` the user gave. Include `target_location` when the business is geo-bound.\n2. Cluster the results by intent, not by topic:\n   - **Transactional** — buy/pricing/demo terms → exact/phrase match, highest bids\n   - **Commercial investigation** — \"best\", \"vs\", \"alternatives\" → phrase match, mid bids\n   - **Informational** — how/what/why → usually excluded or a separate low-bid group\n   - **Branded** — the user's brand and its misspellings → own ad group\n   - **Competitor** — rival brand names → only with the user's explicit sign-off\n3. Each cluster becomes one ad group with tightly related keywords (roughly 10–20 per group). Propose starting negative keywords from the obviously irrelevant terms (jobs, free, DIY — whatever does not fit the business).\n\nFor audience-driven campaigns (Meta/TikTok), research targeting instead: `search_meta_targeting` / `browse_meta_targeting`, `search_tiktok_targeting`. Cross-check with `get_meta_audience_insights` or `get_tiktok_audience_insights` where useful.\n\nIf unsure which campaign type fits the objective, use `select_google_campaign_type` or `select_meta_campaign_type`.\n\n## Step 3 — Propose the build\n\nPresent a single, complete plan before touching a write tool:\n\n- Campaign name (convention: `{platform}-{objective}-{audience}-{yyyymm}`)\n- Objective, budget (daily and, if used, lifetime), bidding strategy\n- Ad group / ad set structure with keywords or targeting per group\n- Creative: headlines, descriptions, primary text, images/video (per the `adagnt-ad-copy` skill; validate assets first with `validate_and_prepare_assets` or the platform-specific variants)\n- Negative keywords (Google) or audience exclusions\n- Landing page URL(s)\n\nThen ask: proceed, adjust, or abort.\n\n## Step 4 — Build (one call per write, verify after)\n\nOn explicit approval only:\n\n- **Google Search**: `create_search_campaign` with `campaign_name`, `budget_daily`, `ad_groups` (keywords + creative per group), `negative_keywords`, `bidding_strategy`, `target_locations`. Performance Max: `create_pmax_campaign`, then `add_pmax_search_themes` / `add_pmax_audience_signal`. Demand Gen: `create_demandgen_campaign`. YouTube: `create_youtube_campaign`.\n- **Meta**: `create_meta_image_campaign`, `create_meta_video_campaign`, or `create_meta_carousel_campaign` — pass `ad_account_id`, `facebook_page_id`, budget, targeting, creative fields. Set `special_ad_categories` when the vertical requires it (housing, credit, employment, politics). Extend with `add_meta_ad_set` / `add_meta_ad`.\n- **TikTok**: `create_tiktok_campaign` or `create_tiktok_video_campaign` with `advertiser_id`, budget, targeting; upload assets first via `upload_tiktok_images` / `validate_video`. Extend with `add_tiktok_ad_group` / `add_tiktok_ad`.\n- **Amazon**: `amazon_create_sp_campaign` (Sponsored Products) with a profile from `amazon_list_profiles`, then `amazon_create_sp_ad_group`, `amazon_create_sp_product_ad`, `amazon_create_sp_keywords`. Sponsored Brands: `amazon_create_sb_campaign`. Sponsored Display: `amazon_create_sd_campaign`.\n- **AppLovin**: `applovin_create_campaign` (or `applovin_create_web_campaign`), then attach creative with `applovin_create_creative_set` / `applovin_attach_creative_set`, and set spend with `applovin_set_global_budget` and `applovin_set_roas_target`.\n\nAfter each successful write, verify with the corresponding read tool (`get_campaign_structure`, `get_meta_campaign_details`, `get_tiktok_campaign_details`, `amazon_list_sp_campaigns`, `applovin_get_campaign`) and echo the created IDs to the user.\n\n**Report what the read observed, never what the write returned.** A write that reports failure has still sometimes succeeded, and the independent read is what tells the user which happened.\n\n### Land it paused\n\n**Google, Meta, TikTok and Amazon campaigns are created ENABLED and start spending immediately.** AppLovin takes `status` on create. Unless the user asked for it to go live, pause it in the same turn as you create it — `pause_campaign`, `pause_meta_campaign`, `pause_tiktok_campaign`, or for Amazon `amazon_update_sp_campaign` with `state` (Amazon has no pause tool). Then read the status back before telling the user it is paused. A campaign the user believes is paused and is not is the worst outcome this workflow can produce.\n\n### Hard limits on Google ad copy\n\n`create_search_campaign` pins ad copy: **exactly 15 headlines, exactly 4 descriptions, and at least 5 keywords** per ad group. Fewer is rejected with `INVALID_ARGS`. Write the full set yourself rather than asking the user for fifteen headlines, and never promise them a smaller number — Google itself allows 3-15 headlines and 2-4 descriptions, so the constraint is ours and stricter than the platform's.\n\n## Step 5 — Record and hand off\n\n- Append a dated entry to STRATEGY.md → Performance History: what was launched, IDs, budget, hypothesis, and the date to review it (typically 7–14 days out).\n- State clearly whether each campaign is live or paused, and give the one action that flips it — `resume_campaign` to start, `pause_campaign` / `pause_meta_campaign` / `pause_tiktok_campaign` to stop. `adagnt-performance` handles the review.\n\n## Intelligence Layer\n\nWhen two creative directions both look plausible, don't pick — test: `create_ab_test` runs variant A vs B inside the campaign until statistical significance, and `promote_ab_test_winner` concludes it (same confirm-before-write rule; both are writes). Check `get_ab_test_results` at the review date before judging creative by gut feel.\n"
Full snapshot data
{
  "description": "End-to-end campaign creation across Google, Meta, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.",
  "included_files": [],
  "name": "adagnt-campaigns",
  "skill_md_contents": "---\nname: adagnt-campaigns\ndescription: End-to-end campaign creation across Google, Meta, TikTok, Amazon, and AppLovin — strategy-grounded keyword research, intent clustering, structured build-out, and a hard confirmation gate before any tool that spends money. Use when the user wants to launch or expand paid campaigns.\n---\n\n# AdAgnt Campaign Creation\n\nTake a campaign from idea to live, grounded in the workspace strategy. The workflow has a research half (cheap, repeatable) and a build half (spends real money, gated).\n\n## Non-negotiable safety rules\n\n- **Write tools cost real money.** Any `create_*`, `add_*`, `update_*`, or budget-touching call changes a live ad account.\n- **Confirm before every write.** Show the exact payload — name, budget, targeting, creative — and get an explicit \"yes\" from the user before calling.\n- **Call each write tool exactly once.** If a write call errors or times out, STOP. Do not retry automatically: the campaign may have been created despite the error. Verify with the matching read tool (`list_campaigns`, `list_meta_campaigns`, `list_tiktok_campaigns`) before deciding anything else.\n- Never invent budgets. If the user has not given one, ask; check STRATEGY.md for a monthly budget to derive a daily figure from.\n\n## Step 1 — Load context\n\nRead `STRATEGY.md` (see the `adagnt-strategy` skill for its shape). Pull out: business description, audience, goals (target CPA/ROAS), budget guidance, brand voice, and any lessons in Performance History. If STRATEGY.md is missing, run `adagnt-setup` first.\n\nConfirm the platform and objective with the user, and check the right account is connected via `get_connections_status`.\n\n## Step 2 — Research\n\nFor search-driven campaigns (Google):\n\n1. Call `research_keywords` with `business_description` and `website_url` from STRATEGY.md plus any `seed_keywords` the user gave. Include `target_location` when the business is geo-bound.\n2. Cluster the results by intent, not by topic:\n   - **Transactional** — buy/pricing/demo terms → exact/phrase match, highest bids\n   - **Commercial investigation** — \"best\", \"vs\", \"alternatives\" → phrase match, mid bids\n   - **Informational** — how/what/why → usually excluded or a separate low-bid group\n   - **Branded** — the user's brand and its misspellings → own ad group\n   - **Competitor** — rival brand names → only with the user's explicit sign-off\n3. Each cluster becomes one ad group with tightly related keywords (roughly 10–20 per group). Propose starting negative keywords from the obviously irrelevant terms (jobs, free, DIY — whatever does not fit the business).\n\nFor audience-driven campaigns (Meta/TikTok), research targeting instead: `search_meta_targeting` / `browse_meta_targeting`, `search_tiktok_targeting`. Cross-check with `get_meta_audience_insights` or `get_tiktok_audience_insights` where useful.\n\nIf unsure which campaign type fits the objective, use `select_google_campaign_type` or `select_meta_campaign_type`.\n\n## Step 3 — Propose the build\n\nPresent a single, complete plan before touching a write tool:\n\n- Campaign name (convention: `{platform}-{objective}-{audience}-{yyyymm}`)\n- Objective, budget (daily and, if used, lifetime), bidding strategy\n- Ad group / ad set structure with keywords or targeting per group\n- Creative: headlines, descriptions, primary text, images/video (per the `adagnt-ad-copy` skill; validate assets first with `validate_and_prepare_assets` or the platform-specific variants)\n- Negative keywords (Google) or audience exclusions\n- Landing page URL(s)\n\nThen ask: proceed, adjust, or abort.\n\n## Step 4 — Build (one call per write, verify after)\n\nOn explicit approval only:\n\n- **Google Search**: `create_search_campaign` with `campaign_name`, `budget_daily`, `ad_groups` (keywords + creative per group), `negative_keywords`, `bidding_strategy`, `target_locations`. Performance Max: `create_pmax_campaign`, then `add_pmax_search_themes` / `add_pmax_audience_signal`. Demand Gen: `create_demandgen_campaign`. YouTube: `create_youtube_campaign`.\n- **Meta**: `create_meta_image_campaign`, `create_meta_video_campaign`, or `create_meta_carousel_campaign` — pass `ad_account_id`, `facebook_page_id`, budget, targeting, creative fields. Set `special_ad_categories` when the vertical requires it (housing, credit, employment, politics). Extend with `add_meta_ad_set` / `add_meta_ad`.\n- **TikTok**: `create_tiktok_campaign` or `create_tiktok_video_campaign` with `advertiser_id`, budget, targeting; upload assets first via `upload_tiktok_images` / `validate_video`. Extend with `add_tiktok_ad_group` / `add_tiktok_ad`.\n- **Amazon**: `amazon_create_sp_campaign` (Sponsored Products) with a profile from `amazon_list_profiles`, then `amazon_create_sp_ad_group`, `amazon_create_sp_product_ad`, `amazon_create_sp_keywords`. Sponsored Brands: `amazon_create_sb_campaign`. Sponsored Display: `amazon_create_sd_campaign`.\n- **AppLovin**: `applovin_create_campaign` (or `applovin_create_web_campaign`), then attach creative with `applovin_create_creative_set` / `applovin_attach_creative_set`, and set spend with `applovin_set_global_budget` and `applovin_set_roas_target`.\n\nAfter each successful write, verify with the corresponding read tool (`get_campaign_structure`, `get_meta_campaign_details`, `get_tiktok_campaign_details`, `amazon_list_sp_campaigns`, `applovin_get_campaign`) and echo the created IDs to the user.\n\n**Report what the read observed, never what the write returned.** A write that reports failure has still sometimes succeeded, and the independent read is what tells the user which happened.\n\n### Land it paused\n\n**Google, Meta, TikTok and Amazon campaigns are created ENABLED and start spending immediately.** AppLovin takes `status` on create. Unless the user asked for it to go live, pause it in the same turn as you create it — `pause_campaign`, `pause_meta_campaign`, `pause_tiktok_campaign`, or for Amazon `amazon_update_sp_campaign` with `state` (Amazon has no pause tool). Then read the status back before telling the user it is paused. A campaign the user believes is paused and is not is the worst outcome this workflow can produce.\n\n### Hard limits on Google ad copy\n\n`create_search_campaign` pins ad copy: **exactly 15 headlines, exactly 4 descriptions, and at least 5 keywords** per ad group. Fewer is rejected with `INVALID_ARGS`. Write the full set yourself rather than asking the user for fifteen headlines, and never promise them a smaller number — Google itself allows 3-15 headlines and 2-4 descriptions, so the constraint is ours and stricter than the platform's.\n\n## Step 5 — Record and hand off\n\n- Append a dated entry to STRATEGY.md → Performance History: what was launched, IDs, budget, hypothesis, and the date to review it (typically 7–14 days out).\n- State clearly whether each campaign is live or paused, and give the one action that flips it — `resume_campaign` to start, `pause_campaign` / `pause_meta_campaign` / `pause_tiktok_campaign` to stop. `adagnt-performance` handles the review.\n\n## Intelligence Layer\n\nWhen two creative directions both look plausible, don't pick — test: `create_ab_test` runs variant A vs B inside the campaign until statistical significance, and `promote_ab_test_winner` concludes it (same confirm-before-write rule; both are writes). Check `get_ab_test_results` at the review date before judging creative by gut feel.\n"
}

SHA-256 of public snapshot: 77f3d0c09a477f4104cc3560b13c9a0b0aad3715a7c411afa692a23d63ce328d