The obstacle pre-scan ran before component placement, caching None for every pin on components being created in the same batch. Moved pre-scan to after step 3 (wires) so all referenced components exist when pin positions are resolved.