Thrifty works just fine, it's just coded directly into the jobs instead of being a proper modifier - that's also the case for the effects of repugnant and charismatic, as can be seen in these parts of the clerk code:
Code:
clerk = {
[...]
planet_modifier = {
planet_amenities_add = 2
trade_value_add = 2
}
triggered_planet_modifier = {
potential = {
OR = {
has_trait = trait_robot_domestic_protocols
has_trait = trait_charismatic
}
}
modifier = {
planet_amenities_add = 0.4
}
}
triggered_planet_modifier = {
potential = {
has_trait = trait_repugnant
}
modifier = {
planet_amenities_add = -0.4
}
}
triggered_planet_modifier = {
potential = {
OR = {
has_trait = trait_thrifty
has_trait = trait_nuumismatic_administration
}
}
modifier = {
trade_value_add = 0.5
}
[...]
}
The same is also true for a lot of Civics and similar effects, depending on what the devs are trying to achieve, the implementation can take a whole array of different forms.
To check whether an effect that has no modifier is actually active or not, you pretty much have to open the whole common and script folders in a text editor such as Notepad++ and then do a bulk-search for the trait name. Something will most likely show up.