A campaign is an objective that takes more than one run: watch a deployment for a week, follow up until a reply arrives, re-check a metric daily until it recovers.
Architecture contract
CampaignV1 holds campaign_id, objective, graph_template, state, budget, wake_policy, attention_policy, completion_criteria, next_wake, owner and status.
- Campaigns are not cron. A campaign owns its objective, budget, state, completion criteria and the logic for when another check is useful. A schedule only fires; a campaign decides.
- A campaign creates and drives runs over time, each a normal durable run.
- It has exactly one pending check at a time, scheduled through the wake queue.
- It raises attention under its attention policy, never by notifying anyone directly.