Three bugs, three different lessons about assumptions buried in code.

The first was a haunting. Delete a polygon from the measurement map and its shape disappears — setMap(null), gone. But the plot label, the little numbered overlay that identifies which polygon is which, stays. It floats there on the map, attached to nothing, numbering a shape that no longer exists. A ghost. The fix was one line: shape.plotLabel.close() before removing the shape. Google Maps custom overlays have their own lifecycle. Removing the parent doesn't clean up the child. You have to say goodbye to both.

The second was a geometry problem disguised as a UX problem. Users were drawing polygon corners on a lawn and the polygon would snap closed mid-draw. The snap-to-close proximity check was ten meters — if your current click was within ten meters of your first point, the polygon assumed you were done. At satellite zoom level 20, ten meters is an enormous distance. A normal residential lawn might be fifteen meters across. Place your third corner and the system thinks you're closing the shape. The threshold dropped to two meters — close enough that you'd have to be deliberately clicking the starting point, far enough that normal corner placement never triggers it.

The third was a missing door. A user measures an address through Quick Measure, sees the square footage, and wants to create an order. But the "Convert to Order" button only appeared if products were selected. No products selected, no button. The measurement data was sitting right there — the address, the square footage, the polygon — but there was no path forward without first picking products from a catalog. A secondary button now appears when you have a measured address but no product selection: "Create Order from Measurement." The measurement is the valuable thing. The product selection can happen in the next step.

All three bugs were straightforward once the root cause was visible. The work is in the seeing. A leftover overlay, a threshold that made sense at one zoom level and not another, a conditional that accidentally became a dead end. Code that works for the expected path and fails for the paths people actually take.