diff --git a/DEFERRED.md b/DEFERRED.md index 795c8e253..2adfbfa86 100644 --- a/DEFERRED.md +++ b/DEFERRED.md @@ -45,6 +45,10 @@ provenance and AI-review deviation-documentation: a row here (or in | **`LPDiD` non-absorbing exit-event dynamics** (Dube et al. 2025 online Appendix C `eta_h^{g,n}`): the shipped `non_absorbing` modes estimate the **entry-effect** estimands (Eq. 12/13) only; separate dynamic event-studies for treatment switch-*offs* are not implemented. Needs the exit-event clean-sample derivation + estimand contract. | `lpdid.py`, REGISTRY | PR-C follow-up | Low | | MMM interop, survey/RC totals for the five `aggregate('total')` adopters (CS/DMLDiD/EfficientDiD/ImputationDiD/TwoStageDiD; the shipped v1 is panel non-survey only and fails closed with `NotImplementedError` on repeated-cross-section-routed fits, fits declaring a `survey_design=`, and the CS/DMLDiD bare-`cluster=` divergent corner where the cohort-mass weighting disagrees with the complete-case count): needs (a) DESIGN-AWARE raw-mass recovery - analytic pweight/aweight resolved weights are normalized to sum = n and CS retains no raw record (fit-time RAW retention required there; CS accepts pweight only), while EDiD's analytic fweight fits and all replicate-design fits already retain raw scale in the kits and Imputation/TwoStage retain raw `SurveyMetadata.sum_weights` - and (b) the mass-uncertainty `att*dC` variance derivation (the shipped relay conditions on the realized mass and omits it). Never ship a survey/RC total from normalized masses. | `diff_diff/staggered_results.py`, `diff_diff/survey.py` | mmm-interop | Low | | **`LPDiD` non-absorbing interior-gap support**: non-absorbing modes require a gap-free panel within each unit's observed span and raise on interior time gaps (the `[t-L, t+h]` window conditions can't be verified across a gap). The absorbing path already reindexes interior gaps to the calendar grid; extending that fail-closed handling (per-window gap masking) to non-absorbing is deferred. | `lpdid.py::_prepare_panel` | PR-C follow-up | Low | +| Bad-control lane on repeated cross sections: Caetano et al. (2026) Remark 1 calls the approach unavailable "to a large extent" with repeated cross sections (`X_{g-1}` and `X_t` must be observed for the same unit); an RCS variant needs its own derivation. `DMLDiD(panel=False).fit(bad_control=)` fails closed. | `dml_did.py` | bad-controls PR-B | Low | +| Limited-anticipation extension of the bad-control lane: MP-2 assumes no anticipation for `Y` AND `X`; the base-period convention for `X` and `W` under `anticipation > 0` is not developed by the paper. `DMLDiD(anticipation=k).fit(bad_control=)` fails closed. | `dml_did.py` | bad-controls PR-B | Low | +| Universal-base bad-control pre-test: MP-5 conditions on the immediately preceding period, and under `base_period="universal"` a pre cell with `t < g - 1` would read `X_t` earlier than `X_{g-1}` / `W`, inverting the ordering; a universal-base version needs its own derivation. `DMLDiD(base_period="universal").fit(bad_control=)` fails closed. | `dml_did.py` | bad-controls PR-B | Low | +| Bad-control lane under `survey_design=`: the nested second-stage nuisances under design weights (Hajek moments, `sample_weight` into the nested fits) and the replicate-weight variance of the nested scores are unvalidated; fails closed (bare `cluster=` is supported). | `dml_did.py` | bad-controls PR-B | Low | ## Needs external reference (R / Stata / Julia) @@ -111,7 +115,7 @@ For survey-specific limitations (`NotImplementedError` paths), see the | Rust local-method `estimate_model` → unify to `solve_wls_svd` (the global-method's SVD helper) for sub-1e-14 bootstrap-SE parity. The local-method bootstrap parity test passes at `atol=1e-5`; the residual ~1e-7 is roundoff, not a user-visible correctness bug. | `rust/src/trop.rs`, `rust/src/linalg.rs` | follow-up | Low | | Validate the `.txt` AI guides (`llms-full.txt`, `llms-practitioner.txt`) as executable snippets — **not low-lift** (re-scoped 2026-06-01): only ~20% of ~112 fenced blocks are standalone-runnable; the rest are signature pseudo-code, context fragments, or data-shape-specific. Needs signature-block detection + a context/data skip-allowlist + per-snippet fixtures. | `tests/test_doc_snippets.py` | #239 | Low | | `TestWorkflowDoesNotExecutePRHeadCode` (CodeQL #14 guard) doesn't model `bash/sh/./source