NakedSignal OS

Variation studio

Move the acquisition knobs and watch the model change its mind — with the band of real variation drawn on every slider.

How variation studio works

12 continuous knobs, in the order a photon meets them, running in this tab over the bytes a real abdominal CT slice arrived as. Move one and the six stages of variation/forward.py run again over the source pixels; the decision above is a linear classifier evaluated on the result.

Every slider carries the interval that a genuine acquisition change was fitted to — axial -> coronal, the same abdominal volumes reconstructed in a different plane — so you can see not only what a knob does but whether the setting you have chosen is a thing that happens. A slider without that band would be a filter app; a slider with it is a measurement, which is why the fitted interval is a required input to every knob here rather than a decoration on some of them.

The arithmetic is not trusted on assertion. npm run check:studio imports this page’s own kernel, runs it over 80 fixtures and requires every pixel to land within one grey level of what variation/forward.py produced, then re-derives all 42 published comparisons with the same band functions that draw the axes here. No figure on this page is typed into it: they are copied out of variation/out/envelope_organ.json by variation/emit_studio.py, carrying the artifact’s sha256.

And the finding the presets make pressable: 41 of 42 published severity constants land outside the interval fitted to real variation, every one of them in the same direction — the published ladder does far too much. The band is fitted from PAIRED_CLASS data, which is the ceiling on all of it.

Synthetic variation

Which pair the band comes from
Source slice

Both come from the calibration corpus shipped with this build, and nothing here is sent anywhere: the forward model, the fitted band and the classifier all run in this tab, on a static export with no server behind it.

liver
predicted · truth is liver
100.0%
confidence
8.011
margin over second place
Every knob sits inside the band of real variation. Running: optics → geometry → response → grain.
PROTOTYPEA working instrument over a real fit, not a certified tool.
What this is notThe band on each slider is fitted from PAIRED_CLASS data — the same abdominal volumes reconstructed in three planes, with no per-image correspondence and no subject identifiers, so it is a class-conditional marginal envelope and not a per-subject one. A plane change also shares an instrument, a protocol and a patient with its reference, which a second hospital’s scanner would not. And the model here is a linear classifier on 28×28 pixels: it is present because the browser can evaluate it exactly, not because it is a good organ classifier.
41/42
published severity constants that land outside the interval fitted to real variation
0
that land inside it
12
compared against an interval the fit pinned to a no-op
3d31f4e9ed4e
envelope 0.1, axial -> coronal
8,635
numbers in the model this page evaluates live

Move the knobs, watch it decide

The frame on the left is the image as it arrived. The one beside it is what the forward model makes of it at the current setting, computed in this tab by the same arithmetic variation/forward.py runs — asserted equal to it, pixel for pixel, over 80 fixtures by npm run check:studio.

axial, as acquired
generated in this tab
a real coronal slice, different subject
What the model says now
liver100.0%
bladder0.0%
kidney-left0.0%
femur-right0.0%

Before the knobs moved it answered liver at 100.0%. Across all 17,778 held-out axial slices this model gets 57.6% right, which is what a linear classifier on raw pixels is worth and is not a claim about anything else.

Presets

The intervals are tight enough that even the untouched image reads as outside on a knob or two: 12 of the 42 comparisons in this artifact are against an interval the fit pinned to a no-op. Magnitude is what tells the two apart — the furthest published severity on this pair sits 9.515 interval widths out.

fitted 95% intervalgrace bandfitted pointpublished severity
psf_sigma_px optics · pixels
0.0009820inside
fitted 0.0009820 · interval 0 to 0.2043inside the band of real variationdashed marks: detector_noise severities 0.3, 0.5, 0.8

the interval is CLIPPED by the generator's declared range [0.0, 4.0]; the unclipped normal-approximation bound lies outside it, so the fit is pressed against the model's own wall

fov_frac geometry · fraction of frame
1.000inside
fitted 1.000 · interval 1.000 to 1.000equal to the fitted point — this interval has no width to be inside ofdashed marks: field_of_view severities 0.92, 0.84, 0.76the fit collapsed this interval to zero width
scale geometry · fraction of reference matrix
1.000inside
fitted 1.000 · interval 1.000 to 1.000equal to the fitted point — this interval has no width to be inside ofdashed marks: resolution severities 0.72, 0.55, 0.42the fit collapsed this interval to zero width
offset_x geometry · fraction of frame width
0.0005630inside
fitted 0.0005630 · interval -0.0004070 to 0.001532inside the band of real variation
offset_y geometry · fraction of frame height
-3.00e-6inside
fitted -3.00e-6 · interval -0.05213 to 0.05212inside the band of real variation
gamma response · exponent
0.9083inside
fitted 0.9083 · interval 0.5868 to 1.230inside the band of real variationdashed marks: gamma_shift severities 1.25, 1.55, 1.9
window_lo response · normalised intensity
-0.02496inside
fitted -0.02496 · interval -0.06849 to 0.01858inside the band of real variationdashed marks: window_level severities 0.05, 0.12, 0.2
window_hi response · normalised intensity
1.024inside
fitted 1.024 · interval 1.000 to 1.049inside the band of real variationdashed marks: window_level severities 0.92, 0.85, 0.78
grain_sigma grain · normalised intensity (std)
0inside
fitted 0 · interval 0 to 0.006657inside the band of real variationdashed marks: detector_noise severities 0.02, 0.04, 0.07

the interval is CLIPPED by the generator's declared range [0.0, 0.5]; the unclipped normal-approximation bound lies outside it, so the fit is pressed against the model's own wall

grain_corr_px grain · pixels
0.0001730inside
fitted 0.0001730 · interval 0 to 3.762inside the band of real variation

NOT LOCALLY IDENTIFIED: moving it 5% of its declared range from the fitted point changes the objective by 0.00e+00 of the fitted distance. The interval is an interval around a parameter this corpus cannot see from here; it is not a measurement, and it is not a claim that the knob does nothing elsewhere in the box. | the interval is CLIPPED by the generator's declared range [0.0, 8.0]; the unclipped normal-approximation bound lies outside it, so the fit is pressed against the model's own wall

quant_levels quantisation · distinct levels
256inside
fitted 256 · interval 256 to 256equal to the fitted point — this interval has no width to be inside ofheld at its no-op by the fit, not fitted

held at the no-op, not fitted: all three planes arrive as the same uint8 uncompressed MedMNIST npz, so this stage is identical between reference and target by construction of the corpus. A fitted band here would be a confidence interval around a known constant.

jpeg_quality compression · not driven here. The canvas JPEG encoder is not libjpeg. Driving this knob in the browser would put a second, disagreeing implementation of one transform on the page, which is the failure this whole programme exists to name. The fit holds it at the no-op for an unrelated and stronger reason, printed beside it. held at the no-op, not fitted: all three planes arrive as the same uint8 uncompressed MedMNIST npz, so this stage is identical between reference and target by construction of the corpus. A fitted band here would be a confidence interval around a known constant.

Leave holding the data

Draw parameter vectors uniformly across the fitted intervals for axial -> coronal, generate the images, and take a manifest recording the envelope id, the artifact’s sha256, the generator version and the two seeds. The set is reproducible from those numbers alone.

What the band is, and what it is not

where do the chosen severity constants sit against the fitted intervals? The answer, for both pairs, is 41 outside, 0 inside — and every one of them in the same direction: the published ladder does far too much. The single most interesting line is gamma_shift, whose severities all sit above 1 while the fitted exponent sits below it. The real plane change slightly lightens midtones; every severity we publish darkens them. The transform does not point the same way as the thing it stands for.

The residual the fit could not reach is named rather than hidden: response (AUC 0.725); sharpness (AUC 0.647); noise (AUC 0.646); geometry (AUC 0.609). The sharpness group is the honest limit of the model — the modulation transfer function, and specifically its ANISOTROPY. The forward model's optics stage is one isotropic Gaussian PSF and its geometry stage one isotropic resampling scale, so every MTF it can produce is the same along both axes. A coronal or sagittal slice of an axially-acquired volume is sampled at the slice pitch along one axis and at the in-plane pixel spacing along the other: its MTF is genuinely different in x and in y. No isotropic PSF reaches that, at any sigma.

Provenance
envelope
variation/out/envelope_organ.json
sha256
4723905f944ed1de6c7103501e9fd082
generator
variation.forward 0.1.0-S2.3+fwdeac645ec
grade
PAIRED_CLASS
seed
1234
Re-derive it
python variation/fit.py
python variation/emit_studio.py --check
npm run check:studio

The last of those imports this page’s own kernel and requires it to land within one grey level of variation/forward.py on every fixture, and re-derives all 42 published comparisons with the same functions that draw the bands above. Two implementations of one transform is a thing this repository refuses to have; the permanent fix is one Rust core compiled to WASM and bound into Python, which is a later lane.

The aggregate measurement behind all of this is on synthetic variation; the single-model version you can watch break is the shift lab; the one genuine acquisition shift in public data sits on the leaderboard.