# Experiment 006 — isolation validation

Run **before training**, on `jetson-server`, CUDA / bfloat16 / `eager`.
`scripts/validate_isolation_006.py` → `isolation_validation_jetson-server.json`.
All nine checks passed; training would not have started otherwise.

## Why these checks are stronger than Experiment 005's

005's readout was zero, so "gate = 0 is bit-identical" was nearly free — an
untrained memory contributed nothing whatever the gate did. 006 initialises the
readout to `N(0, 1e-3)`, so **the module has a non-zero output from the moment it
is installed**. The gate-0 check is therefore genuinely load-bearing here, and a
new check is possible that 005 could not run: gate = 1 must move the logits
*without randomising anything*.

## Results

| # | check | result |
|---|---|---|
| 1 | every base parameter `requires_grad=False` | **PASS** |
| 2 | every memory parameter `requires_grad=True` | **PASS** |
| 3 | exactly **one** insertion point patched | **PASS** |
| 4 | non-zero init, gate 0 → bit-identical to frozen base | **PASS** |
| 5 | non-zero init, gate 1 → logits **differ** | **PASS** |
| 6 | readout randomised, gate 0 → still bit-identical | **PASS** |
| 7 | same randomised readout, gate 1 → logits differ | **PASS** |
| 8 | removal restores base logits exactly | **PASS** |
| 9 | base fingerprint unchanged across install/remove | **PASS** |

Max `|logit diff|` against the frozen base:

| condition | max diff |
|---|---|
| untrained `N(0,1e-3)`, gate = 0 | `0.000e+00` |
| untrained `N(0,1e-3)`, gate = 1 | `5.859e-01` — must be > 0 |
| randomised, gate = 0 | `0.000e+00` |
| randomised, gate = 1 | `7.500e-01` |
| after removal | `0.000e+00` |

## Is the new initialisation's perturbation small?

GOAL_6 requires this to be demonstrated, not asserted. At gate = 1 with the
untrained `N(0, 1e-3)` readout:

| | |
|---|---|
| max \|logit diff\| | 0.586 |
| **argmax token unchanged** | **97.7 % of probe positions** |
| max \|logit diff\| at gate 0 | **0.000** (exactly) |

The isolation guarantee is untouched — gate 0 remains bit-identical — and at
gate 1 the untrained memory leaves the model's greedy choice unchanged on all
but 2.3 % of positions.

## Parameter accounting

| | |
|---|---|
| base parameters | 596,049,920 |
| memory parameters | **739,456** |
| trainable parameters | 739,456 |
| base tensors still trainable | none |
| memory tensors not trainable | none |
| percentage of base | **0.1241 %** |
| base fingerprint | `52683d0e840fb51e`, unchanged before → after training |

## Addressing at initialisation

Read entropy **4.8520** = `ln 128` to four decimals — exactly uniform, as in
Experiment 005. Pre-softmax score margins on the three probes: 0.00069, 0.00347,
0.00023.

Recorded so that any addressing structure observed later is demonstrably
*learned*. It became the baseline against which the collapse trajectory
(4.5977 → 3.9673 → 1.2166 → 0.3369 → 0.0326) is read.
