summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/campaign/CASCADE_ABLATION_PLAN.md41
-rw-r--r--ep_run/casc_eq_train.py9
2 files changed, 47 insertions, 3 deletions
diff --git a/docs/campaign/CASCADE_ABLATION_PLAN.md b/docs/campaign/CASCADE_ABLATION_PLAN.md
index 90985cb..9de77a0 100644
--- a/docs/campaign/CASCADE_ABLATION_PLAN.md
+++ b/docs/campaign/CASCADE_ABLATION_PLAN.md
@@ -568,6 +568,47 @@ direction), not training-under-fault; wave-2 = co-training with faults injected
+### RESULT 44 (2026-07-18): GAP-SOURCE LOCALIZATION — the residual EP gap lives in the TOP-half blocks, split ~evenly attn/ffn; bottom-half EP grads are loss-equivalent to BP.
+bpmix 5-arm, all from cent s200000 through the 215k endgame frame (shared frame; internal A/B
+only, absolutes not comparable to crown lineage). BP reference (allbp) 3.4020; all-EP 3.4245
+-> window gap 0.0225. Swapping module groups to TRUE BP grads:
+ mixbot (blocks 0-5) 3.4244 -> recovers ~0% of the gap
+ mixtop (blocks 6-11) 3.4071 -> recovers 77%
+ mixattn (attn, all) 3.4152 -> recovers 41%
+ mixffn (ffn, all) 3.4161 -> recovers 37% (41+37 ~= 77+0: additive decomposition holds)
+Reading: bottom-half EP fidelity is a SOLVED problem at this scale (exact-BP substitution buys
+nothing); the entire residual gap concentrates in blocks 6-11, attn and ffn about equally.
+Tension with RESULT 25 (transmission bias compounds toward the bottom): bottom grads may be worse
+in cosine yet loss-irrelevant in this window — update magnitude/role concentrates near the head.
+HW consequence: fidelity budget (quant/noise/beta) should be weighted toward the top half.
+
+### RESULT 43 (2026-07-18): CROWN-3 CAUSE OF DEATH = CEILING CROSSED, THEN THE CAP'S HARD BOTTOM HELD BETA ABOVE THE COLLAPSED CEILING FOR 18k STEPS (disguised wall-2, user's read). Estimator-toxicity story DEMOTED; endgame A/B is a TIE.
+Endgame A/B (from cent s200000, 15k steps): end_plain 3.4245 vs end_cent 3.4244 — dead tie,
+both healthy (gn 0.147 / drift 0.009 / 0 skips; plain: one -12% cap graze @213.9k, instant
+recovery). Estimator CE-equivalence now 3-way replicated (42M tail, 72M mid-tail, 72M endgame);
+single-sided is NOT locally toxic on a healthy state. "不是plain不行" (user) confirmed.
+Death timeline (simple-bounds-first per user): first cap bite @196k with ALL health metrics
+normal — leads every symptom by 8k+ steps (gn 204k, cos-negative 217k, drift 216k, skips 225k).
+Cap wrestles floor 196-204k (best 3.3728@203.7k set DURING the fight), then pins at the HARD
+BOTTOM 0.05*beta = 1.5e-4 from ~216k with rho^>0.9 & res>0.02 continuously (v2 absolute-gate =
+bites genuine). rho^ is a per-sweep residual contraction ratio — a WEIGHT-STATE property beta
+cannot restore — so the governor had no lever and sat pinned ABOVE the true ceiling. Zero
+r-skips until 225k: the relax never overtly diverged; death by sustained sub-ceiling-less
+operation + SNR starvation, not explosion.
+Controls: cent late-phase (150k-234k): ONE graze (221.8k). end_plain (plain est, cent state):
+one graze in 15k. => ceiling collapse is a plain-LINEAGE-STATE property. sigma nearly equal at
+200k (467.7 vs 463.0) => the lineage difference lives in block contraction ||J||, not W_out.
+RESULT 42's "bias->sharpening positive feedback" narrative DEMOTED (user's evidentiary bar: no
+direct literature for invisible-accumulation stories). Canonical citation that DOES cover
+one-sided-fails/symmetric-rescues: Laborieux et al. 2021 (O(beta) estimator bias, deep-net
+failure, +-beta symmetric fix = our centered).
+ACTION: --cap_floor flag added (default 0.05 = legacy; 0 = pure ceiling-tracking, three hard
+bottoms released). fw72m_plain_nf IN FLIGHT: resume plain s190000 (last healthy ckpt), cap_floor
+0, exact crown-3 mirror, replay the 190k->234k death window. Survive => hard bottom was the
+killer, plain viable at 1.0x (crown-3b = plain+no-floor). Beta free-fall + skip-storm stall
+(weights preserved, fail-stop) => corridor truly closed => centered is the fix. R42's
+est_late-flip candidate is MOOT either way (endgame estimator doesn't matter — tie).
+
### RESULT 42 (2026-07-18): CROWN-3 VOIDED (user call) — slow-burn endgame instability the guards accepted; the SINGLE-SIDED estimator emerges as the common factor in both 72M deaths.
User caught what skip-counting missed: gn rising / cos falling / CE rising from ~200k, spike at
231.7k, partial recovery — RESULT 41's "zero guard events = healthy" reading RETRACTED.
diff --git a/ep_run/casc_eq_train.py b/ep_run/casc_eq_train.py
index fb9dca5..cca37b5 100644
--- a/ep_run/casc_eq_train.py
+++ b/ep_run/casc_eq_train.py
@@ -68,6 +68,9 @@ ap.add_argument('--drift_adapt', type=float, default=0.0) # >0: adaptive drift
ap.add_argument('--beta_cap_rho', type=float, default=0.0) # >0: LOOP-GAIN CAP on beta — if per-sweep residual
# ratio rho^ exceeds this, bscale *= 0.8 (beta backs off
# under the wall-2 ceiling); recovers x1.02 when rho^ low
+ap.add_argument('--cap_floor', type=float, default=0.05) # hard bottom of the rho-cap; 0 = pure ceiling-tracking
+ # (cap follows the measured ceiling all the way down; a
+ # pinned bottom above the true ceiling = disguised wall-2)
ap.add_argument('--relax_tol', type=float, default=0.0) # >0: ADAPTIVE relax — sweep until rel. state change < tol
# (or --kmax), geta backtracks x0.6 on residual GROWTH (rho>=1
# signal), then one final graphed round. 0 = legacy fixed-K.
@@ -445,7 +448,7 @@ def ep_step(x, y):
# EFFECTIVE beta is continuous across any floor change (the 0.09-at-20k bug, RESULT 37)
pf = GOV.get('prev_floor')
if pf is not None and fl != pf and pf > 0 and fl > 0:
- GOV['cap'] = min(max(GOV.get('cap', 1.0) * pf / fl, 0.05), args.beta_ride)
+ GOV['cap'] = min(max(GOV.get('cap', 1.0) * pf / fl, args.cap_floor), args.beta_ride)
GOV['prev_floor'] = fl
beta_t = beta_t * GOV.get('cap', 1.0) # wall-2 loop-gain cap OVERRIDES the floor (the ceiling
# can sit below the floor near the wall; survival first)
@@ -504,7 +507,7 @@ def ep_step(x, y):
if _legal(gdrift):
ok_retry = True
if args.beta_ride > 1.0: # the failed trial IS the ceiling measurement
- GOV['cap'] = max(GOV.get('cap', 1.0) * 0.5 ** (_h + 1), 0.05)
+ GOV['cap'] = max(GOV.get('cap', 1.0) * 0.5 ** (_h + 1), args.cap_floor)
break
if ok_retry:
pass
@@ -534,7 +537,7 @@ def ep_step(x, y):
rho_use = GOV['rho_ema'] = 0.9 * GOV.get('rho_ema', rho_g) + 0.1 * rho_g
GOV['cool'] = max(GOV.get('cool', 0) - 1, 0)
if res_g > 0.02 and rho_use > args.beta_cap_rho:
- GOV['cap'] = max(GOV.get('cap', 1.0) * 0.85, 0.05) # attack (gentler than v1)
+ GOV['cap'] = max(GOV.get('cap', 1.0) * 0.85, args.cap_floor) # attack (gentler than v1)
if args.ride_cool > 0: GOV['cool'] = args.ride_cool # ride-v2(c), opt-in
elif (res_g < 0.01 or rho_use < 0.5 * args.beta_cap_rho) and GOV['cool'] == 0:
# recover; with beta_ride > 1 the governor CLIMBS past the schedule — beta finds