The forecast itself is computed in code; the agent selects and explains it.
System
Crew
Seven agents, their tools, and the one column that carries the whole safety argument.
No agent has a tool that reaches the outside world. The column reads 'none' on every row, and that is asserted over the whole registry by a test rather than reviewed by eye — so a tool added tomorrow with a side effect fails the build.
| agent | phase | tools | reads | output | side effects |
|---|---|---|---|---|---|
| Forecaster | B | query_sql, forecast | footfall, weather, calendar, events | Eight-week demand per site with an 80% interval | none |
| Planner | B | forecast_lookup, allocate_budget | the forecast and the allocator | Promo calendar with a channel x daypart split | none |
| Creative | C | ask, generate_variants | the brand kit | Three variants per slot, per language | none |
| Compliance | C | ask, check_rules | the rule set and the corpus | Pass or fail with the clause each finding came from | none |
| Panel | C | simulate_personas | the creative | Five scores and a spread | none |
| Measurer | B | query_sql, uplift | footfall | Lift with an interval, a placebo p and the estimator's own bias | none |
| Auditor | C | flag_run | every other agent's output | Policy findings: uncited claims, budget breaches, creatives that slipped | none |
What each one is for
Sizes a promotion to the forecast's LOWER bound, not its point estimate.
Composition is deterministic; Phase C's model writes the copy, not the artefact.
The verdict is regex, not inference. A model cannot talk it into a pass.
A filter, not customer research. Deterministic under seed.
Reports the bias it measures on a window where nothing happened.
Flags. It cannot block, revise or publish — a person does that.
Publishing
Exporting a campaign is a human action taken outside this application. There is no endpoint that sends, schedules or publishes anything.