@@ -90,16 +90,16 @@ jobs:
9090 python -m pip install --upgrade pip
9191 pip install -e ".[dev]"
9292
93- - name : Install parity extra (canonical env — runs the doubleml external-parity pins)
94- # doubleml is the opt-in `parity` extra (not in `dev`). Installing it on
95- # the canonical ubuntu+3.10 env makes tests/external_parity/
96- # test_dml_python_parity.py actually run its 2 sp.dml-vs-doubleml pins,
97- # so the JSS external-parity headline count (52) is verified rather than
98- # silently skipped . Other matrix entries skip those 2 pins and the
93+ - name : Install exact- parity extras (canonical env — runs DoubleML + CCT pins)
94+ # doubleml and rdrobust are opt-in extras (not in `dev`). Installing them
95+ # on the canonical ubuntu+3.10 env makes tests/external_parity/
96+ # test_dml_python_parity.py run its 4 sp.dml-vs-doubleml pins and makes
97+ # test_published_replications.py run the bwselect='cct' RD pins instead
98+ # of skipping them . Other matrix entries may skip optional pins; the
9999 # count-drift guard degrades gracefully (see test_jss_validation_api.py).
100100 # Mirrors the flake8 / mypy / coverage canonical-env gating below.
101101 if : matrix.os == 'ubuntu-latest' && matrix.python-version == '3.10'
102- run : pip install -e ".[parity]"
102+ run : pip install -e ".[parity,rd-cct ]"
103103
104104 - name : Lint with flake8 (hard syntax errors — all matrix entries)
105105 # E9/F63/F7/F82 are real syntax / undefined-name breakage and must be
@@ -130,11 +130,13 @@ jobs:
130130 # matrices and the same pin used by the flake8/mypy gates — where numpy is
131131 # >= 2.1 and the bug is absent. Every other matrix entry runs the full
132132 # suite without ``--cov``. Root cause: docs/rfc (E1 analysis).
133- # Coverage baseline: the 2026-05-28 local full-suite run (committed
134- # ``coverage.xml``, v1.16.0) measured 70.5% line coverage repo-wide
135- # (61,681 / 87,476 lines). The gate is therefore set to 60 — a 4x lift
136- # over the historical 15 placeholder, held ~10pp below the measured
137- # baseline so ordinary fold-split / platform variance cannot red a PR.
133+ # Coverage baseline: the 2026-05-28 local full-suite coverage XML
134+ # snapshot (v1.16.0) measured 70.5% line coverage repo-wide (61,681 /
135+ # 87,476 lines). The gate is therefore set to 60 — a 4x lift over the
136+ # historical 15 placeholder, held ~10pp below the measured baseline so
137+ # ordinary fold-split / platform variance cannot red a PR. The current
138+ # ratchet below consumes the CI-generated coverage.xml from this job; the
139+ # root coverage.xml is a working artifact, not a tracked source of truth.
138140 # Ratchet upward (60 -> 65 -> 70) once each step is confirmed green in
139141 # CI on the canonical ubuntu+3.10 env; never set the gate above the last
140142 # CI-verified number.
@@ -146,8 +148,8 @@ jobs:
146148 # Per-module ratchet for the six core estimators (did iv rd synth dml panel).
147149 # The repo-wide --cov-fail-under above is a soft floor; this gate locks each
148150 # core module at the hard ≥95% the coverage campaign achieved so none can
149- # silently regress. Reuses the coverage.xml just produced. Ratchet the --min
150- # upward only after a higher number is confirmed green here.
151+ # silently regress. Reuses the CI-generated coverage.xml just produced.
152+ # Ratchet the --min upward only after a higher number is confirmed green here.
151153 - name : Core-module coverage ratchet (did/iv/rd/synth/dml/panel ≥ 95%)
152154 if : matrix.os == 'ubuntu-latest' && matrix.python-version == '3.10'
153155 run : |
0 commit comments