Repository navigation
Releases: igerber/diff-diff
Releases · igerber/diff-diff
Release list
v3.13.0
What's Changed
- feat: TWFE weight diagnostics (twfeweights R port, re-scoped from #753) by @wenddymacro in #812
- chore(deps-dev): bump ruff from 0.16.5 to 0.16.7 in the python-minor-patch group across 1 directory by @dependabot[bot] in #830
- fix(dml): fail closed when cross-fit learners cannot be isolated by @shawcharles in #816
- fix(staggered): carry the bootstrap event-study covariance instead of clearing it by @ilgrad in #839
- fix(synthetic_control): put the treated unit in every in-space placebo's donor pool by @ilgrad in #841
- fix(synthetic_control): solve the donor weights exactly by non-negative least squares by @ilgrad in #842
- Bump version to 3.13.0 by @igerber in #850
New Contributors
Full Changelog: v3.12.0...v3.13.0
v3.12.0
What's Changed
- docs(dml): Chang (2020) published-version + replication-code cross-check by @igerber in #810
- fix(results): family-wide summary(alpha=) guard + honest dose-response bands (M-146 completion) by @igerber in #811
- fix(results): exact fractional confidence-level labels family-wide by @igerber in #815
- docs(methodology): Caetano, Callaway, Payne & Sant'Anna (2026) bad-controls paper review (PR-A) by @igerber in #819
- fix(sdid): shape-only pre-treatment fit RMSE, level-gap field, placebo-anchored poor-fit warning by @igerber in #818
- chore(deps-dev): bump ruff from 0.16.4 to 0.16.5 in the python-minor-patch group by @dependabot[bot] in #813
- docs: add Deaner and Ku's duration DiD paper review by @igerber in #822
- feat(dml): Caetano, Callaway, Payne & Sant'Anna (2026) bad-control lane on DMLDiD (PR-B) by @igerber in #829
- feat(duration-did): add DurationDiD estimator (Deaner & Ku 2026 causal duration DiD) by @igerber in #827
- Add WooldridgeDiD opt-out for comparison-support filtering by @igerber in #820
- docs(tutorials): bad-controls tutorial notebook 33 (Caetano et al. 2026, PR-C) by @igerber in #831
- Fix HC2 and HC2-BM finite variances at leverage one by @igerber in #823
- Bump version to 3.12.0 by @igerber in #832
Full Changelog: v3.11.1...v3.12.0
v3.11.1
What's Changed
- docs(dml): tutorial 32 - double ML DiD (numbers-locked) by @igerber in #800
- fix(survey): unit-level survey_metadata recompute reports raw weight scale by @igerber in #801
- marketing: DMLDiD launch carousel (Circuit palette) + claims-sync guard by @igerber in #802
- feat(provenance): per-row event-study df threading (M-092 completion) + ContinuousDiD unit-level metadata by @igerber in #803
- chore(validation): shared n_bootstrap type guards + honest_did inference-df consolidation by @igerber in #804
- test(dml): replicate Chang (2020) §4.2.2 RCS simulation DGP (DML PR-B2) by @igerber in #805
- feat(tooling): changelog fragments - conflict-free parallel PRs by @igerber in #806
- feat(dml): replicate-weight survey designs via IF-reweighting (per-cell + aggregate) by @igerber in #807
- chore(infra): tracking-file guard, LWDiD data canary, /push-pr-update range scan + changelog compiler hardening by @igerber in #808
- Bump version to 3.11.1 by @igerber in #809
Full Changelog: v3.11.0...v3.11.1
v3.11.0
What's Changed
- feat: DML infrastructure - cross-fitting, shared DR scores, ridge, learner protocol (PR-B0) by @igerber in #789
- marketing: LWDiD launch carousel (Ledger palette) + claims-sync guard by @igerber in #790
- feat(dml): DMLDiD estimator - Chang (2020) staggered panel ATT(g,t) (DML PR-B1) by @igerber in #793
- feat(dml): DMLDiD panel=False repeated cross sections - Chang (2020) Case 2 (DML PR-B2) by @igerber in #794
- chore(deps-dev): bump the python-minor-patch group with 2 updates by @dependabot[bot] in #792
- fix: summary-alpha guard sweep, zero-SE plot gate, lambda-slope dedup, shared pscore_trim validator (DML follow-ups) by @igerber in #795
- chore(deps): bump openai/codex-action from 1.11 to 1.12 in the actions-minor-patch group by @dependabot[bot] in #791
- ci: pin openai/codex-action back to v1.11 (v1.12 hangs after turn completes) by @igerber in #797
- ci: fix codex-action pin comment format to satisfy workflow contract test by @igerber in #798
- feat(dml): DMLDiD survey-design and cluster support on both lanes (DML survey PR) by @igerber in #796
- Bump version to 3.11.0 by @igerber in #799
Full Changelog: v3.10.0...v3.11.0
v3.10.0
What's Changed
- Loosen affine-equivariance p-value tolerance (BLAS-dependent CI flake) by @igerber in #777
- test: anchor ImputationDiD coarser aux_partition variants against Stata did_imputation avgeffectsby() by @igerber in #779
- feat(aggregation): CS post-fit aggregate() replays the multiplier bootstrap on bootstrapped fits (M-020) by @igerber in #780
- feat: add LWDiD estimator (Lee & Wooldridge 2025, 2026) by @gorgeousfish in #588
- marketing: MMM calibration launch carousel (Signal palette) + claims-sync guard by @igerber in #781
- docs(lwdid): DR example exercises DR; exact-inference df cases enumerated by @igerber in #782
- chore(deps-dev): bump ruff from 0.16.2 to 0.16.3 in the python-minor-patch group by @dependabot[bot] in #778
- feat(aggregation): EfficientDiD post-fit aggregate() replays the bootstrap on bootstrapped fits (M-023) by @igerber in #783
- docs(lwdid): tutorial 31 - rolling-transformation DiD (numbers-locked) by @igerber in #784
- test: anchor LPDiD non-absorbing SEs against the authors' Stata lpdid package by @igerber in #785
- docs(methodology): Chang (2020) DML DiD paper review (PR-A) by @igerber in #786
- docs(lwdid): pre-release audit - guide coverage, scope-limitation docs, Rust parity tests by @igerber in #787
- Bump version to 3.10.0 by @igerber in #788
New Contributors
- @gorgeousfish made their first contribution in #588
Full Changelog: v3.9.1...v3.10.0
v3.9.1
What's Changed
- Bump undici to 7.29.0 in CI scripts lockfile (resolves 5 Dependabot alerts) by @igerber in #762
- chore(deps): bump pypa/gh-action-pypi-publish from 1.14.1 to 1.14.2 in the actions-minor-patch group across 1 directory by @dependabot[bot] in #746
- chore(deps-dev): bump ruff from 0.16.0 to 0.16.2 in the python-minor-patch group across 1 directory by @dependabot[bot] in #745
- docs: migrate narrative RST off fit-time aggregate= (sweep PR-A) by @igerber in #763
- docs: migrate tutorial notebooks off fit-time aggregate= (sweep PR-B) by @igerber in #764
- feat: MMM exporters container mode (aggregation_result= + scale=) on the 3.9 aggregation surface by @igerber in #765
- docs: Tutorial 28 - The Scholarship Illusion (sharp and fuzzy RDD) by @igerber in #766
- feat(reports): DiagnosticReport consumes the post-fit aggregate('event_study') surface by @igerber in #767
- feat: Meridian roi_calibration_period mask builder + to_code() array support by @igerber in #768
- docs: add CJM 2020 paper review (density-test PR-A) by @igerber in #769
- feat: results.aggregate('total') - estimator-owned totals for CS/EDiD/Imputation/TwoStage + MMM no-scale admission by @igerber in #770
- feat(validation): family-wide anticipation domain validation (M-144) by @igerber in #771
- feat(rdd): RDDensityTest - manipulation testing via local polynomial density estimation (CJM 2020, rddensity 3.0 parity) by @igerber in #772
- LWDiD Stata parity arm + acceptance-suite re-anchor + REGISTRY amendments by @igerber in #773
- docs: make all RST code examples runnable in Python by @wenddymacro in #760
- feat: executed MMM calibration tutorials (PyMC-Marketing + Meridian) + CI interop canary by @igerber in #775
- Bump version to 3.9.1 by @igerber in #776
Full Changelog: v3.9.0...v3.9.1
v3.9.0
What's Changed
- docs: add rdplot paper review (CCT 2015 JASA) by @igerber in #694
- docs: Tutorial 27 - When the Average Hides the Action (distributional DiD with CiC) by @igerber in #696
- feat(rdd): RDPlot - optimal data-driven RD plots (CCT 2015, rdplot parity) by @igerber in #695
- feat(reviewer-eval): N-arm matrix, blinded grading, corpus 2->11 for the GPT-5.6 evaluation by @igerber in #700
- ci+local: upgrade AI PR reviewer model gpt-5.5 -> gpt-5.6-sol (effort xhigh) by @igerber in #701
- docs(v4): 4.0 design spec + CI-enforced deprecation ledger (Phase 1) by @igerber in #697
- chore(deps-dev): bump the python-minor-patch group with 3 updates by @dependabot[bot] in #687
- docs: CiC launch carousel - "The effect your DiD can't see" (Tide deck) by @igerber in #702
- docs(v4): diagnostic-family amendment - third object kind + RDPlot rename rows by @igerber in #704
- docs: restructure RTD site around 5 top-level sections (IA overhaul) by @igerber in #703
- ci(review): credit deferred rows in TODO.md OR DEFERRED.md (tracking-split prep 1/3) by @igerber in #698
- docs: split tracking into TODO.md (actionable) / DEFERRED.md (registry) / docs/dev-status.md (split 2/3) by @igerber in #705
- docs(claude): in-flight-work discovery + memory-hygiene rules in Workflow by @igerber in #707
- test: CI-enforced docs IA guards (tests/test_docs_ia.py) by @igerber in #706
- docs: tracking-split editorial polish - REGISTRY decision folds + history scrub (split 3/3) by @igerber in #708
- feat: MMM calibration export (diff_diff.mmm) - PyMC-Marketing lift tests + Meridian ROI priors by @igerber in #699
- test: anchor LPDiD regression-adjustment SE against Stata teffects (first Stata parity arm) by @igerber in #709
- feat(v4): results-contract foundation - BaseResults, Diagnostic marker, unified event-study surface (Phase 2a) by @igerber in #710
- Audit and harden Claude Code commands: retire 3 stale, purge dead GitHub MCP for gh CLI, add argv-safe helpers by @igerber in #711
- test: anchor ImputationDiD leave-one-out SE against Stata did_imputation (2nd Stata arm) by @igerber in #712
- Extract shared eval engine to tools/eval_core (workflow-eval step 1a) by @igerber in #714
- docs: fix search-result excerpts (CSS-special anchors) + enable search-as-you-type by @igerber in #713
- feat(v4): EventStudyResults full-vcov + per-row df round-trip (M-092 follow-up) by @igerber in #715
- Add plan-review eval harness + content-hash plan-approval gate (workflow-eval step 1b) by @igerber in #716
- docs: polish - version switcher, robots.txt, notebook H1 normalization, llms.txt landing links by @igerber in #721
- plan-review: ship campaign-selected dual-reviewer engine as a .claude/skills/ skill (workflow-eval step 3) by @igerber in #725
- feat(v4): complete event-study df provenance - SunAbraham/dCDH event_study_df, LPDiD pooled_df (M-092 follow-up) by @igerber in #726
- docs(v4): gating-completeness amendment - mirrored renames, public-function sweep, un-rowed obligations by @igerber in #727
- feat(v4): post-fit results.aggregate() contract + CallawaySantAnna (Phase 2b PR 1) by @igerber in #728
- fix(v4): ETWFE reference-period normalization (#724) + Stata jwdid/csdid parity by @igerber in #729
- feat(v4): ETWFE per-period comparison support - restore all-eventually-treated fits (W2025 Sec 5.4) by @igerber in #730
- fix: make legacy dataset provenance explicit by @shawcharles in #723
- chore(deps): bump the actions-minor-patch group across 1 directory with 2 updates by @dependabot[bot] in #717
- chore(deps): bump actions/setup-node from 6.5.0 to 7.0.0 by @dependabot[bot] in #718
- chore(deps): bump actions/setup-python from 6.3.0 to 7.0.0 by @dependabot[bot] in #719
- chore(deps-dev): bump ruff from 0.15.21 to 0.16.0 in the python-minor-patch group across 1 directory by @dependabot[bot] in #720
- feat(3.9): variance-conventions inventory + component-aware absorbed-FE rank (D3) by @igerber in #736
- feat(3.9): converge clustered CR1 on K_reference - D1+D2 fix (M-126) by @igerber in #737
- feat(3.9): tail-df consolidation - three-value df_convention knob + t(residual) defect fix (M-127) by @igerber in #738
- docs(v4): planning consolidation - alias diet + canonical 3.9 sequence (M-132..M-135, M-063 cancelled) by @igerber in #739
- test(v4): naming-completeness guard - section-8 surface sweep, section-9 phase-table agreement, rule-11 consumer coverage by @igerber in #740
- refactor(v4): shared BaseEstimator mixin - transactional set_params library-wide (2(c)-i) by @igerber in #741
- feat(v4): mechanical rename wave - canonical names with 3.9 FutureWarning shims (2(c)-ii PR-A, 32 rows) by @igerber in #742
- feat(v4): semantic rename wave - post/control_group/vcov-only/level shims + missed-rename amendments (2(c)-ii PR-B, 15 rows) by @igerber in #743
- feat(v4): EventStudyResults consumers + dCDH aggregate shim (2(b) PR-1, M-026) by @igerber in #744
- feat(v4): StackedDiD post-fit aggregate() + honest/pretrends container admission (2(b) PR-2, M-024) by @igerber in #747
- feat(v4): EfficientDiD post-fit aggregate() via a lazy recompute kit (2(b) PR-3a, M-023/M-120) by @igerber in #748
- feat(v4): ImputationDiD + TwoStageDiD post-fit aggregate() via panel-backed kits (2(b) PR-3b, M-021/M-022/M-118/M-119) by @igerber in #749
- feat(v4): ContinuousDiD post-fit aggregate() - mixed view/recompute adopter (2(b) PR-3c, M-025) by @igerber in #750
- feat(v4): HAD post-fit aggregate() + mode inference; per-level bootstrap-gate convergence (2(b) PR-4, M-027/M-139) by @igerber in #751
- feat(v4): deprecate the 8 estimator wrappers + alias diet via module getattr; SCM alias (2(d) PR-A, M-070..M-077/M-132..M-135/M-062) by @igerber in #752
- feat(v4): n_bootstrap validation sweep + fail-closed inference selector (2(d) PR-B, M-081/M-096) by @igerber in #754
- feat(v4): TWFE event-study mode absorbs MultiPeriodDiD - M-010/M-060/M-082 (phase 3(a)) by @igerber in #755
- Raise the plan-review codex ceiling 1200s -> 2400s by @igerber in #757
- TripleDifference absorbs StaggeredTripleDifference - M-013/M-064 (phase 3(b)) by @igerber in #756
- ChangesInChanges absorbs QDiD via method= - M-015/M-143 (phase 3(c)) by @igerber in #758
- 4.0 migration guide + R-equivalents argument table (phase 4) by @igerber in #759
- Bump version to 3.9.0 by @igerber in #761
Full Changelog: v3.8.0...v3.9.0
v3.8.0
What's Changed
- docs(tutorial-22): align last two survey/weights phrasings with the 3.7.x removal by @igerber in #660
- perf(had): hoist Stute bootstrap loop invariants — bit-identical, ~2x by @igerber in #641
- test(survey): true half-sample BRR replicate regressions per estimator family by @igerber in #648
- refactor(utils): shared FE-dummy design build across DiD/MPD/TWFE by @igerber in #655
- perf(spillover): sparse cKDTree branch for staggered nearest-treated distances by @igerber in #645
- fix(imputation): FE-span snap guard on the pretrends lead model by @igerber in #650
- docs(todo): drop two resolved Actionable rows (rust vcov determinism #653; HonestDiD B2b) by @igerber in #662
- perf(linalg): scores-based CR2 Bell-McCaffrey DOF (algebraic identity; PT2018 §3.1 Satterthwaite) by @igerber in #656
- fix(imputation): LSMR singular-variance fallback — no dense normal-matrix materialization by @igerber in #657
- test(twfe): tighten live-R fixest parity bands to measured precision (SE-audit C7/C8) by @igerber in #663
- docs(todo): close the SE-audit CI-lock row into its Deferred buckets by @igerber in #665
- perf(linalg): low-rank factored CR2-BM adjustment operators (8-108x) by @igerber in #664
- perf(two_stage): certified sparse-LSMR Stage-1 fallback — no dense normal-matrix materialization by @igerber in #666
- feat(inference): opt-in df_convention="cluster" knob for clustered t/p/CI by @igerber in #667
- perf(linalg): scores-based one-way Bell-McCaffrey DOF denominator by @igerber in #668
- feat(conformal): one-sided alternatives + covariates in the CWZ proxy by @igerber in #669
- perf(linalg): opt-in solve_ols normal-equations Cholesky fast path (DIFF_DIFF_SOLVE_OLS_FASTPATH) by @igerber in #670
- docs(todo): waive the TWFE full-dummy dedup row (premise resolved by #655) by @igerber in #671
- bench: 2026-07 public benchmark refresh harness with fail-closed publication gates by @igerber in #672
- bench: publish 2026-07 refresh results - regenerated benchmarks page + committed artifacts by @igerber in #673
- docs: replace README hero image with corrected DiD diagram by @igerber in #674
- chore: clean package static-analysis findings by @shawcharles in #611
- docs: add RDD paper reviews (CCT 2014, CCFT 2017, CCF 2018, CCFT 2019) by @igerber in #675
- docs(carousel): speed & memory optimization story deck (v3.5.3 -> v3.7.0) by @igerber in #676
- docs: add CiC/QDiD paper reviews (Athey-Imbens 2006, Callaway-Li-Oka 2018, Melly-Santangelo 2015, Ciaccio 2024) by @igerber in #678
- chore: pin lint tooling + normalize source and hand-fixed test files (1/2) by @igerber in #677
- chore: mechanical black/ruff normalization of remaining test files (2/2) by @igerber in #679
- feat: rdrobust 4.0.0 sharp-RD bandwidth-selection port + R golden parity (RDD PR-1) by @igerber in #680
- chore(deps): bump openai/codex-action from 1.9 to 1.11 in the actions-minor-patch group by @dependabot[bot] in #626
- ci: ungated check-only Lint workflow (ruff + black) + blame-ignore + docs by @igerber in #681
- feat: add ChangesInChanges (CiC) + QDiD distributional DiD estimators with qte golden parity by @igerber in #682
- chore(types): mypy triage to enforceable zero + blocking CI job (3/3) by @igerber in #683
- feat: RegressionDiscontinuity - sharp RD estimator with rdrobust 4.0.0 parity (RDD PR-2) by @igerber in #684
- LWDiD precursor: canonical LW paper reviews + REGISTRY entry + Prop 99 / Walmart dataset loaders by @igerber in #685
- feat: fuzzy regression discontinuity via treatment_col on RegressionDiscontinuity by @igerber in #686
- feat: add covariate support to ChangesInChanges/QDiD (qte xformla parity) by @igerber in #688
- LWDiD validation suite: skip-gated methodology acceptance tests + replication goldens (precursor #2 for #588) by @igerber in #689
- feat(rdd): covariate-adjusted RD - covariates= on fit() with rdrobust 4.0.0 parity (CCFT 2019) by @igerber in #691
- feat: dedicated practitioner_next_steps() handler for ChangesInChanges/QDiD by @igerber in #692
- Bump version to 3.8.0 by @igerber in #693
Full Changelog: v3.7.0...v3.8.0
v3.7.0
What's Changed
- docs: correct Dube et al. (2025) JAE citation to issue 7 by @igerber in #610
- feat(had): cluster-robust event-study inference + clustered sup-t band by @igerber in #612
- docs(cs): keep cluster= (not deprecate) + close TODO row by @igerber in #614
- feat(interop): balance interop launch - composition-drift tutorial, contract tests, isolated interop CI job by @igerber in #613
- perf(imputation,two_stage): shared MAP demeaning engine + zero-weight replicate fix by @igerber in #615
- feat(continuous-did): covariate support (reg + dr) under conditional parallel trends by @igerber in #616
- perf(staggered): O(n_units) CS aggregation IF assembly + R did 2.5.1 yardstick by @igerber in #617
- fix(staggered): CS panel reg/ipw influence functions + per-cell SEs to DRDID parity by @igerber in #619
- feat(continuous-did): discrete-treatment saturated regression (treatment_type="discrete") by @igerber in #618
- fix(inference): three standard-error parity fixes vs canonical R by @igerber in #620
- perf(bootstrap): fused column-tiled scatter-GEMM multiplier bootstrap (CS + EfficientDiD) by @igerber in #622
- CS positional base period + absorbed-FE full-K SE parity vs R by @igerber in #621
- feat(continuous-did): lowest-dose-as-control (control_group="lowest_dose", Remark 3.1) by @igerber in #623
- test(se-audit): CI-lock flagship + previously-unasserted SE parity (G2 + C1-C3/C5) by @igerber in #624
- perf(efficient_did): omega_ridge stabilization + fused tiled GEMM analytical path (43x) by @igerber in #625
- fix(callaway): IF-based per-cell SE for no-covariate doubly-robust by @igerber in #627
- test(se-audit): fiddly-bits SE parity locks (C2 DOF, C3 df, C4 intercept SE, C5 Yatchew p/sigma2, G2 cluster band) by @igerber in #628
- perf(efficient_did): cross-cell kcov-table hoisting + per-group W lifecycle (100k: 86 -> 18 min) by @igerber in #629
- feat(imputation): leave-one-out conservative variance (BJS 2024 App. A.9) by @igerber in #630
- perf(efficient_did): dispatch conditional Omega* ridge solves to a Rust batched-Cholesky kernel (fits 1.4-1.8x) by @igerber in #632
- feat(callaway): allow_unbalanced_panel — RC-on-panel parity with R did by @igerber in #631
- perf(linalg): per-cell solver fast paths - IRLS Cholesky inner solve + rank-detection certification (CS covariate fits 1.5-2x) by @igerber in #634
- refactor(had): remove deprecated survey=/weights= kwargs from HeterogeneousAdoptionDiD.fit (3.7.0) by @igerber in #633
- fix(honest_did): nested optimal-FLCI optimizer — R center parity (SE-audit B2b) by @igerber in #635
- perf(callaway): fancy-+= per-(g,t) IF scatters; drop dead _compute_aggregated_se by @igerber in #636
- fix(tests): sandbox doc-snippet env mutations; order-robust dCDH baseline backend detection by @igerber in #637
- test(callaway): fold ipw R yardsticks into regenerated golden; record no-cov ipw document-only decision by @igerber in #638
- perf(efficient_did): skip _ridge_solve_weights fancy-index copy when no row is zero-masked by @igerber in #639
- docs(todo): park SC fit-snapshot residency + stratified PSU draw-tiling with investigation findings by @igerber in #646
- test(se-audit): G2 hetero + cluster machine-precision fixest locks on unbalanced heteroskedastic DGP by @igerber in #644
- perf(callaway): stop materializing per-cell unit-label arrays in influence_func_info by @igerber in #640
- feat(rust): one-way HC2 robust vcov kernel by @igerber in #651
- test(imputation): covariate-path R parity anchor vs didimputation by @igerber in #643
- fix(survey): unify explicit-vcov_type contract under replicate designs (warn + hc1 remap) by @igerber in #654
- test(callaway): machine-precision golden tolerances — SE-audit C6 closure by @igerber in #658
- refactor(spillover): route stage-1 FE through shared _iterative_fe_solve by @igerber in #642
- feat(reviewer-eval): port CI notebook-prose extraction into ci_prompt by @igerber in #649
- refactor(had): remove deprecated survey=/weights= kwargs from the 7 pretest helpers (3.7.x) by @igerber in #659
- perf(utils): precompute r-independent wild-bootstrap inversion pieces (~7x, outputs unchanged) by @igerber in #647
- docs: publish REGISTRY.md + REPORTING.md as in-site Sphinx pages (MyST) by @igerber in #652
- fix(rust): deterministic clustered vcov — first-appearance cluster aggregation by @igerber in #653
- Bump version to 3.7.0 by @igerber in #661
Full Changelog: v3.6.2...v3.7.0
v3.6.2
What's Changed
- feat(efficient_did): survey-weighted Silverman bandwidth in conditional Omega* by @igerber in #594
- feat(had): cluster-robust SE on the continuous paths (Phase 2a) by @igerber in #596
- ci: SHA-pin all GitHub Actions and add CODEOWNERS (supply-chain hardening) by @igerber in #595
- Add LP-DiD launch carousel (local-projections crossover narrative) by @igerber in #597
- fix: define zero-column rank detection contract by @shawcharles in #578
- feat(synthetic_control): split cv-infeasible from failed in placebo/LOO diagnostics by @igerber in #598
- bench: FE-absorption benchmark lane with BEFORE baselines + pyfixest yardstick (scenarios 7-13) by @igerber in #600
- feat(diagnostic_report): register SpilloverDiDResults routing by @igerber in #599
- perf: factorize-once + bincount MAP demeaning, max_iter 10k parity, FE-spanned regressor guard by @igerber in #601
- perf(rust): compiled MAP demeaning kernel - rayon across columns, 1.4-2.8x on FE-absorption workloads by @igerber in #603
- refactor(survey): consolidate panel-to-unit collapse (ContinuousDiD/EfficientDiD) by @igerber in #602
- docs: clarify DiD predict support contract by @shawcharles in #580
- docs(paper): finalize JOSS submission - 20 estimators, required sections, draft-pdf CI by @igerber in #604
- perf(utils): opt-in chunked demean_map dispatch + corrected solver-phase memory attribution by @igerber in #605
- perf(linalg): slim solve_ols marshalling - 15.3->7.8 GB rust-side footprint, -21% firm-panel fits, outputs preserved by @igerber in #607
- feat(synthetic_control): ADH-2015 §4 tail diagnostics (regression_weights + sparse_synthetic_control) by @igerber in #608
- Bump version to 3.6.2 by @igerber in #609
Full Changelog: v3.6.1...v3.6.2