The corpus, and the one number that turned out to matter

Two runs. Same method, same base model (Qwen3-4B-Instruct, LoRA r=16 on q/v), same budget of roughly 600 practice tasks, same 12-primitive vocabulary. One difference: how many distinct compositions those tasks were spread over.

Run A — low diversity
wake 600 · ho_surface 120 · ho_composition 120
N·k/m = 12·2/12 =
2.00
context multiplicity — the run that only specialised
Run B — high diversity
wake 576 · ho_surface 240 · ho_composition 120
N·k/m = 48·2/12 =
8.00
context multiplicity — the run where composition moved

N = training structures · k = 2 (composition depth) · m = 12 (vocabulary size)

Structure × primitive

12/12

Primitive coverage, both corpora

How many training structures each primitive appears in. Full corpus, not the scrub position.

Run A — of 12 structures Run B — of 48 structures

These are absolute counts, so Run B's bars are longer in part because its corpus has four times as many structures. The shape is the point. Run A runs 5, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 0 — one primitive in nearly half the corpus, three in a single structure each, and one in none at all. Run B runs 11 down to 5, with nothing missing.

The vocabulary — 12 primitives, each list[int] → list[int]

Click a row to select that column in the matrix above.

Run A: what was practised vs what was held out

Both lists are depth-2 compositions drawn from the same 12-primitive vocabulary.

s_train — 12 practised structures

the model saw these, repeatedly, in ~600 wake tasks

    s_comp — 12 held-out compositions

    never practised · badge = how many training structures each part appeared in

      Caption.

      Skew.

      Reconstruction note.