Skip to content

Release prep for v0.3.0: latest-yields conflict semantics and scalafmt - #28

Merged
arcaputo3 merged 3 commits into
mainfrom
release/v0.3.0-prep
Aug 27, 2026
Merged

Release prep for v0.3.0: latest-yields conflict semantics and scalafmt#28
arcaputo3 merged 3 commits into
mainfrom
release/v0.3.0-prep

Conversation

@arcaputo3

Copy link
Copy Markdown
Contributor

The two pre-tag items for v0.3.0, per the release plan.

latest yields to explicit specifiers

dependencyPairs compared specifiers by string equality, and a missing version resolves to
latest — so one unversioned dep in any published library hard-conflicted with every consumer
that pins a version, reachable through transitive classpath manifests rather than the consumer's
own build file. An explicit specifier now wins over latest; two different explicit
specifiers (even semantically overlapping ones like ^19 vs ^19.0.0) still fail
deterministically, and the conflict message no longer lists the irrelevant latest. Unit tests
cover both directions, order independence, and the only-unversioned case; README, CHANGELOG, and
MIGRATING-0.3 updated.

scalafmt

.scalafmt.conf (deliberately conservative: Scala 3 dialect, maxColumn = 120,
newlines.source = keep, no brace/indentation conversion — the tree legitimately mixes both
styles) plus a checkFormatAll step in CI ahead of compilation. The one-time reformat touched
10 files, +49/−26 — the tree was already near-consistent, and the config is chosen to keep it
that way rather than to re-style it.

Full suites green. After this merges, main is tag-ready for v0.3.0.

arcaputo3 and others added 3 commits August 27, 2026 12:15
dependencyPairs compared specifiers by string equality, and a missing
version resolves to "latest" — so one unversioned dep in any published
library hard-conflicted with every consumer that pins a version,
reachable through transitive classpath manifests rather than the
consumer's own build file, escapable only via npmOverrides.

"latest" is only the placeholder for an unversioned declaration, so any
explicit specifier now wins over it. Two different explicit specifiers
(including semantically overlapping ones like ^19 and ^19.0.0) still
fail deterministically, and the conflict message no longer lists the
irrelevant "latest".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deliberately conservative: Scala 3 dialect, maxColumn 120,
newlines.source = keep, and no brace/indentation conversion — the tree
legitimately mixes both styles, and this config normalizes spacing and
wrapping without re-styling it. The one-time reformat touched 10 files
(+49/-26). CI checks formatting ahead of compilation on every platform
so it cannot drift.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
GitHub's Windows runners default to autocrlf=true, which rewrote every
Scala source to CRLF at checkout — scalafmt then reported all 28 files
misformatted. .gitattributes now checks sources out as LF on every
platform; batch files stay CRLF because cmd.exe mis-parses some
constructs without it (their blobs are still stored normalized, which
is the one renormalization in this commit).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@arcaputo3
arcaputo3 merged commit ee200b6 into main Aug 27, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant