Skip to content

docs: CiC launch carousel - "The effect your DiD can't see" (Tide deck)#702

Merged
igerber merged 2 commits into
mainfrom
cic-carousel
Jul 19, 2026
Merged

docs: CiC launch carousel - "The effect your DiD can't see" (Tide deck)#702
igerber merged 2 commits into
mainfrom
cic-carousel

Conversation

@igerber

@igerber igerber commented Jul 19, 2026

Copy link
Copy Markdown
Owner

Summary

  • New LinkedIn launch carousel for ChangesInChanges: carousel/generate_cic_carousel.py -> carousel/diff-diff-cic-carousel.pdf (11 slides, regenerated in the same commit per carousel/README.md's contract). "Tide" visual identity (ocean navy / teal / seafoam on a light aqua gradient, coral kickers, amber significant-band highlight, distribution-as-water cover motif) - distinct from every existing deck palette.
  • Narrative (villain-first, grounded in Athey & Imbens 2006): the effect mean DiD can't see (a simulated program with truth known by construction: $0.22 p=0.90 verdict vs a $3.01 true effect) -> dark twist (same data in logs: +14.0% p=0.001; the scale choice IS the assumption) -> the paper's answer (compare ranks, not scales; verbatim abstract pull quote; equivariance receipt: dollars fit == exp(logs fit)) -> the math (annotated Theorem 3.1 composition + QTE definition) -> the QTE-profile payoff -> sup-t uniform bands ("the bottom half moved" as one simultaneous claim) -> code slide (sklearn-style fit()) -> covariates (confidently-wrong 9.38 [8.32, 10.45] -> truth-covering 6.53 [5.35, 7.70]) -> production grid + validation strip -> CTA (pip install; the single Tutorial 27 mention).
  • Claim discipline in the module docstring: every number is Tutorial 27's seed-locked value; parity wording scoped per the parity-suite header (unconditional point estimates match the R qte 1.3.1 golden files to 1e-10; "bit-exact" reserved for the type-1 quantile arithmetic at atol=0; covariate branch = layered parity per the REGISTRY Deviation note); equivariance qualified to unconditional fits on-slide; power-law (never "multiplicative") trend framing; bootstrap-only inference and fixed-95% sup-t bands framed as qte-parity conventions; no speed claims; QDiD not mentioned.
  • tests/test_cic_carousel_claims.py (10 tests) closes the synchronization chain: deck constants are parsed via ast (no carousel-only dependencies in CI) and compared against values parsed from the committed Tutorial 27 notebook surface - which the T27 drift test locks against the library - plus visible-slide-surface phrase locks on every load-bearing qualifier (docstrings excluded; negative lock on "multiplicative").

Methodology references (required if estimator / math changes)

  • Method name(s): ChangesInChanges (CiC) - marketing/documentation artifact only; no estimator implementation changes.
  • Paper / source link(s): Athey & Imbens (2006), Econometrica 74(2), 431-497 (Theorem 3.1 composition; abstract pull quote verbatim from the published PDF, p. 431); R qte 1.3.1 (parity conventions).
  • Any intentional deviations from the source (and why): None - the deck restates documented behavior with the REGISTRY's own qualifiers; the claim-discipline rules are written into the generator's module docstring.

Validation

  • Tests added/updated: tests/test_cic_carousel_claims.py - 10 tests syncing every visible deck number to the committed Tutorial 27 notebook surface (QTE table, SEs, sup-t crit, ATT row, covariate CIs, receipt pairs, DGP constants) plus qualifier phrase locks. All green alongside the T27 drift suite.
  • Backtest / simulation / notebook evidence (if applicable): all deck numbers originate from docs/tutorials/27_cic_distributional_effects.ipynb (seed-locked, drift-tested in CI).

Security / privacy

  • Confirm no secrets/PII in this PR: Yes (PDF checked for local-path/username leakage).

Generated with Claude Code

11-slide LinkedIn deck announcing ChangesInChanges, grounded in Athey &
Imbens (2006). Villain-first narrative: real programs move parts of the
distribution and the mean averages them away ($0.22 p=0.90 verdict vs a
$3.01 known truth) -> dark twist (same data in logs: +14.0% p=0.001 -
the scale choice IS the assumption) -> the paper's answer (ranks, not
scales; verbatim abstract pull quote; equivariance receipt: dollars fit
== exp(logs fit)) -> the math (Theorem 3.1 composition annotated step
by step + QTE definition) -> the QTE-profile payoff -> sup-t uniform
bands ("the bottom half moved" as one claim) -> the code (sklearn-style
fit()) -> covariates (confidently-wrong 9.38 -> truth-covering 6.53) ->
production grid + qte-1.3.1 validation strip -> CTA (single Tutorial 27
mention). "Tide" palette: ocean navy / teal / seafoam on a light aqua
gradient, coral kickers, amber significant-band; distribution-as-water
cover motif.

Every number is Tutorial 27's seed-locked value (simulated example,
truth known by construction - stated on-slide). Claim discipline in the
module docstring: parity wording scoped per the parity-suite header
(golden files matched to 1e-10; "bit-exact" reserved for the type-1
quantile arithmetic at atol=0), equivariance qualified to unconditional
fits, power-law (never "multiplicative") trend framing, bootstrap +
fixed-95% sup-t bands framed as qte-parity conventions, no speed
claims, QDiD not mentioned.

tests/test_cic_carousel_claims.py (10 tests) closes the sync chain:
the deck's constants are parsed via ast (no carousel deps in CI) and
compared against values PARSED FROM THE COMMITTED Tutorial 27 notebook
surface (which the T27 drift test in turn locks against the library),
plus visible-slide-surface phrase locks on every load-bearing
qualifier with a negative lock on "multiplicative". PDF regenerated in
the same commit per carousel/README.md's contract.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W75ea3yFYQbjVhB2evhRiZ
@github-actions

Copy link
Copy Markdown

Overall Assessment

✅ Looks good. No unmitigated P0/P1 findings.

Executive Summary

  • No estimator, weighting, SE/variance, or default behavior changes.
  • The affected method is ChangesInChanges / CiC, but this PR adds a carousel artifact and claim-sync tests only.
  • The visible methodology claims match docs/methodology/REGISTRY.md and the CiC implementation docstrings: qte parity, bootstrap-only inference, fixed-95% sup-t bands, and covariate-branch caveats are qualified.
  • The Athey-Imbens abstract quote used on slide 4 matches the published abstract wording. (onlinelibrary.wiley.com)
  • I could not run pytest or extract PDF text because pytest, pdfinfo, pdftotext, and PDF Python libraries are absent in this environment. I did reproduce the new claim-sync checks with plain Python.

Methodology

Finding: None.

Affected method: ChangesInChanges / CiC. The deck’s claims align with docs/methodology/REGISTRY.md:L4109-L4168, including the Theorem 3.1 composition, type-1/qte conventions, documented qte covariate deviations, bootstrap-only inference, and fixed-95% sup-t uniform bands. The slide copy preserves important qualifiers at carousel/generate_cic_carousel.py:L904-L912, carousel/generate_cic_carousel.py:L993-L998, and carousel/generate_cic_carousel.py:L1224-L1227.

Code Quality

Finding: None.

The generator is self-contained and avoids importing carousel-only dependencies from tests by using AST parsing in tests/test_cic_carousel_claims.py:L33-L58.

Performance

Finding: None.

The added generator is an offline artifact builder. It does not affect runtime library performance.

Maintainability

Finding: None.

The constants are centralized in carousel/generate_cic_carousel.py:L153-L226, and the new tests sync those constants against Tutorial 27 output and code at tests/test_cic_carousel_claims.py:L88-L197.

Tech Debt

Finding: None.

Existing CiC deferred scope is already tracked in TODO.md:L115-L119 and documented in the registry. This PR does not add new deferred methodology work.

Security

Finding: None.

I found no obvious secret or local-path strings in the added Python/test files or via strings over the PDF. No networked or credential-handling code is added.

Documentation/Tests

Finding: None.

The new test file covers headline numeric claims, QTE table values, sup-t split, covariate claims, receipt rows, DGP constants, and load-bearing qualifier phrases at tests/test_cic_carousel_claims.py:L88-L243.

Verification note: pytest was unavailable, so I could not run the test suite directly. Plain-Python replication of the new test logic passed, and file identifies carousel/diff-diff-cic-carousel.pdf as an 11-page PDF.

…link

- The three composition annotations now compute their arrow tips from
  rendered glyph widths (prefix-width measurement in display coords)
  instead of hand-tuned axes coordinates - arrow 3 previously landed on
  the equals sign rather than F_10.
- CTA: dropped the drift-tests-in-CI sentence; the tutorial reference
  now links directly to the RTD tutorial page (URL verified live)
  instead of the docs root.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W75ea3yFYQbjVhB2evhRiZ
@github-actions

Copy link
Copy Markdown

🔁 AI review rerun (requested by @igerber)

Head SHA: 5beb922d3ce6d0edf3a1f6418dd6a18af99ecd25


Overall Assessment

✅ Looks good. No unmitigated P0/P1 findings.

Executive Summary

  • Re-review confirms the prior assessment; no previous P1+ findings required remediation.
  • Changes are documentation, generation, and claim-sync tests only—no estimator or inference logic changed.
  • CiC equations and claims match Athey–Imbens and the Methodology Registry.
  • The committed PDF is 11 pages and contains the required visible qualifiers.
  • Manual replication of all numeric claim-sync checks passed.

Methodology

  • Severity: P3 — informational, mitigated
    Impact: Bootstrap inference, fixed-95% sup-t bands, and covariate solver differences are documented deviations, not defects. The carousel accurately labels them at carousel/generate_cic_carousel.py:L929-L931, carousel/generate_cic_carousel.py:L1012-L1015, and carousel/generate_cic_carousel.py:L1243-L1246, consistent with docs/methodology/REGISTRY.md:L4136-L4148.
    Concrete fix: None required.

The Theorem 3.1 composition and scale-equivariance scope also match docs/methodology/REGISTRY.md:L4115-L4134.

Code Quality

No findings.

Performance

No findings. Generation costs are confined to the offline carousel builder.

Maintainability

No findings. Numeric claims are centralized and synchronized with Tutorial 27 through tests/test_cic_carousel_claims.py:L88-L197.

Tech Debt

No findings. Existing CiC limitations remain documented in TODO.md:L115-L119 and are not expanded by this PR.

Security

No findings. No credentials, private paths, or sensitive metadata were found.

Documentation/Tests

No findings. Tests cover the headline effects, QTE table, uniform-band split, covariate example, equivariance receipt, DGP constants, and visible qualifiers.

pytest and carousel dependencies were unavailable in the review environment; equivalent claim-sync checks were reproduced directly and passed.

@igerber igerber added the ready-for-ci Triggers CI test workflows label Jul 19, 2026
@igerber
igerber merged commit a704566 into main Jul 19, 2026
28 of 29 checks passed
@igerber
igerber deleted the cic-carousel branch July 19, 2026 12:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-ci Triggers CI test workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant