second review round: tempered claims, robust statistics, corrected technical statements

Analyses (figures/stats_llm_epistasis.py, committed + reproducible):
condition-clustered bootstrap CIs (functional measures exclude zero:
dis_raw [+0.04,+0.69], conf-weighted [+0.02,+0.68]; gradient alignment
[-0.59,-0.06]; geometry straddles zero), PAIRED predictor contrasts (not
individually significant — stated), leave-one-condition-out held-out
prediction (functional replicates, geometry ~0, performance baseline
unstable), three outcome references (ordering sensitive to reference —
reported, with the mechanism), between/within-axis decomposition
(within-conflict identification impossible by design; the compat axis
identifies), and seed-level paired reliability (routing/directed beat
soup 3/3 seeds incl. one catastrophic soup failure; CI-width fragility
claim withdrawn).

Renames and corrections: "decisive experiment" -> "controlled predictive
test"; "operational epistasis" -> "confidence-weighted functional
conflict (proposed proxy)"; "functional by construction" -> "controls a
major source of coordinate mismatch / conflict-associated" (module,
configs, READMEs, figures); SI proposition's "chord" defined precisely
(endpoint-loss interpolation, invariant) vs the path (not invariant) +
no-global-optimality caveat (removable = lower bound, residual = upper);
snowball count != performance cliff distinction added; claims table
gains four rows (grid finding / weighting NOT supported / functional-vs-
all-geometry not established / operator choice open); §1 ladder states
the prediction rung as a bounded small-model result.

paper/response-to-review-2.md: point-by-point, opening with the
bookkeeping correction (E13b/c were in the reviewed draft — revised
interpretation, not new results). READMEs rewritten around the four
analyses with the chronology (prospective/adaptive/post-hoc) disclosed.
151 tests green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BkRLcc18rwT2Lysu6PbG7v
This commit is contained in:
Giorgio Gilestro 2026-09-06 17:55:46 +01:00
parent 1ae950cb7c
commit a40ace1821
17 changed files with 418 additions and 95 deletions

View file

@ -1,8 +1,9 @@
"""The decisive-experiment figure — does pre-merge epistasis predict merge failure?
"""The controlled predictive test — does a pre-merge functional-conflict measure predict merge damage?
(A) The theory's predictor: operational epistasis (confidence-weighted bilateral disagreement,
measured before merging) against the merge penalty (parent potential merged achieved, the
hybrid-load analogue). Conflict-axis pairs in red, duration-axis pairs in blue.
(A) The framework-motivated predictor: confidence-weighted functional conflict (bilateral confident
disagreement, measured before merging a proposed proxy for merge-relevant interactions, not a
measured epistasis) against the merge penalty (oracle parent potential merged achieved; ordering is
sensitive to the outcome reference see stats_llm_epistasis.py).
(B) The geometry predictor on the same outcome: weight divergence (LoRA-delta L2) the
matched-divergence contrast: the duration axis spans large weight divergence at ~zero penalty, while
@ -27,7 +28,7 @@ from scipy.stats import spearmanr
sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig # noqa: E402
PREDICTORS = [("epi_conf", "operational\nepistasis"),
PREDICTORS = [("epi_conf", "conf-weighted\nfunctional conflict"),
("dis_raw", "raw\ndisagreement"),
("grad_cos", "gradient\nalignment"),
("delta_cos", "delta\ncosine"),
@ -59,8 +60,8 @@ def main() -> None:
pass
fig, axes = plt.subplots(1, 3, figsize=(16.5, 4.9))
_scatter(axes[0], df, "epi_conf", "operational epistasis (pre-merge)",
"(A) the theory's predictor")
_scatter(axes[0], df, "epi_conf", "confidence-weighted functional conflict (pre-merge)",
"(A) the framework-motivated predictor")
_scatter(axes[1], df, "delta_cos", "LoRA-delta cosine similarity (pre-merge)",
"(B) the geometry predictor — does it detect\nincompatibility, or just task overlap?")
@ -77,8 +78,9 @@ def main() -> None:
ax.set(ylabel="|Spearman ρ| vs merge penalty", ylim=(0, 1),
title="(C) predictor league table (pre-merge only)")
fig.suptitle("Predicting merge failure BEFORE merging: functional conflict, not weight divergence "
"(conflict, overlap-without-conflict, and divergence decorrelated by construction; 3 seeds)", y=1.03, fontsize=12)
fig.suptitle("A controlled predictive test: across this task grid, pre-merge functional disagreement "
"predicted merge penalties; the selected weight-geometry baselines did not "
"(three axes decorrelated by construction; 13 conditions x 3 seeds)", y=1.03, fontsize=11.5)
fig.tight_layout()
savefig(fig, "results/llm_epistasis", "llm_epistasis")