Not really sure how it is determined WHERE reinforcements appear. It used to be that they would by created on a per-guardpost basis, including wormhole guardposts, and would appear there.
Now, it looks like reinforcements are created at the reinforcement warp gate - in most systems, the Command Station, although it can be a Troop Accelerator or similar AI unique, as well.
Here's part of an older log:
Spoiler for Hiden:
***Doing guard-post reinforcement pulses:
reinforcementStrengthPerPulse = AIP/40 = 0.4
reinforcementStrengthPerPulse *= (tech level multiplier) = 0.36
reinforcementStrengthPerPulse *= MultiplierFromHumanHomeworldsAndChampions = 0.72
reinforcementStrengthPerPulse must be at least 1 and at most 14; = 1
after AdjustNumberShipsFromAIType, reinforcementStrengthPerPulse = 1
---doing pulse for SpecialForcesCommandPost
StrengthBudget += 3 = 2
AIBuyShipsFromList StrengthBudget = 2
bought 1 SpireBladeSpawnerII for 57.6
total count bought: 1, total strength spent: 57.6, remaining = -55.6
---doing pulse for AIPassiveGuardPostII
StrengthBudget += 1 = -54.6
AIBuyShipsFromList StrengthBudget = -54.6
total count bought: 0, total strength spent: 0, remaining = -54.6
---doing pulse for AIMLRSGuardPostII
StrengthBudget += 1 = -53.6
AIBuyShipsFromList StrengthBudget = -53.6
total count bought: 0, total strength spent: 0, remaining = -53.6
---doing pulse for AIShortRangeGuardPostII
StrengthBudget += 1 = -52.6
AIBuyShipsFromList StrengthBudget = -52.6
total count bought: 0, total strength spent: 0, remaining = -52.6
---doing pulse for AIMLRSGuardPostII
StrengthBudget += 1 = -51.6
AIBuyShipsFromList StrengthBudget = -51.6
total count bought: 0, total strength spent: 0, remaining = -51.6
---doing pulse for AIShortRangeGuardPostII
StrengthBudget += 1 = -50.6
AIBuyShipsFromList StrengthBudget = -50.6
total count bought: 0, total strength spent: 0, remaining = -50.6
---doing pulse for AISpireShieldSphereGuardPostII
StrengthBudget += 1 = -49.6
AIBuyShipsFromList StrengthBudget = -49.6
total count bought: 0, total strength spent: 0, remaining = -49.6
---doing pulse for WormholeCommandPost
StrengthBudget += 1 = -48.6
AIBuyShipsFromList StrengthBudget = -48.6
total count bought: 0, total strength spent: 0, remaining = -48.6
---doing pulse for WormholeCommandPost
StrengthBudget += 1 = -47.6
AIBuyShipsFromList StrengthBudget = -47.6
total count bought: 0, total strength spent: 0, remaining = -47.6
---doing pulse for WormholeCommandPost
StrengthBudget += 1 = -46.6
AIBuyShipsFromList StrengthBudget = -46.6
total count bought: 0, total strength spent: 0, remaining = -46.6
---doing pulse for WormholeCommandPost
StrengthBudget += 1 = -45.6
AIBuyShipsFromList StrengthBudget = -45.6
total count bought: 0, total strength spent: 0, remaining = -45.6
As you can see, it used to buy units post-by-post. There was a lot of interesting math in determining the total budget and assigning reinforcement pulses - totally neutering a system actually made each reinforcement pulse stronger than the base size, even if fewer posts got reinforced.
Also, high-priority reinforcement systems would get two reinforcement pulses - but the second one only came if there were leftover pulses after the first round of high-priority targets had been reinforced.
Here's part of a new log:
Spoiler for Hiden:
= Trying to reinforce Notinuo (#1)
planet.CurrentFleetshipReinforcementBalance = -0.65
Reinforcement focus types: MLRS,Fighter,Cruiser
numberOfGuardables = planet.FgNonWormholeNonSpecialForcesGuardPosts.Count + ( planet.OrbitalCommandStation == null ? 0 : 1 ) = 1
currentPopulation = rollup.AlliedUnits.Count + rollup.Planet.FgColdStorageUnits.Count = 13
populationCap = numberOfGuardables = 1
populationCap *= Game.Instance.Options.UnitCapScale.AIShipCapPerPost = 100
since !(planet.WasOriginallyHomePlanet || planet.IsCoreAIPlanet), maximum = Game.Instance.Options.UnitCapScale.AIShipCapMaxNormal = 700
minimum = Game.Instance.Options.UnitCapScale.AIShipCapMinimum = 200
populationCap = Max(populationCap,mimimum) = 200
currentPopulation < populationCap, so proceeding with reinforcement here
multiplierFromPriority = 1
due to reinforce priority >= 2000, multiplierFromPriority += 1 = 2
multiplierFromSpecialStructures = 1
multiplierFromGuardPosts = 1 + planet.FgNonWormholeNonSpecialForcesGuardPosts.Count * 0.1 = 1
reinforcementFleetShipBudget = baseReinforcementFleetShipBudget = 6
reinforcementFleetShipBudget *= multiplierFromPriority = 11.99
reinforcementFleetShipBudget *= multiplierFromSpecialStructures = 11.99
reinforcementFleetShipBudget *= multiplierFromGuardPosts = 11.99
planet.CurrentFleetshipReinforcementBalance += reinforcementFleetShipBudget = 11.35
called Helper_PickUnitsForReinforcement with: Fighter, Bomber, MissileShip, MLRS, ZenithSiegeEngine
which became, after calling PruneFGTypeListAccordingToPlanetReinforcementTypes, : Fighter, Fighter, Fighter, MissileShip, MLRS, MLRS, MLRS, MLRS, MLRS, MLRS, MLRS, MLRS, MLRS
** Picked
5 MLRS @ 2.53 each = 12.63
After picking fleet ships, planet.CurrentFleetshipReinforcementBalance = is now -1.28
= checking for starship or guardian reinforcements
reinforcementFleetShipBudget: 11.99
player.AITypeData.StarshipBudgetMultiplier: 0.08
= reinforcementStarshipBudget = reinforcementFleetShipBudget * player.AITypeData.StarshipBudgetMultiplier * 8 = 8.06
planet.CurrentStarshipGuardianReinforcementBalance += reinforcementStarshipBudget = 2.5
maxStarshipsAtPlanet = planetReinforcementAITechLevel * 3 = 3
current starship count: 0
this planet is adjacent to a human homeworld, so can't pick guardians
maxGuardiansPerGuardable is 1, plus 1 if Diff >= 8, plus 1 if Diff >= 10: 2
totalAllowedGuardians = numberOfGuardables * maxGuardiansPerGuardable = 2
currentGuardianCount: 0
called Helper_PickUnitsForReinforcement with: LightStarship, Dreadnought, LeechStarship
which became, after calling PruneFGTypeListAccordingToPlanetReinforcementTypes, : LightStarship, Dreadnought, LeechStarship
** Picked
1 LightStarship @ 96 each = 96
After picking, planet.CurrentStarshipGuardianReinforcementBalance = -93.5
remainingReinforcements -= multiplierFromPriority = 0
totals for planet 1 (Notinuo); count: 6, strength: 108.63
totals for MLRS; count: 5, strength: 12.63
totals for LightStarship; count: 1, strength: 96
== grand totals; count: 6, strength: 108.63
Here, we see several things.
First, that 2 * 6 = 11.99.
Second, the budget is determined all at once, with a base value multiplied by the number of guardposts + command station. Wormhole guardposts are NOT included on this list. They do count towards the system population cap, though, but do not increase the cap like other guardposts. So wormhold guardposts are really and truly good for nothing.
Third, high priority systems receive a single double reinforcement pulse right at the beginning. So a few higher priority systems can totally consume the reinforcement pulses for lower priority systems. However, the list still loops once, so a system can actually receive two double-strength pulses.
I set up a game with a beachhead, and watched it reinforce for a few hours gametime (+10 FTW) as I read a book. The reinforcements appeared at the AI Command Station (or possibly the Warp Gate, couldn't tell) and the normal guardposts. Never at the wormhole guardposts. Also never at the Special Forces guardpost (they are also good for nothing these days, it seems). But despite most reinforcements appearing at the Command Station, not all did. It looked kind of like it was doling them out by ID number, as the high ID number GPs got reinforcements much less often. But sometimes they did anyway.
In otherwords, I experimented a bunch, and can say: I dunno.