diff --git a/README.md b/README.md index 4021220..018b52c 100644 --- a/README.md +++ b/README.md @@ -75,13 +75,20 @@ Three active arms, identical model and teacher pool, differing only in the gradi - **vanilla** -- no intervention; the emergence reference. - **erase** -- subtract the v_hack component from the live `delta_S` gradient (one-sided). -- **route2** -- current routing arm. Per-rollout gate `cos(g_rollout, v_grad) > tau` (tau calibrated each step from the hack-vs-clean cosine gap) decides whether a rollout's whole gradient routes into a scale-matched, distinct-basis `delta_S_hack`. An exploration floor (`rollout_ablate_frac`) generates a fraction of rollouts knob-off so the deployed knob always sees solve signal even if the full policy saturates on hacking. +- **routeV** -- current routing arm. A banded cosine gate `cos(g, v_grad) ∈ band` (band + calibrated from the hack-vs-clean cosine gap, either from the pairs or a live rolling + quantile) decides how much of a gradient routes into a scale-matched, distinct-basis + `delta_S_hack`. The gate runs per-rollout or per-token (`routeV_gate`); per-token is the + current best. An exploration floor (`rollout_ablate_frac`) generates a fraction of + rollouts knob-off so the deployed knob always sees solve signal even if the full policy + saturates on hacking. -Deploy hack/solve is measured the same way for every arm now: knob-off forward -(`ablate_quarantine` for route2, the trained model itself for vanilla/erase), -n=64 prompts*group, sampled at T=0.7. So the per-arm deploy numbers are apples-to-apples. +Deploy hack/solve is measured the same way for every arm: knob-off forward +(`ablate_quarantine` for routeV, the trained model itself for vanilla/erase) on the +held-out test set (n=119), sampled at T=0.7. So the per-arm deploy numbers are +apples-to-apples. -The frozen-vs-refresh distinction is orthogonal: erase and route2 can re-extract +The frozen-vs-refresh distinction is orthogonal: erase and routeV can re-extract their pair-derived direction every N steps on the current adapter. ## Quick start diff --git a/src/vgrout/figs.py b/src/vgrout/figs.py index 3cb5e97..048efe4 100644 --- a/src/vgrout/figs.py +++ b/src/vgrout/figs.py @@ -17,7 +17,7 @@ from pathlib import Path FIGS_DIR = Path("docs/figs") # Reader-facing arm names. Code/log tags carry our internal vocabulary -# (route2 = the current routing arm; "knob" = the delta_S adapter); plots must +# (routeV = the current routing arm; "knob" = the delta_S adapter); plots must # not. Map every internal tag to the word a paper reader sees. Anything missing # falls through to its raw tag, so a new arm shows up loud rather than silently # mislabelled.