Took some digging, but I found the formula.
tmpstream << (total_mass() * 1000);
bicycle.item_vars["weight"] = tmpstream.str();
// TODO: how to calculate the volume?
tmpstream.str(std::string());
tmpstream << (total_mass() * 10);
bicycle.item_vars["volume"] = tmpstream.str();
So both volume and weight are based off of the total mass it seems. It looks like making the volume *1 and the weight *10000 would make it behave more the way you’re expecting, but it seems like a better long term solution would be to add a separate “volume_folded” attribute to foldable parts, and probably to leave the other numbers the same. I’d like to test out assume numbers before coding anything, but this is on my radar.