In SemVer, the second bundle, with a version of 0.0.0, is considered a higher version than the first bundle with a version of 0.0.0-20240506.2. The latter version is considered a prerelease due to the -. A prerelease is lower in version sort order than an equivalent version (0.0.0) without the -. If you're expecting a newer local build to be a "later" version, this SemVer rule will
Both bundles install packages into the same 0.0.0 root, so they overwrite. platforms/Windows/SideBySideUpgradeStrategy.props uses the Major.Minor version to define the upgrade version ranges so 0.0.0 can't coexist. If you want that ability, you could define in SideBySideUpgradeStrategy.props different version ranges for "semi-official" builds (e.g., 0.1 or 1.0 as a version that won't overlap with official Swift builds).
From FireGiant: