▶️ Open a fresh Claude chat named "Phase 2 — Data layer," paste this whole page, and say: "Walk me through building this one step at a time, starting with task 1."
Today the dashboard gets each school's ad numbers from Google Sheets that a tool called Coefficient fills in — it's clunky and fails quietly. The project's goal is to pull numbers straight from the ad platforms instead. Before touching any single platform, we build one flexible "data layer" that decides where each number comes from. That lets us switch one school or one channel at a time, and if anything fails it quietly falls back to the old Coefficient sheet so nothing breaks.
api/pipeline-run.js; today its channel reads fetch the Coefficient sheet as CSV.{source, lastSuccess, ok} tag.ok:false so the dashboard can flag it later.Have Claude build a parity report: for all 4 schools, the period numbers before this change vs after — spend, leads/clicks, CPL/CPC — side by side with match ✅ / mismatch ❌. The whole point of this phase is that nothing changes yet, so every row must be ✅. Any ❌ = a bug in the refactor; stop and fix before moving on.
This is one of the three sign-off gates. Janet (or a technical reviewer) eyeballs the parity report and confirms it's all green before this is merged to production. Don't skip — a wrong number here would flow into every later phase.
The pipeline runs through the new data layer, the parity report is all green on all 4 schools, each channel reports its source + health, and Janet has signed off. Nothing visible changes — that's success.