An offer decision system that is clear about what it can show. Extend your existing project where the data fits, or use the corrected uplift benchmark plus a clearly labelled operational simulator. Keep the 25-hour scope to a few actions and one main boosted-tree comparison. Two-tower retrieval, causal forests and bandits are optional extensions once the core system works.
Deliver these:
- A decision contract and accounting example, covering no offer, constraints, horizon and guardrails.
- A data manifest and feature/label builder that checks decision-time availability, maturity and outcome coverage, plus one versioned net-reward definition.
- Rules and arm-mean baselines, logistic regression and one boosted tree, and a supported uplift or value-policy comparison where the data allows.
- An evaluation report with split dates or the benchmark's limits, support counts, calibration, policy value and uncertainty, cost sensitivity, and results for sparse-history customers.
- A batch job or API with an offer catalogue, idempotency, shared contact controls, budget reservations, decision/outcome logs and a tested fallback.
- A policy experiment memo and rollout/rollback runbook, including the proof still needed.
Useful correctness checks test real failure modes. A late-arriving event stays out of an old feature snapshot. An immature or mature-but-missing outcome is not called negative. An ineligible or negative-value offer is not sent. Concurrent requests stay within a hard budget, and retries send only once. Changing the profit formula changes the chosen action in the worked example. Check propensity normalisation over the real feasible set, and reject logged assignments with impossible zero probability. Simulate a failed reservation after assignment: keep the original action and probabilities, log the no-offer execution separately, and include the account in the assignment analysis.