marketing: DMLDiD launch carousel (Circuit palette) + claims-sync guard - #802
Conversation
11-slide poster-mode deck for the v3.11 DMLDiD launch (ML-forward hook; user decisions 2026-08-29): cover curve-vs-line motif, the confidently-wrong receipt (linear 2.5909, reported SE 0.0743, vs true 2.2388 - nominal-inference caveats slide-local), dark ridge twist, Chang (2020) paper slide (attributed paraphrase, no verbatim pull quote - the published PDF was not cross-checked word-for-word), annotated Case-1 score slide (the UNCENTERED summand s labeled as such, centered score psi = s - ATT in the caption, orthogonality scoped to the learned nuisances g and l, arrows pixel-anchored via manual fraction composition - mathtext bboxes carry asymmetric slop), four-learner payoff chart with the double-robustness beat, honest DMLDiD-vs-CS decision split plus the learner-flexibility band (four built-ins with no extra installs; scikit-learn estimators fit the duck-typed fit()/predict() contract), dark code slide with a real sklearn swap line, production grid (aggregation/HonestDiD/sup-t, survey + clustering with the A2.3 same-target-population qualifier on the RCS card, diagnostics) with the DoubleML Case-1 parity strip (ATT diff 4.4e-16, committed spike), CTA with the single tutorial-32 mention. Every estimate is a seed-locked tutorial-32 value from the simulated truth-known example (labeled on-slide). tests/test_dml_carousel_claims.py (17 checks): notebook-surface sync with row-associated learner-table pins, arithmetic backing for the five-SE and recovery claims, constants-reach-their-slides + qualifier slide-locality enforcement, banned-absolutes list (including the retired overclaims: "in each nuisance", "confident CI"), REGISTRY sync for the DoubleML figure, dependency-free proof for the built-in-learner claim, and the documented-sklearn-contract check.
Overall Assessment: ✅ Looks goodExecutive Summary
MethodologyP3 — Documented extensions correctly scoped
Code QualityNo findings. PerformanceNo findings. MaintainabilityNo findings. Tech DebtP3 — PDF/source drift guard remains deferred
SecurityNo findings. Documentation/TestsP2 — Learner contract copy omits
P2 — Cohort synchronization assertion is effectively vacuous
|
…onstruction pin PR #802 review P2s: (1) slide 8 said any learner needs fit()/predict(), but propensity learners require predict_proba() - the card and the flexibility band now state both contracts (regressors fit()/predict(), classifiers predict_proba()), with slide-local pins; (2) the cohort sync assertion's str(g)-in-code fallback was vacuous (single digits occur everywhere) - it now requires the exact np.where(early, 4, 5) construction rendered from the deck constants. PDF regenerated; claims guard 17/17 green.
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall Assessment:
|
…t docstring guard PR #802 review round 2 P1: the slide fix missed the module docstring, which still described a bare fit()/predict() scikit-learn contract - propensity classifiers need predict_proba() (a LinearSVC would be rejected). The spine bullet and claim-discipline bullet now state both contracts, and a new ast.get_docstring test requires predict_proba() there (the slide-string guard deliberately excludes docstrings, so the docstring needs its own pin). PDF regenerated (byte-freshness only; slide content unchanged); claims guard 18/18 green.
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall Assessment: ✅ Looks goodExecutive Summary
MethodologyP3 — Documented extensions are correctly scoped
Code QualityNo findings. PerformanceNo findings. MaintainabilityNo findings. Tech DebtP3 — PDF/source drift guard is tracked
SecurityNo findings. Documentation/TestsP2 — Slide 9’s displayed fit call is invalid Python
The previous learner-contract P1 is resolved at |
…e slide PR #802 review round 3 P2: the displayed call used a positional ellipsis after keyword arguments (a SyntaxError) under a caption claiming the shown call reproduces the shown numbers. The slide now renders the tutorial's full invocation (unit/time/first_treat keywords + base_period=universal) in a slightly wider panel, and a new claims check reconstructs the snippet from the slide's token lines via AST and requires it to ast.parse, pinning base_period and the fit keywords. PDF regenerated; claims guard 19/19 green.
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall Assessment: ✅ Looks goodExecutive Summary
MethodologyP3 — Documented extensions are correctly scoped
Code QualityNo findings. PerformanceNo findings. MaintainabilityNo findings. Tech DebtP3 — PDF/source drift guard remains tracked
SecurityNo findings. Documentation/TestsP3 — Prior slide-9 finding resolved
The environment lacked |
…outs CI failure on every Python leg: test_module_docstring_states_both_contracts read the generator without the GENERATOR.exists() guard the rest of the file carries, and the isolated-install CI jobs copy only tests/ (no carousel/). Verified both layouts: full checkout 19 passed; a simulated tests-only layout 19 skipped.
|
🔁 AI review rerun (requested by @igerber) Head SHA: Overall Assessment: ✅ Looks goodExecutive Summary
MethodologyP3 — Documented extensions correctly scoped
Code QualityNo findings. PerformanceNo findings. MaintainabilityNo findings. Tech DebtP3 — PDF/source drift guard remains tracked
SecurityNo findings. No apparent secrets or unsafe file handling were introduced. Documentation/TestsP2 — CTA overstates Tutorial 32’s provenance
P3 — Prior slide-9 finding resolved
|
Summary
carousel/generate_dml_carousel.py+ committedcarousel/diff-diff-dml-carousel.pdf(11 slides, poster mode, "Circuit" palette — graphite structure with a single signal-green ML/truth accent).slabeled as such withpsi = s - ATTin the caption; orthogonality scoped to the learned nuisances g and ℓ; annotation arrows pixel-anchored via manual fraction composition), four-learner payoff chart with the double-robustness beat, honest DMLDiD-vs-CS decision split plus the learner-flexibility band (four built-ins, no extra installs; scikit-learn estimators fit the duck-typed contract), dark code slide with a real sklearn swap line, production grid with the DoubleML Case-1 parity strip and the A2.3 same-target-population qualifier on the RCS card, CTA.tests/test_dml_carousel_claims.py(17 checks): every deck estimate located on the committed tutorial-32 notebook surface (row-associated learner-table pins), arithmetic backing for the five-SE and recovery claims, constants-reach-their-slides + qualifier slide-locality enforcement, a banned-absolutes/overclaims list, REGISTRY sync for the DoubleML figure, a dependency-free proof for the built-in-learner claim, and the documented-sklearn-contract check.Methodology references (required if estimator / math changes)
Validation
tests/test_dml_carousel_claims.py(new, 17 checks, green).Security / privacy