Skip to content

Backbone noise-level axis for score and every driver family (replaces the score refusal, #2509/#2517) - #214

Merged
maraxen merged 5 commits into
mainfrom
fix/261011-score-backbone-noise
Oct 12, 2026
Merged

maraxen merged 5 commits into
mainfrom
fix/261011-score-backbone-noise

Conversation

@maraxen

@maraxen maraxen commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

What changed

This PR originally refused nonzero backbone_noise on plain score (debt #2509). Per direction ("we need to have a noise-level axis available for both design and score"), it now applies every noise level instead. Spec: .praxia/docs/specs/261011_noise-level-axis.md.

Stock family (runner.score)

  • Every level in spec.backbone_noise is applied on the encode-once and fused multi-state paths. None is silently dropped any more.
  • Shape:
    • exactly one level → (S, C), as before;
    • two or more → (S, C, D), candidates before noise, mirroring sample's (S, N, D, T, L);
    • fused multi-state → (1, C) / (1, C, D);
    • logits gain the same axis.
  • Key: noise is drawn from design's per-structure key, fold_in(_base_sampling_key(spec), structure_idx). Scoring a design's output at the same spec and seed therefore sees the identical noised backbone. Decoding-order keys are unchanged.
  • Results record noise_levels. SCORING_SCHEMA_VERSION → scoring_v2. agent/shaping.py emits noise_index.
  • The averaged path (average_node_features) still fuses the levels. Its R3 check is hoisted out of the vmap, so D≥2 no longer raises TracerBoolConversionError (#2517).

Driver families

  • pottsmpnn, lasermpnn and protonpottsmpnn take every level. Before, they read only the first level (Potts, LASEr) or ignored noise entirely (ProtonPotts).
  • One draw is shared across levels and scaled by each level, so a single-level run is bit-identical to before.
  • D≥2 adds D_noise after the candidate/sample axis. Potts sample_rank ranks per level.
  • ProtonPotts gains backbone noise (apply_potts_backbone_noise, key fold 0x7070).
  • Refused at D≥2, because no honest per-level array exists: ProtonPotts pH design, LASEr proofread, Potts emit_etab.

Out of scope

Browser pages have no backbone noise yet, and noise there can only be graded distributionally against Python. The multi-state PoE campaign path is also out of scope.

Verification (titanix, aminx-sprint-git venv, JAX_PLATFORMS=cpu)

  • New tests: 19 passed, plus 6 slow, weights-needing ones (see below).
  • Regression (tests/agent tests/scoring tests/knob_semantics tests/families tests/protonpotts tests/host, filtered to score/noise/family): 717 passed, 20 skipped, 0 failed at 1df1580.
  • Slow score tests at ca90d70: 10/10 passed, covering:
    • the encoder output of sample and score matches at the same seed;
    • the (S, C, D) slice equals a single-level run;
    • nonzero noise changes every score (the control against the old silent drop);
    • seed determinism;
    • fused (1, C, D);
    • averaged D=2;
    • the existing fused-multistate tests.
  • The first slow run failed one test on a fixture bug: state_position_map width 76 vs max_length 128. It was fixed in ca90d70.

Ledger

host/runner.py, scoring/score.py and the family drivers are in every row's closure, so all 9 ledger rows go stale on merge. One re-wave (AMINX_WAVE_REF=<branch> bash -l scripts/redsox/launch_wave.sh 4) after #212 and this PR, ledger last.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SGHJhq24fYihaMivnXNhro

maraxen and others added 5 commits October 10, 2026 20:22
…509)

The plain per-structure and fused multi-state score paths never forwarded
backbone_noise to the scorer, so runner.score returned noise-free scores for a
spec that asked for noise, with no warning. Only the averaged-feature path
applies it. Refuse with a ValueError that names average_node_features as the
fix, rather than invent a noise-level axis the plain result schema lacks.

Tests: nonzero noise is refused before model load; a multi-level sweep is
refused; backbone_noise=0 matches the default spec (weights-gated).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SGHJhq24fYihaMivnXNhro
…h has no wheel -- main fails the same way)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014bjCGQZgFEE6nR8cGTMFt7
#214 refusal; spec 261011_noise-level-axis)

Stock score: every backbone_noise level is applied with design's per-structure key
fold_in(_base_sampling_key(spec), structure_idx); encode once per (structure, level).
One level -> (S, C) as before; two or more -> (S, C, D) (fused multistate (1, C, D)).
noise_levels recorded in results and metadata; SCORING_SCHEMA_VERSION -> scoring_v2;
shaping emits noise_index. Averaged path keeps fusing levels; its R3 check is hoisted
out of the vmap so D>=2 no longer raises TracerBoolConversionError (#2517).

Driver families (N-D5): pottsmpnn, lasermpnn and protonpottsmpnn take every level with one
shared draw (level not folded into the key), so single-level runs are bit-identical. D>=2
adds D_noise after the candidate/sample axis; sample_rank ranks per level. ProtonPotts gets
backbone noise for the first time (apply_potts_backbone_noise, fold 0x7070). Refused at D>=2
where no honest axis exists: ProtonPotts pH design, LASEr proofread, Potts emit_etab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SGHJhq24fYihaMivnXNhro
…tate_position_map is (S, L) against max_length)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SGHJhq24fYihaMivnXNhro
@maraxen maraxen changed the title score: refuse nonzero backbone_noise on the plain path instead of ignoring it (#2509) Backbone noise-level axis for score and every driver family (replaces the score refusal, #2509/#2517) Oct 12, 2026
@maraxen
maraxen merged commit 10d1647 into main Oct 12, 2026
2 checks passed
@maraxen
maraxen deleted the fix/261011-score-backbone-noise branch October 12, 2026 13:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant