Skip to content

Tracking: vendor every Maven shape through the jvm planner and retire the legacy single-pom backend #971

Description

[agent] Filed by the scheduled architecture audit routine (ecosystems and formats). Register: discussion #560 register.

Kind: tracking. Source: review Part 5.7 ("JVM: two backends for one ecosystem"); register E26.

Problem

Vendored Maven has two backends, chosen by root-pom shape (verified on main @ 9c43dfc):

  • vendor_maven sends reactors, Gradle builds and mixed roots to the v5 jvm planner. It sends a lone single-module pom.xml to the legacy vendor_maven_single, because Detected::shape maps (Some(Single), false) to Shape::Other ("Single-POM builds retain the legacy backend", jvm/mod.rs#L4).
  • The planner already handles single-module poms. Shape::Mixed plans a single-module pom beside a Gradle build with maven_reactor::plan_with_config. A throwaway test, run twice on 9c43dfc, planned a lone CRLF single-module pom that detect classifies as Other:
    • the plan succeeded with no warnings;
    • re-planning wrote nothing;
    • unplan restored pom.xml byte for byte and deleted .mvn/maven.config.
  • The two models differ in a user-visible way.
    • Legacy appends a <repository> socket-patch-vendor-<uuid> → file://${project.basedir}/.socket/vendor/maven/<uuid> and keeps the unsuffixed GAV. A warm ~/.m2, an earlier repository or mirrorOf * therefore serves the pristine jar (local_cache_shadow_warning is always emitted).
    • The planner pins <base>-socket.<hex8>, a GAV that only the committed .socket/vendor/maven2 tree serves.
  • The split costs code at every layer:

Symptoms (legacy same-GAV wiring): #263, #274 (single-module half), #622, #716.

Target design

One vendored JVM backend: jvm::detect returns a planner shape for every root that has a pom.xml or a Gradle build. A single-module pom is a reactor of one. The legacy maven_pom_repository ledger kind remains revert-only (adapted at load, the way legacy_mixed_root already keeps old roots working until they are reverted).

Checklist (in order)

Dependencies

Child 1 should land after #876, which edits fetch_registry_bytes in the same file. Blocks the VendorBackend table (#959) for Maven, and E24's revert engine (one fewer revert mechanism).

Activity

  1. added
    arch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)
    refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code
    on Oct 7, 2026
  2. added a commit that references this issue on Oct 7, 2026
  3. mikolalysenko commented on Oct 7, 2026

    @mikolalysenko
    CollaboratorAuthor

    [agent] Triage: priority:p3 (Maven, tracking). Child 3 onwards waits on the decision in #973 (labeled agent:needs-human); #972 is the mechanical first slice and is sequenced after #876.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent:triagedarch-auditFiled by a scheduled architecture audit routine (see the architecture review discussion)pm:mavenMavenpriority:p3refactorStructural change: duplicated code or logic, missing abstraction, layering, dead code

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions