A marketing analyst in a box: business question in, analyst-grade SQL, deterministic attribution, and a cited interpretation out - or an honest refusal when the evidence does not support a claim.
Every number about credit and lift is computed by deterministic Python against a real warehouse. The LLM investigates, explains, and cites; it never invents a figure. Same discipline as BondLens, applied to the domain Epsilon's Account Analytics team lives in - where the team already runs AI agents that generate analyst-grade SQL and treats evaluation harnesses as part of the job.
Wave 0 of 6 - the deterministic core:
- Attribution models (last-touch, first-touch, linear, time-decay) with a conservation contract: credit assigned sums to revenue converted, asserted on every run
- DuckDB warehouse schema (spend, conversions, ordered touchpoints) with atomic inserts and path streaming
- Seeded synthetic-data generator with planted channel multipliers, so interpretations can be graded against a known ground truth
Planned next: text-to-SQL analyst CLI with cost ledger (wave 1), evaluation harness + geo-lift incrementality (wave 2), BigQuery sandbox + Databricks Free Edition adapters (wave 3), one recorded cloud-LLM run with a local-vs-cloud comparison table (wave 4), agent tool calls governed by Turnstile (wave 5).
uv sync
uv run pytest
uv run ruff check src tests
uv run mypy src # strictuv run python scripts/generate_synthetic.py data/marketing.duckdbSeeded and deterministic: the same command produces the same warehouse, and the generator's README section documents the planted effect sizes.
A portfolio project, local-first, not production software-as-a-service. The synthetic warehouse is a stand-in for real campaign data; the identification assumption behind any lift estimate is stated next to the estimate, and a question the data cannot answer gets a refusal, not a confident guess.