lake update does not update transitive dependency pins
@tydeu is already working on this.
Since Mar 24, 2026.
- Dominant language
- Lean
- Stars
- 9.2k
- Forks
- 990
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 175
Description
When running lake update, direct dependencies are updated to their latest commits, but transitive dependencies are not re-resolved from the updated upstream package's manifest. This means stale transitive dependency pins can silently persist even after the direct dependency has been updated.
Reproduction
Given three projects:
- C (e.g.
subverso) — a library - B (e.g.
verso) — depends on C viarequire C from git "..."@"main" - A (e.g.
reference-manual) — depends on B viarequire B from git "..."@"main"
- A's
lake-manifest.jsonhas B pinned at commitb1and C pinned at commitc1 - B is updated: B's main now points to
b2, and B's manifest pins C atc2 - Run
lake updatein A
Expected: A's manifest updates B to b2 and C to c2 (from B's updated manifest)
Actual: A's manifest updates B to b2 but keeps C at c1
Concrete example
This happened during the v4.29.0-rc7 release with the reference-manual:
subversogot a fix at21e4badfe6a6("chore: prefer inferInstance, for v4.29.0-rc7")verso's main (7ad685cf1a9e) updated its manifest to pin the fixed subverso- Running
lake updateinreference-manualupdated verso to7ad685cf1a9ebut kept subverso at the old699813355084, causing a build failure
The only workaround was to manually edit lake-manifest.json to update the subverso rev.
🤖 Prepared with Claude Code
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.