docs: README/figs name the current arm routeV, not the dropped route2

The cleanup removed the v1 route and route2 arms (Config is now
none|erase|routeV) but left README calling the live arm route2 with its
old binary-tau gate description. Rename to routeV, describe the banded
cosine gate (per-rollout/per-token, per-token best), and fix the deploy
line (held-out test n=119 knob-off, not n=64). figs.py keeps the
route2/routing2 display map for historical run artifacts.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
This commit is contained in:
wassname
2026-06-09 13:39:15 +00:00
parent b53043cec3
commit 61d3819dae
2 changed files with 13 additions and 6 deletions
+12 -5
View File
@@ -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
+1 -1
View File
@@ -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.