Caret and tilde constraints resolve differently than you expect

Both operators mean “this version or a bit newer” and they differ in where the ceiling sits. The difference only shows up when a dependency releases a minor version, at which point one of them upgrades and the other does not.

"^1.2.3"   // >=1.2.3 <2.0.0   — minor and patch
"~1.2.3"   // >=1.2.3 <1.3.0   — patch only
"~1.2"     // >=1.2   <2.0.0   — minor and patch
"1.2.*"    // >=1.2   <1.3.0

~ is stricter with three components and equivalent to ^ with two, which is exactly the sort of rule that gets misremembered. ^ is the right default because it matches what semantic versioning promises. It also assumes the package actually follows semver — for one that does not, a tighter constraint is not paranoia.