Since I've got a bit of time and was poking around stuff, I thought I might as well clear this up.
Char Level H MHP L MHP
Cloud: 7 334 323
Cloud: 12 474 441
Cloud: 22 955 892
Cloud: 32 1753 1658
Cloud: 42 2806 2639
Cloud: 52 4069 3826
Cloud: 62 5435 5123
Cloud: 82 7834 7381
Cloud: 99 9554 9007
BaseDifference = 40 * CurveBase + (level - 1) * CurveGradient [CurveBase is between -128 - 127 inclusive]
Difference = (1 .. 8) + (100 * BaseDifference / CurrentMHP) - 100 [capped between 0 and 11; L MHP uses 1 and H MHP uses 8]
NewMHP = CurrentMHP + Floor(RandomBonus(Difference) * CurveGradient)
Your problems are twofold. First, you were rounding
(100 * BaseDifference / CurrentMHP) to the nearest number, not rounding down/truncating. As such, it's really no wonder your ranges are much higher than they should be. If you rounded down, you'd get the theoretical base range of 8965-9508 for Cloud at L99.
But that's still not the fulll range of 8960-9511, of course. Why is that? Simple:
But, you should know that achieving max HP requires that you must take lower than max gains at some levels....
At L11, Cloud's HP range is 385-410, which matches the "always take lowest gain" to "always take highest gain" values. But at L12, the correct range is 435-472, not 439-464 as you might expect.
If you had 410 HP at L11, your difference would be 2% of the baseline of 422, giving you a maximum HP Gain of 1.3 * 42 = 54. So 410 + 54 = 464.
But if you had 409 HP at L11, your difference would instead be 3% of the baseline of 422, giving you a maximum HP Gain of 1.5 * 42 = 63. So 409 + 63 = 472.
It's not a huge increase, and the lower HP quickly catches up, and in fact can still get to Cloud's highest max HP from that value... but this example just showcases the mechanic that makes even more of a difference at higher level, where there's less chance to catch up and every point counts.
Oh, and you can easily test the 'base' range ingame by simply altering the executable at the HP/MP growth stage and get it to always spit out 1s or 8s, and then just level from 6 to 99 quickly (easy if you also set Cloud's starting XP to a large enough value). Obviously, this won't get the true range (and you can't without a far more complex and time-consuming routine), but it'll be close enough.
EDIT: I also just found an error in his example:
The minimum for him in that level bracket would, of course, be 40% of 98, or 58 (remember to round down).
40% of 98 is not 58, it's 39. 58 is ~60% of 98
That was a by-hand example, and yeah, looks like I took 40% of 147 instead. My apologies on that. The actual range data was calculated via a program, and have been proven by people after Max Stats (although FF7's crappy RNG meant that a new path had to be found by someone because it's impossible to get both Max HP and Max MP at the same time).
And while I'm taking a quick look at things, I'll note the following about certain things in Wall Market/Proud Clod.
AI Trigger: Ally Death: This trigger is actually run at the End of Battle, not on Ally Death.
AI Trigger: Post-Attack: This is a far worse name than what I've tended to call it (PreTurn). I never called it PreTurn because I thought it happened as soon as someone's Time Bar finished filling. I called it PreTurn because it happens before whatever command you enter gets to do things. You could call it Pre-Command, I guess, but since it's triggered by any queued command (including Poison damage, I believe), it's a really difficult thing to name. The point is that the changes it makes all occur before the attack is run. Of course, an enemy can't use it to attack before you hit due to the attack queue, but it can certainly do stuff like alter its invincibility state or evasion before your attack even connects.
Battle-specific Party AI: Proud Clod could use the ability to set/change the Battle specific AI data for party members. Much like Enemy AI starts at 0xE80 with 3 records (one for each enemy), Party AI starts at 0xC80 with 4 records (one for each enemy formation). This is used in FF7 to deal with things like removing Waterpolo from a dead party member, but it has the potential to be used for so much more.
Attack Data: Attack Damage: You really need to split this up into the two different pieces of data it really is: the Attack Type and the Attack Formula. The Attack Type dictates whether the attack is Physical or Magical (and thus whether Att or MAt is used), whether there will be a Critical Hit or not, what type of accuracy is used, and whether any custom formulas must be used. The Attack Formula dictates how the damage is calculated, and with the exception of Attack Types 6, 7 and A, the formulas work the same no matter what the Attack Type. Being able to set both Type and Formula individually offers far more customisation.