I’ve read just about every circle packing post on here and the original Grasshopper forum. So many ways to skin that cat. The method I’ve latched onto uses a C# script from god knows where/when. It’s just a little buggy compared to newer methods and I’m not sure how to update it or find a post-Kangaroo 2 alternative.
This is my simple perforation definition.

circle pack perforation.gh (21.4 KB)
This Circle Packing definition below by @DanielPiker isn’t as tight around the boundaries as I’d like, it’s also built around Sphere Collider so I don’t know how to adapt it to multiple size circles with offset spacing, like I did with the perforation script but it works so smoothly, when I push boundary the circles just overlap a little instead of popping out like the one above. It’s far more forgiving and you can add pull.
I’d love to find a middle ground, or at the very least understand what that C# script in my perforation def is doing and how to modify it.