What we found
After extensive testing, we discovered that +SP recovery% doesn't necessarily apply to all of your +SP/tick. Specifically, the amount of +SP/tick used to calculate +SP recovery% is 1 + [int/6] + [maxsp/100]. This is fine if your INT is below 120, but then it starts to fall apart. That's because this is not the formula for base +SP/tick. The real formula is 1 + [int/6] + [maxsp/100] + (int<120 ? 0 : 4+[int/2-60]), and it has been this way for many years--at 120 INT you get a sizable bonus and an additional +SP/tick for every 2 points of INT beyond 120.
What this means
If you have 120 or higher INT, the amount of extra SP recovered from +SP recovery% items is lower than what you'd expect. The higher your INT is, the greater the difference. For example, on my AB with 138 total int, 77 base luk, and 4.5k max SP, I get +82 SP/tick with no modifiers, and I should have +106 SP/tick with just Meditatio10 and +188 SP/tick with Meditatio10+AA. Instead, I get +102 SP/tick with just Meditatio10 and +171 SP/tick with Meditatio10+AA (because the +% stuff pretends my base SP recovery is +69 SP/tick, instead of the +82 SP/tick it actually is).
Summary
Expected +SP/tick: (from http://irowiki.org/wiki/SP_Recovery)
var SPR = 1; SPR += Math.floor( MAX_SP / 100 ); SPR += Math.floor( INT / 6 ); if (INT >= 120) { SPR += 4; SPR += Math.floor(INT / 2 - 60); } SPR = Math.floor( SPR * (1 + SPR_MOD * 0.01) );
Actual in-game +SP/tick:
var SPR = 1; SPR += Math.floor( MAX_SP / 100 ); SPR += Math.floor( INT / 6 ); SPR = Math.floor( SPR * (1 + SPR_MOD * 0.01) ); if (INT >= 120) { SPR += 4; SPR += Math.floor(INT / 2 - 60); }
What is the explanation for this behavior? When I have +130% SP recovery, I expect +130% of my SP recovery... not +130% of some artificial, arbitrarily calculated lower base value.