To see artifact you need add some LUT in TimeCube + apply some gamma correction in Levels.
Code:
clip = core.std.Levels(clip=clip, min_in=64, max_in=940, min_out=64, max_out=940), gamma=0.50
If other filters with 32 bit RGB internal processing don't require additional RGB->YUV transformation after them, it is probably a bug in TimeCube and i can contact TimeCube developer.
From other point of view, it sounds logical to output maximum possible bit depth and unchanged color to provide more data to other filters. So TimeCube may be just designed like this.
10 bit source -> 32 bit TimeCube -> 32/16 bit color correction -> 32/16 bit noise Reduction -> 32 bit resize -> export to 12 or 10 bit video file.
At least apps like Davinci Resolve and similar works like this. They upscale any source to 32 bit RGB internally for color correction and other filters processing.
P.S. I read some tips
http://www.vapoursynth.com/doc/functions/levels.html http://www.vapoursynth.com/doc/avisynthcomp.html and played with Levels green/purple gamma shift bug, and seems i also believe that it is a bug in Vapoursynth.
Gamma correction works normally if source transformed to RGB. But in YUV it produce green/purple gamma shift.
And just to illustrate my explanation that luma only gamma is not the same as normal gamma:
planes: all Gamma adjusted in YUV. Green/Purle color shift problem (probably bug in Vapoursynth):
planes: luma Gamma adjusted in YUV. No color shift problem, but "desaturation" effect that is essential for this sort of luma only adjustment.
planes: all Gamma adjusted in RGB. This is how any normal gamma adjustment usually look:
As a reference here is screengrab with gamma adjusted PhotoLine graphic editor. Some difference may be due video player screengrabs color management and range transformations, but overall look is near the same. It is dark but not desaturated: