Contract (P0) — F6-dev-01
Question. Does the cross-country Preston curve (life expectancy rising with log income) hold in the most recent year with usable WDI data, and how strong is it?
Estimand. β in the linear projection LE_i = α + β·ln(GDPpc_i) + ε_i across countries/economies (equal weights, one obs per country) in the analysis year. LE = life expectancy at birth (years); GDPpc = GDP per capita PPP, constant 2021 intl $. β is a descriptive best-linear-predictor slope (years per log-point), meaningful without causal assumptions; inference via heteroskedasticity-robust SE treats countries as independent draws (the "population" is essentially the full set of countries, so the SE is a superpopulation/model-based notion). Also: α, Pearson r, R², RMSE of mean-only baseline vs OLS residual RMSE.
Outputs. out/results.json with keys analysis_year, n_excluded_missing, baseline_metric, model_metric, pearson_r, r_squared, effect_estimate, intercept, effect_se, effect_ci_low, effect_ci_high, conclusion (positive_effect/negative_effect/no_detectable_effect/premise_invalid), task_id ("F6-dev-01"), feasibility, feasibility_reason, data_issues [{issue,handling}], n_input_rows {file:int}, n_analysed, random_seed. Also out/figure1.png (scatter + OLS line), out/table1.csv (income_level, n_countries, mean_log_gdp_pc, mean_life_expectancy), out/report.md (six sections in order), out/analysis.py (Agg, deterministic, data/ only), out/claims.json, plus exclusions.csv and state files.
Information rules. Exclude region=="Aggregates". Analysis year = latest year 2015–2023 with both indicators observed for ≥150 countries/economies. Countries with a missing indicator in that year are dropped and counted (n_excluded_missing); no imputation. Natural log. Only the listed files.
Invalidity / impossibility. No year reaching 150 complete countries; inability to identify aggregates; non-positive GDP (log undefined); duplicated entity-years; data not matching provenance hashes. Any of these would make the estimand inestimable or contaminated (→ premise_invalid / null values).