1#!/bin/bash2# run_all.sh — FIRC-0002 v2.1 (Stage D review) single entry point. Rebuilds everything from the staged author inputs3# (data/raw_russell3000/, data/processed_r3k/ — the 2026-10-28 Yahoo/SEC vintage, sha256 in reproducibility/FIRC-0002/environment/inputs.sha256)4# into data/processed_r3k_v2/, results/r3k_v2/, figures/r3k_v2/ and paper/tables/, then compiles the manuscript.5# Network steps (10 = yfinance second price pass + Ken French daily factors, 12 = SEC companyfacts, 13/13b = FinData OS read-only SQL,6# 21 = doi.org/Crossref) are skipped when their outputs exist (set FORCE_DOWNLOAD=1 to redo them; prices are a new vintage then).7# Usage: bash scripts/run_all.sh [--no-latex] Environment: uv venv .venv-review --python 3.12; uv pip install -r reproducibility/FIRC-0002/environment/requirements.lock8set -euo pipefail; cd "$(dirname "$0")/.."; PY=${PY:-.venv-review/bin/python}; export OMP_NUM_THREADS=${OMP_NUM_THREADS:-4} OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 PYTHONHASHSEED=09LOG=results/r3k_v2/run_all.log; mkdir -p results/r3k_v2 data/processed_r3k_v2 figures/r3k_v2; : > "$LOG"10step() { local name=$1; shift; local t0=$(date +%s); echo "== $name start $(date -Iseconds)" | tee -a "$LOG"; nice -n 10 "$PY" -I "$@" >> "$LOG" 2>&1; echo "== $name done in $(( $(date +%s) - t0 )) s" | tee -a "$LOG"; }11V=data/processed_r3k_v2; F=${FORCE_DOWNLOAD:-0}12[ "$F" = 1 ] || [ ! -f $V/ff_daily.parquet ] && step r3k_10_download_v2 scripts/r3k_10_download_v2.py || echo "skip r3k_10 (outputs present)"13[ "$F" = 1 ] || [ ! -f $V/sec_shares_raw.parquet ] && step r3k_12_sec_shares_v2 scripts/r3k_12_sec_shares_v2.py || step r3k_12_reaggregate scripts/r3k_12_sec_shares_v2.py --reaggregate14[ "$F" = 1 ] || [ ! -f results/r3k_v2/hygiene_log.csv ] && step r3k_13_hygiene_findata scripts/r3k_13_hygiene_findata.py || echo "skip r3k_13 (hygiene_log.csv present)"15[ "$F" = 1 ] || [ ! -f $V/prices_monthly_findata_raw.parquet ] && step r3k_13b_findata_raw_closes scripts/r3k_13b_findata_raw_closes.py || echo "skip r3k_13b (present)"16step r3k_14_build_panel_v2 scripts/r3k_14_build_panel_v2.py17step r3k_15_analysis_v2 scripts/r3k_15_analysis_v2.py18step r3k_16_extended_v2 scripts/r3k_16_extended_v2.py19step r3k_17_event_study_v2 scripts/r3k_17_event_study_v2.py20step r3k_18_survivorship scripts/r3k_18_survivorship.py21step r3k_19_figures_v2 scripts/r3k_19_figures_v2.py22step r3k_20_tables_v2 scripts/r3k_20_tables_v2.py23[ -f results/r3k_v2/t17_refit.json ] || step r3k_11_t17_refit scripts/r3k_11_t17_refit.py24if [ "${1:-}" != "--no-latex" ]; then t0=$(date +%s); (cd paper && latexmk -pdf -interaction=nonstopmode -halt-on-error main.tex > ../results/r3k_v2/latexmk.log 2>&1) && echo "== latexmk done in $(( $(date +%s) - t0 )) s" | tee -a "$LOG" || echo "latexmk FAILED (see results/r3k_v2/latexmk.log)" | tee -a "$LOG"; fi25echo "ALL DONE $(date -Iseconds)" | tee -a "$LOG"26