From ba931e0bc323d1478b2cc5dda7237d7ea0709074 Mon Sep 17 00:00:00 2001 From: igerber Date: Thu, 20 Aug 2026 07:04:32 -0400 Subject: [PATCH 1/2] marketing: MMM calibration launch carousel (Signal palette) + claims-sync guard New LinkedIn launch deck for the diff_diff.mmm interop, following the generate_cic_carousel.py architecture (magazine sidebar, split logo, one dark slide, footer wordmark, phone type floors) with a new "Signal" palette: violet = calibrated, coral = uncalibrated, amber reserved for ground truth in every chart. Ease-first narrative (Tutorial 30 / Meridian is the spine, Tutorial 29 / PyMC-Marketing the secondary beat): cover hook with the two-posterior motif ("the true ROI (simulated)" + illustrative tag) -> the hand-derivation pain -> the three-line handshake (dark code slide) -> the generated to_code() snippet shown verbatim -> the payoff interval chart (default 3.29 [3.02, 3.57] vs truth 2.5; calibrated 2.54 [2.47, 2.62]) -> the aggregation schematic -> estimand-rigor cards -> the PyMC lift-test beat (3.52 -> 2.21 vs truth 2.0, executable keyword-only call) -> a capabilities slide -> CTA carrying the single tutorial mention and the full simulation-provenance statement. Claim posture (documented in the module docstring + DEFERRED.md decision record): capabilities over validation; guardrail copy scoped, never absolute ("the easy mistakes fail loudly", "you own the design, it owns the math") with the retired absolutes ban-listed; truth provenance concentrated into the cover/chart "(simulated)" labels and the CTA line; slide 8 carries no on-slide linearity qualifier - the staggered-boost compression's linear-channel scoping is tutorial 29's job. tests/test_mmm_carousel_claims.py (18 tests, normal suite, skips when carousel/ or docs/ absent) syncs the deck to the committed executed notebooks: every constant is located on the tutorial output surface, the slide-4 snippet lines must be byte-verbatim from the committed to_code() output, the confidently-wrong interval structure and 6x-narrower ratio are recomputed from constants, slide-8 call arguments are re-derived from tutorial 29's DGP, the four named aggregate('total') adopters are pinned against each results class's _AGGREGATE_SUPPORTED, the "Zero new dependencies" strip is backed by an mmm.py import scan plus a pyproject.toml requirement scan, the version strip is derived from the tutorials' own requirement pins, and competitive claims plus unqualified guardrail absolutes are ban-listed. Tracking: TODO.md gains the deck-agnostic PDF-vs-generator drift-guard row (fpdf date metadata makes byte-compare nontrivial); DEFERRED.md's decision record documents the marketing-surface claim posture. The committed PDF is the generator's build artifact, regenerated with the final source per carousel/README.md. --- DEFERRED.md | 1 + TODO.md | 1 + carousel/diff-diff-mmm-carousel.pdf | Bin 0 -> 205194 bytes carousel/generate_mmm_carousel.py | 1231 +++++++++++++++++++++++++++ tests/test_mmm_carousel_claims.py | 393 +++++++++ 5 files changed, 1626 insertions(+) create mode 100644 carousel/diff-diff-mmm-carousel.pdf create mode 100644 carousel/generate_mmm_carousel.py create mode 100644 tests/test_mmm_carousel_claims.py diff --git a/DEFERRED.md b/DEFERRED.md index 32ec54b2e..453c15f73 100644 --- a/DEFERRED.md +++ b/DEFERRED.md @@ -134,6 +134,7 @@ decisions (refactor waivers, perf trade-offs, test-infrastructure calls) are rec |----------|----------|----------| | **Fixed-B Stata SE-golden comparisons in the LWDiD suite run unmarked in default CI** (no `ci_params.bootstrap()` scaling, no `slow` marker): the SE tolerance derives from BOTH fixed rep counts (ours B=999, Stata's R from the golden meta) so scaling either side would invalidate the committed-golden comparison — the ci_params convention governs convergence-style tests, not fixed-B golden comparisons — and these tests are the PR #588 acceptance bar, which must run in default CI; module-scoped fit memoization bounds the cost (~1-2 s per fit locally) | `tests/test_methodology_lwdid.py` | 2026-08-16 | | **The 4.0 migration guide's code blocks are not snippet-executed.** `tests/test_doc_snippets.py` discovers a hardcoded list of `.rst` files and only `.. code-block:: python` / RST `::` bodies, so `docs/migration-4.0.md` gets no coverage. Deliberate: the guide is a MIXED document - most "after" examples (the renames, `results.att`) run on the current release, but the `field-flip` and `df-convention-flip` examples describe 4.0 behaviour that cannot run until 4.0, so a blanket execution lane would fail by construction. Closing the gap fully means a markdown-fence extractor plus a skip-marker convention for the future-API blocks - a harness change, out of scope for a docs PR. What IS gated: the appendix's ledger parity (`test_migration_guide_*`), which pins the row set and every mechanically checkable cell; and, since the first local review found all three merge examples carrying invalid keywords, `test_migration_guide_examples_bind_to_real_signatures`, which ast-parses the guide's python blocks and asserts every constructor/`fit()` keyword exists on the target signature. That is signature binding, NOT execution - it deliberately skips calls whose owner it cannot resolve (e.g. `results.aggregate(...)`), and it cannot catch a wrong VALUE or a wrong sequence of calls. The hand-written `Fix` prose remains unverifiable by any available means. | `docs/migration-4.0.md`, `tests/test_doc_snippets.py` | Phase 4 / 2026-08-09 | +| **MMM launch carousel carries scoped marketing claims, not exporter-contract documentation.** The deck (a LinkedIn marketing artifact, not a docs surface) states capabilities in scoped-but-punchy form: guardrail copy says "the easy mistakes fail loudly" / "you own the design, it owns the math" (the caller-owned estimand/population/window/outcome-scale alignment lives in REGISTRY.md's MMM section and the exporter docstrings, not on slides), and slide 8 shows tutorial 29's worked staggered-boost lift row WITHOUT an on-slide linearity qualifier - the compression's linear-channel scoping is the tutorial's job, which the CTA points to. Absolutes ("no silent mis-calibration", "any estimate exports", "anything with an estimate + SE") are ban-listed by `tests/test_mmm_carousel_claims.py`; local review R1/R2 pressed for compliance-style scoping language on the slides and the marketing-appropriate scoped copy was chosen instead. | `carousel/generate_mmm_carousel.py`, `tests/test_mmm_carousel_claims.py` | mmm-carousel / 2026-08-20 | | **MultiPeriodDiD deprecation shim loses static constructor-arg checking (3.9 window).** The M-010 shim is `__init__(*args, **kwargs)` + an import-time `__signature__` mirror of DiD's constructor: runtime introspection (get_params/set_params, `inspect.signature`) and eager validation are fully preserved, but static type checkers / IDEs cannot check constructor arguments for the deprecated class until its 4.0 removal. Accepted: the alternative (hand-mirroring ~20 parameters) is a drift magnet on a class with one minor version of remaining life. | `diff_diff/estimators.py` | 3(a) / 2026-08-07 | | **DCDH `sklearn.base.clone` param-identity failure won't-fix.** `ChaisemartinDHaultfoeuille._validate_paths_of_interest` unconditionally canonicalizes `paths_of_interest` into a fresh `List[Tuple[int, ...]]`, so sklearn `clone()`'s post-construction `param1 is param2` identity check fails for configured instances - a pre-existing normalization the BaseEstimator mixin PR documented rather than changed (get_params/set_params signatures are clone-compatible; the dependency-free `cls(**est.get_params())` config-equality contract is the enforced one, `tests/test_base_estimator.py`). Fixing would mean returning the caller's raw object from a validator whose job is canonicalization. | `chaisemartin_dhaultfoeuille.py` | mixin PR / 2026-08-01 | | **scikit-learn stays out of dev deps; clone-identity tests remain importorskip-only.** The sklearn-`clone()` round-trip tests (`test_base_estimator.py`, had/rdd/cic suites) run only where scikit-learn happens to be installed - deliberate, matching the numpy/pandas/scipy-only dependency posture; the always-running contract is the dependency-free re-instantiation config-equality test. | `tests/test_base_estimator.py` | mixin PR / 2026-08-01 | diff --git a/TODO.md b/TODO.md index 69d9482b3..ce6895f10 100644 --- a/TODO.md +++ b/TODO.md @@ -85,6 +85,7 @@ generic sparse-FE, QR+SVD rank-detection redundancy, `check_finite` bypass — m | df-provenance completion follow-up (PR C descoping): a Wooldridge public per-row df channel (a per-key dict that can also carry the hc2_bm BM contrast dofs the scalar `_df_analytic_fallback` cannot represent — the unified surface's Wooldridge df column stays NaN until then); ImputationDiD lead-horizon `event_study_df` (needs the `_compute_lead_coefficients`/`_aggregate_event_study` return-path change plus bootstrap-clearing semantics for post rows); and the `inference_df` (DiD/MPD/SA/StackedDiD) vs `df_inference` (CS/dCDH) adapter-naming unification. NOTE (M-024): StackedDiD's `df_survey=None` on analytical fits is DELIBERATE - the container resolver's `df_inference` fallback not matching `inference_df` is load-bearing (normal-theory FLCI; see the REGISTRY StackedDiD M-024 Note and the pin in `tests/test_event_study_consumers.py`) - the unification must preserve that outcome or renegotiate it explicitly. | `diff_diff/wooldridge_results.py`, `diff_diff/imputation.py`, `diff_diff/results_base.py` | #variance-PR-C | Mid | Low | | `worktree-rm` safety via a tested argv helper: the prose rewrite (ask-before-remove confirmation gate, detached-HEAD reachability/rescue, tip-identity force-delete guard) was reverted to the main version because editing the prose repeatedly reintroduced shell-injection (last: sourcing a state file built from a git-derived branch name). Restore those guards in a `worktree_rm.py` that takes the name via file ingress, invokes git through argv arrays, and has a metacharacter-branch/path injection regression test — the pattern that worked for `pr_prepare.py`/`premerge_scan.py`. | `.claude/commands/worktree-rm.md`, `.claude/scripts/` | skill-audit | Heavy | Medium | | `premerge_scan.py` should scan the staged blob (`git show :path`) for staged methodology files, not the working-tree copy — a stage-then-revert-working-copy edit currently reads the safe working version and misses the staged violation. Union staged-index findings with unstaged/untracked filesystem findings. | `.claude/scripts/premerge_scan.py` | skill-audit | Mid | Low | +| Carousel PDF drift guard: the committed deck PDFs are build artifacts of their `generate_*.py` scripts (README rule: regenerate in the same commit), but nothing verifies a committed PDF matches its generator — a source edit without regeneration, or a stale raster chart, passes every claims test. Applies to ALL decks, not just the MMM one. fpdf embeds creation-date metadata, so a byte-compare needs fixed metadata or a per-page rendered-text manifest. Origin: mmm-carousel local review R1. | `carousel/`, `tests/` | mmm-carousel | Mid | Low | | Re-add committed-range methodology scanning to `/push-pr-update` §3b (clean tree, commits ahead) using `premerge_scan.py --range`, with the comparison ref passed as **data** (resolved into a quoted variable in one Bash call, never a raw ``). It was removed to avoid ref interpolation; the helper already implements and tests `--range`. | `.claude/commands/push-pr-update.md` | skill-audit | Quick | Low | | Codex reviewer isolation (repo-wide): `codex --sandbox read-only` blocks writes but does NOT confine READS to the worktree/repo (verified: a probe read `/etc/hosts`), and prompt guards are not a security boundary. Affects `/ai-review-local` (which already documents and accepts this surface) and plan-review-eval dual arms equally. Evaluate OS-level isolation for codex invocations (container / `sandbox-exec` profile / dedicated low-privilege account exposing only the worktree). | `.claude/scripts/openai_review.py`, `tools/plan-review-eval/` | plan-review-eval local review R6 | Heavy | Medium | | plan-review-eval dual arms: terminate the surviving peer subprocess when the first reviewer of a dual pair fails (today an early Claude failure still waits out the codex peer — up to its 3600s ceiling — before the run becomes INFRA_ERROR; needs process handles threaded through `_call_claude`/`call_codex` or a shared cancellation event). | `tools/plan-review-eval/plan_adapters/plan_reviewer.py` | plan-review-eval local review R3 | Mid | Low | diff --git a/carousel/diff-diff-mmm-carousel.pdf b/carousel/diff-diff-mmm-carousel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3e309ce8b64f82b64b20fad861eb91dad94d41db GIT binary patch literal 205194 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

`ls}W9_{Rl8tN1f@4f2GQS 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 kC@p{ob=CjBg}tE8y=hKV+WRVpLy= 13pt, +headlines 34-50) with the "Signal" palette: deep violet primary (calibrated +posterior / diff-diff accent), coral for the uncalibrated model, amber +reserved EXCLUSIVELY for ground truth in every chart, on a lavender-to-white +gradient. The single dark slide is the HANDSHAKE CODE slide (slide 3) - the +deck is ease-first (user decision, 2026-08-19): the drama is how little code +there is, not a villain arc. + +Narrative spine (ease-first; Meridian / Tutorial 30 is the running example, +PyMC-Marketing / Tutorial 29 gets the secondary beat): + +1. Cover -- "Your geo test is already an MMM calibration input." + Posterior-density motif + amber truth line +2. The setup -- launch in 8 of 12 markets; the MMM has a calibration + hook waiting; connecting them by hand = three chances + to silently mis-calibrate +3. Handshake (DARK)-- fit -> aggregate('total') -> to_meridian_roi_prior. + Three lines, no hand-derived scaling +4. Paste and run -- prior.to_code() writes the Meridian code; the tutorial + executes the generated snippet exactly as printed +5. The payoff -- default 3.29 [3.02, 3.57] (truth 2.5 outside the 90% + interval) -> calibrated 2.54 [2.47, 2.62] +6. Why the gap -- a national model never saw the geo contrast; the + demand ramp landed on the launch window (schematic) +7. Rigor included -- staggered waves via CS; launch-from-zero total IS + roi_m's estimand; loud setup checks; cross-check +8. PyMC too -- spend boost -> lift test row: 3.52 -> 2.21 vs truth 2.0 +9. Capabilities -- one-line totals (4 estimators), any-estimate explicit + route, both MMM dialects, pooling, guardrails, zero + new dependencies (capabilities-over-validation: user + decision, 2026-08-20 - readers care what it gets + them, not how we test it) +10. CTA -- pip install; tutorials 29 + 30 mentioned ONCE, here, + as the learn-more teaser + +Claim discipline (verified against the committed executed notebooks +``docs/tutorials/30_mmm_calibration_meridian.ipynb`` and +``docs/tutorials/29_mmm_calibration_pymc.ipynb``): + +- EVERY number on the deck is a committed, seed-locked tutorial value. The + synchronization chain: library <-> notebook is pinned by the t29/t30 drift + tests; notebook <-> deck is pinned by ``tests/test_mmm_carousel_claims.py`` + (parses this module's constants and locates each on the committed notebook + surface). Truth provenance is CONCENTRATED, not repeated (user decision, + 2026-08-20 - the receipt band and per-slide DGP framing were cut): the + payoff chart's truth line is labeled "(simulated)", slide 8 carries a bare + "truth: 2.0", and the CTA line "A simulated market, so the truth is known" + is the full statement. Never strip the remaining three - a deck that shows + a "true ROI" with no simulation label implies real-market ground truth. +- The slide-5 payoff chart draws ONLY committed summary numbers (posterior + means + 90% interval endpoints as an interval plot) - no invented + distribution shapes. The COVER density motif is illustrative art (curves + drawn from the committed mean/interval summaries with widths uniformly + inflated for legibility, relative widths preserved), not a data claim - + same convention as the CiC deck's cover motif. +- The slide-6 panel is labeled a schematic ON the slide; it illustrates the + aggregation argument and plots no tutorial data. +- Slide 4 shows the generated ``to_code()`` snippet ABRIDGED and says so + on-slide; every displayed snippet line is verbatim from the committed + notebook output (claims-test pinned), and the "executes the generated + snippet exactly as printed" claim is backed by the notebook's exec cell. +- "interval 6x narrower" (slide 8) derives from committed widths + 3.59 -> 0.59; the claims test recomputes the ratio and requires >= 6. +- Slide-9 capability claims are source-pinned by the claims test: the four + named ``aggregate('total')`` adopters must each list ``"total"`` in their + results class's ``_AGGREGATE_SUPPORTED``, and the "Zero new dependencies" + claim is backed by an import scan of ``diff_diff/mmm.py`` (no framework + imports at module level - the templates embed them as text only). +- Framework versions appear once, as build facts ("built against + pymc-marketing 1.0 + google-meridian 1.8"); no forward-compat claims. +- Guardrail claims are SCOPED, never absolute (round-1 local review): the + exporters validate what is machine-checkable (signs, double scaling, + window/channel membership in the mask builder) while estimand, outcome + scale, population, and window alignment stay caller-owned (REGISTRY.md + MMM section). The deck says "the easy mistakes fail loudly" and "you own + the design, it owns the math"; the claims test BANS the retired absolutes + ("no silent mis-calibration", "never silently", "anything with an + estimate + SE", "any effect + SE", "any estimate exports"). The + round-2 resolution (user decision, 2026-08-20; DEFERRED.md decision + record): the slide-9 card reads "Bring your own estimator" (an API + capability, no universal), and slide 8 carries NO on-slide linearity + qualifier - the staggered-boost compression's linear-channel scoping is + tutorial 29's job, which the CTA points to. +- NO competitive claims ("only frequentist bridge", competitor names): not + click-through verifiable (user decision, 2026-08-19). +- Tutorials are referenced ONCE, on the CTA slide (CiC-deck precedent). + +Run with:: + + python carousel/generate_mmm_carousel.py + +Produces ``carousel/diff-diff-mmm-carousel.pdf``. Generation requires +``fpdf2``, ``Pillow``, and ``matplotlib`` (carousel-only dependencies, not +part of the library's install extras). +""" + +import os +import re +import tempfile +from pathlib import Path + +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt # noqa: E402 +import numpy as np # noqa: E402 +from fpdf import FPDF # noqa: E402 +from PIL import Image as PILImage # noqa: E402 + +# Page dimensions (4:5 portrait -- same as the other decks) +WIDTH = 270 # mm +HEIGHT = 337.5 # mm + +# Version label derived from pyproject.toml (regex, not tomllib: py>=3.9). +_PYPROJECT = Path(__file__).parent.parent / "pyproject.toml" +_m = re.search(r'^version\s*=\s*"([^"]+)"', _PYPROJECT.read_text(encoding="utf-8"), re.MULTILINE) +if _m is None: + raise RuntimeError(f"could not parse project version from {_PYPROJECT}") +VERSION_LABEL = "v" + _m.group(1) + +TOTAL_SLIDES = 10 + +# ------------------------------------------------------------------------- +# "Signal" palette +# ------------------------------------------------------------------------- +VIOLET = (124, 58, 237) # #7c3aed primary accent (calibrated / diff-diff) +VIOLET_DARK = (109, 40, 217) # #6d28d9 +VIOLET_BRIGHT = (167, 139, 250) # #a78bfa accents on the dark slide +LILAC = (221, 214, 254) # #ddd6fe light fills / dark-slide text pop +CORAL = (225, 29, 72) # #e11d48 the uncalibrated model + kickers +AMBER = (245, 158, 11) # #f59e0b GROUND TRUTH ONLY (chart grammar) +LAVENDER_TINT = (245, 243, 255) # #f5f3ff gradient start +SHADOW = (203, 213, 225) # #cbd5e1 soft card shadow + +# Text + structural (shared with the other decks for legibility) +NAVY = (15, 23, 42) # #0f172a primary text; dark-slide gradient start +GRAY = (100, 116, 139) # #64748b +LIGHT_GRAY = (148, 163, 184) # #94a3b8 +WHITE = (255, 255, 255) +DARK_VIOLET = (46, 16, 101) # #2e1065 dark-slide gradient end +PANEL_NAVY = (30, 41, 59) # #1e293b code panel on the dark slide +AMBER_CODE = (252, 211, 77) # #fcd34d code string/number literals +SLATE_CODE = (148, 163, 184) # #94a3b8 + +VIOLET_HEX = "#7c3aed" +VIOLET_BRIGHT_HEX = "#a78bfa" +LILAC_HEX = "#ddd6fe" +CORAL_HEX = "#e11d48" +AMBER_HEX = "#f59e0b" +NAVY_HEX = "#0f172a" +GRAY_HEX = "#64748b" +LIGHT_GRAY_HEX = "#94a3b8" + +# ------------------------------------------------------------------------- +# Seed-locked numbers from the committed executed tutorials. +# +# Tutorial 30 (Meridian spine): docs/tutorials/30_mmm_calibration_meridian.ipynb +# (seed 30301, 12 geos x 104 weeks, launch in 8 geos, waves 30/44/58). +# Tutorial 29 (PyMC beat): docs/tutorials/29_mmm_calibration_pymc.ipynb +# (seed 2026, 15 geos x 104 weeks, boost in 9 geos). +# +# Every constant below is located on the committed notebook surface by +# tests/test_mmm_carousel_claims.py - never edit one without re-running it. +# ------------------------------------------------------------------------- +MER_DEFAULT = (3.29, 3.02, 3.57) # default prior: ROI mean, 90% interval +MER_CAL = (2.54, 2.47, 2.62) # calibrated prior: ROI mean, 90% interval +MER_TRUTH = 2.50 # simulated true ROI (known by construction) +MER_DID = (2.49, 0.05) # the DiD measurement the prior encodes +MER_ERR = (0.79, 0.04) # posterior mean abs error, default -> calibrated +MER_WIDTH = (0.55, 0.15) # 90% interval width, default -> calibrated + +CS_TOTAL_LABEL = "184,281" # CS aggregate('total') incremental sales +SPEND_LABEL = "74,100" # total experiment spend +ROI_MEAS = (2.487, 0.048) # experiment ROI +/- sd fed to the prior +PRIOR_MU, PRIOR_SIGMA = 0.9109, 0.0195 # lognormal prior parameters +MASK_WEEKS = 74 # search weeks inside the calibration window +N_GEOS_MER, N_LAUNCHED = 12, 8 +WAVE_WEEKS = (30, 44, 58) +N_WEEKS = 104 + +PM_PLAIN = (3.52, 1.78, 5.36) # without lift test: ROI mean, 90% interval +PM_CAL = (2.21, 1.91, 2.50) # with lift test: ROI mean, 90% interval +PM_TRUTH = 2.00 +PM_ERR = (1.52, 0.21) # posterior mean abs error, plain -> calibrated +PM_WIDTH = (3.59, 0.59) # 90% interval width, plain -> calibrated +N_GEOS_PM, N_BOOSTED = 15, 9 +# Slide-8 call arguments (tutorial 29's lift row): x = national weekly +# baseline spend (SEARCH_BASE x N_GEOS), delta_x = total weekly boost +# (BOOST x boosted geos), scale = the boosted-geo count. The claims test +# re-derives all three from the notebook's DGP constants. +PM_X, PM_DELTA_X, PM_SCALE = 1500, 450, 9 + +# Lines shown on slide 4, VERBATIM from the committed to_code() output cell +# (the claims test locates each in the notebook output). The mask-building +# lines are elided on-slide; the slide says "abridged". +SNIPPET_LINES = [ + "mu = [0.9108575376065811, 0.2]", + "sigma = [0.019461139350044197, 0.9]", + 'roi_prior = tfp.distributions.LogNormal(mu, sigma, name="roi_m")', + "prior = prior_distribution.PriorDistribution(roi_m=roi_prior)", + "model_spec = spec.ModelSpec(", + " prior=prior,", + ' media_prior_type="roi",', + " roi_calibration_period=roi_calibration_period,", + ")", +] + + +class MMMCarouselPDF(FPDF): + def __init__(self): + super().__init__(orientation="P", unit="mm", format=(WIDTH, HEIGHT)) + self.set_auto_page_break(False) + self._temp_files = [] + + def cleanup(self): + for f in self._temp_files: + try: + os.unlink(f) + except OSError: + pass + + # ----------------------------------------------------------------- + # Magazine vertical sidebar -- VIOLET bar, CORAL progress tick. + # ----------------------------------------------------------------- + def _draw_vertical_sidebar(self, slide_number, total=TOTAL_SLIDES, dark=False): + bar_x = 14 + bar_y_top = 45 + bar_y_bottom = 275 + self.set_draw_color(*(VIOLET_BRIGHT if dark else VIOLET)) + self.set_line_width(0.6) + self.line(bar_x, bar_y_top, bar_x, bar_y_bottom) + + ratio = (slide_number - 1) / (total - 1) if total > 1 else 0.0 + tick_y = bar_y_top + ratio * (bar_y_bottom - bar_y_top) + self.set_draw_color(*CORAL) + self.set_line_width(1.2) + self.line(bar_x - 4, tick_y, bar_x + 7, tick_y) + + # ----------------------------------------------------------------- + # Backgrounds + footer + # ----------------------------------------------------------------- + def light_gradient_background(self): + """Lavender #f5f3ff fading to white.""" + steps = 50 + r0, g0, b0 = LAVENDER_TINT + for i in range(steps): + ratio = i / steps + self.set_fill_color( + int(r0 + (255 - r0) * ratio), + int(g0 + (255 - g0) * ratio), + int(b0 + (255 - b0) * ratio), + ) + y = i * HEIGHT / steps + self.rect(0, y, WIDTH, HEIGHT / steps + 1, "F") + + def dark_gradient_background(self): + """Near-black navy #0f172a fading to deep violet #2e1065.""" + steps = 50 + r0, g0, b0 = NAVY + r1, g1, b1 = DARK_VIOLET + for i in range(steps): + ratio = i / steps + self.set_fill_color( + int(r0 + (r1 - r0) * ratio), + int(g0 + (g1 - g0) * ratio), + int(b0 + (b1 - b0) * ratio), + ) + y = i * HEIGHT / steps + self.rect(0, y, WIDTH, HEIGHT / steps + 1, "F") + + def add_footer(self, dark=False): + """Centered split-color ``diff-diff vX.Y.Z`` wordmark.""" + self.set_font("Helvetica", "B", 12) + dd_text = "diff-diff " + v_text = VERSION_LABEL + dd_w = self.get_string_width(dd_text) + v_w = self.get_string_width(v_text) + start_x = (WIDTH - dd_w - v_w) / 2 + + self.set_xy(start_x, HEIGHT - 18) + self.set_text_color(*(LIGHT_GRAY if dark else GRAY)) + self.cell(dd_w, 10, dd_text) + self.set_text_color(*(VIOLET_BRIGHT if dark else VIOLET)) + self.cell(v_w, 10, v_text) + + # ----------------------------------------------------------------- + # Text helpers + # ----------------------------------------------------------------- + def centered_text(self, y, text, size=28, bold=True, color=NAVY, italic=False): + self.set_xy(0, y) + style = ("B" if bold else "") + ("I" if italic else "") + self.set_font("Helvetica", style, size) + self.set_text_color(*color) + self.cell(WIDTH, size * 0.5, text, align="C") + + def _kicker(self, y, text, color=CORAL): + """Editorial section label: letter-spaced caps with flanking rules.""" + spaced = " ".join(text.upper()) + self.set_font("Helvetica", "B", 13) + tw = self.get_string_width(spaced) + mid_y = y + 3 + rule = 20 + gap = 8 + self.set_draw_color(*color) + self.set_line_width(0.7) + self.line(WIDTH / 2 - tw / 2 - gap - rule, mid_y, WIDTH / 2 - tw / 2 - gap, mid_y) + self.line(WIDTH / 2 + tw / 2 + gap, mid_y, WIDTH / 2 + tw / 2 + gap + rule, mid_y) + self.set_xy(0, y) + self.set_text_color(*color) + self.cell(WIDTH, 6, spaced, align="C") + + def draw_split_logo(self, y, size=18): + """Split-color diff-diff logo with VIOLET middle dash.""" + self.set_xy(0, y) + self.set_font("Helvetica", "B", size) + self.set_text_color(*NAVY) + self.cell(WIDTH / 2 - 5, 10, "diff", align="R") + self.set_text_color(*VIOLET) + self.cell(10, 10, "-", align="C") + self.set_text_color(*NAVY) + self.cell(WIDTH / 2 - 5, 10, "diff", align="L") + + # ----------------------------------------------------------------- + # Shadowed card helpers + # ----------------------------------------------------------------- + def _shadow_rect(self, x, y, w, h): + self.set_fill_color(*SHADOW) + self.rect(x + 1.4, y + 1.4, w, h, "F") + + def _stat_card(self, x, y, w, h, headline, sub_lines, accent, headline_size=34): + """One shadowed stat card: big number + small caption lines.""" + self._shadow_rect(x, y, w, h) + self.set_fill_color(*WHITE) + self.set_draw_color(220, 220, 220) + self.set_line_width(0.5) + self.rect(x, y, w, h, "DF") + self.set_fill_color(*accent) + self.rect(x, y, w, 3.2, "F") + + self.set_xy(x, y + 12) + self.set_font("Helvetica", "B", headline_size) + self.set_text_color(*accent) + self.cell(w, 14, headline, align="C") + + ly = y + 32 + for line, emphasize in sub_lines: + self.set_xy(x + 6, ly) + self.set_font("Helvetica", "B" if emphasize else "", 13) + self.set_text_color(*(NAVY if emphasize else GRAY)) + self.cell(w - 12, 7, line, align="C") + ly += 9.5 + + def _chip_card(self, x, y, w, h, title, desc, accent): + """Small feature card: accent left bar + title + description.""" + self._shadow_rect(x, y, w, h) + self.set_fill_color(*WHITE) + self.set_draw_color(220, 220, 220) + self.set_line_width(0.5) + self.rect(x, y, w, h, "DF") + self.set_fill_color(*accent) + self.rect(x, y, 4, h, "F") + self.set_xy(x + 10, y + 7) + self.set_font("Helvetica", "B", 13.5) + self.set_text_color(*NAVY) + self.cell(w - 16, 7, title) + self.set_xy(x + 10, y + 19) + self.set_font("Helvetica", "", 11.5) + self.set_text_color(*GRAY) + self.multi_cell(w - 16, 5.6, desc, align="L") + + # ----------------------------------------------------------------- + # Figure helpers (matplotlib -> PNG -> fpdf image) + # ----------------------------------------------------------------- + def _save_fig(self, fig, dpi=200, transparent=False, facecolor="white"): + fd, path = tempfile.mkstemp(suffix=".png") + os.close(fd) + fig.savefig( + path, + dpi=dpi, + bbox_inches="tight", + pad_inches=0.1, + transparent=transparent, + facecolor=None if transparent else facecolor, + ) + plt.close(fig) + with PILImage.open(path) as img: + pw, ph = img.size + self._temp_files.append(path) + return path, pw, ph + + def _place_image_centered(self, path, pw, ph, y, max_w=200): + aspect = ph / pw + display_w = min(max_w, WIDTH * 0.8) + display_h = display_w * aspect + self.image(path, (WIDTH - display_w) / 2, y, display_w) + return display_h + + # ----------------------------------------------------------------- + # Cover motif -- the two ROI posteriors + the amber truth line. + # Illustrative art from the COMMITTED summaries (means + 90% interval + # half-widths as normal curves, widths uniformly inflated 2.5x for + # legibility; relative widths preserved) - not a data claim. + # ----------------------------------------------------------------- + def _render_cover_posteriors(self): + z90 = 1.645 + sd_def = (MER_DEFAULT[2] - MER_DEFAULT[1]) / (2 * z90) * 2.5 + sd_cal = (MER_CAL[2] - MER_CAL[1]) / (2 * z90) * 2.5 + grid = np.linspace(1.7, 4.3, 600) + + def _norm(mu, sd): + return np.exp(-0.5 * ((grid - mu) / sd) ** 2) / sd + + d_def = _norm(MER_DEFAULT[0], sd_def) + d_cal = _norm(MER_CAL[0], sd_cal) + peak = d_cal.max() + d_def, d_cal = d_def / peak, d_cal / peak + + fig, ax = plt.subplots(figsize=(10, 3.1)) + fig.patch.set_alpha(0) + ax.set_facecolor("none") + + ax.axvline(MER_TRUTH, color=AMBER_HEX, linewidth=3.0, linestyle=(0, (5, 2))) + ax.text( + MER_TRUTH - 0.05, + 1.06, + "the true ROI (simulated)", + fontsize=13.5, + color=AMBER_HEX, + fontweight="bold", + ha="right", + ) + ax.text( + grid[-1], + -0.06, + "illustrative", + fontsize=11, + color=LIGHT_GRAY_HEX, + style="italic", + ha="right", + va="top", + ) + + ax.plot(grid, d_def, color=CORAL_HEX, linewidth=3.2, alpha=0.75) + ax.fill_between(grid, 0, d_def, color=CORAL_HEX, alpha=0.10, linewidth=0) + ax.plot(grid, d_cal, color=VIOLET_HEX, linewidth=3.4) + ax.fill_between(grid, 0, d_cal, color=VIOLET_HEX, alpha=0.12, linewidth=0) + + ax.text( + MER_DEFAULT[0] + 0.16, + d_def.max() * 1.28, + "MMM alone", + fontsize=13.5, + color=CORAL_HEX, + fontweight="bold", + ) + ax.text( + MER_CAL[0] + 0.09, + 0.86, + "with your experiment", + fontsize=13.5, + color=VIOLET_HEX, + fontweight="bold", + ) + + ax.set_xlim(grid[0], grid[-1]) + ax.set_ylim(0, 1.22) + ax.set_xticks([]) + ax.set_yticks([]) + for spine in ax.spines.values(): + spine.set_visible(False) + fig.tight_layout(pad=0.2) + return self._save_fig(fig, transparent=True) + + # ----------------------------------------------------------------- + # Payoff figure (slide 5) -- committed means + 90% intervals ONLY, + # drawn as an interval plot. No invented distribution shapes. + # ----------------------------------------------------------------- + def _render_payoff_intervals(self): + fig, ax = plt.subplots(figsize=(10, 4.1)) + + rows = [ + (1.0, MER_DEFAULT, CORAL_HEX, "default prior"), + (0.0, MER_CAL, VIOLET_HEX, "with the experiment prior"), + ] + ax.axvline( + MER_TRUTH, + color=AMBER_HEX, + linewidth=3.0, + linestyle=(0, (5, 2)), + zorder=1, + label=f"true ROI = {MER_TRUTH:.1f} (simulated)", + ) + for yv, (mean, lo, hi), color, label in rows: + ax.plot([lo, hi], [yv, yv], color=color, linewidth=7, solid_capstyle="butt", zorder=2) + for xend in (lo, hi): + ax.plot([xend, xend], [yv - 0.06, yv + 0.06], color=color, linewidth=2.4) + ax.plot([mean], [yv], "o", color=color, markersize=13, zorder=3) + ax.annotate( + f"{mean:.2f}", + xy=(mean, yv), + xytext=(mean - 0.02, yv + 0.16), + fontsize=16, + fontweight="bold", + color=color, + ha="center", + ) + ax.text( + lo - 0.045, + yv, + label, + fontsize=13.5, + color=color, + fontweight="bold", + ha="right", + va="center", + ) + ax.text( + hi + 0.045, + yv, + f"[{lo:.2f}, {hi:.2f}]", + fontsize=12.5, + color=GRAY_HEX, + va="center", + ) + + ax.text( + MER_DEFAULT[0], + 0.68, + "the truth isn't even in the 90% interval", + fontsize=13, + color=CORAL_HEX, + fontweight="bold", + ha="center", + ) + + ax.set_xlim(1.28, 4.05) + ax.set_ylim(-0.55, 1.55) + ax.set_yticks([]) + ax.set_xlabel( + "search-channel ROI posterior (mean + 90% interval)", fontsize=13, color=NAVY_HEX + ) + ax.tick_params(labelsize=12, colors=GRAY_HEX) + for s in ("top", "right", "left"): + ax.spines[s].set_visible(False) + ax.spines["bottom"].set_color(LIGHT_GRAY_HEX) + ax.legend(loc="upper left", fontsize=12, frameon=False) + fig.tight_layout(pad=0.3) + return self._save_fig(fig, facecolor="white") + + # ----------------------------------------------------------------- + # Aggregation schematic (slide 6) -- labeled a schematic on-slide; + # illustrates the argument, plots no tutorial data. + # ----------------------------------------------------------------- + def _render_aggregation_schematic(self): + rng = np.random.default_rng(30301) + t = np.arange(N_WEEKS) + ramp = np.clip((t - 26) / 52.0, 0, None) + + fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10.6, 3.8)) + for ax in (ax1, ax2): + ax.set_xticks([]) + ax.set_yticks([]) + for s in ax.spines.values(): + s.set_visible(False) + + # Left: the geo contrast the experiment sees. + waves = [30, 30, 30, 44, 44, 44, 58, 58] + for i, w in enumerate(waves): + base = i * 1.15 + y = base + 0.55 * (t >= w) + ax1.plot(t, y, color=VIOLET_HEX, linewidth=1.9, alpha=0.85) + ax1.axvline(w, color=VIOLET_HEX, alpha=0.0) + for j in range(4): + base = -(j + 1) * 1.15 + ax1.plot(t, np.full_like(t, base, dtype=float), color=LIGHT_GRAY_HEX, linewidth=1.9) + ax1.text( + 2, 9.6, "8 launched markets (3 waves)", fontsize=13, color=VIOLET_HEX, fontweight="bold" + ) + ax1.text(2, -5.6, "4 holdouts", fontsize=13, color=GRAY_HEX, fontweight="bold") + ax1.set_title("what the experiment sees", fontsize=14, color=NAVY_HEX, fontweight="bold") + ax1.set_ylim(-6.6, 10.8) + + # Right: the single national series the MMM sees. + launched_frac = np.mean([(t >= w) for w in waves], axis=0) + national = 1.0 + 2.4 * ramp + 0.55 * launched_frac + rng.normal(0, 0.16, N_WEEKS) + ax2.plot(t, national, color=CORAL_HEX, linewidth=2.6) + ax2.axvspan(30, N_WEEKS - 1, color=LILAC_HEX, alpha=0.45, linewidth=0) + ax2.text(35, 0.62, "launch window", fontsize=12.5, color=VIOLET_HEX) + ax2.annotate( + "demand ramp + launch,\none indistinguishable line", + xy=(78, float(national[78])), + xytext=(18, 4.25), + fontsize=13, + color=CORAL_HEX, + fontweight="bold", + arrowprops=dict(arrowstyle="->", color=CORAL_HEX, lw=1.5), + ) + ax2.set_title("what a national MMM sees", fontsize=14, color=NAVY_HEX, fontweight="bold") + ax2.set_ylim(0.3, 5.0) + + fig.text( + 0.99, 0.01, "schematic", fontsize=11, color=LIGHT_GRAY_HEX, ha="right", style="italic" + ) + fig.tight_layout(pad=0.6) + return self._save_fig(fig, facecolor="white") + + # ----------------------------------------------------------------- + # Code-block helper (dark panel with token-colored lines) + # ----------------------------------------------------------------- + def _add_code_block(self, x, y, w, token_lines, font_size=12, line_height=10, fill=NAVY): + n_lines = len(token_lines) + total_h = n_lines * line_height + 24 + + self._shadow_rect(x, y, w, total_h) + self.set_fill_color(*fill) + self.rect(x, y, w, total_h, "F") + + self.set_font("Courier", "", font_size) + char_w = self.get_string_width("M") + + pad_x = 15 + pad_y = 12 + for i, tokens in enumerate(token_lines): + cx = x + pad_x + cy = y + pad_y + i * line_height + for text, color in tokens: + if not text: + continue + self.set_xy(cx, cy) + self.set_text_color(*color) + self.cell(char_w * len(text), 10, text) + cx += char_w * len(text) + return total_h + + # ----------------------------------------------------------------- + # Slides + # ----------------------------------------------------------------- + def slide_01_cover(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(1) + + self.draw_split_logo(30, size=38) + + self.centered_text(72, "Your geo test is already", size=45) + self.centered_text(102, "an MMM calibration input.", size=45, color=VIOLET) + + motif_path, _pw, _ph = self._render_cover_posteriors() + motif_w = 216 + self.image(motif_path, (WIDTH - motif_w) / 2, 134, motif_w) + + self.centered_text( + 216, "Turn a DiD experiment into your MMM's prior -", size=20, color=NAVY + ) + self.centered_text(233, "in three lines of code.", size=20, color=NAVY) + + self.set_xy(0, HEIGHT - 70) + self.set_font("Helvetica", "B", 16) + self.set_text_color(*VIOLET) + self.cell( + WIDTH, + 8, + "Speaks Google Meridian + PyMC-Marketing natively.", + align="C", + ) + self.add_footer() + + def slide_02_setup(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(2) + + self._kicker(34, "The Setup") + self.centered_text(52, "You ran the experiment.", size=38) + self.centered_text(80, "Your MMM is still guessing.", size=38, color=CORAL) + + self.set_xy(33, 112) + self.set_font("Helvetica", "", 14.5) + self.set_text_color(*GRAY) + self.multi_cell( + WIDTH - 66, + 8, + f"A search channel launched in {N_LAUNCHED} of {N_GEOS_MER} markets, in three" + f" staggered waves. The {N_GEOS_MER - N_LAUNCHED} holdouts never got it. Your MMM" + " has a calibration hook built for exactly this experiment - Meridian takes" + " ROI priors, PyMC-Marketing takes lift tests. Connecting them by hand means" + " deriving, yourself:", + align="C", + ) + + card_w = 66 + card_h = 42 + gap = 8 + left_x = (WIDTH - 3 * card_w - 2 * gap) / 2 + cy = 164 + for i, (title, desc) in enumerate( + ( + ("a total", "incremental outcome,\nin outcome units"), + ("a lognormal", "mu / sigma from the\nestimate and its SE"), + ("a mask window", "which weeks the\nprior may speak for"), + ) + ): + cx = left_x + i * (card_w + gap) + self._shadow_rect(cx, cy, card_w, card_h) + self.set_fill_color(*WHITE) + self.set_draw_color(220, 220, 220) + self.set_line_width(0.5) + self.rect(cx, cy, card_w, card_h, "DF") + self.set_fill_color(*CORAL) + self.rect(cx, cy, card_w, 3.0, "F") + self.set_xy(cx, cy + 8) + self.set_font("Helvetica", "B", 15) + self.set_text_color(*NAVY) + self.cell(card_w, 8, title, align="C") + self.set_xy(cx + 4, cy + 20) + self.set_font("Helvetica", "", 11.5) + self.set_text_color(*GRAY) + self.multi_cell(card_w - 8, 5.6, desc, align="C") + + self.centered_text(226, "Get any one wrong and the model is", size=17, color=NAVY) + self.centered_text(242, "silently mis-calibrated.", size=17, color=NAVY) + self.centered_text( + 268, "Here's the whole bridge.", size=15, bold=False, italic=True, color=GRAY + ) + self.add_footer() + + def slide_03_handshake(self): + self.add_page() + self.dark_gradient_background() + self._draw_vertical_sidebar(3, dark=True) + + self._kicker(36, "The Handshake") + self.centered_text(56, "Three lines.", size=52, color=WHITE) + + margin = 26 + code_y = 100 + token_lines = [ + [ + ("res", WHITE), + (" = ", SLATE_CODE), + ("CallawaySantAnna", AMBER_CODE), + ("().fit(panel, ", WHITE), + ("outcome", WHITE), + ("=", SLATE_CODE), + ("'sales'", AMBER_CODE), + (", ", SLATE_CODE), + ("unit", WHITE), + ("=", SLATE_CODE), + ("'geo'", AMBER_CODE), + (",", SLATE_CODE), + ], + [ + (" ", WHITE), + ("time", WHITE), + ("=", SLATE_CODE), + ("'week'", AMBER_CODE), + (", ", SLATE_CODE), + ("first_treat", WHITE), + ("=", SLATE_CODE), + ("'first_treat'", AMBER_CODE), + (")", WHITE), + ], + [], + [ + ("total", WHITE), + (" = ", SLATE_CODE), + ("res.aggregate(", WHITE), + ("'total'", AMBER_CODE), + (")", WHITE), + (" # incremental sales: 184,281", LIGHT_GRAY), + ], + [], + [ + ("prior", WHITE), + (" = ", SLATE_CODE), + ("to_meridian_roi_prior", AMBER_CODE), + ("(", WHITE), + ("aggregation_result", WHITE), + ("=", SLATE_CODE), + ("total", WHITE), + (",", SLATE_CODE), + ], + [ + (" ", WHITE), + ("spend", WHITE), + ("=", SLATE_CODE), + ("total_spend", WHITE), + (")", WHITE), + (" # 74,100", LIGHT_GRAY), + ], + [], + [ + ("# experiment ROI: 2.487 +/- 0.048", LIGHT_GRAY), + ], + [ + ("# -> LogNormal(mu=0.9109, sigma=0.0195), ready for Meridian", LIGHT_GRAY), + ], + ] + code_h = self._add_code_block( + margin, + code_y, + WIDTH - margin * 2, + token_lines, + font_size=11.5, + line_height=10, + fill=PANEL_NAVY, + ) + + y = code_y + code_h + 14 + for line, color in ( + ("Staggered waves? Handled by the estimator.", LILAC), + ("Outcome units? The total already speaks them.", LILAC), + ("Lognormal math? Done, with the SE propagated.", LILAC), + ): + self.centered_text(y, line, size=15, bold=False, color=color) + y += 13 + + self.centered_text(y + 6, "No hand-derived scaling anywhere.", size=18, color=VIOLET_BRIGHT) + self.add_footer(dark=True) + + def slide_04_to_code(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(4) + + self._kicker(32, "Paste and Run") + self.centered_text(50, "It writes the", size=40) + self.centered_text(78, "Meridian code for you.", size=40, color=VIOLET) + + self.set_xy(0, 100) + self.set_font("Courier", "B", 15) + self.set_text_color(*NAVY) + self.cell(WIDTH, 8, "prior.to_code()", align="C") + self.set_xy(0, 110) + self.set_font("Helvetica", "I", 12) + self.set_text_color(*GRAY) + self.cell( + WIDTH, + 8, + "generated output (abridged - the full snippet builds the mask too):", + align="C", + ) + + margin = 32 + code_y = 124 + token_lines = [] + for line in SNIPPET_LINES: + stripped = line.strip() + if stripped.startswith(("mu =", "sigma =")): + name, rest = line.split(" = ", 1) + token_lines.append([(name, WHITE), (" = ", SLATE_CODE), (rest, AMBER_CODE)]) + else: + token_lines.append([(line, WHITE)]) + code_h = self._add_code_block( + margin, code_y, WIDTH - margin * 2, token_lines, font_size=11.5, line_height=9.5 + ) + + y = code_y + code_h + 12 + for text in ( + "Your experiment's prior on 'search' - the other channels keep Meridian's own defaults.", + f"For 'search', the calibration mask covers the {MASK_WEEKS}-week experiment window" + " and nothing else.", + "Paste it into your Meridian pipeline - it runs exactly as generated.", + ): + self.set_xy(30, y) + self.set_font("Helvetica", "", 13.5) + self.set_text_color(*NAVY) + self.multi_cell(WIDTH - 60, 7, text, align="C") + y = self.get_y() + 3 + self.add_footer() + + def slide_05_payoff(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(5) + + self._kicker(32, "The Payoff") + self.centered_text(50, "One prior. The posterior", size=38) + self.centered_text(78, "snaps to the truth.", size=38, color=VIOLET) + + plot_path, ppw, pph = self._render_payoff_intervals() + plot_h = self._place_image_centered(plot_path, ppw, pph, 104, max_w=214) + + base_y = 104 + plot_h + 8 + self.set_xy(28, base_y) + self.set_font("Helvetica", "", 14) + self.set_text_color(*NAVY) + self.multi_cell( + WIDTH - 56, + 7.6, + f"With Meridian's default prior, the model settles on {MER_DEFAULT[0]:.2f} -" + f" confidently, and wrong. Feed it the experiment and the posterior lands on" + f" {MER_CAL[0]:.2f} against a true ROI of {MER_TRUTH:.1f}. Posterior error" + f" {MER_ERR[0]:.2f} -> {MER_ERR[1]:.2f}; interval width {MER_WIDTH[0]:.2f} ->" + f" {MER_WIDTH[1]:.2f}. The DiD measured {MER_DID[0]:.2f} +/- {MER_DID[1]:.2f}.", + align="C", + ) + self.add_footer() + + def slide_06_why(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(6) + + self._kicker(34, "Why It Was Wrong") + self.centered_text(52, "The national model", size=38) + self.centered_text(80, "never saw the contrast.", size=38, color=CORAL) + + plot_path, ppw, pph = self._render_aggregation_schematic() + plot_h = self._place_image_centered(plot_path, ppw, pph, 108, max_w=216) + + base_y = 108 + plot_h + 10 + self.set_xy(30, base_y) + self.set_font("Helvetica", "", 14) + self.set_text_color(*NAVY) + self.multi_cell( + WIDTH - 60, + 7.6, + "Aggregation destroys the holdout comparison, and a demand ramp lands right" + " on the launch window - so the model credits the launch. The experiment is" + " the one thing in the data that moved spend independent of demand. That is" + " exactly why both MMMs ship calibration hooks.", + align="C", + ) + self.add_footer() + + def slide_07_rigor(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(7) + + self._kicker(34, "Rigor Included") + self.centered_text(52, "The estimand matches,", size=38) + self.centered_text(80, "so you don't have to.", size=38, color=VIOLET) + + cards = [ + ( + "Staggered launches", + "Callaway-Sant'Anna cohorts - not a naive pre/post average across waves", + ), + ( + "Launch-from-zero = roi_m", + "the experiment total IS Meridian's full-spend-vs-none ROI estimand", + ), + ( + "It checks your setup", + "malformed windows, wrong signs, double-scaled totals - the easy mistakes fail loudly", + ), + ( + "Cross-checked estimate", + "swap in ImputationDiD and the total agrees - a one-line robustness check", + ), + ] + col_w = 104 + row_h = 44 + gap_x = 12 + gap_y = 12 + start_x = (WIDTH - 2 * col_w - gap_x) / 2 + start_y = 122 + for i, (title, desc) in enumerate(cards): + cx = start_x + (i % 2) * (col_w + gap_x) + cy = start_y + (i // 2) * (row_h + gap_y) + self._chip_card(cx, cy, col_w, row_h, title, desc, VIOLET) + + self.centered_text( + start_y + 2 * (row_h + gap_y) + 16, + "You think about the experiment. It thinks about the export.", + size=17, + color=NAVY, + ) + self.add_footer() + + def slide_08_pymc(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(8) + + self._kicker(34, "Also Speaks PyMC") + self.centered_text(52, "Spend boost instead?", size=38) + self.centered_text(80, "That's a lift test.", size=38, color=VIOLET) + + self.set_xy(32, 108) + self.set_font("Helvetica", "", 14) + self.set_text_color(*GRAY) + self.multi_cell( + WIDTH - 64, + 7.6, + f"The other classic geo experiment - a budget boost in {N_BOOSTED} of" + f" {N_GEOS_PM} markets, with a spend history that chased demand - exports" + " as a PyMC-Marketing lift-test row:", + align="C", + ) + + margin = 42 + code_y = 134 + token_lines = [ + [ + ("df", WHITE), + (" = ", SLATE_CODE), + ("to_pymc_marketing_lift_test", AMBER_CODE), + ("(", WHITE), + ("channel", WHITE), + ("=", SLATE_CODE), + ("'search'", AMBER_CODE), + (", ", SLATE_CODE), + ("x", WHITE), + ("=", SLATE_CODE), + (str(PM_X), AMBER_CODE), + (",", SLATE_CODE), + ], + [ + (" ", WHITE), + ("delta_x", WHITE), + ("=", SLATE_CODE), + (str(PM_DELTA_X), AMBER_CODE), + (", ", SLATE_CODE), + ("aggregation_result", WHITE), + ("=", SLATE_CODE), + ("simple", WHITE), + (", ", SLATE_CODE), + ("scale", WHITE), + ("=", SLATE_CODE), + (str(PM_SCALE), AMBER_CODE), + (")", WHITE), + ], + [ + ("mmm.add_lift_test_measurements(df)", WHITE), + (" # scale = 9 boosted geos", LIGHT_GRAY), + ], + ] + self._add_code_block( + margin, code_y, WIDTH - margin * 2, token_lines, font_size=11, line_height=9.5 + ) + + card_w = 104 + card_h = 66 + gap = 12 + left_x = (WIDTH - 2 * card_w - gap) / 2 + cy = 196 + self._stat_card( + left_x, + cy, + card_w, + card_h, + f"{PM_PLAIN[0]:.2f}", + [ + ("without the lift test", True), + (f"90% interval [{PM_PLAIN[1]:.2f}, {PM_PLAIN[2]:.2f}]", False), + ("wide AND centered high", False), + ], + CORAL, + headline_size=32, + ) + self._stat_card( + left_x + card_w + gap, + cy, + card_w, + card_h, + f"{PM_CAL[0]:.2f}", + [ + ("with it", True), + (f"90% interval [{PM_CAL[1]:.2f}, {PM_CAL[2]:.2f}]", False), + (f"truth: {PM_TRUTH:.1f}", False), + ], + VIOLET, + headline_size=32, + ) + + self.set_xy(30, 272) + self.set_font("Helvetica", "", 14) + self.set_text_color(*NAVY) + self.multi_cell( + WIDTH - 60, + 7.4, + f"Posterior error {PM_ERR[0]:.2f} -> {PM_ERR[1]:.2f}; the 90% interval is" + f" 6x narrower ({PM_WIDTH[0]:.2f} -> {PM_WIDTH[1]:.2f}). One exported" + " DataFrame did that.", + align="C", + ) + self.add_footer() + + def slide_09_production(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(9) + + self._kicker(30, "What You Get") + self.centered_text(46, "Built for how you measure.", size=34) + + features = [ + ( + "One-line totals", + "aggregate('total') on Callaway-Sant'Anna, EfficientDiD, ImputationDiD, TwoStageDiD", + ), + ( + "Bring your own estimator", + "synthetic-control geo tests, on/off pulses, dose designs - the explicit route takes your effect + SE", + ), + ( + "Both MMM dialects", + "Meridian ROI priors + calibration masks; PyMC-Marketing lift tests, geo dims included", + ), + ( + "Multiple experiments", + "spend-weighted pooling into one prior, with optional SE widening", + ), + ( + "Loud guardrails", + "wrong-sign and double-scaling mistakes raise - you own the design, it owns the math", + ), + ( + "sklearn-style API", + "fit() / summary() / to_dataframe(), like every diff-diff estimator", + ), + ] + col_w = 104 + row_h = 40 + gap_x = 12 + gap_y = 7 + start_x = (WIDTH - 2 * col_w - gap_x) / 2 + start_y = 78 + for i, (title, desc) in enumerate(features): + cx = start_x + (i % 2) * (col_w + gap_x) + cy = start_y + (i // 2) * (row_h + gap_y) + self._chip_card(cx, cy, col_w, row_h, title, desc, VIOLET) + + vy = start_y + 3 * (row_h + gap_y) + 8 + self.set_fill_color(*DARK_VIOLET) + self.rect(34, vy, WIDTH - 68, 54, "F") + self.set_xy(0, vy + 6) + self.set_font("Helvetica", "B", 15) + self.set_text_color(*LILAC) + self.cell(WIDTH, 8, "Zero new dependencies", align="C") + self.set_xy(34 + 8, vy + 18) + self.set_font("Helvetica", "", 12.5) + self.set_text_color(*WHITE) + self.multi_cell( + WIDTH - 68 - 16, + 6.4, + "The exporters emit plain DataFrames, prior parameters, and generated code" + " - your DiD analysis never has to share an environment with Meridian or" + " PyMC. Built against pymc-marketing 1.0 + google-meridian 1.8.", + align="C", + ) + self.add_footer() + + def slide_10_cta(self): + self.add_page() + self.light_gradient_background() + self._draw_vertical_sidebar(10) + + self.draw_split_logo(52, size=44) + self.centered_text(92, "Stop choosing between", size=30) + self.centered_text(114, "the experiment and the model.", size=30, color=VIOLET) + + chip_w = 150 + chip_x = (WIDTH - chip_w) / 2 + chip_y = 152 + self._shadow_rect(chip_x, chip_y, chip_w, 24) + self.set_fill_color(*NAVY) + self.rect(chip_x, chip_y, chip_w, 24, "F") + self.set_xy(chip_x, chip_y + 6) + self.set_font("Courier", "B", 17) + self.set_text_color(*AMBER_CODE) + self.cell(chip_w, 12, "pip install diff-diff", align="C") + + self.set_xy(35, 194) + self.set_font("Helvetica", "", 14) + self.set_text_color(*NAVY) + self.multi_cell( + WIDTH - 70, + 7.8, + "A simulated market, so the truth is known - tutorials 29 and 30 reproduce" + " every number here end to end:", + align="C", + ) + self.centered_text( + 216, + "diff-diff.readthedocs.io/en/latest/tutorials/30_mmm_calibration_meridian.html", + size=12, + color=VIOLET_DARK, + ) + self.centered_text( + 228, + "diff-diff.readthedocs.io/en/latest/tutorials/29_mmm_calibration_pymc.html", + size=12, + color=VIOLET_DARK, + ) + + self.centered_text(252, "github.com/igerber/diff-diff", size=16, color=NAVY) + + self.set_xy(0, 280) + self.set_font("Helvetica", "I", 12) + self.set_text_color(*GRAY) + self.cell( + WIDTH, + 6, + "DiD experiments -> MMM calibration. Now in diff-diff.", + align="C", + ) + self.add_footer() + + +def main(): + pdf = MMMCarouselPDF() + try: + pdf.slide_01_cover() + pdf.slide_02_setup() + pdf.slide_03_handshake() + pdf.slide_04_to_code() + pdf.slide_05_payoff() + pdf.slide_06_why() + pdf.slide_07_rigor() + pdf.slide_08_pymc() + pdf.slide_09_production() + pdf.slide_10_cta() + + output_path = Path(__file__).parent / "diff-diff-mmm-carousel.pdf" + pdf.output(str(output_path)) + print(f"PDF saved to: {output_path}") + finally: + pdf.cleanup() + + +if __name__ == "__main__": + main() diff --git a/tests/test_mmm_carousel_claims.py b/tests/test_mmm_carousel_claims.py new file mode 100644 index 000000000..07aa697d5 --- /dev/null +++ b/tests/test_mmm_carousel_claims.py @@ -0,0 +1,393 @@ +"""Claim-sync guard for the MMM calibration interop carousel. + +The deck (``carousel/generate_mmm_carousel.py``) hardcodes the committed +executed tutorials' seed-locked numbers as module constants. The +synchronization chain is: + +- library <-> notebook: ``tests/test_t29_mmm_calibration_pymc_drift.py`` and + ``tests/test_t30_mmm_calibration_meridian_drift.py`` re-derive the DiD-side + numbers from the public API and pin the committed notebook surfaces; +- notebook <-> carousel: THIS file parses the deck's constants (via ``ast`` - + the generator imports ``fpdf2``, a carousel-only dependency deliberately + absent from CI) and locates each on the COMMITTED NOTEBOOK SURFACE, not + restated here. If either tutorial is ever retuned and the carousel is + forgotten, the notebook surface changes and this file fails. + +Skips cleanly when ``carousel/`` or ``docs/`` is absent (the isolated-install +CI jobs copy only ``tests/``). +""" + +from __future__ import annotations + +import ast +import re +from pathlib import Path + +import pytest + +from tests._tutorial_drift import notebook_output_text + +GENERATOR = Path(__file__).resolve().parents[1] / "carousel" / "generate_mmm_carousel.py" +NB_MER = "docs/tutorials/30_mmm_calibration_meridian.ipynb" +NB_PM = "docs/tutorials/29_mmm_calibration_pymc.ipynb" + + +@pytest.fixture(scope="module") +def deck_constants(): + if not GENERATOR.exists(): + pytest.skip(f"{GENERATOR} not available in this CI environment.") + tree = ast.parse(GENERATOR.read_text(encoding="utf-8")) + consts = {} + for node in tree.body: + if isinstance(node, ast.Assign) and len(node.targets) == 1: + target = node.targets[0] + if isinstance(target, ast.Name): + try: + consts[target.id] = ast.literal_eval(node.value) + except (ValueError, TypeError): + pass + elif isinstance(target, ast.Tuple) and all( + isinstance(el, ast.Name) for el in target.elts + ): + # e.g. ``PRIOR_MU, PRIOR_SIGMA = 0.9109, 0.0195`` + try: + values = ast.literal_eval(node.value) + except (ValueError, TypeError): + continue + if isinstance(values, tuple) and len(values) == len(target.elts): + for el, val in zip(target.elts, values): + consts[el.id] = val + return consts + + +@pytest.fixture(scope="module") +def visible_strings(): + """Slide copy: every string literal in the generator EXCEPT docstrings.""" + if not GENERATOR.exists(): + pytest.skip(f"{GENERATOR} not available in this CI environment.") + tree = ast.parse(GENERATOR.read_text(encoding="utf-8")) + docstring_nodes = set() + for node in ast.walk(tree): + if isinstance(node, (ast.Module, ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)): + body = node.body + if ( + body + and isinstance(body[0], ast.Expr) + and isinstance(body[0].value, ast.Constant) + and isinstance(body[0].value.value, str) + ): + docstring_nodes.add(id(body[0].value)) + return " ".join( + node.value + for node in ast.walk(tree) + if isinstance(node, ast.Constant) + and isinstance(node.value, str) + and id(node) not in docstring_nodes + ) + + +def _notebook_code(rel_path: str) -> str: + import json + + nb_path = Path(__file__).resolve().parents[1] / rel_path + if not nb_path.exists(): + pytest.skip(f"Notebook not found at {nb_path}.") + return "\n".join( + "".join(c["source"]) if isinstance(c["source"], list) else c["source"] + for c in json.loads(nb_path.read_text())["cells"] + if c["cell_type"] == "code" + ) + + +@pytest.fixture(scope="module") +def mer_output(): + return notebook_output_text(NB_MER) + + +@pytest.fixture(scope="module") +def pm_output(): + return notebook_output_text(NB_PM) + + +class TestMeridianSpineMatchesNotebook: + """Every tutorial-30 number on the deck is on the committed surface.""" + + def test_posterior_summary_lines(self, deck_constants, mer_output): + c = deck_constants + d, cal = c["MER_DEFAULT"], c["MER_CAL"] + for needle in ( + f"default prior: ROI mean {d[0]:.2f}, 90% interval ({d[1]:.2f}, {d[2]:.2f})", + f"calibrated prior: ROI mean {cal[0]:.2f}, 90% interval ({cal[1]:.2f}, {cal[2]:.2f})", + f"truth: {c['MER_TRUTH']:.2f}", + f"DiD measurement: {c['MER_DID'][0]:.2f} ± {c['MER_DID'][1]:.2f}", + f"error: {c['MER_ERR'][0]:.2f} -> {c['MER_ERR'][1]:.2f}; " + f"90% width: {c['MER_WIDTH'][0]:.2f} -> {c['MER_WIDTH'][1]:.2f}", + ): + assert needle in mer_output, f"deck value not on tutorial-30 surface: {needle!r}" + + def test_confidently_wrong_structure(self, deck_constants): + # The load-bearing story beats, reproduced from the deck's own + # constants: the default interval EXCLUDES the truth, the calibrated + # interval covers it and is strictly narrower. + c = deck_constants + d, cal, truth = c["MER_DEFAULT"], c["MER_CAL"], c["MER_TRUTH"] + assert d[1] > truth, "slide-5 claim requires truth below the default interval" + assert cal[1] < truth < cal[2], "calibrated interval must cover the truth" + assert (cal[2] - cal[1]) < (d[2] - d[1]) + + def test_totals_lines(self, deck_constants, mer_output): + # The slide-3 code-panel comments quote the CS total and the spend; + # both must match the labeled lines in the committed output. + c = deck_constants + for label_re, key in ( + (r"CS total incremental sales:\s+", "CS_TOTAL_LABEL"), + (r"total experiment spend:\s+", "SPEND_LABEL"), + ): + pattern = label_re + re.escape(c[key]) + assert re.search(pattern, mer_output), f"totals line not found: {pattern!r}" + + def test_prior_and_mask_lines(self, deck_constants, mer_output): + c = deck_constants + roi = c["ROI_MEAS"] + assert f"experiment ROI: {roi[0]:.3f} ± {roi[1]:.3f}" in mer_output + assert f"mu={c['PRIOR_MU']:.4f}, sigma={c['PRIOR_SIGMA']:.4f}" in mer_output + assert f"search weeks in window: {c['MASK_WEEKS']}" in mer_output + + def test_snippet_lines_verbatim_from_committed_to_code_output(self, deck_constants, mer_output): + # Slide 4 shows the generated snippet; every displayed line must be + # byte-verbatim from the committed to_code() output cell. + for line in deck_constants["SNIPPET_LINES"]: + assert line in mer_output, f"snippet line not verbatim in tutorial 30: {line!r}" + + def test_design_facts_match_notebook_code(self, deck_constants): + c = deck_constants + code = _notebook_code(NB_MER) + assert f"N_GEOS, N_WEEKS = {c['N_GEOS_MER']}, {c['N_WEEKS']}" in code + m = re.search(r"LAUNCH_COHORTS = (\{[^}]*\})", code) + assert m, "LAUNCH_COHORTS literal not found in tutorial 30" + cohorts = ast.literal_eval(m.group(1)) + assert set(cohorts) == set(c["WAVE_WEEKS"]) + assert sum(len(g) for g in cohorts.values()) == c["N_LAUNCHED"] + + +class TestPymcBeatMatchesNotebook: + """The tutorial-29 numbers on slide 8 are on the committed surface.""" + + def test_posterior_summary_lines(self, deck_constants, pm_output): + c = deck_constants + p, cal = c["PM_PLAIN"], c["PM_CAL"] + for needle in ( + f"without lift test: ROI mean {p[0]:.2f}, 90% interval ({p[1]:.2f}, {p[2]:.2f})", + f"with lift test: ROI mean {cal[0]:.2f}, 90% interval ({cal[1]:.2f}, {cal[2]:.2f})", + f"truth: {c['PM_TRUTH']:.2f}", + f"error: {c['PM_ERR'][0]:.2f} -> {c['PM_ERR'][1]:.2f}; " + f"90% width: {c['PM_WIDTH'][0]:.2f} -> {c['PM_WIDTH'][1]:.2f}", + ): + assert needle in pm_output, f"deck value not on tutorial-29 surface: {needle!r}" + + def test_six_x_narrower_claim(self, deck_constants): + # "the 90% interval is 6x narrower" - recompute from the committed + # widths; the wording rounds DOWN, so the true ratio must be >= 6. + w = deck_constants["PM_WIDTH"] + assert w[0] / w[1] >= 6.0 + + def test_design_facts_match_notebook_code(self, deck_constants): + c = deck_constants + code = _notebook_code(NB_PM) + assert f"N_GEOS, N_WEEKS = {c['N_GEOS_PM']}, {c['N_WEEKS']}" in code + m = re.search(r"TREAT_COHORTS = (\{[^}]*\})", code) + assert m, "TREAT_COHORTS literal not found in tutorial 29" + cohorts = ast.literal_eval(m.group(1)) + assert sum(len(g) for g in cohorts.values()) == c["N_BOOSTED"] + + def test_slide8_call_arguments_rederived_from_notebook_dgp(self, deck_constants): + # Round-2 review: the slide-8 x/delta_x/scale literals render from + # deck constants; re-derive each from tutorial 29's own DGP lines so + # a notebook retune cannot leave the deck's call arguments stale. + c = deck_constants + code = _notebook_code(NB_PM) + base = re.search(r"SEARCH_BASE = ([\d.]+)", code) + boost = re.search(r"BOOST = ([\d.]+)", code) + assert base and boost, "tutorial 29 DGP spend constants not found" + assert c["PM_X"] == float(base.group(1)) * c["N_GEOS_PM"] + assert c["PM_DELTA_X"] == float(boost.group(1)) * c["N_BOOSTED"] + assert c["PM_SCALE"] == c["N_BOOSTED"] + + +class TestGuardrailPhrases: + """The qualifiers ARE the claim - a rewording that drops one ships an + overclaim even with every number intact (CiC-deck precedent).""" + + def test_load_bearing_phrases_on_visible_surface(self, visible_strings): + for phrase in ( + # Truth provenance is deliberately CONCENTRATED (2026-08-20): + # the chart's "(simulated)" label + the CTA's full statement are + # the only sites, so losing either ships a real-market + # ground-truth implication. + "(simulated)", # slide-5 truth-line label + "the true ROI (simulated)", # cover truth-line label (round-4 + # review: the cover circulates alone as the post thumbnail) + "illustrative", # cover motif shape label (curves are drawn from + # summaries with inflated widths, not posterior draws) + "A simulated market, so the truth is known", # CTA teaser line + "abridged", # slide-4 snippet honesty + "schematic", # slide-6 figure label + "For 'search', the calibration mask", # slide-4 mask scoping + # Guardrail scoping (round-1 review): the deck may only claim the + # checks the exporters actually run - "the easy mistakes" scopes + # the loud-failure claim, and the ownership line assigns the + # semantic-alignment responsibility (estimand, outcome scale, + # population, window) to the caller without a compliance clause. + "the easy mistakes fail loudly", # slide-7 setup-check scope + "you own the design, it owns the math", # slide-9 guardrail scope + ): + assert phrase in visible_strings, f"load-bearing phrase missing: {phrase!r}" + + def test_no_unqualified_guardrail_absolutes(self, visible_strings): + # Round-1 review: these absolutes are falsifiable (a log-scale or + # window-mismatched estimate passes numeric validation silently), so + # they may never return in any rewording. + lowered = visible_strings.lower() + for banned in ( + "no silent mis-calibration", + "never silently", + "anything with an estimate + se", + "any effect + se", + "any estimate exports", + "catches every", + # aggregate()/export are NOT universal estimator methods + # (round-3 review): the four totals adopters own aggregate(); + # the exporters are module functions. + "one pattern across every estimator", + ): + assert banned not in lowered, f"unqualified guardrail absolute on deck: {banned!r}" + + def test_deck_comment_literals_match_constants(self, deck_constants, visible_strings): + # The slide-3 code-panel comments are hardcoded strings; tie them to + # the notebook-synced constants so they cannot drift independently. + c = deck_constants + roi = c["ROI_MEAS"] + assert f"# incremental sales: {c['CS_TOTAL_LABEL']}" in visible_strings + assert f"# {c['SPEND_LABEL']}" in visible_strings + assert f"# experiment ROI: {roi[0]:.3f} +/- {roi[1]:.3f}" in visible_strings + assert f"LogNormal(mu={c['PRIOR_MU']:.4f}, sigma={c['PRIOR_SIGMA']:.4f})" in visible_strings + # Slide 8's scale= argument is the boosted-geo count. + assert f"# scale = {c['N_BOOSTED']} boosted geos" in visible_strings + + def test_totals_adopter_card_matches_source(self, visible_strings): + # Slide 9 names the four aggregate('total') adopters; each named + # estimator's results module must actually list "total" in its + # _AGGREGATE_SUPPORTED tuple, so the card cannot outlive a de-adoption + # (or miss staying in sync if the deck's list is ever edited). + assert ( + "aggregate('total') on Callaway-Sant'Anna, EfficientDiD, ImputationDiD, TwoStageDiD" + in visible_strings + ), "slide-9 totals-adopter card wording changed - re-sync this test" + repo = Path(__file__).resolve().parents[1] + for module in ( + "diff_diff/staggered_results.py", + "diff_diff/efficient_did_results.py", + "diff_diff/imputation_results.py", + "diff_diff/two_stage_results.py", + ): + path = repo / module + if not path.exists(): + pytest.skip(f"{module} not available in this CI environment.") + src = path.read_text(encoding="utf-8") + m = re.search(r"_AGGREGATE_SUPPORTED = \(([^)]*)\)", src) + assert m and '"total"' in m.group( + 1 + ), f"{module} no longer advertises aggregate('total') - slide 9 overclaims" + + FORBIDDEN_FRAMEWORKS = ( + "meridian", + "pymc_marketing", + "pymc", + "tensorflow_probability", + "tensorflow", + ) + + def test_zero_new_dependencies_claim_imports(self, visible_strings): + # Slide 9's "Zero new dependencies" strip: diff_diff/mmm.py must not + # import either MMM framework (or its substrate) ANYWHERE - stricter + # than module level, so a lazy in-function import also fails - the + # to_code() templates embed those imports as TEXT only. + assert "Zero new dependencies" in visible_strings + repo = Path(__file__).resolve().parents[1] + path = repo / "diff_diff" / "mmm.py" + if not path.exists(): + pytest.skip("diff_diff/mmm.py not available in this CI environment.") + tree = ast.parse(path.read_text(encoding="utf-8")) + imported = set() + for node in ast.walk(tree): + if isinstance(node, ast.Import): + imported.update(alias.name.split(".")[0] for alias in node.names) + elif isinstance(node, ast.ImportFrom) and node.module: + imported.add(node.module.split(".")[0]) + forbidden = set(self.FORBIDDEN_FRAMEWORKS) + assert not (imported & forbidden), ( + f"mmm.py imports MMM frameworks {sorted(imported & forbidden)} - " + "the 'Zero new dependencies' claim on slide 9 is false" + ) + + def test_zero_new_dependencies_claim_pyproject(self): + # Round-1 review: an import scan alone would miss a framework added + # to the install requirements without being imported. Scan every + # quoted requirement string in pyproject.toml for the forbidden + # distributions (regex, not tomllib - the test must run on the 3.9 + # CI floor). + repo = Path(__file__).resolve().parents[1] + path = repo / "pyproject.toml" + if not path.exists(): + pytest.skip("pyproject.toml not available in this CI environment.") + text = path.read_text(encoding="utf-8") + # The terminator set includes the closing quote so a BARE requirement + # ("pymc-marketing", no version/extras marker) is also caught + # (round-2 review). + spec_names = { + m.group(1).lower().replace("_", "-") + for m in re.finditer(r'"([A-Za-z0-9][A-Za-z0-9._-]*)\s*[><=~!;\["]', text) + } + forbidden = { + "google-meridian", + "meridian", + "pymc-marketing", + "pymc", + "tensorflow", + "tensorflow-probability", + "tfp-nightly", + } + assert not (spec_names & forbidden), ( + f"pyproject.toml declares MMM framework dependencies {sorted(spec_names & forbidden)} - " + "the 'Zero new dependencies' claim on slide 9 is false" + ) + + def test_framework_version_claim_matches_notebook_requirements(self, visible_strings): + # Round-4 review: the slide-9 strip's "Built against ..." versions + # must be DERIVED from the tutorials' own stated requirements + # (each notebook's intro markdown pins the exact framework version), + # so a tutorial version bump cannot leave the deck claim stale. + from tests._tutorial_drift import notebook_markdown + + pm = re.search(r"pymc-marketing==(\d+\.\d+)", notebook_markdown(NB_PM)) + mer = re.search(r"google-meridian==(\d+\.\d+)", notebook_markdown(NB_MER)) + assert pm and mer, "tutorial intro requirement pins not found" + expected = f"Built against pymc-marketing {pm.group(1)} + google-meridian {mer.group(1)}" + assert ( + expected in visible_strings + ), f"slide-9 version strip does not match the tutorials' requirements: {expected!r}" + + def test_no_competitive_claims(self, visible_strings): + # User decision (2026-08-19): no landscape/competitor claims - they + # are not click-through verifiable. + lowered = visible_strings.lower() + for banned in ( + "only frequentist", + "the only ", + "robyn", + "causalpy", + "geolift", + "causalimpact", + "first and only", + ): + assert banned not in lowered, f"banned competitive claim on deck: {banned!r}" From c2660fc875891f2d61d3b1610a9d106bd24c8752 Mon Sep 17 00:00:00 2001 From: igerber Date: Thu, 20 Aug 2026 07:12:34 -0400 Subject: [PATCH 2/2] CI review R1: slide 4 displays the scoped to_code() invocation to_code() deliberately fails closed without channel + time scope, so the 'Paste and Run' slide now shows the tutorial's actual call (channel/media_channels/roi_calibration_period) instead of a bare prior.to_code() that would raise ValueError. New regression assertion pins the scoping kwargs on the displayed call, bans the bare form, and confirms the same kwargs in tutorial 30's to_code() cell. PDF regenerated. --- carousel/diff-diff-mmm-carousel.pdf | Bin 205194 -> 205233 bytes carousel/generate_mmm_carousel.py | 17 ++++++++++++----- tests/test_mmm_carousel_claims.py | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/carousel/diff-diff-mmm-carousel.pdf b/carousel/diff-diff-mmm-carousel.pdf index 3e309ce8b64f82b64b20fad861eb91dad94d41db..33d80c1d31023737688d64589c9fbba44dd9fba1 100644 GIT binary patch delta 2186 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 diff --git a/carousel/generate_mmm_carousel.py b/carousel/generate_mmm_carousel.py index d566d67ab..18339c109 100644 --- a/carousel/generate_mmm_carousel.py +++ b/carousel/generate_mmm_carousel.py @@ -832,11 +832,18 @@ def slide_04_to_code(self): self.centered_text(50, "It writes the", size=40) self.centered_text(78, "Meridian code for you.", size=40, color=VIOLET) - self.set_xy(0, 100) - self.set_font("Courier", "B", 15) + # The displayed call is the tutorial's ACTUAL invocation - to_code() + # deliberately fails closed without channel + time scope, so a bare + # prior.to_code() would raise (CI review R1). + self.set_xy(0, 98) + self.set_font("Courier", "B", 12.5) self.set_text_color(*NAVY) - self.cell(WIDTH, 8, "prior.to_code()", align="C") - self.set_xy(0, 110) + self.cell( + WIDTH, 7, 'prior.to_code(channel="search", media_channels=["search", "tv"],', align="C" + ) + self.set_xy(0, 106) + self.cell(WIDTH, 7, "roi_calibration_period=mask)", align="C") + self.set_xy(0, 116) self.set_font("Helvetica", "I", 12) self.set_text_color(*GRAY) self.cell( @@ -847,7 +854,7 @@ def slide_04_to_code(self): ) margin = 32 - code_y = 124 + code_y = 130 token_lines = [] for line in SNIPPET_LINES: stripped = line.strip() diff --git a/tests/test_mmm_carousel_claims.py b/tests/test_mmm_carousel_claims.py index 07aa697d5..1143ce8cb 100644 --- a/tests/test_mmm_carousel_claims.py +++ b/tests/test_mmm_carousel_claims.py @@ -159,6 +159,25 @@ def test_snippet_lines_verbatim_from_committed_to_code_output(self, deck_constan for line in deck_constants["SNIPPET_LINES"]: assert line in mer_output, f"snippet line not verbatim in tutorial 30: {line!r}" + def test_slide4_displays_scoped_to_code_invocation(self, visible_strings): + # CI review R1: to_code() fails closed without channel + time scope, + # so the "Paste and Run" slide must display the tutorial's scoped + # invocation - a bare prior.to_code() raises ValueError. Pin the + # scoping kwargs on the displayed call and confirm the same kwargs + # appear in the tutorial's own to_code() cell. + assert 'prior.to_code(channel="search", media_channels=["search", "tv"],' in visible_strings + assert "roi_calibration_period=mask)" in visible_strings + assert ( + "prior.to_code()" not in visible_strings + ), "bare prior.to_code() is back on the deck - it raises ValueError" + code = _notebook_code(NB_MER) + for kwarg in ( + 'channel="search"', + 'media_channels=["search", "tv"]', + "roi_calibration_period=mask", + ): + assert kwarg in code, f"tutorial 30's to_code() call lost {kwarg!r}" + def test_design_facts_match_notebook_code(self, deck_constants): c = deck_constants code = _notebook_code(NB_MER)