The surface the renderer's draw loop needs from the skinned unlit program — UnlitProgram's contract plus the palette upload. Structural, so the renderer never names the class that implements it.
UnlitProgram
Uploads the material colour, scaled by its opacity.
Optional
Selects the map and vertex-colour multipliers, mirrored on change.
Uploads the item's joint palette — 16 floats per joint (§54).
Uploads one render item's world matrix.
Uploads projection * view, once per viewport.
projection * view
Makes this the current program.
The surface the renderer's draw loop needs from the skinned unlit program —
UnlitProgram's contract plus the palette upload. Structural, so the renderer never names the class that implements it.