Why is this so, what would make it unstable?
We currently have constant sources that add or remove from the system total, decay that removes a percentage of the system total each turn and moves it towards 0 as total sum and diffusion which does nothing to the total sum (it just distributes it different). When no further sources and drains are added, it moves towards a state of flow balance.
If it is calculated well, that is (which it currently is not good enough but I will get to that later). A strict limit in the values can disturb that. Of course there is the possibility to have some weaker limits like a stronger decay on negative values.
Is propagation dependent on the source value changing, or is propagation triggered merely by an attempt to change the value regardless of whether it has or not? (such as being at the max/min)
The dynamic properties are solved once per turn, regardless if they changed or not.
Why would luck be involved in the order of property manipulator processing? Is it not the same order each time? Are you using multiple thread that make race conditions on who gets to change the value first? (that's my first though as to how luck might come into play)
Multiple threads are indeed used. Propagators and sources are split among the threads.
Does it really matter who gets to change the value first, so long as all of them get the chance to change it? If the base property value is already so close to the maximum that 2 out of three upward adjustments result in no change, how harmful is that?
Order only matters in regards to percentage based manipulators like diffusion and decay. The order of the constant sources does not matter at all. It might well be that a cut after all property calculations once per turn works well. Depends on a try. But it definitely has to be considered where exactly to apply it.
If perchance the above happen, and then a downward adjustment happen, you have a lower base value at the end of processing the 4 adjustors. Whereas, if the downward adjustment happen first, followed by the 3 upwards adjustments, the base value could well hit the maximum again. However, in this case, won't it self correct within the next turn or two? While this might lead to some odd, unreliable delta trends when at the maximum (or minimum) if the maximum is sufficiently above the target value of the "worse case" (example pollution at 2000?) weird turn to turn deltas deriving purely from variable process order, that don't dip it back below 2000, won't matter much.
Finally, how do you gather all your adjustor deltas before applying them to the base property value? Do you allow each potential adjustor to access and change the property directly or do you sum up all of the possible positive and negative adjustors to get a final adjustment value and apply that to the base value only once (for a given turn). If the latter case, processing order should not alter the final adjustment value.
All property manipulators compute their delta on all properties on all objects. This is then summed up on each object and afterwards all property manipulators get a chance to revise their delta. The result is then summed up again and actually applied.
After careful consideration I don't actually think that we have a case of integer overflow as the cause. It can happen as a result but the amount of sources needed for it to be the prime cause would be excessive (anything up to 5 million per turn added in a single city should still work and what would be the point of it with only up to around 1000 having a real effect).
My prime suspect is the diffusion propagator on trade routes. The problem is that trade routes are not symmetric and neither is the diffusion propagator. A single application of it only works in one direction. So we get a maze of one way diffusions with some cities being the target of a huge amount of trade routes.
If that city is then very low on crime while the other cities are not, the difference causes a moderate flow of crime from each of those cities which sums up to a number that rivals the difference in the first place. The revising step is not strong enough to counter that so the city ends up with high crime after a single turn. The net effect is that crime is now more concentrated than before and some strong trade cities will start to oscillate between high and low crime.
For now I'd suggest to remove the diffusion to trade cities until some counter measures are made. It did not make sense in the first place for properties like pollution anyway.