Implemented only the functions already defined in src/ve2e/inference/isup.py; no helper functions were added.
Confirmed the current DinoFlex volume contract still uses t2, dwi_b1400, and adc, each shaped (B, D, H, W) before channel stacking.
Added input-shape checks, model-contract validation, canonical class-logit conversion, ISUP argmax prediction, and maximum softmax confidence.
Reused the existing ClearML EMA loader and to_class_logits production primitive.
Passed Ruff, formatting, compilation, complexity checks, and a mocked end-to-end class test.
Appended and pushed commit 019bf781 to feat/isup-inference.
Lessons Learned: Pitfalls
The input skeleton contained an explicit uncertainty comment. Treating its fields as fixed without first checking current schemas caused avoidable user frustration.
The configured default model still cannot be deserialized by the current code because its pickle references the removed SelfAttnConcatLinear class; class implementation does not change that artifact incompatibility.
Lessons Learned: Improvements
Resolve explicit TODO questions against current production schemas before implementing around them.
Keep inference inputs explicitly documented as model-ready when the class does not own resampling, cropping, or normalization.