Variation studio
Move the acquisition knobs and watch the model change its mind — with the band of real variation drawn on every slider.
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.
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.
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.
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.
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
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
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
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.
- envelope
- variation/out/envelope_organ.json
- sha256
- 4723905f944ed1de6c7103501e9fd082
- generator
- variation.forward 0.1.0-S2.3+fwdeac645ec
- grade
- PAIRED_CLASS
- seed
- 1234
python variation/fit.py
python variation/emit_studio.py --check
npm run check:studioThe 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.