Skip to content

fix(manifest): block on a non-blocking JVM failure whose module resolved nowhere - #1647

Merged
Jeppe Fredsgaard Blaabjerg (jfblaa) merged 2 commits into
jfblaa/maven-facts-tolerated-pomsfrom
jfblaa/facts-report-resolved-modules
Oct 23, 2026
Merged

Jeppe Fredsgaard Blaabjerg (jfblaa) merged 2 commits into
jfblaa/maven-facts-tolerated-pomsfrom
jfblaa/facts-report-resolved-modules

Conversation

@jfblaa

@jfblaa Jeppe Fredsgaard Blaabjerg (jfblaa) commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

LLM Description written by Claude Code:claude-opus-5-5

  • Variant ambiguity stays non-blocking only when its module resolved in some configuration of its project; one that resolved nowhere is missing from the SBOM, so it blocks. Assembled reports now carry resolvedModules for this.
  • A bare group:name failure is only folded into its versioned form when both come from the same projects.
  • Reachability scans (--reach with auto-manifest or --dynamic-sbom-inference) name --reach-continue-on-install-errors next to ignoreUnresolved: reachability cannot install a dependency that was let through.

Testing: new renderer unit tests.

🤖 Generated with Claude Code


Note

Medium Risk
Changes exit-code and messaging for JVM manifest generation and reachability prep; incorrect classification could block or allow incomplete SBOMs, but scope is limited to resolution reporting and hints.

Overview
Tightens JVM manifest resolution reporting so “lenient” failures cannot silently omit dependencies from the SBOM, and reachability flows get clearer remediation when users ignore unresolved deps.

Blocking vs notice: Resolution reports now carry resolvedModules (per subproject group:name). A failure category that is normally non-blocking—e.g. Gradle variant ambiguity—is treated as blocking when that module did not resolve in any configuration of the failing project, because it would be missing from the facts. Assembly populates resolvedModules only when there are failures, by scanning what actually landed in the graph.

Deduping: Bare group:name vs versioned coordinates are collapsed only when both refer to the same projects, so cross-subproject duplicates stay visible in the summary.

Reachability hints: Auto-manifest / recursive DSI paths that resolve artifacts for reach (withFiles / computeArtifactsSidecar) pass a new hint so error text also mentions --reach-continue-on-install-errors alongside ignoreUnresolved (including when failures are already ignored). Plain manifest commands do not surface install-error wording.

Gradle’s ambiguous-variant blocking header is updated to match the new “resolved nowhere” behavior. CHANGELOG and renderer unit tests cover the new rules.

Reviewed by Cursor Bugbot for commit bcc0e4b. Configure here.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is ON, but none of the reported issues met your autofix severity threshold.

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit bcc0e4b. Configure here.

Comment thread src/commands/manifest/scripts/resolution-report-render.mts Outdated

@mtorp Martin Torp (mtorp) left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[agent] Approving. The inline note is a policy question for the whole stack, not a problem with this diff.

Comment thread src/commands/manifest/scripts/resolution-report-render.mts
…ved nowhere

Variant ambiguity is lenient because the module is almost always
captured through another configuration. The report now checks that: an
ambiguous module that resolved in no configuration of its project is
missing from the SBOM, so it blocks. Reachability scans also name
--reach-continue-on-install-errors next to ignoreUnresolved, since
reachability cannot install a dependency that was let through.
Failures were merged by coordinate across projects before checking
whether the module resolved, so one project that resolved it kept the
failure lenient for another project whose SBOM lacked it. Blocking is
now decided per failure, and failures aggregate by coordinate, category
and that decision.
@jfblaa
Jeppe Fredsgaard Blaabjerg (jfblaa) merged commit c7214a7 into v1.x Oct 23, 2026
10 checks passed
@jfblaa
Jeppe Fredsgaard Blaabjerg (jfblaa) deleted the jfblaa/facts-report-resolved-modules branch October 23, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants