stratum atlas
Model DocsCorrelation and Effects
M27

Causal Effects Model

Whether a shock actually changed outcomes - answered with one approved design, or refused with the failed assumptions named.

Assumptions

Everything the model believes, stated before the math. If you do not buy one of these, do not buy the output.

  1. The only approved design is matched difference-in-differences; there is no generic causal button.
  2. Matching uses pre-treatment fields only - project type, state, capacity tercile. Post-event variables can never enter the match key.
  3. Co-movement alone never activates causal language: IDENTIFIED requires the pre-trend, placebo, overlap, and minimum-cell checks to pass.
  4. A scenario output is never relabeled causal evidence.
  5. Censoring is printed via cell counts, never imputed.
  6. An instrumental-variables request is refused absent a documented exclusion argument - no IV design exists in the registry.

Derivation

Treated subjects are the projects carrying the shocked object (node, sponsor, or queue request). Controls are projects that do not carry it but share a treated unit's pre-treatment match key - type, state, and capacity tercile - so every treated cell with overlap gets a comparison group drawn from how projects looked before the event, never after.

The effect is the difference-in-differences of withdrawal rates, treated minus control, net of the same difference before the event:

Three diagnostics gate the estimate before it may print. The pre-trend check compares pre-event milestone activity between treated and controls with a two-proportion z (pass: |z| < 1.96) - if the groups already moved differently before the event, the design fails. The placebo re-runs the design with the event shifted one year earlier - a significant placebo effect means the design is picking up something other than the event. Overlap requires at least 5 matched controls and 5 resolved outcomes per cell; below that, censoring is printed and no number is released.

Identification strategy

Why the estimate supports the claimed meaning - and where the model refuses to claim more than the data carries.

  • The identification contract is the gate, not the arithmetic: any failed assumption - malformed event date, no treated subjects, poor overlap, failed pre-trend, significant placebo, thin cells - returns NOT_IDENTIFIED with every failed assumption named, and the effect prints as UNKNOWN with the reason, never as a number.
  • Pre-treatment-only matching is the anti-contamination rule: because the match key is built from fields fixed before the event, the event itself cannot decide who looks like a control.
  • The placebo is the falsification channel: shifting the event a year earlier asks the design to find an effect where none should exist, and a significant result kills the estimate.
  • The hidden-bias note prints with every estimate: matching is on observables only, so bias from unobserved confounders is unbounded - the interval is labeled optimistic by construction.

Inputs and outputs

Reads

Causal event
A shocked object (node, sponsor, or queue request) with an event date and direction
Project statuses
Resolved / censored status per project; censoring printed, never imputed
Milestone history
Dated milestone events, used for the pre-trend diagnostic on pre-event activity
Pre-treatment fields
Project type, state, capacity tercile - the only permitted match keys

Writes

  • Identification verdict: IDENTIFIED or NOT_IDENTIFIED with failed assumptions named
  • Treated and matched-control cohorts with the match keys and overlap note
  • Pre-trend diagnostic (rates, z, pass) and placebo (shifted date, effect, significance)
  • The DiD estimate with standard error and 95% interval - only when identified
  • Hidden-bias sensitivity note with every estimate

Calibration and gate evidence

Validation design

  • Validated by construction gates: a run with no treated subjects must return NOT_IDENTIFIED naming that failure, and a failed design must yield an UNKNOWN effect, never a number.

Evidence on record

  • Smoke gates at seal (10 m27-specific): the only design is the approved matched DiD; the identification verdict is explicit; NOT_IDENTIFIED names the failed assumptions; matching is restricted to pre-treatment fields; pre-trend and placebo print; failed identification yields an UNKNOWN effect, never a number; the hidden-bias note prints; no treated subjects returns NOT_IDENTIFIED; determinism (identical input hash on re-run); audit row written for every run.

Gates at seal

  • smoke: 10 m27 gates incl. no-treated NOT_IDENTIFIED, determinism + audit row (suite counts at seal per the build agent's seal report)
  • sealed at d7a7dc6b on atlas-nl-shock-redesign

Failure modes

The ways this model declines, degrades or goes UNKNOWN - and what it prints when it does.

  • No treated subjects carry the shocked object: NOT_IDENTIFIED, named.
  • Fewer than 5 matched controls or 5 resolved outcomes per cell: no estimate released; censoring printed via cell counts.
  • No pre-event history in the record: parallel movement cannot be checked and the design fails.
  • Pre-trend or placebo failure: the estimate is withheld and the failed diagnostic is named.

Sensitivity

  • Capacity terciles are the coarsest match key: within a tercile, a very large treated project can sit against much smaller controls, and the estimate carries that heterogeneity.
  • Matching on observables only means hidden bias is unbounded - the printed note treats every interval as optimistic, which is the honest reading of an observational design.

Iron rules

Co-movement alone never activates causal language.

A scenario output is never relabeled causal evidence. Failed identification prints UNKNOWN with the failed assumptions named, never a number.

Source and audit

Written from the sealed model source. Every run is recorded - model version, frozen inputs, input hash, timestamp. There is no unrecorded model execution.