File size: 1,620 Bytes
04a0448
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Checkpoint ↔ code compatibility

**A representation change breaks old checkpoints. This file records which code loads which arm.**

| arms | conditioning | `PER_SITE_DIM` | `COND_DIM` | load with |
|---|---|---|---|---|
| `A_*`, `B_*`, `C_*`, `D_*`, `E_long*`, `F_scout`, `G_100*` | pre-WP-018 | 62 | 948 | commit **`203c036`** or earlier |
| `H_pq*` and later | WP-018 (+ per-shell SPECIFIED bit) | 68 | 1020 | commit **`74dae8f`** or later |

Loading a pre-WP-018 checkpoint with current code raises:

```
size mismatch for site_proj.0.weight: copying a param with shape torch.Size([256, 62])
from checkpoint, the shape in current model is torch.Size([256, 68])
```

That is the correct, loud failure — not a corrupted download.

## How this happened, and the rule it earns

WP-018 added a **SPECIFIED bit per shell** so a user could ask for fewer than six shells. That is a
change to the *input representation*, and it silently invalidated **16 of 19 trained arms** for
inference. It surfaced only when a control experiment tried to feed a shallow query to a
full-query model and torch raised a size mismatch.

> **RULE: a change to the conditioning or token representation is a BREAKING change. It must (a) be
> recorded in the checkpoint's own metadata, (b) be checked on load with a message that names the
> commit to use, and (c) appear in this table before the change is committed.**

⚠ `arm_meta.json` records `tokenizer_version` and `vocab_hash` but **not** a conditioning version —
which is why nothing caught this at load time. Adding one is the fix; until then, this table is the
source of truth.