You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
P1 step-2 / Assumption 7 closure precondition: per
docs/methodology/REGISTRY.md HeterogeneousAdoptionDiD
§ "Assumption 7 / step 2 closure" + had_pretests.py:4738-4756 + 2769,
aggregate="event_study" closes paper Section 4.2 step 2 ONLY IF the
panel has at least one earlier placebo pre-period beyond the base F-1.
With only the base F-1 pre-period available (minimal 3-period
event-study, or 4-period under trends_lin=True where the consumed F-2
placebo is auto-dropped), the workflow sets pretrends_joint=None,
all_pass=False, and appends 'joint pre-trends skipped (no earlier
pre-period)' to the verdict - step 2 stays uncovered.
The previous Step-3 wording in both _handle_had and
_handle_had_event_study + the HAD Pretests intro in llms-full.txt said
generically that aggregate="event_study" closes the step-2 gap, which
is overbroad and could mislead agents on minimal valid event-study
panels. All three surfaces now make the precondition explicit AND
document the pretrends_joint=None / 'joint pre-trends skipped' fallback
verdict so agents know what to expect when the precondition fails.
P2 missing regression coverage: the prior tests locked assumption
labels and the QUG-under-survey caveat but did not lock the
earlier-pre-period precondition - that is why the overstatement
landed in the new agent-facing surfaces without tripping the existing
guide / practitioner tests.
Tests added (2 new, 94 total):
- test_had_step_3_documents_earlier_pre_period_precondition_for_step_2:
asserts both HAD handler variants surface the 'earlier pre-period'
/ placebo precondition AND the pretrends_joint=None / 'joint
pre-trends skipped' fallback.
- test_llms_full_had_pretests_documents_earlier_pre_period_precondition:
same lock on the HAD Pretests section in llms-full.txt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diagnostic pretests for the `HeterogeneousAdoptionDiD` identifying assumptions (de Chaisemartin, Ciccia, D'Haultfœuille & Knau 2026). The composite workflow `did_had_pretest_workflow` is the recommended entry point — call it before reporting WAS as causal. The workflow follows paper Section 4.2's three-step battery: **step 1** is the QUG support-infimum test (decides whether Design 1' or Design 1 applies); **step 2** is the Assumption 7 pre-trends test (joint Stute on the event-study path; explicitly NOT covered on the overall path because a single-pre-period panel cannot support the joint variant); **step 3** is the Assumption 8 linearity test (`stute_test` or `yatchew_hr_test`). On the default `aggregate="overall"` path the workflow runs steps 1 + 3 only and the returned `verdict` flags the Assumption 7 gap; pass `aggregate="event_study"` on a multi-period panel to close that gap.
1409
+
Diagnostic pretests for the `HeterogeneousAdoptionDiD` identifying assumptions (de Chaisemartin, Ciccia, D'Haultfœuille & Knau 2026). The composite workflow `did_had_pretest_workflow` is the recommended entry point — call it before reporting WAS as causal. The workflow follows paper Section 4.2's three-step battery: **step 1** is the QUG support-infimum test (decides whether Design 1' or Design 1 applies); **step 2** is the Assumption 7 pre-trends test (joint Stute on the event-study path; explicitly NOT covered on the overall path because a single-pre-period panel cannot support the joint variant); **step 3** is the Assumption 8 linearity test (`stute_test` or `yatchew_hr_test`). On the default `aggregate="overall"` path the workflow runs steps 1 + 3 only and the returned `verdict` flags the Assumption 7 gap; pass `aggregate="event_study"` on a multi-period panel **with at least one earlier placebo pre-period beyond the base `F-1`** to close that gap. With only the base `F-1` pre-period available (minimal 3-period event-study, or 4-period under `trends_lin=True` where the consumed `F-2` placebo is dropped), the workflow still sets `pretrends_joint=None`, `all_pass=False`, and appends `joint pre-trends skipped (no earlier pre-period)` to the verdict — step 2 stays uncovered.
0 commit comments