# Threshold assumptions and validation status

Defaults in skills are **plausible, not validated**. Every numeric cutoff is
marked `ASSUMPTION` in the skill bodies until it has been backtested against
real optimization outcomes.

---

## How to read a threshold

A default here is a starting point, not a recommendation with evidence behind
it. Run the skill read-only first, compare what it flags against what you would
have done yourself, and tune the cutoff for your vertical and geo before you let
anything write.

---

## Threshold registry

| Rule | Default | Status |
|---|---|---|
| CPA block (CPA Tune) | > 2.0× target | **ASSUMPTION** |
| CPA QF decrease (manual CPC) | > 1.5× target | **ASSUMPTION** |
| CTR fatigue drop | ≥ 30% vs prior 7d | **ASSUMPTION** |
| Budget cap hit | spend ≥ 95% of dailyLimit on 5/7 days | **ASSUMPTION** |
| Anomaly trigger | 7d vs prior 7d ≥ 40% on CPC/CVR/CPA | **ASSUMPTION** — no day-over-day |
| Pause teaser recovery rate | 30–70% sibling absorption | **ASSUMPTION** |
| Block wasted-share formula | `1 - target/actual` | **ASSUMPTION** |
| Apply drift warn | 10% change in spent or CPA | **ASSUMPTION** |
| Simulator default campaign scope | 25 active campaigns | **DEFAULT** — ask user if more |

---

## Simulator campaign scope

| Constant | Value | Notes |
|---|---|---|
| `DEFAULT_CAMPAIGN_SCOPE` | **25** | Analyze all active when count ≤ 25 |

When active campaign count **exceeds 25**, the agent **must ask the user** before
Phase 2 whether to run top-25-by-spend (default), all active, or named ids.

User overrides (“all active”, explicit ids, “top 50”) always win over the default.

---

## CPA Tune — learning phase (critical)

**ASSUMPTION pending ads-team confirmation:** manually blocking sources or
aggressive QF cuts while `bidding.strategy` is `cpa` (CPA Tune) may **fight the
algorithm** during its learning period.

Until learning is complete:

- Prefer **monitor-only** (`alert_anomaly`) over blocks.
- Suppress block recommendations with `cpa_tune_learning` when:
  - Campaign age < **14 days** (`ASSUMPTION`), **or**
  - Conversions in lookback < **50** (`ASSUMPTION`), **or**
  - User has not confirmed learning is complete.

Replace the heuristics above with the documented learning-phase signals once
they are published.

---

## Client-configurable overrides

```yaml
# Example — store in ads-mcp server config per client, not in skill files
cpa_block_multiplier: 2.0
cpa_qf_multiplier: 1.5
max_budget_shift_pct: 20
max_qf_change_pct: 25
min_source_clicks: 50
min_source_spend_usd: 10
cpa_tune_learning_min_days: 14
cpa_tune_learning_min_conversions: 50
stats_drift_warn_pct: 10
default_campaign_scope: 25
```
