Faixa de versão e versão fixa
Uma faixa como ^1.2.0 deixa a instalação puxar sozinha a versão mais nova que couber; uma versão fixa, não.
No manifesto você pode pedir uma dependência de dois jeitos. Fixa: "date-tools": "1.4.3" instala exatamente 1.4.3, sempre. Em faixa: "date-tools": "^1.2.0" aceita qualquer versão de 1.2.0 (inclusive) até 2.0.0 (exclusive), e o instalador puxa a mais nova que couber. O acento circunflexo (^) deixa subir menor e correção; o til (~1.2.0) deixa subir só a correção.
A faixa é cômoda (você ganha correções sem mexer no manifesto), mas perigosa: se uma versão nova dentro da faixa introduz uma falha, um install futuro a traz sozinho, sem você pedir. Por isso existem o lockfile (que grava a versão exata resolvida, para todos instalarem igual) e o hábito de fixar versões sensíveis.
Exemplo: o manifesto pede ^1.2.0 e o registro tem até 1.9.0. Um npm install resolve para 1.9.0 (a mais nova da faixa). O aviso diz que date-tools é afetado em >= 1.5.0 < 1.9.2, então 1.9.0 caiu bem no buraco. Ao lado, report-gen estava fixo em 3.0.1 e nem se moveu. O conserto é fixar date-tools numa versão boa (como 1.4.3) e versionar o lockfile. Em Python, date-tools>=1.2 é a faixa e date-tools==1.4.3 é a versão fixa.