Why the first number matters
A major bump is a promise that the interface may have changed. If your code survived 1.9.9 and 2.0.0 fails, that is the contract working as designed. If it silently misbehaves, you depended on something the version string did not promise.
Where version strings come from
Package managers, image tags, and API headers all carry them. The discipline is the same everywhere: compare numerically, pin explicitly, and treat a moving label as a convenience, not a dependency.