---
name: exit-learning-limited
description: >-
  Diagnoses why a specific ad set is stuck in Learning Limited, structurally unable to reach ~50
  optimization events within 7 days, by checking, in order, recent edit churn, budget floor
  (daily_budget x 7 / target cost-per-event), audience size, event depth, and cross-ad-set
  fragmentation, then applies exactly one matching fix: stop editing, raise budget, widen the
  audience or switch to Advantage+ audience, step to a shallower event, or route to account-level
  consolidation. Reach for it when mads_get_adset/mads_run_insights flags an ad set Learning
  Limited, or when an ad set has run well past 7 days without exiting learning. It ends at an ad
  set clearing ~50 events/week and off Learning Limited, the structural fix when the cause is
  account-wide fragmentation lives in consolidate-fragmented-account, and what normal (non-limited)
  learning-phase volatility looks like is covered in manage-the-learning-phase.
---
# Diagnose and Exit Learning Limited

## Purpose
Learning Limited means Meta's delivery system has concluded an ad set structurally cannot gather enough
optimization events to leave learning, it keeps serving, but inefficiently, indefinitely, until something
about the ad set changes. This skill is the diagnostic-plus-fix routine: identify which of a handful of
root causes applies, edit churn, budget, audience size, event depth, or fragmentation, and apply the one
matching fix instead of guessing or stacking several changes at once.

## When to run
- `mads_get_adset` or `mads_run_insights` shows an ad set flagged Learning Limited.
- An ad set has been "in learning" for well past 7 days without exiting, Learning Limited in effect even
  if not yet labeled.
- CPA/CPL is erratic and high on an ad set that never seems to stabilize.
- Before scaling anything (`scale-budget-vertically`, `scale-horizontally-with-duplication`), scaling a
  Learning Limited base wastes the increment.

## When NOT to run
- The ad set is still inside its first ~7 days / ~50 events and simply hasn't finished learning yet, that's normal volatility, not Learning Limited (see `manage-the-learning-phase` for what's normal).
- The root cause is obviously account-wide, many ad sets simultaneously Learning Limited → go straight
  to `consolidate-fragmented-account`, the structural version of this skill's fragmentation fix.
- The event/objective itself was wrong from the start (e.g., optimizing Purchase with zero pixel history)
  → `select-campaign-objective`.

## Prerequisites
- `mads_get_adset` for the ad set's current status, budget, targeting, and `optimization_goal`.
- `mads_run_insights` (`mads_get_insights`) or `mads_get_insights` for the last 7-14
  days of results, to count actual weekly optimization events.
- Awareness of recent edit history (budget/audience/creative/bid changes in the last 7 days), every
  significant edit restarts the clock.
- Target CPA or cost-per-event, to check budget headroom against.

## Procedure
1. **Confirm the diagnosis.** Pull `mads_get_adset` plus insights and count optimization events over the
   trailing 7 days. IF that count is below ~50 and the ad set has been live long enough that this isn't
   just early volatility, THEN it's genuinely Learning Limited or heading there, proceed. Otherwise stop;
   nothing to fix yet.
2. **Check for edit churn first.** IF the ad set had a significant edit, budget change greater than
   ~20%, audience change, optimization event change, creative swap, or bid strategy change, within the
   last 7 days, THEN the clock restarted and the low count may just be a fresh cycle. The fix is: stop
   editing and let a full cycle run before diagnosing further.
3. **Check the budget floor.** Compute events supportable at the current budget: `daily_budget x 7 /
   target cost-per-event`. IF that's below ~50, THEN budget is the binding constraint, raise it (see
   Decision rules) or optimize a cheaper, shallower event instead.
4. **Check audience size.** A narrow audience caps deliverable volume regardless of budget. IF the
   addressable audience is small relative to the events needed, THEN widen it, stack interests, broaden
   targeting, or switch to Advantage+ audience so Meta can find more eligible people.
5. **Check event depth.** IF the optimization event is deep or rare (a high-value custom conversion
   firing only a handful of times a week) relative to the ad set's actual traffic, THEN step to a
   shallower event, e.g., Purchase to AddToCart, or a broader qualified-lead event, until volume
   supports the deeper one again.
6. **Check cross-ad-set fragmentation.** IF several ad sets are splitting a conversion pool that would
   clear ~50/week combined but not individually, THEN this ad set's fix is really an account-level fix, route to `consolidate-fragmented-account` instead of patching this one cell in isolation.
7. **Apply exactly one fix, then stop touching it.** Choose the single binding constraint from steps 2-6
   (usually one dominates), apply that change, preview it, get explicit user approval, commit, and leave
   it alone.
8. **Let the fix run a full cycle before judging.** ~50 events or ~7 days, whichever governs, checking
   daily and re-editing recreates the exact churn that causes Learning Limited in the first place.
9. **Re-verify exit.** Pull insights again after the cycle; confirm weekly events now clear ~50 and
   delivery status has moved off Learning Limited before treating this ad set as a candidate for
   `scale-budget-vertically`.

## Decision rules
- **Root-cause priority when several look plausible:** check edit churn first (cheapest fix, often the
  actual cause), then fragmentation (structural, fixed elsewhere), then budget, then audience size, then
  event depth. Fixing the wrong one first just adds another edit to the churn pile.
- **Budget fix sizing:** raise daily budget to at least `target cost-per-event x 50 / 7`, the same
  minimum-viable-budget floor `select-campaign-objective` establishes at launch, money in minor units
  (a $50.00 floor is `daily_budget=5000`).
- **Audience fix:** widen incrementally (add interests, raise lookalike %, or move to Advantage+
  audience) rather than jumping straight to the broadest possible targeting, unless the account is small
  enough that broad is clearly appropriate.
- **Event fix:** step exactly one level shallower (Purchase to AddToCart, not Purchase to LinkClick), overcorrecting trades a rare-but-relevant event for a cheap-but-meaningless one.
- **One fix at a time.** IF budget, audience, and event all look plausible, THEN fix only the highest-
  priority one this cycle, changing several together makes it impossible to know which one worked and
  stacks multiple learning-resetting edits into one.
- **Done means:** the binding root cause identified and named, exactly one fix applied and approved, a
  full learning cycle allowed to pass untouched, and re-pulled insights confirming weekly events clear
  ~50 and Learning Limited has cleared.

## Common failure modes
- **Treating normal early volatility as Learning Limited** and panic-editing an ad set that just needed a
  few more days.
- **Stacking fixes**, raising budget and widening audience and swapping the event in one sitting, so
  even a successful exit teaches nothing about which lever mattered.
- **Fixing the symptom on one ad set while the real cause is account-wide fragmentation**, this ad set
  exits, three siblings stay stuck, and the fix has to be redone per-cell forever instead of once,
  structurally.
- **Re-editing mid-cycle** because day-3 numbers look bad, restarting the clock again before the previous
  fix even had a chance to prove out.
- **Deepening the event when volume is already thin**, moving from AddToCart to Purchase on an account
  that couldn't support AddToCart-level volume in the first place.

## Related skills
- Structural cause: `consolidate-fragmented-account` (run this instead when fragmentation is the root
  cause across multiple ad sets).
- Background: `manage-the-learning-phase` (what normal learning looks like, so this skill isn't invoked
  on volatility that isn't actually Learning Limited).
- Run before: `scale-budget-vertically`, `scale-horizontally-with-duplication` (both assume the base has
  already exited learning).
- Feeds back to: `select-campaign-objective` (when the event-depth fix requires reconsidering the chosen
  optimization event).
