The two rules people get wrong
A caret allows changes that do not modify the leftmost non-zero part of the version. On a released package that means the major is pinned, which everybody knows. On a zero-major package it means the minor is pinned - so a caret on a zero-point-two release behaves exactly like a tilde, and will not accept the next minor.
That is not a footnote. Every pre-1.0 dependency in a lockfile is governed by it, and it is the single most surprising behaviour in the system. A caret on a zero-zero-x version is narrower still: it accepts nothing but that exact version.
The second rule is prereleases. A release candidate does not satisfy an ordinary range even when it falls inside the numeric window, because a prerelease only qualifies if the range itself names a prerelease at the same major, minor and patch. That is why an install can refuse a version that looks obviously in range, and the tool says so explicitly rather than returning a bare no.