Here's the log entry:
Triggering CPA (always from first AI); Game Time: 3:22:30
effectiveAIPForCPAPurposes = this.AIProgressionLevelEffective = 112
since diff > 9, numberOfSecondsPerPointOfMinimumAIPForCPAPurposes = 240 + ( (FInt)120 * ( (FInt)9 - this.AIDifficulty ) ).IntValue = 120
minimumAIPForCPAPurposes = Game.Instance.GameSecond / numberOfSecondsPerPointOfMinimumAIPForCPAPurposes = 101
effectiveAIPForCPAPurposes = Max(effectiveAIPForCPAPurposes,minimumAIPForCPAPurposes) = 112
difficultyFactor = ( this.AIDifficulty * this.GetHandicapMultiplier() ) / ( 13 - this.AIDifficulty ) : 3.33
aiTypeFactor = 1
simulateMaxTimeWaveFactor = Mat.One + ( ( this.AIDifficulty * 2 ) / ( ( 14 - this.AIDifficulty ) * 3 ) ) : 2.67
simulateDoubleWaveFactor = 2
simulateDifficultySpecificWaveSizeMultiplier = (if <= 3 then 1, <= 4 : 1.5, <= 5 : 1.75, <= 6 : 2, <= 7 : 2.25, <= 9 : 2.5, <= 9.3 : 2.9, <= 9.6 : 3.3, <= 9.8 : 4, 10 : 5) = 5
humanHomeworldCountMultiplier = Mat.One + ( (FInt)( humanHomeworldCount - 1 ) * FInt.FromParts( 0, 330 ) ) + ( championCount * FInt.FromParts( 0, 066 ) ) = 1.53
numberOfShips (before applying cap-scale) = ( (FInt)effectiveAIPForCPAPurposes * difficultyFactor * aiTypeFactor * simulateMaxTimeWaveFactor * simulateDoubleWaveFactor * simulateDifficultySpecificWaveSizeMultiplier * humanHomeworldCountMultiplier ).IntValue = 15204
So apparently it came from a combination of having actual AIP exceed minimum AIP (by 11, so not much) and 1 home + 8 champs counting as 1.53 HWs.