Skip to content

test(pkg): cover platform-specific solver diagnostics - #16210

Merged
Alizter merged 1 commit into
ocaml:mainfrom
Alizter:push-ptltnwtr
Aug 26, 2026
Merged

test(pkg): cover platform-specific solver diagnostics#16210
Alizter merged 1 commit into
ocaml:mainfrom
Alizter:push-ptltnwtr

Conversation

@Alizter

@Alizter Alizter commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Record the current per-platform diagnostic behavior before joint multi-platform solving changes it.
  • Cover a conditional dependency failing on one requested platform and identical failures on two of four requested platforms.
  • Cover a pin whose availability differs by platform, including alternative selection and the mandatory-pin failure path without reporting repository versions shadowed by the pin.
  • Correct stale prose for non-boolean availability filters, which are already treated as unavailable without printing a warning.

This is a green preparatory change for #15982; it does not change solver behavior.

Checks

  • dune runtest test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-all-or-nothing.t test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-platform-rejection-reason.t test/blackbox-tests/test-cases/pkg/unavailable-packages.t

Record the current per-platform behavior for diagnostics that joint
multi-platform solving changes.

Cover failures affecting one requested platform and identical failures on
two of four platforms. Also cover a pin whose availability differs by
platform: it can be selected where available while another package satisfies
the dependency elsewhere, and only the pinned version is reported when it
becomes mandatory and unavailable.

Correct stale prose for non-boolean availability filters, which are already
treated as unavailable without printing a warning.

Signed-off-by: Ali Caglayan <alizter@gmail.com>
@Alizter
Alizter marked this pull request as ready for review August 25, 2026 23:57
@Alizter
Alizter merged commit 8cd8326 into ocaml:main Aug 26, 2026
36 of 38 checks passed
@Alizter
Alizter deleted the push-ptltnwtr branch August 26, 2026 00:04
@Alizter Alizter added this to the 3.25.0 milestone Aug 26, 2026
Alizter added a commit that referenced this pull request Aug 26, 2026
## Summary

- Build one SAT universe containing every requested platform instead of
solving each platform independently.
- Make roles, availability, conflict classes, and result extraction
platform-aware.
- Constrain every platform role for a package to select the same
version, choosing an older common version when necessary and failing
when no common version exists.
- Resolve each platform's package formulas against only the packages
selected on that platform, preserving platform-specific dependency
alternatives.
- Generate conditional lock-file data directly from the joint result and
remove obsolete result-merging APIs.
- Keep diagnostics origin-aware: repository pre-rejections are reported
only for repository-backed roles, and failures affecting a subset of
requested platforms retain their platform qualifiers.
- Remove the unreachable warning path for non-boolean availability
filters, which are treated as unavailable.
- Credit: the cross-platform version-equality SAT encoding was proposed
by @art-w in #13647.

This branch is rebased on `main` after #16210 landed. It does not
include #16172 or #16173.

## Landed preparation

The following independent preparatory PRs have landed on `main`.

### Observability and solver invariants

- #15923 adds the opt-in SAT trace category and `sat/solve` statistics.
- #15961 records solve counts and statistics in the existing solver
tests.
- #15962 snapshots all-or-nothing failure, deduplicated manifest errors,
and the legacy per-platform version divergence.
- #15981 makes portable lock-directory generation all-or-nothing before
changing the solver architecture.

### Per-platform semantics

- #15998 preserves per-platform dependency-alternative selections.
- #15999 preserves platform filters in local package constraints.
- #16000 preserves platform-specific rejection reasons.
- #16001 records legacy per-platform version selection.
- #16002 covers extra files when platforms converge on a common version.
- #16003 preserves the single-platform SAT problem size.
- #16009 preserves legacy dependencies whose names overlap formula
constructors.
- #16010 preserves platform-local conflict-class diagnostics.

### Joint-solve edge cases

- #16040 covers a solvable portable platform set.
- #16041 reproduces duplicate-platform failures.
- #16042 records per-platform avoid minimization.
- #16057 preserves platform-specific alternatives selected for local
package dependencies.
- #16058 ignores malformed repository versions excluded by local
constraints.
- #16084 preserves post-dependency reachability independently for each
platform.
- #16210 records per-platform diagnostic behavior for one-of-many and
two-of-four failures, platform-dependent pin availability, repository
versions shadowed by pins, and non-boolean availability filters.

### Build and tool integration

- #16167 snapshots host-platform package selection in build contexts.
- #16168 covers dev-tool compiler-package relocking and lock reuse.
- #16169 snapshots the former precedence between explicit
`solve_for_platforms` entries and conflicting lock-stanza solver
variables.

## Independent related fixes

The following sibling PRs are based directly on `main` and are not
dependencies of this PR:

- #16172 rejects solver variables repeated across lock-stanza
environment fields and honors valid lock-stanza environments during
package builds.
- #16173 compares project and dev-tool compiler packages semantically,
avoiding unnecessary relocking while preserving same-version
recipe-change detection.

## Review fixes

- Compute post-solve reachability separately for every platform before
taking the union, so a local package's macOS alternative is not dropped
after its Linux alternative is visited first.
- Keep versions rejected on every platform out of manifest loading,
while retaining platform-local candidates needed by another platform.
- Do not attach repository pre-rejections to local or pinned roles,
whose repository versions are not candidates.
- Preserve platform annotations whenever a failure affects fewer than
all requested platforms, including identical failures on two of four
platforms.
- Report cross-platform version conflicts with the selected version and
platform instead of an opaque SAT clause.
- Rename and rewrite the no-common-version regression so its name and
prose match the enforced invariant.
- Remove the redundant platform-version extra-files regression at the
commit where joint version equality makes it obsolete.
- Avoid constructing a discarded non-portable platform input and remove
the unreachable non-boolean availability warning.

## Checks

- `dune runtest test/blackbox-tests/test-cases/pkg/portable-lockdirs`
- `CI=true dune build @fmt @check`

Closes #13647
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant