Skip to content

DSL Diffusion SLM Research Program — Wave 1 foundations (E3 lineage, A1 emptiness probe)#259

Merged
Tyler-R-Kendrick merged 15 commits into
mainfrom
claude/dsl-diffusion-slm-autoresearch-dg16mx
Jul 17, 2026
Merged

DSL Diffusion SLM Research Program — Wave 1 foundations (E3 lineage, A1 emptiness probe)#259
Tyler-R-Kendrick merged 15 commits into
mainfrom
claude/dsl-diffusion-slm-autoresearch-dg16mx

Conversation

@Tyler-R-Kendrick

Copy link
Copy Markdown
Owner

Implements the first items of the DSL Diffusion SLM Research Program (Linear project DSL Diffusion SLM Research Program, team slm-training). Work continues on this branch/PR across the program's waves; this is the running PR.

Context

The program builds DSL-specific diffusion SLMs (OpenUI first, then GraphQL, a design-patterns DSL, and expert nomenclatures) inside the existing autoresearch loop. The binding constraint from docs/MODEL_CARD.md (E224–E236) is that syntax validity is solved (parse-syntax 1.0) but meaningful parse ≈ 0 — models emit valid-but-empty layouts. Wave 1 lays the measurement/diagnosis foundation before any representation or decode changes.

Changes so far

E3 — Research-lineage intake (SLM-33) — commit 9d46032

  • New committed manifest src/slm_training/resources/autoresearch/dsl-program-sources.json: 24 prior-art sources (all tagged Adjacent), loadable via scripts/autoresearch.py --source-manifest, feeding the hypothesizer's EvidenceSnapshot.
  • docs/design/research-lineage.md gains a "DSL diffusion research program (Tracks A–G)" section with cluster boundaries, engaged negative results, and explicit novelty positioning.
  • Regression test enforces manifest size, Adjacent tags, and zero URI overlap with the earlier committed manifests.

A1 — Emptiness probe (SLM-20) — commit 6924a2a

  • src/slm_training/evals/emptiness_probe.py: scores the model's fully-masked reconstruction NLL of the gold populated program vs a deterministic minimal-valid program, decomposing empty-preference into total NLL (length-bias-exposed — what a score-ranking constrained decoder compares) and per-token NLL (length-controlled). Verdict separates length_bias_constraint_distortion (decode-time fix) from content_modeling_failure (representation/training).
  • scripts/probe_emptiness.py CLI with an honest AgentV envelope (claim=diagnostic_not_ship).
  • Fixture-grade run over the committed playground_demo checkpoint documented in docs/design/iter-e248-emptiness-probe-20260716.{md,json}; MODEL_CARD history notes the diagnostic.

Verification

  • New unit tests green: manifest regression (tests/test_autoresearch/test_harness.py) and 4 emptiness-probe tests (tests/test_evals/test_emptiness_probe.py).
  • Changed-file suites via .githooks/check-changed: 161 passed, 1 skipped.
  • python -m scripts.repo_policy ok; git diff --check clean.

Honesty

All runs here are fixture/CPU-scratch — wiring evidence only, not ship claims. No ship gate is weakened and nothing is promoted. The real A1 verdict for the E224+ wall requires running the probe against the local frontier checkpoints (gitignored, absent from a fresh clone) on a GPU host.

🤖 Generated with Claude Code

https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA


Generated by Claude Code

claude added 2 commits July 16, 2026 20:05
24 new Adjacent-tagged sources for the Tracks A-G research program
(sketch-then-fill, macro/library induction, binding theory, negative
results on identifier anonymization and alpha-equivalence hashing,
diffusion adaptation baselines, reasoning baselines, self-improvement
loops) in resources/autoresearch/dsl-program-sources.json, loadable via
scripts/autoresearch.py --source-manifest. research-lineage.md gains a
program section with cluster boundaries and explicit novelty
positioning; regression test guards manifest size, tags, and
no-overlap with earlier manifests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
New evals/emptiness_probe.py scores the model's fully-masked reconstruction
NLL of the gold populated program vs a deterministic minimal-valid program,
decomposing empty-preference into total NLL (length-bias-exposed, what a
score-ranking constrained decoder compares) and per-token NLL (length-
controlled). Verdict separates decode-time length-bias/constraint-distortion
(fix in Track A) from content-modeling failure (Tracks B/C/D). CLI
scripts/probe_emptiness.py with honest AgentV envelope (diagnostic_not_ship).

Fixture-grade run over the committed playground_demo checkpoint documented in
docs/design/iter-e248-emptiness-probe-20260716.{md,json}; the real E224+
verdict requires the local frontier checkpoints (gitignored). MODEL_CARD
history notes the diagnostic. Four unit tests; full changed-file suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
@vercel

vercel Bot commented Jul 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
slm-training Ready Ready Preview, Comment Jul 17, 2026 12:51am

Request Review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@Tyler-R-Kendrick, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 24 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ce2292cf-a801-4a95-a984-98c91ac9cc2f

📥 Commits

Reviewing files that changed from the base of the PR and between aaca952 and 9677538.

📒 Files selected for processing (54)
  • .agents/skills/honest-ship-eval/SKILL.md
  • docs/MODEL_CARD.md
  • docs/design/adversarial-review.md
  • docs/design/design-patterns-dsl.md
  • docs/design/expert-nomenclature-packs.md
  • docs/design/iter-e240-e247-lattice-campaign-20260716.md
  • docs/design/iter-e248-emptiness-probe-20260716.json
  • docs/design/iter-e248-emptiness-probe-20260716.md
  • docs/design/iter-e249-semantic-bits-20260716.json
  • docs/design/iter-e249-semantic-bits-20260716.md
  • docs/design/iter-e250-min-content-decode-20260716.md
  • docs/design/iter-e251-coverage-remask-20260716.md
  • docs/design/iter-e252-canonicalizer-20260716.md
  • docs/design/iter-e253-forward-simplification-20260716.md
  • docs/design/iter-e255-e256-b4-ar-adaptation-20260716.md
  • docs/design/iter-e257-c1-relative-bind-20260716.md
  • docs/design/lattice-recursive-search.md
  • docs/design/quality-experiment-matrix.md
  • docs/design/quality-matrix-results-iter-v10-b4-20260716.json
  • docs/design/quality-matrix-results-iter-v10-b4-lr3e5-20260716.json
  • docs/design/quality-matrix-results-iter-v10-c1-20260716.json
  • docs/design/quality-matrix-results-iter-v9-lattice-20260716.json
  • docs/design/research-lineage.md
  • scripts/measure_semantic_bits.py
  • scripts/probe_emptiness.py
  • scripts/run_quality_matrix.py
  • src/slm_training/data/diffusion/simplify.py
  • src/slm_training/dsl/canonicalize.py
  • src/slm_training/dsl/grammar/fastpath/compiler_draft.py
  • src/slm_training/evals/canonical_match.py
  • src/slm_training/evals/emptiness_probe.py
  • src/slm_training/evals/semantic_bits.py
  • src/slm_training/harnesses/model_build/config.py
  • src/slm_training/harnesses/model_build/factory.py
  • src/slm_training/harnesses/model_build/ship_gates.py
  • src/slm_training/models/dsl_tokenizer.py
  • src/slm_training/models/hf_denoiser.py
  • src/slm_training/models/parallel_decode.py
  • src/slm_training/models/twotower.py
  • src/slm_training/resources/autoresearch/dsl-program-sources.json
  • tests/test_autoresearch/test_harness.py
  • tests/test_data/test_diffusion_simplify.py
  • tests/test_dsl/test_canonicalize.py
  • tests/test_evals/test_agentv.py
  • tests/test_evals/test_canonical_match.py
  • tests/test_evals/test_emptiness_probe.py
  • tests/test_evals/test_semantic_bits.py
  • tests/test_harnesses/model_build/test_a3_coverage_remask.py
  • tests/test_harnesses/model_build/test_dsl_tokenizer_relative.py
  • tests/test_harnesses/model_build/test_eval_gates.py
  • tests/test_models/test_compiler_decode.py
  • tests/test_models/test_hf_denoiser.py
  • tests/test_scripts/test_quality_matrix_v11.py
  • tests/test_scripts/test_quality_matrix_v9.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/dsl-diffusion-slm-autoresearch-dg16mx

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

claude added 2 commits July 16, 2026 21:06
Adds a per-suite component_type_recall floor to DEFAULT_SHIP_GATES so a
compression- or decode-driven change cannot green the gates with
shorter-but-emptier output on syntax alone: the trivial/empty program
recovers ~0 of the gold component types and now fails. Floors sit at or
below each suite's structural bar (density must be at least as present as
structure); the change only makes the policy stricter, never weaker. The
metric is surfaced in the gates 'actual' block for transparency. Gate
tables in adversarial-review.md and the honest-ship-eval skill updated in
lockstep. Three focused tests: floor present for every suite, valid+
structural+low-recall now fails, populated run still passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
New evals/semantic_bits.py measures a corpus's information content over
grammar choice points only, tokenizer-independently: corpus unigram
description length over the ProductionCodec choice stream vs the surface
lexeme stream, with bits_per_decision (empirical entropy) and a
params_per_bit(n) helper for the B3 capacity ladder. CLI
scripts/measure_semantic_bits.py.

On the committed eval corpus (n=19): externalizing the grammar cuts total
choice bits 1.88x (production 4.32 vs surface 5.40 bits/decision, 1.51x
fewer tokens) — the quantitative form of 'externalized grammar shrinks the
learning target'. Documented in
docs/design/iter-e249-semantic-bits-20260716.{md,json}. 7 unit tests.

Also completes the E2 semantic-density gate fixtures: two AgentV ship
tests construct a passing smoke suite and now supply component_type_recall
(a metric real scoreboards emit) so smoke still passes all bars; their
fail-closed intent is unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
Extends the compiler completion forest from proving legality to proving
minimum content: build_completion_forest gains a min_content gate at the
EOS-admission chokepoint so a grammatically complete but empty/underfull
layout is not a legal completion while the grammar still offers a way to
add content (guarded to never dead-end). Content is measured by
emitted_component_count via the tokenizer's compiler-derived component
symbol space (no AST parse / Node bridge).

New TwoTowerConfig.decode_min_content (0 off | >0 floor | -1 auto from
distinct slot-contract roots via _effective_min_content), threaded through
ModelBuildConfig and factory so any matrix row can set it. Recorded risk:
hard floors can force hallucinated components — A3 coverage-energy remask
is the softer sibling; the v9 E-row comparison measures which wins.

Tests: forest withholds/admits EOS by floor with no dead-end;
_effective_min_content auto/fixed/off; end-to-end config threading;
iter-e250 doc. test_compiler_decode + test_lattice_search green (38);
full changed-file suite 272 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
…grade)

Executes the previously plan-only V9 compiler-lattice campaign end-to-end
through scripts/run_quality_matrix.py on CPU with the honest five-suite
scoreboard and per-row AgentV publication.

New --eval-checkpoint flag: the V9 rows declare initialization=eval_only
(decode-policy comparison over identical checkpoint lineage), but the matrix
classifier silently reclassified them to parent/scratch, retraining a model
per row. The flag routes declared eval-only rows through one frozen
checkpoint; regression tests cover the declaration and the routing.

Campaign: E240 trained as the explicit scratch control (800 steps, fixture v1
corpus, 108 records); E241-E247 evaluated eval-only from E240's frozen
checkpoint. All rows fail honest gates (syntax/meaningful parse 0.0 from
placeholder-policy rejections - genuine fixture-scale capacity, bridge
verified). Diagnostics: triggered rows reproduce greedy byte-for-byte with
zero bottoms/rollbacks; always-on PTRM (E244) fires 1680 triggers at ~3x
latency and lowers structural similarity on every suite - selective over
always-on stochasticity at fixture scale.

Evidence: iter-e240-e247-lattice-campaign-20260716.md + merged campaign JSON;
V9 section of quality-experiment-matrix.md now carries measured results;
MODEL_CARD history row appended. Wiring evidence only - no ship claim; the
frontier-scale run on local E224+ checkpoints (GPU, rico_held 1500) stays open.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132PYCBHb1t1pjhDRzLrPov
claude added 3 commits July 16, 2026 21:49
Adds select_remask_coverage_indices (parallel_decode) mirroring the
CoRe instability policy but ranking by a per-position content-coverage
deficit, and wires it as remask_policy='coverage' in the TwoTower
MaskGIT remask dispatch. TwoTowerModel._coverage_deficit scores
non-content (filler) positions by 1 - content_fraction from the
tokenizer's compiler-derived component/sym/bind spaces, so a
content-sparse layout preferentially remasks filler for another decode
pass toward missing inventory content; dense rows and kind_ids-less
tokenizers degrade gracefully to confidence remasking. Soft sibling of
A4's hard min-content contract; no new config field, no extra forward.

Tests: pure-policy ranking/fallback/budget/BOS + model-level deficit
scoring (content 0, filler >0). Regression across v6/v7 remask +
compiler decode green (58); full changed-file suite 198 passed.
Doc iter-e251. No checkpoint/ship claim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
…atch

New dsl/canonicalize.py maps each layout equivalence class (binder
renaming, statement order, style literals) to one representative string
via a confluent production-codec round-trip (encode_openui ->
decode_productions): canonical statement order, De Bruijn-style binder
pool, style stripped, validated through the official parser, idempotent.
Honestly a normal-form canonicalizer, not an e-graph/equality-saturation
engine and not a semantic simplifier (no default elision / container
flattening). Documents the context-sensitive alpha-equivalence caveat
(2401.02948) for C3.

evals/canonical_match.py consumes it: canonical vs surface exact-match
with a canonicalization_rescued count, beside surface match, never a ship
gate. Feeds D1 (forward-process simplifier) and C3 (repeated-span
fingerprint).

9 tests (alpha-equivalence, idempotence, validation, rescue accounting);
full changed-file suite 240 passed. Doc iter-e252.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
New data/diffusion/simplify.py pre-canonicalizes ExampleRecord targets
(via the D2 canonicalizer) before the corruption pipeline tokenizes and
masks them, so every noised intermediate the denoiser sees is a noised
canonical tree — the reverse model learns one canonical form per layout
equivalence class instead of surface variation it should ignore. Reverse-
loop simplification would instead push mid-trajectory states off-
distribution. Never drops a record (unparseable targets pass through);
placeholders and all fields preserved. simplify_records reports
distinct_canonical_targets (the equivalence-class count = the cleaner
learning target).

Tests: canonical/valid/idempotent target, alpha-variants collapse to one
target, pass-through on unparseable, placeholder preservation, corpus
collapse stats. 5 tests; full changed-file suite 225 passed. Doc
iter-e253. Forward-vs-post-hoc X-row comparison is a GPU-host grammar-
matrix run, not claimed here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
Scopes the third DSL target (patterns/algorithms/data-structures) with
the oracle problem front-and-center: unlike OpenUI (parser+renderer) and
GraphQL (graphql-js+schema), a pattern DSL has no free validity oracle,
so 'correct' is a modeling decision made before any training. Recommends
shipping the first pack on a typed well-formedness oracle (reward labeled
well_formed_not_behavioral, analogous to OpenUI syntax!=meaningful), with
executable property tests as a documented gate upgrade. Maps the DSL into
the existing program machinery (typed-AST generation, placeholders, De
Bruijn scope, D2 canonicalizer, D1 forward simplification) and the F1 pack
contract. Design-only; no code, corpus, or ship claim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
Scopes the fourth DSL family (expert nomenclatures / ontologies) and the
pack-contract variant it needs: unlike the CFG packs, a nomenclature is a
flat 10^4-10^6 concept graph whose validity oracle is an ontology-
consistency check, not a parser, and whose constrained decode is a
graph-walk (mask to concepts reachable by a legal relation edge), not a
DFA. Frames it as the strongest test of schema-as-symbol-table (F2) and
dynamic pseudo-embeddings (C2), with a small openly-licensed pilot
ontology first (not SNOMED) so the fixture loop runs on CPU. Design-only;
no ontology, code, or ship claim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015M3mERHzsfxy561zTeJfNA
claude added 2 commits July 16, 2026 23:01
New models/hf_denoiser.py adapts the pretrained SmolLM2-135M causal LM into
the denoiser tower (denoiser_backend=hf): full bidirectional visibility via
an explicit 4D attention mask (only DiffuLLaMA's drop-the-causal-mask move;
no annealing/shift/training recipe), fresh OpenUI-vocab embeddings with
weight-tied lm_head, and context-tower hiddens prepended as projected prefix
states. Implements the exact DenoiserTower interface so training, every
decode path, and checkpoint round-trips work unchanged.

V10 matrix rows: matched pair differing only in denoiser_backend - E255
from-scratch control (1.1M) vs E256 adaptation (135M), parallel MaskGIT
decode on both. Fixture-grade run (200 CPU steps, fixture v1 corpus, honest
five-suite scoreboard + AgentV): both fail honest gates; the adaptation
trails the scratch control on every secondary signal (loss 8.51 vs 3.75),
and an lr=3e-5 probe converges even less (9.72), so the deficit is budget,
not just LR. B4 verdict stays OPEN - fixture scale can neither confirm nor
kill the from-scratch assumption; the decisive run needs GPU-scale
matched-compute arms with per-arm LR selection.

Tests: bidirectionality, encode/project candidate equivalence, backbone
gradient flow + checkpoint round-trip, V10 matched-pair registration; also
makes the checkout-relative suite-loader fallback test hermetic (it failed
whenever a real outputs/data/eval/v1 had been built). Evidence:
iter-e255-e256-b4-ar-adaptation-20260716.md + v10 campaign JSONs;
quality-experiment-matrix.md V10 section; research-lineage DiffuLLaMA tag
Adjacent->Adapted; MODEL_CARD history row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132PYCBHb1t1pjhDRzLrPov
bind_encoding=relative on the lexer-native tokenizer: definition sites become
nameless <BINDDEF> tokens (statement position IS the identity - the model
never invents or even selects a binder name) and reference sites carry signed
statement deltas <BINDREL_+/-k> (OpenUI allows forward references, so classic
most-recent-binder De Bruijn indices do not apply). Decode inverts deltas
positionally; out-of-scope offsets decode to a never-defined oob<k> name that
stream_check flags unresolved - scope legality is the verifier's job, never
silently repaired. New tokens keep TokenKind.BIND, so the grammar gate's NAME
expansion and factorized embeddings work unchanged. Encoding persisted in the
tokenizer sidecar; plumbed through TwoTowerConfig/ModelBuildConfig/Experiment
with absolute as the default (zero change to existing rows).

Also fixes a real alpha-invariance bug the C1 property test exposed in the D2
canonicalizer: production_codec._statement_order read binder references out of
string-literal contents, so placeholder text like ":form.title" aliased the
binders form/title and canonical statement order leaked original names.
String literals are now stripped before reference scanning; regression test
added and a correction note appended to the D2 iter doc.

V10 row E257 (matched vs E255, only bind_encoding differs). Fixture run
(200 CPU steps, fixture v1 corpus, honest suites + AgentV): syntax parse
0.667/0.6/0.25/0.5 vs 0.0 on the matched absolute control, loss 3.27 vs 3.75,
decode p50 1-8s vs ~15s; meaningful parse 0.0 on both - failures shift to
empty_root_stack, i.e. the valid-but-empty wall (Track A) is untouched, as
expected. Wiring evidence only; frontier E-row and C1xA interaction stay open.
Round-trip property test over every committed seed program via the lang-core
bridge plus 7 unit tests; full changed-file suite green (320 passed).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132PYCBHb1t1pjhDRzLrPov
Both branches claimed the v10 quality-matrix name: main's exact-state
local-preference rows (E248-E254) keep v10; this branch's B4/C1
representation rows (E255-E257) become v11 (script, tests, docs
retitled; historical result-JSON filenames unchanged).

Code conflicts resolved as unions (config fields, factory wiring,
compiler_draft helpers, twotower backend switch + isolated aux init);
production_codec keeps main's AST-based _statement_order. MODEL_CARD
history and quality-experiment-matrix keep both campaigns' rows.
passing_evaluation() fixture now supplies component_type_recall so the
RL-readiness gate test matches this branch's E2 semantic-density floor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132PYCBHb1t1pjhDRzLrPov
Keeps #274's repaired E252 counterfactual pipeline (local_decisions
evidence outputs, train_preference --evidence-out, corrected E252 docs)
and this branch's v11 rows, A4 min-content decode, and HF denoiser
backend switch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132PYCBHb1t1pjhDRzLrPov
@Tyler-R-Kendrick
Tyler-R-Kendrick merged commit 2a13bec into main Jul 17, 2026
4 checks passed
@Tyler-R-Kendrick
Tyler-R-Kendrick deleted the claude/dsl-diffusion-slm-autoresearch-dg16mx branch July 17, 2026 00:56
Tyler-R-Kendrick added a commit that referenced this pull request Jul 17, 2026
Salvaged from the superseded B4/C1/C2 branch (old head 9e86c13; the
lever implementations there were superseded by the E255-E257 work
merged via #259). Both defects are latent on main because no merged
row activates runtime_symbol_features yet; both fire the moment one
does:

- evaluate_loss_suites now clears request-local runtime symbol
  features on entry: the teacher-forced suites carry no request
  context, and stale per-batch features from the last training batch
  crash the batched NLL forward (batch-dim mismatch) or silently bias
  it when dimensions happen to line up
- DenoiserTower.project accepts [D]/[N,D] hidden slices with features
  active (compiler/tree scorers project slices): shape-polymorphic for
  a single active request, fail-closed when multi-request features
  cannot be attributed to a sliced row

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014AWAXqSioAB3sYXKxgJ3rG
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.

2 participants