# DEVIATION D6: arm P runs with `--stratum-key none` (pooled, 6 cells)

Written: 2026-10-28 06:37:41 MDT (Oct 28 2026), BEFORE any real-data scoring. No score file existed when this was written
(checked on the DGX at 06:37:21 MDT: `v2/scores/` absent; the only file newer than B2V2_DATA_MANIFEST.json is v2/logs/BUILD.log).
Decided by: Abe (prereg owner), option (a), at 06:35 MDT, 28 October 2026. Recorded by Grok Bot (executor) for Ford.
Applies to: PREREG_HLE_B2_v2.md (LOCKED, sha256 fabb2cc3dcf571d2b412f0d221404529cef9b4c798cc98993cd6ade6b0973680),
which incorporates v1 PREREG_HLE_B2.md §4 and §7 by reference. Background: v2/RUN_NOTE_ARM_P_STRATUM.md
(sha256 e4397820caea8b96fdc91967ac45ad8803aa69ba9d0a775a64b85b92633532c9).

## What the literal §4 arm-P command does
`nulltest_paired.py data/B2P_pairs.jsonl --pair-key id --alpha 0.025 --json --jobs 4`
nulltest_paired.py 0.1 (sha256 2fbbebca…37d3) calls nulltest.sniff_keys(). With --stratum-key omitted it
auto-selects the first STRATUM_KEYS field present in the items. The pair rows carry `category`, so the
literal command runs STRATIFIED by category: 54 cells (6 pooled + 48 category cells), n_perm 4400.
This was confirmed on synthetic data only (b2_sim.generate(99990001, 0.6) -> pair items, box /tmp/synchk);
no HLE file was scored to establish it.

## Why that differs from §4 and from the validated gate
- v1 §4 text: "Primary (per A4): a single pooled stratum. No --stratum-key, 6 cells per arm (the six v1.4
  probes), min_cell 12, B auto-raised (600), --alpha 0.025." The 54-cell family is §4's SECONDARY configuration.
- The v2 synthetic gate (B2V2_SIM_GATE.json, e1932d45…8a78a) validated arm P pooled: b2_sim.run_job calls
  P.evaluate_paired(pairs, "text", "label", "id", None, alpha=0.025), i.e. stratum None, 6 cells.
  The planted (W), null (N1) and shuffle (N2) calibration therefore applies to the 6-cell pooled analysis only.
- `--stratum-key none` is nulltest's documented off switch for the automatic stratum (sniff_keys returns
  stratum None). Synthetic check on the box (/tmp/synchk) with it: keys.stratum None, 6 cells, n_perm 600.

## Exact arm-P commands run under this deviation (on the DGX, cwd batch2/v2, nice -n 19 ionice -c3, python3)
Planted (§7.3), s = 0..3:
  python3 ../code/nulltest_paired.py data/B2P_planted_s{0,1,2,3}.jsonl --pair-key id --alpha 0.025 --json --jobs 4 --stratum-key none
Shuffle control (§7.4):
  python3 ../code/nulltest_paired.py data/B2P_shuffled.jsonl --pair-key id --alpha 0.025 --json --jobs 4 --stratum-key none
Primary (§4, §7.5):
  python3 ../code/nulltest_paired.py data/B2P_pairs.jsonl --pair-key id --alpha 0.025 --json --jobs 4 --stratum-key none
Each writes its --json report to v2/scores/ on the DGX.

## Unchanged
- Arm G is unchanged: nulltest_grouped.py passes --stratum-key straight through (default None = one pooled
  cell), so its §4 commands run exactly as written (planted, shuffle, primary without --stratum-key;
  secondary with --stratum-key category).
- Data, seeds, alpha 0.025 per arm, probes, B, order (§7.6), verdict table (§9) and budget (§11) are unchanged.

## Only this one analysis
- For arm P's planted, shuffle and primary runs, ONLY the pooled 6-cell analysis above is run.
  The auto-stratified 54-cell version of these runs will NOT be run, now or later, and no result from it exists.
- The §4 SECONDARY arm-P run (explicit `--stratum-key category`, localisation only, never verdict-relevant)
  is a separately pre-registered analysis whose family is also 54 cells. Because the run instruction says the
  54-cell variant is not to be run at all, the arm-P secondary is HELD (not run) pending explicit confirmation
  from Ford/Abe; holding it cannot change any verdict (§4: secondary runs never change the batch verdict).
  The arm-G secondary runs as locked.
