# Traceability matrix — principal inferential claims → script → output → automatic check

Each row maps a manuscript claim to the script that computes it, the pipeline output
file that stores it, and the check in `04_verify_manuscript.py` that asserts it.
Running `bash run_all.sh` regenerates all outputs and runs 170 pre-specified checks
covering the principal inferential claims of the abstract, results, and tables
(all passing, exit 0). Descriptive values in Table 2 and the D/W sensitivity are
regenerated by the scripts but not all individually asserted; the checks target the
claims the conclusions rest on.

| Manuscript claim | Script | Output | Automatic check |
|---|---|---|---|
| Component A raw contrast (Road 1.025, Ahu 1.132, t=3.18, p=0.002, d=0.55) | 01_component_A.py | component_A.json | A road_mean / ahu_mean / welch_t / p / d |
| Scale validity: logL p=0.118, interaction p=0.261, stage −0.102 p=0.006 | 05_component_A_specificity.py | component_A_specificity.json | scale logL_p / interaction_p / stage_coef |
| Part×Stage interaction (centered, at mean size) −0.103 p=0.008 | 05 | component_A_specificity.json | PartxStage interaction_coef/p (centered) |
| Direct base width A2 (size-adjusted) −0.037 p=0.33 | 05 | component_A_specificity.json | A2 base_direct effect/p/n_road |
| D/W proxy (n=28, r=0.065, p=0.744, CV, Levene, Kruskal) | 10 | dw_proxy.json | D/W checks (verifier 04) |
| Within-part: base p=0.928, shoulder p=0.032 | 05 | component_A_specificity.json | within base p / within shoulder p |
| Background 3 baselines: base d −0.17/−0.19/−0.35 | 05 | component_A_specificity.json | bg base_pooled/base_ahu/base_leave1ctx d |
| Background 3 baselines: shoulder d −0.47/−0.56/−1.00 | 05 | component_A_specificity.json | bg shoulder_pooled/ahu/leave1ctx d |
| Negative controls: diff −0.02, bootstrap CI [−0.36,+0.30] | 05 | component_A_specificity.json | negctrl diff / ci_lo / ci_hi |
| Candidate/control means 0.378 / 0.397 | 05 | component_A_specificity.json | negctrl cand_mean / ctrl_mean |
| Partition sensitivity (5 partitions, −0.20 to +0.16) | 05 | component_A_specificity.json | partition ×5 |
| Robustness: OLS −0.102, Huber −0.118, no-infl −0.123 (9), quad −0.086 | 05 | component_A_specificity.json | robust ols/huber/no_influential/quadratic |
| Group coding 6 vs 7 p=0.90; jackknife pmax=0.003 | 05 | component_A_specificity.json | coding 6_vs_7 p / jackknife pmax |
| Residual variance: Levene base 0.184, shoulder 0.115 | 05 | component_A_specificity.json | levene base / shoulder |
| Component B bounds: ROAD [8.1,71.0], AHU [11.0,88.6], QUARRY [0.8,98.6], overlap | 02_bounds_and_control.py | bounds_control.json | B ROAD/AHU/QUARRY lo/hi, B overlap |
| Eye control bounds: QUARRY hi 25.4, AHU lo 41.8, disjoint | 02 | bounds_control.json | EYE QUARRY hi / AHU lo / disjoint |
| Fisher D_Shaped p=0.02, OR=0.288 | 03_fisher_contingency.py | fisher.json | Fisher D_Shaped p / OR |
| Observability by stage: 1.6/22.7/54.8/39.1% | 06_observability_rescue.py | observability_rescue.json | obs bedrock/detached/road/ahu pct |
| Bedrock→detached Fisher p=5.4e-7 | 06 | observability_rescue.json | bedrock-detached Fisher p<1e-6 |
| All five base fields individually reproduce the jump | 06 | observability_rescue.json | per-field all reproduce |
| Rescue frontier: 38 of 39 | 06 | observability_rescue.json | rescue_k / rescue_of |
| Detached D-shaped: 3 objects; quarry and nearest-road distances regenerated; spatial ambiguity assessed contextually in the manuscript | 07_detached_and_C.py | detached_and_C.json | detached count; RR-distance ×3 |
| Component C base angle: n=34, mean 9.5°, range 5.2–15.0° (road only, state S3) | 07_detached_and_C.py | detached_and_C.json | C n / mean_deg / min_deg / max_deg |
| Raw contrast n and SD (road n=47 SD 0.155; ahu n=76 SD 0.216; diff 0.107) | 01_component_A.py | component_A.json | A road_n / ahu_n / road_sd / ahu_sd / diff |
| Fisher rows (front-contracting, back-expanding, forward-lean) present | 03_fisher_contingency.py | fisher.json | Fisher ×3 present |
| Figures regenerated to expected dimensions (5 figs) | 08_make_figures.py | fig_*.png/.pdf | fig ×5 regenerated |
| All five figures regenerated from JSON | 08_make_figures.py | fig_*.png | (dimensions printed; regenerated in-run) |

| Trait availability by context, all eight traits, with Fisher tests (max road–platform gap 26.2 pp) | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | avail max gap pp / neck & forehead & base road_pct & ahu_pct / neck fisher p |
| Candidate−control specificity contrast as Hedges' g with exact small-sample correction (point estimate on full data, g = −0.200; Cohen's d = −0.204) | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | base-only hedges g |
| Specificity contrast bootstrapped by object, by site, stratified by context, and by (site, context) cell within context — all four intervals cover zero | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | object_level / site_clustered / context_stratified / site_context_cell_stratified CI covers 0 |
| P(base > controls) does not rise under site clustering (0.102 → 0.077) | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | P_gt_0 falls under site clustering |
| Equal-weight-per-site contrast remains negative (−0.333); base ranks below every facial control | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | equal-weight-site contrast negative |
| Four mixed sites identified (02-209, 06-002, 07-575, 08-002); excluding them (20 of 144 objects) leaves the contrast at −0.223 | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | mixed-site exclusion point / bootstrap |
| Complete-case limit: only 12 statues carry all eight traits (5 road, 7 platform, 9 sites) — reported, not used as the primary test | 12_specificity_site_sensitivity.py | specificity_site_sensitivity.json | common-set n |
| A1 ratio contrast weakens under equal-site weighting (object p = 0.009; site-clustered p = 0.023; equal-site p = 0.135, MWU 0.065) | 11_site_clustered.py | site_clustered.json | ratio object welch p / ratio equal-weight site p / mwu |
| A2 direct base width unaffected by weighting (object p = 0.32; equal-site p = 0.78) | 11_site_clustered.py | site_clustered.json | base object welch p / base equal-weight site p |

| Observability by stage and field class (basal 12.3%/39.0%; matched controls 48.2%/48.7% at detached/road) | 13_observability_negative_control.py | observability_negative_control.json | detached & road basal pct / matched pct |
| Negative control, detached to road: DiD +26.23 pp, CI excludes zero, 0 of 2000 replicates non-positive | 13_observability_negative_control.py | observability_negative_control.json | primary DiD / CI excludes 0 / replicates non-positive |
| Bedrock to detached DiD is negative: first transition is not basal-specific | 13_observability_negative_control.py | observability_negative_control.json | bedrock->detached DiD negative |
| Broad-control DiD +39.02 pp; complete enumeration of all 118,755 five-field control subsets returns no non-positive case | 13_observability_negative_control.py | observability_negative_control.json | broad DiD / enumeration universe / all positive / min positive |
| Stage x field-class interaction, statue-clustered, p < 1e-4 | 13_observability_negative_control.py | observability_negative_control.json | interaction p |

| Prospective rescue targets: the 39 road records lacking BASAL_SURFACE_OUTLINE, all with coordinates, no priority ranking imposed | 14_prospective_and_identity.py | prospective_and_identity.json | rescue targets listed / coordinates / no ranking |
| Unit-identity sensitivity: collapsing the flagged probable duplicate leaves the road-platform overlap intact; frontier moves 38 of 39 to 37 of 38 | 14_prospective_and_identity.py | prospective_and_identity.json | as-recorded & collapsed frontier / overlap holds / collapsed N |
| Adversarial coding margin of the eye-socket control: global minimum 60 recoded observed labels, 3 minimal configurations, by exact enumeration | 14_prospective_and_identity.py | prospective_and_identity.json | adversarial minimum / minimal configurations / grid enumerated |

Total automatic checks: 170 automated consistency and integrity checks covering the principal reported
values and the generated outputs. Command: `bash run_all.sh` (exit 0 = all pass).
Vector PDF versions of all five figures are emitted alongside the PNGs.
