1+ name : Nightly CI
2+
3+ on :
4+ schedule :
5+ # Run at 2 AM UTC every day
6+ - cron : ' 0 2 * * *'
7+ workflow_dispatch : # Allow manual triggering
8+
9+ jobs :
10+ comprehensive-validation :
11+ runs-on : ubuntu-latest
12+
13+ steps :
14+ - uses : actions/checkout@v4
15+
16+ - name : Setup Julia
17+ uses : julia-actions/setup-julia@v1
18+ with :
19+ version : ' 1.11'
20+
21+ - name : Cache Julia packages
22+ uses : julia-actions/cache@v1
23+
24+ - name : Install dependencies
25+ run : |
26+ julia --project=. -e "using Pkg; Pkg.instantiate()"
27+
28+ - name : Run package tests
29+ run : |
30+ julia --project=. -e "using Pkg; Pkg.test()"
31+
32+ - name : Run comprehensive seed sweep
33+ run : |
34+ julia --project=. scripts/seed_sweep.jl --seeds 30 --N 600 --T 200 --treated-share 0.10 --F 1:8 --L -30:-1 --phi 0.0 --rho 0.5 --sigma-y 0.2 --beta1 0.3 --beta2 0.5 --out test/validation/nightly_seed_sweep.json
35+
36+ - name : Run bias and coverage analysis
37+ run : |
38+ julia --project=. scripts/sim_bias_coverage.jl --seeds 20 --iterations 400 --out test/validation/nightly_bias_coverage.json
39+
40+ - name : Run placebo permutation tests
41+ run : |
42+ julia --project=. scripts/placebo_permutation.jl --permutations 300 --iterations 100 --out test/validation/nightly_placebo.json
43+
44+ - name : Upload comprehensive validation artifacts
45+ uses : actions/upload-artifact@v4
46+ if : always()
47+ with :
48+ name : nightly-validation-results
49+ path : |
50+ test/validation/nightly_*.json
51+ retention-days : 90
52+
53+ - name : Create validation summary
54+ if : always()
55+ run : |
56+ echo "# Nightly Validation Summary" > validation_summary.md
57+ echo "Generated: $(date)" >> validation_summary.md
58+ echo "" >> validation_summary.md
59+
60+ if [ -f test/validation/nightly_seed_sweep.json ]; then
61+ echo "## Seed Sweep Results" >> validation_summary.md
62+ julia --project=. -e "
63+ using JSON
64+ data = JSON.parsefile(\"test/validation/nightly_seed_sweep.json\")
65+ summary = data[\"summary\"]
66+ println(\"- MAE Mean: \", summary[\"mae_mean\"])
67+ println(\"- MAE SD: \", summary[\"mae_sd\"])
68+ println(\"- MxE Max: \", summary[\"mxe_max\"])
69+ " >> validation_summary.md
70+ fi
71+
72+ if [ -f test/validation/nightly_bias_coverage.json ]; then
73+ echo "" >> validation_summary.md
74+ echo "## Bias & Coverage Results" >> validation_summary.md
75+ julia --project=. -e "
76+ using JSON
77+ data = JSON.parsefile(\"test/validation/nightly_bias_coverage.json\")
78+ bias_summary = data[\"bias\"][\"summary\"]
79+ coverage_summary = data[\"coverage\"][\"summary\"]
80+ println(\"- Overall MAE: \", bias_summary[\"overall_mae\"])
81+ println(\"- Overall RMSE: \", bias_summary[\"overall_rmse\"])
82+ println(\"- Coverage Rate: \", coverage_summary[\"overall_coverage\"])
83+ " >> validation_summary.md
84+ fi
85+
86+ if [ -f test/validation/nightly_placebo.json ]; then
87+ echo "" >> validation_summary.md
88+ echo "## Placebo Test Results" >> validation_summary.md
89+ julia --project=. -e "
90+ using JSON
91+ data = JSON.parsefile(\"test/validation/nightly_placebo.json\")
92+ summary = data[\"placebo\"][\"summary\"]
93+ println(\"- Type I Error Rate: \", summary[\"overall_type1\"])
94+ println(\"- Successful Permutations: \", summary[\"n_successful\"], \"/\", summary[\"n_attempted\"])
95+ " >> validation_summary.md
96+ fi
97+
98+ - name : Upload validation summary
99+ uses : actions/upload-artifact@v4
100+ if : always()
101+ with :
102+ name : validation-summary
103+ path : validation_summary.md
104+ retention-days : 90
0 commit comments