Skip to content

Commit c2c9a57

Browse files
igerberclaude
andcommitted
docs(v4): review feedback - consumer-propagation gate, honest family framing, API-roster surface
M-091's done-gate now requires consumer propagation, not just marker membership: BusinessReport must reject marked diagnostics as primary estimator input BY TYPE (today it special-cases only Bacon by name) and practitioner_next_steps must route marked diagnostics through diagnostic handling (not the unknown-result estimator fallback) - consumer files added to the row's scope. Section 3.5 reframed honestly as a NEW canonical consolidation anchored on (not identical to) the docs family, with explicit reclassifications and non-members (Conley is an embedded inference method, not a diagnostic object). M-090 gains docs/api/index.rst (which lists Bacon as an estimator today) and a terminal grouping assertion. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eVKbBqzenDKa5idwtexQa
1 parent 09b1027 commit c2c9a57

2 files changed

Lines changed: 26 additions & 15 deletions

File tree

docs/v4-deprecations.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -904,8 +904,8 @@ rows:
904904
removed_in: null
905905
status: planned
906906
phase: 5
907-
code_refs: [README.md, diff_diff/guides/llms.txt, diff_diff/bacon.py]
908-
notes: "4.0 diagnostic-family docs/roster reorganization (spec section 3.5): Bacon re-homed OUT of the API estimator roster (misfiled today); RDPlot (already documented as a diagnostic) consolidated under the unified family grouping; README/llms.txt/API/alias groupings and estimator-count claims split into estimators + diagnostics. The Phase 2 marker introduction is gated separately by [M-091]."
907+
code_refs: [README.md, diff_diff/guides/llms.txt, docs/api/index.rst, diff_diff/bacon.py]
908+
notes: "4.0 diagnostic-family docs/roster reorganization (spec section 3.5): Bacon re-homed OUT of the API estimator roster (misfiled today); RDPlot (already documented as a diagnostic) consolidated under the unified family grouping; README/llms.txt/API/alias groupings (incl. docs/api/index.rst, which lists Bacon as an estimator today) and estimator-count claims split into estimators + diagnostics; the flip's terminal test asserts the estimator/diagnostic grouping on the named surfaces. The Phase 2 marker introduction is gated separately by [M-091]."
909909
- id: M-091
910910
kind: behavior
911911
group: diagnostic-family
@@ -916,8 +916,8 @@ rows:
916916
removed_in: null
917917
status: planned
918918
phase: 2
919-
code_refs: [diff_diff/bacon.py, diff_diff/rdplot.py, diff_diff/honest_did.py, diff_diff/pretrends.py, diff_diff/power.py, diff_diff/diagnostics.py, diff_diff/had_pretests.py, diff_diff/diagnostic_report.py]
920-
notes: "Phase 2 Diagnostic marker base on the RESULT roster (spec section 3.5): BaconDecompositionResults, RDPlotResult, HonestDiDResults + SensitivityResults, PreTrendsPowerResults + PreTrendsPowerCurve, PowerResults + Simulation*Results, PlaceboTestResults, and the HAD pretest containers (QUGTestResults, StuteTestResults, YatchewTestResults, StuteJointResult, HADPretestReport), and DiagnosticReportResults (serialization pair moves/delegates from the builder onto the container). Flip to done requires the dedicated roster test (isinstance + summary/to_dataframe on every member; estimator results NOT marked). Raw-dict functions and TWFEWeightsResult are docs-family only (narrowed, spec section 3.5). introduced_in gates the 3.9 cut: the marker cannot be silently skipped."
919+
code_refs: [diff_diff/bacon.py, diff_diff/rdplot.py, diff_diff/honest_did.py, diff_diff/pretrends.py, diff_diff/power.py, diff_diff/diagnostics.py, diff_diff/had_pretests.py, diff_diff/diagnostic_report.py, diff_diff/business_report.py, diff_diff/practitioner.py, diff_diff/_reporting_helpers.py, diff_diff/__init__.py]
920+
notes: "Phase 2 Diagnostic marker base on the RESULT roster (spec section 3.5): BaconDecompositionResults, RDPlotResult, HonestDiDResults + SensitivityResults, PreTrendsPowerResults + PreTrendsPowerCurve, PowerResults + Simulation*Results, PlaceboTestResults, and the HAD pretest containers (QUGTestResults, StuteTestResults, YatchewTestResults, StuteJointResult, HADPretestReport), and DiagnosticReportResults (serialization pair moves/delegates from the builder onto the container). Flip to done ALSO requires consumer-propagation tests: BusinessReport rejects marked diagnostics as primary estimator input BY TYPE (not by name), and practitioner_next_steps routes marked diagnostics through diagnostic handling (not the unknown-result estimator fallback). Flip to done requires the dedicated roster test (isinstance + summary/to_dataframe on every member; estimator results NOT marked). Raw-dict functions and TWFEWeightsResult are docs-family only (narrowed, spec section 3.5). introduced_in gates the 3.9 cut: the marker cannot be silently skipped."
921921

922922
# ---- Behavior policies (schema-tracked, spec-governed; no reality probe) -
923923
- id: M-080

docs/v4-design.md

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,20 @@ it assesses a design, an identifying assumption, or robustness (a
158158
decomposition table, binned plot data, a pre-trends p-value, sensitivity
159159
bounds, a power curve).
160160

161-
**Membership = the library's EXISTING "Diagnostics & Sensitivity" docs
162-
family, formalized** - not a new taxonomy: BaconDecomposition, RDPlot,
163-
parallel-trends testing, the placebo suite, HonestDiD, PreTrendsPower,
164-
PowerAnalysis, `twowayfeweights`, the HAD pretests, and the upcoming
165-
CJM 2020 density test (born into the family). (A narrower classes-only
166-
tier with separate categories for HonestDiD/PowerAnalysis was drafted and
167-
REJECTED 2026-07-19: the boundary needed adjudication, and the docs
168-
family already draws the right line.)
161+
**Membership: a NEW CANONICAL CONSOLIDATION anchored on the
162+
"Diagnostics & Sensitivity" docs family** (which today is close but not
163+
identical - the consolidation is the source of truth from 4.0):
164+
BaconDecomposition (reclassified OUT of the README/API estimator lists),
165+
RDPlot (consolidated from the RD grouping), parallel-trends testing, the
166+
placebo suite, HonestDiD, PreTrendsPower, PowerAnalysis,
167+
`twowayfeweights`, the HAD pretests, DiagnosticReport's results, and the
168+
upcoming CJM 2020 density test (born into the family). Explicit
169+
NON-members despite current docs placement: Conley spatial-HAC (an
170+
embedded inference method on estimators, not a diagnostic object) and
171+
other design elements listed under the README section. (A narrower
172+
classes-only tier with separate categories for HonestDiD/PowerAnalysis
173+
was drafted and REJECTED 2026-07-19: the boundary needed adjudication,
174+
and the family line above is the decided one.)
169175

170176
**Mechanics - the marker lives on RESULT containers.** Consumers hold
171177
results, not entry points, so the `Diagnostic` marker base (shipping
@@ -193,9 +199,14 @@ return raw dicts (`check_parallel_trends` and variants,
193199
`summary()`/`to_dataframe()` today) participate in the DOCS family only,
194200
not the type contract; upgrading them to marked containers is optional
195201
Phase 2 follow-up work, not part of this contract. The Phase 2 gate
196-
[M-091] requires a dedicated roster test: every enumerated result type is
197-
`isinstance(result, Diagnostic)` and exposes the serialization pair, and
198-
representative ESTIMATOR results are NOT. Import paths do NOT move - the
202+
[M-091] requires a dedicated roster test AND consumer propagation: every
203+
enumerated result type is `isinstance(result, Diagnostic)` and exposes
204+
the serialization pair, representative ESTIMATOR results are NOT, and the
205+
CONSUMERS actually switch to the marker - BusinessReport rejects marked
206+
diagnostics as its primary estimator input by type (today it
207+
special-cases only Bacon by name), and `practitioner_next_steps()` routes
208+
marked diagnostics through diagnostic-specific handling instead of its
209+
unknown-result estimator fallback. Import paths do NOT move - the
199210
flat top-level namespace is kept (rejected: `diff_diff.diagnostics.*`
200211
moves). Zero new classes beyond the single marker.
201212

0 commit comments

Comments
 (0)