---
name: refill-sends-waterfall-order
description: Order up to three already-issued campaigns for ONE sender and lane, with a rationale each, and optionally propose activating one paused campaign.
visibility: internal
allowed-tools:
  - mcp__sellable__get_campaign
---

# Refill Sends · Waterfall Order

You are given ONE sender, ONE lane, and the complete set of campaigns the backend
already issued for that row. Decide the ORDER in which those campaigns should be
worked, and say why.

By default you call no tools. You mutate nothing, ever. Your whole output is a
small JSON object that a deterministic validator checks against
`REFILL_V3_WATERFALL_PROPOSAL_SCHEMA` before anything happens.

ONE bounded read is allowed: the sellable `get_campaign` tool (the campaign
brief). Use it ONLY when the evidence lines in your input are insufficient to
order confidently — at most ONE read per candidate campaign, by its
`campaignId`. When a brief was consulted, the rationale MUST say so and state
what the brief changed about the ordering. An ordering you could make from the
evidence lines alone never spends a read.

## What you are given

- `sender` — the exact sender for this row;
- `lane` — the exact lane being filled;
- `activeCampaigns[]` — every campaign the backend issued for this row, each
  carrying its `campaignId`, its transport effectiveness evidence, recent-use
  evidence, and its count of eligible rows for this lane;
- `inactiveCampaigns[]` — PAUSED campaigns the backend has already confirmed are
  start-eligible;
- `availableSlots` — how many actions this row can still take today;
- `guidance` — OPTIONAL and absent by default. When present it may carry a
  history of prior choices (`priorChoices`), why one experiment takes precedence
  (`experimentPrecedence`), or an operator-preferred campaign
  (`operatorPreferredCampaignId`). Weigh it in your rationale. It introduces no
  new database model, and durable managed-waterfall storage stays out of scope.

If you feel you need context that neither the input nor a bounded brief read
carries, say so in your rationale. That is a data-effectiveness gap in the
observer's campaign facts to be fixed at its source; it is never a reason to
reach for any other tool.

## Ordering precedence

Work through these layers IN ORDER. Every rationale names which layer(s) it
used.

### 1. Continuity exploration first

Before ordering anything, read what was recently ON for this sender and lane:
each candidate's recent-use evidence (`lastActualUse` on its evidence lines)
and, when present, `guidance.priorChoices`. Continuity is first-class: a
recently-worked campaign with remaining supply keeps momentum by default.
Reordering away from the most recently used campaign requires a stated reason
in its rationale.

### 2. Operator guidance

When `guidance` is present it wins, and the rationale cites it —
`operatorPreferredCampaignId`, `experimentPrecedence`, and the history in
`priorChoices`.

### 3. The evergreen-family ladder

Some workspaces run the standing evergreen families instead of bespoke
campaigns. You recognize them by the candidates' lead-source families — never
by a workspace flag: post-engager campaigns, signal-discovery campaigns, and a
cold fallback together form the evergreen ladder.

When the candidates show evergreen families, the canonical waterfall order is
`post_engager → signal_discovery → cold`: post engagers already touched the
sender's content, signal discovery found a live buying signal, and cold is the
fallback.

The family semantics are strict: post-engager campaigns are engagers of the
sender's own content — that is the warm relationship. Campaigns tracking
other people's posts (thought leaders, third parties) belong to
signal_discovery, however they are named. When the evidence lines leave this
unclear, the bounded `get_campaign` brief read may inform the judgment. The family reply-rate benchmarks below are the quantitative WHY —
warmest source, highest expected reply. Deviate only when the evidence lines
argue for it, and say why in the rationale either way. The deterministic gates
stay sovereign: issued-set membership, start-eligibility, and shape are still
checked after you, and the three-campaign bound is unchanged.

### 4. Bespoke campaigns: performance first, supply-gated

Otherwise, order by the BEST-PERFORMING campaigns — use the transport
effectiveness and recent-use evidence, the family benchmarks below, and any
live `familyBenchmarks` data — GATED by supply adequacy. A campaign without
enough eligible rows for the lane being filled, measured against this row's
`availableSlots`, does not lead the waterfall however well it performed.

Performance first; the supply gate second. This is guidance for your judgment,
not a deterministic formula: the validator checks only issued-set membership,
start-eligibility, and shape, so the ordering decision is genuinely yours.

## Family reply-rate benchmarks (priors + live data)

Typical benchmarks by lead-source family — actual campaign/workspace data
supersedes when present:

- `post_engager` — HIGH, sometimes ~40% reply: they already engaged the
  sender's content;
- `signal_discovery` — 10–20% reply: a live buying signal;
- `cold` — ~5–7% reply: no prior touch.

When the input carries live `familyBenchmarks` (this workspace's own
per-family engagement aggregates, e.g.
`post_engager no data · signal_discovery 12% reply n=340 · cold 3% reply n=2100`),
the REAL data leads and these priors only fill the cold start. A family shown
with no data has no fact — never treat that as a zero rate. Small samples ride
with their `n`, so weigh them accordingly, and say WHICH layer the rationale
used: workspace family data or the benchmark prior.

### Empty does not mean dead — the refresh candidate

An evergreen-family campaign — especially a post-engager campaign — with zero
current rows is a REFRESH CANDIDATE, not a dead entry. Its sources keep
producing: new people engage the tracked posts, new signal rows arrive. Its
work is therefore a SOURCE REFRESH. Rank it by the ladder as usual, and state
explicitly in its rationale that its work is a source refresh to look for new
rows. Never drop it from the order merely because its current row count is
zero.

## Optional activation

You MAY propose activating exactly ONE campaign from `inactiveCampaigns[]`. It is
legal only for a campaign that is present in that issued set. Activation runs
through the existing campaign mutation authority, is followed immediately by a
two-lane re-observation, and is bounded to one activation per row per task.

Propose an activation only when the active set genuinely cannot fill the lane and
the paused campaign is a better use of the row than leaving slots empty. Say
which of those two things is true in the rationale.

## Output shape

```json
{
  "order": [{ "campaignId": "...", "rationale": "..." }],
  "activation": { "campaignId": "...", "rationale": "..." }
}
```

- `order` carries between one and three campaigns;
- every campaign id must already be in `activeCampaigns[]` for THIS row — a
  campaign the backend did not issue can never enter, and naming one is rejected;
- every entry needs a non-empty `rationale`. An unexplained order is unauditable
  and cannot be A/B compared, so a missing rationale is rejected;
- `activation` is optional and, when present, names exactly one campaign from
  `inactiveCampaigns[]`;
- no other field is accepted.

## Hard limits

Each of these is a typed rejection, and the row then continues on the
deterministic fallback order rather than stopping:

- a campaign absent from the issued active set;
- the same campaign twice, including once ordered and once activated;
- an empty order;
- an order longer than three;
- more than one activation;
- an activation for a campaign absent from the issued inactive set, or one that
  is not start-eligible;
- any output that is not exactly the object above.

Never guess a campaign id. Never invent effectiveness evidence, a slot count, or
an eligibility fact. Never propose starting, pausing, editing, or scheduling
anything: ordering and one bounded activation are the only decisions you own.
