=== step 1/2: experiment.py (axis gate + PCA/low-rank reconstruction, 9-fold x 3-seed) === [ 0.0s] === axis calibration gate (ds15, subject A) === [ 0.0s] axis0(ap): ref-span=120.13mm all-span=124.58mm max|disp|=10.56mm [ 0.0s] axis1(si): ref-span=150.18mm all-span=161.80mm max|disp|=20.17mm [ 0.0s] axis2(lr): ref-span=75.13mm all-span=83.77mm max|disp|=10.54mm [ 0.0s] cyc1-own-t0 vs cyc3-ref-t0: mean_3d_offset=3.81mm max_3d_offset=9.46mm (plan anchor: mean 3.81mm, max 9.46mm) [ 0.0s] PASS: axis calibration gate ok [ 0.0s] loading ds5 subjects A and B ... [ 0.8s] subject A: n_points=8219 cycles=[1, 2, 3, 4] [ 0.8s] subject B: n_points=10125 cycles=[1, 2, 3, 4, 5] [ 0.8s] subject A ROI 'liver_dome': 197 points within 20.0mm [ 0.8s] subject A ROI 'liver_inferior': 252 points within 20.0mm [ 0.8s] subject A ROI 'liver_lateral': 230 points within 20.0mm [ 0.8s] subject B ROI 'liver_dome': 220 points within 20.0mm [ 0.8s] subject B ROI 'liver_inferior': 254 points within 20.0mm [ 0.8s] subject B ROI 'liver_lateral': 233 points within 20.0mm [ 0.8s] total folds (leave-one-cycle-out): 9 [ 0.8s] === PASS 1: spacing selection sweep (default K/sigma/alpha) === [ 1.0s] fold A/cyc1 done [ 1.1s] fold A/cyc2 done [ 1.3s] fold A/cyc3 done [ 1.5s] fold A/cyc4 done [ 1.6s] fold B/cyc1 done [ 1.8s] fold B/cyc2 done [ 2.0s] fold B/cyc3 done [ 2.2s] fold B/cyc4 done [ 2.4s] fold B/cyc5 done [ 2.4s] parallel-2sag spacing sweep pooled RMSE(mm): d=10:0.759, d=20:0.748, d=30:0.735, d=50:0.719 -> best d=50 [ 2.4s] parallel-2cor spacing sweep pooled RMSE(mm): d=10:0.744, d=20:0.738, d=30:0.733, d=50:0.726 -> best d=50 [ 2.4s] === PASS 2: canonical 5 arms, full metrics, 3 seeds x 9 folds === [ 2.7s] fold A/cyc1 full-metrics done [ 2.8s] fold A/cyc2 full-metrics done [ 3.0s] fold A/cyc3 full-metrics done [ 3.2s] fold A/cyc4 full-metrics done [ 3.3s] fold B/cyc1 full-metrics done [ 3.5s] fold B/cyc2 full-metrics done [ 3.6s] fold B/cyc3 full-metrics done [ 3.6s] fold B/cyc4 full-metrics done [ 3.8s] fold B/cyc5 full-metrics done [ 3.9s] saved run_raw.pkl, done with core computation. === step 2/2: analyze.py (results.json + figs) === === PREDICTION TEST (27 paired fold x seed samples) === orthogonal dvf_rmse3d_mm per-sample mean=0.6465 parallel-2sag(best d=50) mean=0.6373 delta (parallel - orthogonal), positive=orthogonal better: mean=-0.0092mm (-1.09% rel) sign test: 11/27 samples favor orthogonal (threshold <=19 for 'no strong pos direction') paired bootstrap 95% CI on mean delta: [-0.0168, -0.0030] rmse_lr_mm: parallel-2sag=0.5648 orthogonal=0.5792 ratio=0.975 (need >=1.5 for mechanism) LR squared-error share of orthogonal arm total: 61.93% (need <15%) cond_a(orth clearly better)=False cond_b(parallel reverses)=False cond_c(LR ratio<1.5, mechanism wrong)=True => prediction_outcome = refuted wrote results.json done: figs/arms_rmse3d.png, figs/paired_diff_27.png, figs/axis_breakdown.png, figs/spacing_sweep.png done. results.json + figs/*.png written.