# Project MSC corrected complete-layer evidence report

## Technical summary

The corrected intervention zeros both the voxel-energy features and matching operational-mask entries for one pion layer in every event. Existing-checkpoint validation selected M11 over M12-C ($\lambda=0.10$) for all seven layers before official-evaluation scoring, so the corrected routed system is exactly M11. On 120,800 official events per layer, M11 uniform-macro rMAE is **0.1929**, versus **0.2404** for M10 and **0.2147** for M12-C; voxel-weighted values are **0.2104**, **0.2844**, and **0.2346**. The historical mask-only result is not layer-failure evidence.

## Dataset, split, and geometry

Project MSC uses Fast Calorimeter Simulation Challenge 2022 Dataset 1 version
3, DOI `10.5281/zenodo.8099322`. The charged-pion training source is
`dataset_1_pions_1.hdf5` (120,800 events; MD5
`6a5f52722064a1bcd8a0bc002f16515d`) and the untouched official evaluation
source is `dataset_1_pions_2.hdf5` (120,800 events; MD5
`fee7457b40127bc23c8ab909e2638ca0`). Both store `incident_energies` with
shape `(120800, 1)` and `showers` with shape `(120800, 533)` as on-disk
float64 arrays; preparation validates and converts arrays to float32.

The pion representation has 533 voxels in active original layers
`[0, 1, 2, 3, 12, 13, 14]` with respective sizes
`[8, 100, 100, 5, 150, 160, 10]`. Geometry comes from
`geometry/binning_dataset_1_pions.xml`.

The first file alone was split 85:15 into 102,680 training and 18,120
validation events, stratified by incident-energy bin. The second file remained
the 120,800-event official evaluation set. For each first-file event, the
stable event ID is BLAKE2b-128 over `(particle, source SHA-256, row index)`.
Within each energy bin, rows are ordered by BLAKE2b of `(20261027, event ID)`;
the first rounded 85% are training and the next rounded 15% validation. This
procedure is invariant to input row order.

| Incident energy (MeV) | Train | Validation | Official evaluation |
| ---: | ---: | ---: | ---: |
| 256 | 8500 | 1500 | 10000 |
| 512 | 8500 | 1500 | 10000 |
| 1,024 | 8500 | 1500 | 10000 |
| 2,048 | 8500 | 1500 | 10000 |
| 4,096 | 8500 | 1500 | 10000 |
| 8,192 | 8500 | 1500 | 10000 |
| 16,384 | 8500 | 1500 | 10000 |
| 32,768 | 8500 | 1500 | 10000 |
| 65,536 | 8500 | 1500 | 10000 |
| 131,072 | 8500 | 1500 | 10000 |
| 262,144 | 8330 | 1470 | 9800 |
| 524,288 | 4250 | 750 | 5000 |
| 1,048,576 | 2550 | 450 | 3000 |
| 2,097,152 | 1700 | 300 | 2000 |
| 4,194,304 | 850 | 150 | 1000 |

All preprocessing artifacts have SHA-256
`03bfa04efcb271fb4c061cd69bf201b39b8728e91cbca319c7ad6ef194e3fb8a`.
The fitted statistics were computed from the 102,680 clean training events
only; validation and evaluation arrays were never used to fit them.

## Input and target preprocessing

For cell energy $x\geq0$ (stored in MeV), the positive-cell training median is
$s=46.072547912597656$. The base transform and standardized model input are

$$u=\log(1+x/s),\qquad z=(u-\mu_x)/\sigma_x,$$

with $\mu_x=0.5018876791000366$ and
$\sigma_x=1.0562999248504639$, computed over the entire transformed training
matrix, including physical zeros. A zero or dead cell therefore maps to
$(0-\mu_x)/\sigma_x$; dead cells are set to zero before transformation.

The operational mask is a float32 array aligned one-to-one with the 533 cells:
1 denotes operational and 0 denotes deliberately failed. Natural zero energy
in an operational cell retains mask value 1. Gain drift, Gaussian noise, and
hot-cell corruptions do not alter the mask.

Targets $E$ are in GeV. With
$\mu_E=2.533506155014038$ and $\sigma_E=2.5103209018707275$,

$$t=(\log(\max(E,10^{-12}))-\mu_E)/\sigma_E,$$
$$\widehat E=\exp(\widehat t\,\sigma_E+\mu_E).$$

Training and inference tensors and saved predictions use float32. Metric
calculations cast to NumPy float64.

## Corruptions and train/evaluation boundary

- **Random dead 5%:** choose exactly `round(0.05×533)=27` distinct cells
  uniformly without replacement per event; set their energies and masks to 0.
- **Block dead 5%:** choose a layer with probability proportional to its voxel
  count. Set a contiguous alpha–radial block with target size 27 to zero. If the selected layer contains fewer than 27 voxels, the entire layer is used; otherwise exactly 27 block indices are retained. Width is
  `min(n_alpha, round(sqrt(27)))`; height is
  `min(n_radial, ceil(27/width))`; alpha wraps and the radial start is sampled
  from valid starts. The mask is zeroed at the same cells.
- **Complete-layer training corruption:** select one active layer and set all its energies and mask entries to 0. M11 uses voxel-count-proportional layer sampling; M12-C uses uniform sampling over the seven active layer identities.

The corrected deterministic evaluation sets every voxel energy and corresponding mask entry in one selected layer to zero while leaving all other layers unchanged. Historical mask-only rows retain clean layer energies and are preserved solely as a detector-status inconsistency control.

- **Layer gain drift:** independently for every event and layer, draw
  $g_\ell=\max(0,\mathcal N(1,0.05))$ and multiply all cells in that layer by
  $g_\ell$; the mask remains 1.
- **Gaussian noise:** for each event, compute the median positive cell energy
  $m_+$ and set $\sigma=0.02m_+$. Add independent
  $\mathcal N(0,\sigma)$ noise to every cell, then clip energies at zero; the
  mask remains 1.
- **Hot cells:** choose two distinct cells per event and add independent
  log-normal spikes with log-mean $\log(1.0)$ and log-standard deviation 0.5,
  in the stored cell-energy unit; the mask remains 1.
- **Mixed unseen:** apply block-dead 5%, then layer gain drift 5%, then Gaussian
  noise 2%, using one deterministic RNG stream; masks multiply across steps.

M10 training used random-dead 5% for every event. M11 sampled clean,
random-dead 5%, block-dead 5%, and complete-layer failure with probability
0.25 each; complete-layer identities were voxel-count weighted. M12-C sampled
clean 0.20, random-dead 0.15, block-dead 0.15, and complete-layer failure 0.50,
with the failed layer uniform over the seven identities. Gain drift, Gaussian
noise, hot cells, and mixed unseen were evaluation-only for all three models.

## Exact model definitions

M10 and M11 use the same 824,449-parameter layer-gated Transformer and differ
only in training augmentation. Each layer's input vector is passed through
`Linear(n_layer,192) → GELU → LayerNorm(192)`. In parallel, its binary mask is
passed through `Linear(n_layer,192) → sigmoid`; the two 192-vectors are
multiplied. Seven learned positional embeddings are added. Two PyTorch
Transformer encoder layers use width 192, four attention heads, feed-forward
width 384, GELU, dropout 0, post-normalization, and batch-first layout. Tokens
are mean-pooled across layers. The output head is
`LayerNorm(192) → Linear(192,96) → GELU → Linear(96,1)`.

M12-C has 837,712 parameters. It retains the same token encoders, gates,
Transformer, pooling, and base head. It additionally computes the operational
fraction of each layer, concatenates those seven fractions to the pooled
192-vector, and predicts an additive standardized-log-energy correction with
`LayerNorm(199) → Linear(199,64) → GELU → Linear(64,1)`.

## Training and validation selection

All models use AdamW with learning rate $3\times10^{-4}$, weight decay
$10^{-4}$, batch size 2,048, automatic mixed precision on CUDA, gradient
norm clipping at 5.0, and a 60-epoch limit. The base loss is PyTorch Huber loss
with default transition $\delta=1$ in standardized log-energy space:

$$L_H(r)=\begin{cases}\tfrac12r^2,&|r|\le1\\|r|-\tfrac12,&|r|>1.\end{cases}$$

M10 and M11 select the minimum validation Huber loss; early stopping patience
is 12 epochs. M10 ran 60 epochs for all three seeds. M11 ran 60 epochs for four
seeds and 59 for seed 20261031.

M12-C adds a group relative-bias penalty. For standardized prediction
$\widehat t_i$, target $t_i$, and target scale $\sigma_E$,

$$q_i=\exp(\operatorname{clip}((\widehat t_i-t_i)\sigma_E,-10,10))-1,$$
$$L=L_H+0.10\,\frac1{|G_B|}\sum_{g\in G_B}
\left(\frac1{|B_g|}\sum_{i\in B_g}q_i\right)^2.$$

Groups are clean, random dead, block dead, and each of the seven complete-layer
identities present in the batch. Every five epochs, M12-C was originally selected using validation-only uniform macro rMAE across seven historical mask-only inconsistency interventions. The corrected evaluation does not retroactively change that checkpoint-selection criterion. Patience is four such checks. Its five seeds
ran 30, 40, 30, 35, and 55 epochs. Training seeds are 20261027–20261029 for
M10 and 20261027–20261031 for M11 and M12-C.

Recorded campaign wall times, including each campaign's own evaluation and
artifact writing, are 239.31 s for M10, 401.45 s for M11, and 1,159.25 s for
the complete 20-model M12 campaign. The frozen artifacts do not record
per-variant or pure-training-only wall time; none is estimated here.


## Corrected validation-frozen policy

```text
if one physical layer has energy == 0 and mask == 0 for all its cells:
    expert = validation_selected_expert[layer]  # M11 for all seven layers
else:
    expert = M11
prediction = mean(expert_seed_predictions)
```

Complete-layer-plus-additional-cell damage and all ordinary states use M11. Mask-only inconsistency is never routed. The saved policy was frozen from 18,120 corrected validation events per layer before official scoring; its SHA-256 is `8fb737e07f75471b4fe602fe358e0da34e2b3ace9a7ffc67002135a7a3d18f80`.

## Metric definitions

For residual $r=(\widehat E-E)/E$, rMAE is $\mathrm{mean}(|r|)$, bias is $\mathrm{mean}(r)$, and R68 is $(Q_{0.84}-Q_{0.16})/2$. The **large-error / catastrophic-error threshold used in every table is $|r|>0.20$**, a strict absolute relative error greater than 20%. Ensembles average predictions event-wise before scoring.

## Broad scenarios

The corrected run does not alter broad frozen arrays. Routed metrics equal M11.

| System | Scenario | rMAE | Bias | R68 | Large-error |
| --- | ---: | ---: | ---: | ---: | ---: |
| M10 | Clean | 0.1804 | 0.0976 | 0.1678 | 0.3194 |
| M10 | Random dead 5% | 0.1574 | 0.0304 | 0.1667 | 0.2562 |
| M10 | Block dead 5% | 0.1799 | 0.0545 | 0.1939 | 0.3179 |
| M10 | Layer gain drift | 0.1812 | 0.0973 | 0.1704 | 0.3231 |
| M10 | Gaussian noise | 0.1935 | 0.1131 | 0.1718 | 0.3327 |
| M10 | Hot cells | 0.1807 | 0.0983 | 0.1678 | 0.3204 |
| M10 | Mixed unseen | 0.1940 | 0.0705 | 0.1996 | 0.3326 |
| M11 | Clean | 0.1533 | 0.0507 | 0.1624 | 0.2613 |
| M11 | Random dead 5% | 0.1568 | 0.0016 | 0.1751 | 0.2714 |
| M11 | Block dead 5% | 0.1610 | 0.0289 | 0.1787 | 0.2809 |
| M11 | Layer gain drift | 0.1548 | 0.0505 | 0.1655 | 0.2663 |
| M11 | Gaussian noise | 0.1654 | 0.0665 | 0.1649 | 0.2707 |
| M11 | Hot cells | 0.1537 | 0.0515 | 0.1626 | 0.2616 |
| M11 | Mixed unseen | 0.1751 | 0.0458 | 0.1848 | 0.2956 |
| M12-C | Clean | 0.1793 | -0.0104 | 0.2056 | 0.3286 |
| M12-C | Random dead 5% | 0.1926 | -0.0883 | 0.2033 | 0.3680 |
| M12-C | Block dead 5% | 0.1922 | -0.0469 | 0.2179 | 0.3638 |
| M12-C | Layer gain drift | 0.1802 | -0.0108 | 0.2063 | 0.3312 |
| M12-C | Gaussian noise | 0.1827 | -0.0044 | 0.2073 | 0.3321 |
| M12-C | Hot cells | 0.1793 | -0.0100 | 0.2056 | 0.3286 |
| M12-C | Mixed unseen | 0.1963 | -0.0406 | 0.2214 | 0.3686 |
| Routed | Clean | 0.1533 | 0.0507 | 0.1624 | 0.2613 |
| Routed | Random dead 5% | 0.1568 | 0.0016 | 0.1751 | 0.2714 |
| Routed | Block dead 5% | 0.1610 | 0.0289 | 0.1787 | 0.2809 |
| Routed | Layer gain drift | 0.1548 | 0.0505 | 0.1655 | 0.2663 |
| Routed | Gaussian noise | 0.1654 | 0.0665 | 0.1649 | 0.2707 |
| Routed | Hot cells | 0.1537 | 0.0515 | 0.1626 | 0.2616 |
| Routed | Mixed unseen | 0.1751 | 0.0458 | 0.1848 | 0.2956 |


## Corrected deterministic layer failures

Each layer is physically disabled in all 120,800 official events by zeroing both energy and matching mask entries.

| System | Failed layer | rMAE | Bias | R68 | Large-error |
| --- | ---: | ---: | ---: | ---: | ---: |
| M10 | 0 | 0.1946 | 0.0727 | 0.1975 | 0.3623 |
| M11 | 0 | 0.1793 | 0.0513 | 0.2090 | 0.3331 |
| M12-C | 0 | 0.1942 | -0.0477 | 0.2248 | 0.3701 |
| Routed | 0 | 0.1793 | 0.0513 | 0.2090 | 0.3331 |
| M10 | 1 | 0.1825 | 0.0282 | 0.2051 | 0.3351 |
| M11 | 1 | 0.1641 | 0.0327 | 0.1777 | 0.2813 |
| M12-C | 1 | 0.1917 | -0.0548 | 0.2140 | 0.3572 |
| Routed | 1 | 0.1641 | 0.0327 | 0.1777 | 0.2813 |
| M10 | 2 | 0.3238 | -0.1097 | 0.3645 | 0.6169 |
| M11 | 2 | 0.2393 | 0.0482 | 0.2767 | 0.4255 |
| M12-C | 2 | 0.2603 | -0.0643 | 0.2956 | 0.5003 |
| Routed | 2 | 0.2393 | 0.0482 | 0.2767 | 0.4255 |
| M10 | 3 | 0.1784 | 0.0585 | 0.1881 | 0.3066 |
| M11 | 3 | 0.1663 | 0.0285 | 0.1898 | 0.3010 |
| M12-C | 3 | 0.1863 | -0.0476 | 0.2113 | 0.3512 |
| Routed | 3 | 0.1663 | 0.0285 | 0.1898 | 0.3010 |
| M10 | 12 | 0.3193 | -0.0307 | 0.3823 | 0.5831 |
| M11 | 12 | 0.2290 | 0.0595 | 0.2600 | 0.4379 |
| M12-C | 12 | 0.2517 | -0.0378 | 0.2989 | 0.4885 |
| Routed | 12 | 0.2290 | 0.0595 | 0.2600 | 0.4379 |
| M10 | 13 | 0.3053 | 0.0607 | 0.3707 | 0.5370 |
| M11 | 13 | 0.2097 | 0.0506 | 0.2261 | 0.3831 |
| M12-C | 13 | 0.2362 | -0.0203 | 0.2707 | 0.4425 |
| Routed | 13 | 0.2097 | 0.0506 | 0.2261 | 0.3831 |
| M10 | 14 | 0.1791 | 0.0739 | 0.1798 | 0.3106 |
| M11 | 14 | 0.1629 | 0.0370 | 0.1805 | 0.2849 |
| M12-C | 14 | 0.1829 | -0.0456 | 0.2088 | 0.3416 |
| Routed | 14 | 0.1629 | 0.0370 | 0.1805 | 0.2849 |


### Uniform and voxel-count-weighted aggregates

| System | Layer average | rMAE | Bias | R68 | Large-error |
| --- | ---: | ---: | ---: | ---: | ---: |
| M10 | uniform macro | 0.2404 | 0.0220 | 0.2697 | 0.4360 |
| M10 | voxel count weighted | 0.2844 | -0.0027 | 0.3339 | 0.5181 |
| M11 | uniform macro | 0.1929 | 0.0440 | 0.2171 | 0.3495 |
| M11 | voxel count weighted | 0.2104 | 0.0488 | 0.2346 | 0.3840 |
| M12-C | uniform macro | 0.2147 | -0.0454 | 0.2463 | 0.4073 |
| M12-C | voxel count weighted | 0.2346 | -0.0411 | 0.2703 | 0.4464 |
| Routed | uniform macro | 0.1929 | 0.0440 | 0.2171 | 0.3495 |
| Routed | voxel count weighted | 0.2104 | 0.0488 | 0.2346 | 0.3840 |


## Individual-seed mean ± sample standard deviation

These are average single-model metrics and are kept separate from ensemble metrics. M10 has three seeds; M11 and M12-C have five.

| System | Scenario | n seeds | rMAE mean ± SD | Bias mean ± SD | R68 mean ± SD | Large-error mean ± SD |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| M10 | Block dead 5% | 3 | 0.1892 ± 0.0072 | 0.0545 ± 0.0236 | 0.2058 ± 0.0023 | 0.3413 ± 0.0104 |
| M10 | Clean | 3 | 0.1876 ± 0.0094 | 0.0976 ± 0.0241 | 0.1813 ± 0.0029 | 0.3392 ± 0.0151 |
| M10 | complete layer failure layer 0 | 3 | 0.2011 ± 0.0026 | 0.0727 ± 0.0078 | 0.2085 ± 0.0024 | 0.3751 ± 0.0052 |
| M10 | complete layer failure layer 1 | 3 | 0.1909 ± 0.0045 | 0.0282 ± 0.0217 | 0.2165 ± 0.0146 | 0.3550 ± 0.0240 |
| M10 | complete layer failure layer 12 | 3 | 0.3295 ± 0.0195 | -0.0307 ± 0.0545 | 0.3910 ± 0.0266 | 0.5986 ± 0.0164 |
| M10 | complete layer failure layer 13 | 3 | 0.3222 ± 0.0246 | 0.0607 ± 0.0540 | 0.3767 ± 0.0305 | 0.5530 ± 0.0206 |
| M10 | complete layer failure layer 14 | 3 | 0.1895 ± 0.0118 | 0.0739 ± 0.0246 | 0.1957 ± 0.0058 | 0.3342 ± 0.0209 |
| M10 | complete layer failure layer 2 | 3 | 0.3299 ± 0.0073 | -0.1097 ± 0.0090 | 0.3722 ± 0.0162 | 0.6285 ± 0.0200 |
| M10 | complete layer failure layer 3 | 3 | 0.1909 ± 0.0033 | 0.0585 ± 0.0112 | 0.2064 ± 0.0024 | 0.3375 ± 0.0067 |
| M10 | Gaussian noise | 3 | 0.2006 ± 0.0116 | 0.1131 ± 0.0260 | 0.1852 ± 0.0025 | 0.3507 ± 0.0163 |
| M10 | Hot cells | 3 | 0.1880 ± 0.0096 | 0.0983 ± 0.0242 | 0.1813 ± 0.0029 | 0.3399 ± 0.0154 |
| M10 | Layer gain drift | 3 | 0.1885 ± 0.0094 | 0.0973 ± 0.0241 | 0.1839 ± 0.0030 | 0.3424 ± 0.0148 |
| M10 | Mixed unseen | 3 | 0.2031 ± 0.0095 | 0.0705 ± 0.0258 | 0.2121 ± 0.0027 | 0.3548 ± 0.0111 |
| M10 | Random dead 5% | 3 | 0.1685 ± 0.0088 | 0.0304 ± 0.0267 | 0.1823 ± 0.0049 | 0.2852 ± 0.0128 |
| M11 | Block dead 5% | 5 | 0.1770 ± 0.0064 | 0.0289 ± 0.0280 | 0.1972 ± 0.0037 | 0.3199 ± 0.0139 |
| M11 | Clean | 5 | 0.1677 ± 0.0087 | 0.0507 ± 0.0264 | 0.1790 ± 0.0024 | 0.2967 ± 0.0213 |
| M11 | complete layer failure layer 0 | 5 | 0.1936 ± 0.0093 | 0.0513 ± 0.0332 | 0.2169 ± 0.0107 | 0.3737 ± 0.0303 |
| M11 | complete layer failure layer 1 | 5 | 0.1792 ± 0.0064 | 0.0327 ± 0.0258 | 0.1948 ± 0.0059 | 0.3170 ± 0.0194 |
| M11 | complete layer failure layer 12 | 5 | 0.2458 ± 0.0255 | 0.0595 ± 0.0604 | 0.2791 ± 0.0181 | 0.4644 ± 0.0365 |
| M11 | complete layer failure layer 13 | 5 | 0.2249 ± 0.0082 | 0.0506 ± 0.0309 | 0.2441 ± 0.0015 | 0.4134 ± 0.0132 |
| M11 | complete layer failure layer 14 | 5 | 0.1777 ± 0.0078 | 0.0370 ± 0.0299 | 0.1947 ± 0.0031 | 0.3209 ± 0.0187 |
| M11 | complete layer failure layer 2 | 5 | 0.2570 ± 0.0143 | 0.0482 ± 0.0452 | 0.2921 ± 0.0177 | 0.4611 ± 0.0102 |
| M11 | complete layer failure layer 3 | 5 | 0.1849 ± 0.0110 | 0.0285 ± 0.0406 | 0.2069 ± 0.0114 | 0.3413 ± 0.0277 |
| M11 | Gaussian noise | 5 | 0.1796 ± 0.0103 | 0.0665 ± 0.0276 | 0.1826 ± 0.0029 | 0.3060 ± 0.0237 |
| M11 | Hot cells | 5 | 0.1680 ± 0.0087 | 0.0515 ± 0.0264 | 0.1793 ± 0.0024 | 0.2975 ± 0.0217 |
| M11 | Layer gain drift | 5 | 0.1691 ± 0.0085 | 0.0505 ± 0.0264 | 0.1815 ± 0.0025 | 0.3010 ± 0.0207 |
| M11 | Mixed unseen | 5 | 0.1907 ± 0.0078 | 0.0458 ± 0.0291 | 0.2036 ± 0.0046 | 0.3324 ± 0.0160 |
| M11 | Random dead 5% | 5 | 0.1744 ± 0.0039 | 0.0016 ± 0.0237 | 0.1952 ± 0.0044 | 0.3145 ± 0.0100 |
| M12-C | Block dead 5% | 5 | 0.2130 ± 0.0057 | -0.0469 ± 0.0229 | 0.2424 ± 0.0105 | 0.4170 ± 0.0128 |
| M12-C | Clean | 5 | 0.1998 ± 0.0058 | -0.0104 ± 0.0244 | 0.2315 ± 0.0094 | 0.3816 ± 0.0156 |
| M12-C | complete layer failure layer 0 | 5 | 0.2116 ± 0.0109 | -0.0477 ± 0.0183 | 0.2517 ± 0.0142 | 0.4221 ± 0.0292 |
| M12-C | complete layer failure layer 1 | 5 | 0.2107 ± 0.0060 | -0.0548 ± 0.0211 | 0.2376 ± 0.0112 | 0.4099 ± 0.0169 |
| M12-C | complete layer failure layer 12 | 5 | 0.2702 ± 0.0075 | -0.0378 ± 0.0216 | 0.3180 ± 0.0064 | 0.5227 ± 0.0100 |
| M12-C | complete layer failure layer 13 | 5 | 0.2566 ± 0.0093 | -0.0203 ± 0.0240 | 0.2935 ± 0.0120 | 0.4839 ± 0.0132 |
| M12-C | complete layer failure layer 14 | 5 | 0.2038 ± 0.0046 | -0.0456 ± 0.0205 | 0.2329 ± 0.0093 | 0.3963 ± 0.0127 |
| M12-C | complete layer failure layer 2 | 5 | 0.2803 ± 0.0143 | -0.0643 ± 0.0351 | 0.3204 ± 0.0158 | 0.5455 ± 0.0324 |
| M12-C | complete layer failure layer 3 | 5 | 0.2089 ± 0.0058 | -0.0476 ± 0.0211 | 0.2382 ± 0.0087 | 0.4103 ± 0.0161 |
| M12-C | Gaussian noise | 5 | 0.2031 ± 0.0056 | -0.0044 ± 0.0232 | 0.2333 ± 0.0093 | 0.3842 ± 0.0156 |
| M12-C | Hot cells | 5 | 0.1998 ± 0.0058 | -0.0100 ± 0.0243 | 0.2315 ± 0.0094 | 0.3815 ± 0.0156 |
| M12-C | Layer gain drift | 5 | 0.2005 ± 0.0057 | -0.0108 ± 0.0243 | 0.2326 ± 0.0091 | 0.3838 ± 0.0152 |
| M12-C | Mixed unseen | 5 | 0.2170 ± 0.0057 | -0.0406 ± 0.0216 | 0.2455 ± 0.0102 | 0.4206 ± 0.0128 |
| M12-C | Random dead 5% | 5 | 0.2146 ± 0.0062 | -0.0883 ± 0.0220 | 0.2306 ± 0.0126 | 0.4294 ± 0.0138 |
| Routed | Block dead 5% | 5 | 0.1770 ± 0.0064 | 0.0289 ± 0.0280 | 0.1972 ± 0.0037 | 0.3199 ± 0.0139 |
| Routed | Clean | 5 | 0.1677 ± 0.0087 | 0.0507 ± 0.0264 | 0.1790 ± 0.0024 | 0.2967 ± 0.0213 |
| Routed | complete layer failure layer 0 | 5 | 0.1936 ± 0.0093 | 0.0513 ± 0.0332 | 0.2169 ± 0.0107 | 0.3737 ± 0.0303 |
| Routed | complete layer failure layer 1 | 5 | 0.1792 ± 0.0064 | 0.0327 ± 0.0258 | 0.1948 ± 0.0059 | 0.3170 ± 0.0194 |
| Routed | complete layer failure layer 12 | 5 | 0.2458 ± 0.0255 | 0.0595 ± 0.0604 | 0.2791 ± 0.0181 | 0.4644 ± 0.0365 |
| Routed | complete layer failure layer 13 | 5 | 0.2249 ± 0.0082 | 0.0506 ± 0.0309 | 0.2441 ± 0.0015 | 0.4134 ± 0.0132 |
| Routed | complete layer failure layer 14 | 5 | 0.1777 ± 0.0078 | 0.0370 ± 0.0299 | 0.1947 ± 0.0031 | 0.3209 ± 0.0187 |
| Routed | complete layer failure layer 2 | 5 | 0.2570 ± 0.0143 | 0.0482 ± 0.0452 | 0.2921 ± 0.0177 | 0.4611 ± 0.0102 |
| Routed | complete layer failure layer 3 | 5 | 0.1849 ± 0.0110 | 0.0285 ± 0.0406 | 0.2069 ± 0.0114 | 0.3413 ± 0.0277 |
| Routed | Gaussian noise | 5 | 0.1796 ± 0.0103 | 0.0665 ± 0.0276 | 0.1826 ± 0.0029 | 0.3060 ± 0.0237 |
| Routed | Hot cells | 5 | 0.1680 ± 0.0087 | 0.0515 ± 0.0264 | 0.1793 ± 0.0024 | 0.2975 ± 0.0217 |
| Routed | Layer gain drift | 5 | 0.1691 ± 0.0085 | 0.0505 ± 0.0264 | 0.1815 ± 0.0025 | 0.3010 ± 0.0207 |
| Routed | Mixed unseen | 5 | 0.1907 ± 0.0078 | 0.0458 ± 0.0291 | 0.2036 ± 0.0046 | 0.3324 ± 0.0160 |
| Routed | Random dead 5% | 5 | 0.1744 ± 0.0039 | 0.0016 ± 0.0237 | 0.1952 ± 0.0044 | 0.3145 ± 0.0100 |


## Paired event-bootstrap intervals

Paired, incident-energy-stratified bootstrap; 1000 resamples, seed 20261027; differences are routed minus comparator.

| Scenario | Comparison | rMAE difference | 95% CI low | 95% CI high |
| --- | ---: | ---: | ---: | ---: |
| Clean | routed minus M10 | -0.0270 | -0.0274 | -0.0266 |
| Clean | routed minus M11 | 0.0000 | 0.0000 | 0.0000 |
| Random dead 5% | routed minus M10 | -0.0005 | -0.0010 | -0.0001 |
| Random dead 5% | routed minus M11 | 0.0000 | 0.0000 | 0.0000 |
| Mixed unseen | routed minus M10 | -0.0189 | -0.0194 | -0.0184 |
| Mixed unseen | routed minus M11 | 0.0000 | 0.0000 | 0.0000 |
| complete layer failure uniform macro | routed minus M10 | -0.0475 | -0.0479 | -0.0471 |
| complete layer failure uniform macro | routed minus M11 | 0.0000 | 0.0000 | 0.0000 |
| complete layer failure uniform macro | routed minus M12 C lambda 010 | -0.0218 | -0.0225 | -0.0211 |
| complete layer failure voxel weighted | routed minus M10 | -0.0740 | -0.0747 | -0.0734 |
| complete layer failure voxel weighted | routed minus M11 | 0.0000 | 0.0000 | 0.0000 |
| complete layer failure voxel weighted | routed minus M12 C lambda 010 | -0.0242 | -0.0250 | -0.0235 |


Intervals quantify official-test sample uncertainty only and **do not include training-seed uncertainty**. Seed variability appears separately above.

## Corrected versus detector-status inconsistency

Historical mask-only rows retain clean energy while declaring a layer failed. They are relabeled **detector-status inconsistency / mask-only intervention**, preserved in dedicated tables, and never described as complete-layer failure. Their divergence from the corrected run shows sensitivity to contradictory status metadata, not recovery from absent measurements.

## Computational performance

| System | Device | Batch | Timed reps | Ensemble events/s | Checkpoint-evals/s |
| --- | ---: | ---: | ---: | ---: | ---: |
| M10 | RTX A5000 | 2048 | 1 | 97348.1 | 292044.4 |
| M11 | RTX A5000 | 2048 | 1 | 57912.6 | 289562.8 |
| M12_C_lambda_010 | RTX A5000 | 2048 | 1 | 55194.3 | 275971.7 |
| routed_M11_M12_C | RTX A5000 | 2048 | 1 | 57912.6 | 289562.8 |
| M10 | home CPU | 2048 | 3 | 4661.8 | 13985.3 |
| M11 | home CPU | 2048 | 3 | 2261.9 | 11309.7 |
| M12_C_lambda_010 | home CPU | 2048 | 3 | 2180.3 | 10901.6 |
| routed_M11_M12_C | home CPU | 2048 | 3 | 2261.9 | 11309.7 |


GPU timing used an RTX A5000, batch 2,048, one warm-up, and one full pass. CPU timing used 8,192 validation events, batch 2,048, four threads, one warm-up per checkpoint, and three repetitions. Since corrected routing always selects M11, deployment needs only the five M11 checkpoints: **49,925,785 bytes**.

## Limitations and claim boundaries

- Simulation-only evidence; no real-detector claim.
- Operational masks are assumed accurate.
- M12-C checkpoints were historically selected on mask-only validation, not the corrected objective.
- M12-C is not selected as a corrected complete-layer specialist.
- Mixed layer-plus-cell damage falls back to M11.
- No mask/no-mask ablation; mask benefit is not isolated.
- Photon results are control evidence only because the baseline differs.
- Demonstrated: broad M11 robustness under tested synthetic corruptions. Not demonstrated: universal superiority.

## Reproducibility and next steps

`corrected_evaluation/` contains the complete corrected output tree: validation and official arrays, metrics, policy, configuration, audits, provenance, system information, log, and transfer verification. The manifest hashes inputs and outputs. No model was retrained and no frozen result modified. Next: select or train on corrected physical failures, stress-test inaccurate masks, and validate on real detector states.
