This particular issue got caused by overlapping plane outlines of the same priority and the overlapping plane being enclosed by a track.
All planes get filled ordered by their priority, so planes of the same priority don’t “know” about each other and could have their fragments (calculated shape) overlap. Usually, this gets caught in DRC. In your case, the GND plane was pushed back from the offending plane by the surrounding track.
So why did this cause the inner plane to vanish from the gerber document? Gerber doesn’t really know about holes in polygons. Instead, you draw another polygon with the polarity set to “light” that will erase everything underneath it. Obviously, this introduces a dependency on the order things get drawn in. Conceptually, planes of lower priority sit “on top of” planes of higher priority, so planes of higher priority need to get drawn first.
Since all planes on your board have the same priority, the order they’re drawn in is random, so the hole in the GND plane can erase the plane underneath it.
Setting the top GND plane’s priority to 1 fixes the gerber output.
Making sure that planes of identical priority don’t overlap isn’t really a task for humans, so we now have a check for that: board rules: check for plane priorities · horizon-eda/horizon@644e2c8 · GitHub As it runs more or less instantly, I also added it to the checks performed before exporting the fabrication output.