Feature idea, follow-on to #147 and to future subproject (dev-as-an-ecosystem) resolution.
Principle already decided: lock files are never availability facts — a subproject's deps.lock is that project's solve snapshot, not what it requires. Transitive edges must come from declared constraints (dependencies.rb ranges), or diamonds turn into manufactured exact-vs-exact conflicts.
The one legitimate use of a sub-lock: as a preference, not a constraint. When the resolver picks a version for a transitively-reached package, prefer the version the subproject's own lock pinned iff it satisfies all accumulated constraints; otherwise move to the highest satisfying version as usual. This is bundler's conservative-resolution behavior: it minimizes churn and keeps the parent's solve close to what the subproject actually tested against, without ever letting the snapshot over-constrain the solve.
Scope notes:
Feature idea, follow-on to #147 and to future subproject (dev-as-an-ecosystem) resolution.
Principle already decided: lock files are never availability facts — a subproject's
deps.lockis that project's solve snapshot, not what it requires. Transitive edges must come from declared constraints (dependencies.rbranges), or diamonds turn into manufactured exact-vs-exact conflicts.The one legitimate use of a sub-lock: as a preference, not a constraint. When the resolver picks a version for a transitively-reached package, prefer the version the subproject's own lock pinned iff it satisfies all accumulated constraints; otherwise move to the highest satisfying version as usual. This is bundler's conservative-resolution behavior: it minimizes churn and keeps the parent's solve close to what the subproject actually tested against, without ever letting the snapshot over-constrain the solve.
Scope notes:
PackageVersion/EdgeSetedge facts; it is resolver input (a hint channel), not a repository fact.