I used the console command;
give_trait "Simon Selvo" Corrupt 4, and it did indeed remove the Corrupt trait entirely. Upon ending the turn and refusing the AI's Bribe, he gained a rank in the Loyal trait (which is the second anti-trait, along with Upright, of Corrupt).
However, when I reloaded the game (where he still had the Corrupt trait) and used;
give_trait "Simon Selvo" Loyal 1 he did not gain the loyalty. Instead, it boosted his Corrupt trait up to level 2 (called "Underhanded").
When I used the command to give him "Upright 1" once, there was no change to his traits. When I did it a second time, the Corrupt trait again worsened to Underhanded.
I tried the give_trait command on another character with the Lewd trait (at the first level - "Crude"). When I tried giving him 1 level in Prim (which is the anti-trait), it instead progressed the Lewd one.
However, using give_trait StrategyDread on a character that had some levels in StrategyChivalry seemed to work perfectly fine, and reduced the Chivalry trait just like it should have.
So...yea, I'd say there was some buggy stuff with traits. It makes no sense to have a bribe refusal make a character
more corrupt. There's already a no going back level in place, so it seems obvious that it was
intended that one would be able to reverse some traits; but it seems to be completely impossible without using the console to manually remove certain traits first, which completely removes the "natural" progression and regression that the game should have.
One question regarding giving traits with the console; when you set a trait to an impossible number, is the trait really gone? Or does it simply become somehow hidden, and still provide the negative effects? Since I received the Loyalty line for bribe refusal after setting Corrupt to 4, it seems as though it's gone. Just a strange way of doing it I guess; I'd have expected setting it to 0 would be the way to remove a trait
