and a PacketExtension is therefore a direct child of it, no?
Not in case of IQs. PacketExtensions are here extension elements within the element underneath the IQ element. And if they appears also depends (currently) if IQ.getchildElementXML() calls getExtensionsXML().
I plan to change the IQ class so that PacketExtensions are always included in a future Smack version.