Skip to content

fix(pacquet): require pnpm-lock.yaml for single-project optimisticRepeatInstall fast path#11945

Merged
zkochan merged 3 commits into
mainfrom
opt-repeat
May 25, 2026
Merged

fix(pacquet): require pnpm-lock.yaml for single-project optimisticRepeatInstall fast path#11945
zkochan merged 3 commits into
mainfrom
opt-repeat

Conversation

@zkochan

@zkochan zkochan commented May 25, 2026

Copy link
Copy Markdown
Member

Summary

Follow-up to #11943. The optimisticRepeatInstall port applied pnpm's workspace-branch mtime-only exit to every install, including single-project ones. Pnpm's single-project branch additionally throws RUN_CHECK_DEPS_LOCKFILE_NOT_FOUND when pnpm-lock.yaml is missing — the outer try converts that to upToDate: false. Pacquet skipped that gate, so a single-project install with node_modules present but no lockfile silently short-circuited as "Already up to date" in ~35 ms (vs pnpm running the real install at ~5–7 s on the same fixture).

This was visible in the pnpm.io benchmarks the day #11943 landed:

action cache lockfile node_modules pnpm pacquet (before)
install 7.1s 35ms ⚠️
install 5s 37ms ⚠️

Both rows have no lockfile but pacquet was hitting the optimistic fast path anyway.

Fix

  • Add an is_workspace_install: bool parameter to check_optimistic_repeat_install.
  • In single-project mode (no pnpm-workspace.yaml), require <workspace_root>/pnpm-lock.yaml to exist before returning UpToDate.
  • Workspace mode is unchanged — pnpm's workspace branch's only lockfile probe (findConflictedLockfileDir) silently continues on ENOENT (checkDepsStatus.ts:593-596), so pacquet matches that polarity.

Caller in install.rs passes workspace_manifest.is_some().

Tests ported / added

  • returns_skipped_when_lockfile_missing_in_single_project_mode — unit test; the direct regression catcher.
  • returns_up_to_date_in_workspace_mode_without_lockfile — unit test; proves the workspace branch still tolerates a missing lockfile, matching pnpm.
  • optimistic_repeat_install_does_not_short_circuit_when_lockfile_missing — install-level integration test; observes the absence of the Already up to date log when pnpm-lock.yaml is missing.
  • Existing happy-path tests now seed pnpm-lock.yaml via a new write_empty_lockfile helper inside setup_fresh_install so they exercise the realistic single-project layout.

Verified per pacquet conventions by temporarily disabling the new gate — both new tests fail; with the gate restored, all 332 pacquet-package-manager tests pass. just fmt/check/lint are clean.

Test plan

  • cargo nextest run -p pacquet-package-manager optimistic_repeat (16 tests, all pass)
  • cargo nextest run -p pacquet-package-manager full crate (332 pass)
  • just fmt, just check, just lint
  • Temporarily disabled the new check to confirm the two new tests fail, then re-enabled to confirm they pass

Written by an agent (Claude Code, claude-opus-4-7).

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Improved "Already up to date" detection to correctly distinguish between single-project and workspace installations, ensuring the fast-path optimization properly validates installation state.
  • Tests

    • Added regression tests to verify correct behavior when lockfiles are present or missing in different installation scenarios.

Review Change Stack

…eatInstall fast path

The port of pnpm's `optimisticRepeatInstall` short-circuit in #11943
applied the workspace branch's mtime-only exit
(`checkDepsStatus.ts:263-271`) to every install, including single-project
ones. Pnpm's single-project branch (`checkDepsStatus.ts:387-462`)
additionally throws `RUN_CHECK_DEPS_LOCKFILE_NOT_FOUND` when
`pnpm-lock.yaml` is absent, which the outer `try` converts into
`upToDate: false`. Without that gate, pacquet treated a single-project
install with `node_modules` present but no lockfile as "Already up to
date" — the pnpm.io `node_modules`-only and `cache+node_modules`
benchmark cells finished in ~35 ms instead of running the install
(pnpm ~5–7 s on the same fixtures).

Add an `is_workspace_install: bool` parameter; in single-project mode,
require `<workspace_root>/pnpm-lock.yaml` to exist before declaring the
install up to date. Workspace installs continue to skip the lockfile
probe — pnpm's workspace branch's only lockfile check
(`findConflictedLockfileDir`) silently `continue`s on ENOENT
(`checkDepsStatus.ts:593-596`).

Tests:
- `returns_skipped_when_lockfile_missing_in_single_project_mode`
- `returns_up_to_date_in_workspace_mode_without_lockfile`
- `optimistic_repeat_install_does_not_short_circuit_when_lockfile_missing`
  (install-level integration test)
- Existing happy-path tests now seed `pnpm-lock.yaml` via a new
  `write_empty_lockfile` helper in `setup_fresh_install`.
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 898fc2f9-9200-43ab-bd2f-0bfaf642ea6e

📥 Commits

Reviewing files that changed from the base of the PR and between 6b3ba4d and f9a2f36.

📒 Files selected for processing (4)
  • pacquet/crates/package-manager/src/install.rs
  • pacquet/crates/package-manager/src/install/tests.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Code Coverage
  • GitHub Check: Lint and Test (ubuntu-latest)
  • GitHub Check: Lint and Test (macos-latest)
  • GitHub Check: Lint and Test (windows-latest)
  • GitHub Check: Run benchmark on ubuntu-latest
  • GitHub Check: Run benchmark on ubuntu-latest
  • GitHub Check: Compile & Lint
🧰 Additional context used
📓 Path-based instructions (1)
pacquet/**/*.rs

📄 CodeRabbit inference engine (pacquet/AGENTS.md)

pacquet/**/*.rs: When porting a function that fires pnpm:<channel> events through globalLogger, logger.debug(), or streamParser.write(), mirror the call site, payload, and ordering so the reporter parses pacquet's NDJSON the same way it parses pnpm's.
Declare a newtype wrapper for branded string types. Do not collapse the brand into a plain String or &str.
If upstream always validates before construction, validate in pacquet's wrapper too. The wrapper must construct only via TryFrom<String> and/or FromStr. Do not provide an infallible public constructor.
If upstream never validates, just brand for type-safety. Expose an infallible From<String> (and From<&str> when convenient).
If upstream occasionally constructs without validation, expose from_str_unchecked as an escape hatch alongside the validating constructor.
Match upstream serde behavior for branded types that cross JSON, YAML, or INI boundaries. Use #[serde(try_from = "String")] for deserialization and #[serde(into = "String")] for serialization.
Use #[derive(derive_more::From)] and #[derive(derive_more::Into)] for mechanical conversion impls. Fall back to manual impl only when conversion needs custom logic.
String-literal unions should become enums, not newtype wrappers. Model closed sets of valid string values as enums.
Template literal types should be treated as branded strings with validation discipline from rules 2-5.
Choose owned vs. borrowed parameters to minimize copies. Widen to the most encompassing type (&Path over &PathBuf, &str over &String) when it doesn't force extra copies.
Prefer Arc::clone(&x) / Rc::clone(&x) over x.clone() for reference-counted types, so the cost is visible at the call site.
Follow Rust API Guidelines for naming conventions.
Do not use star imports inside module bodies. Write use super::{Foo, bar} instead of use super::*;. Two forms stay allowed: external-crate preludes like use rayon::prelude::*; and root-of-module re-...

Files:

  • pacquet/crates/package-manager/src/install.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install.rs
  • pacquet/crates/package-manager/src/install/tests.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
🧠 Learnings (3)
📚 Learning: 2026-05-20T19:40:55.051Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11774
File: pacquet/crates/resolving-deps-resolver/src/resolve_peers.rs:0-0
Timestamp: 2026-05-20T19:40:55.051Z
Learning: In the pacquet Rust code, ensure the semver implementation uses the `node-semver` crate (not `nodejs-semver`). `node-semver`’s public API does not include a `satisfies_with_prerelease`-style method; prerelease-tolerant matching should be implemented inline by first calling `Range::satisfies`, and when it rejects a prerelease version, retry matching against a stripped `MAJOR.MINOR.PATCH` base of the prerelease version.

Applied to files:

  • pacquet/crates/package-manager/src/install.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install.rs
  • pacquet/crates/package-manager/src/install/tests.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
📚 Learning: 2026-05-22T00:08:44.646Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11837
File: pacquet/crates/resolving-npm-resolver/src/pick_package.rs:33-51
Timestamp: 2026-05-22T00:08:44.646Z
Learning: In the pnpm/pnpm repo’s pacquet Rust crates, do not flag Unicode ellipsis characters (U+2026, `…`) in Rust doc comments (`///` / `/** */`) as a lint violation. The pacquet crate’s `dylint.toml` only enables `perfectionist::derive_ordering`, and the Dylint `unicode-ellipsis` rule is not enabled for this project—so `…` in doc comments is an intentional, repo-consistent style.

Applied to files:

  • pacquet/crates/package-manager/src/install.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install.rs
  • pacquet/crates/package-manager/src/install/tests.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
📚 Learning: 2026-05-20T23:07:58.444Z
Learnt from: zkochan
Repo: pnpm/pnpm PR: 11784
File: pacquet/crates/resolving-deps-resolver/src/hoist_peers.rs:120-133
Timestamp: 2026-05-20T23:07:58.444Z
Learning: When reviewing code in this pacquet Rust port, follow the upstream pnpm compatibility rule: only match pnpm’s behavior exactly. Do not propose review changes that intentionally deviate from pnpm’s documented/observed behavior, even if pnpm appears buggy. If you identify a real bug in pnpm behavior, the review should prioritize fixing it upstream in pnpm first, and avoid implementing a pnpm-behavior workaround here unless the same fix has already landed upstream.

Applied to files:

  • pacquet/crates/package-manager/src/install.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install.rs
  • pacquet/crates/package-manager/src/install/tests.rs
  • pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
🧬 Code graph analysis (1)
pacquet/crates/package-manager/src/install/tests.rs (6)
pacquet/crates/config/src/lib.rs (1)
  • new (941-943)
pacquet/crates/reporter/src/lib.rs (2)
  • LogEvent (28-202)
  • SilentReporter (771-771)
pacquet/crates/lockfile/src/lib.rs (1)
  • Lockfile (61-91)
pacquet/crates/package-manifest/src/lib.rs (1)
  • create_if_needed (132-140)
pacquet/crates/workspace-state/src/lib.rs (4)
  • ProjectEntry (41-46)
  • update_workspace_state (163-178)
  • WorkspaceState (56-64)
  • load_workspace_state (184-198)
pacquet/crates/package-manager/src/optimistic_repeat_install.rs (1)
  • current_settings (184-214)
🔇 Additional comments (5)
pacquet/crates/package-manager/src/optimistic_repeat_install.rs (1)

46-46: LGTM!

Also applies to: 83-92, 95-102, 139-151

pacquet/crates/package-manager/src/install.rs (1)

391-398: LGTM!

pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs (1)

3-3: LGTM!

Also applies to: 16-22, 65-70, 97-98, 110-110, 138-138, 163-163, 189-189, 208-208, 243-243, 293-293, 336-336, 382-382, 424-424, 477-477, 530-530, 535-595

pacquet/crates/package-manager/src/install/tests.rs (2)

4886-4894: LGTM!


5151-5437: LGTM!


📝 Walkthrough

Walkthrough

The PR updates the optimistic repeat-install fast-path to require pnpm-lock.yaml existence for single-project installs while maintaining the original workspace-mode behavior. The function gains an is_workspace_install parameter, integrations pass workspace context, and comprehensive tests seed, validate, and regress-test both code paths.

Changes

Optimistic repeat-install lockfile gating

Layer / File(s) Summary
Lockfile gating logic and signature update
pacquet/crates/package-manager/src/optimistic_repeat_install.rs
check_optimistic_repeat_install imports Lockfile, extends documentation, receives is_workspace_install: bool parameter, and implements conditional early-return: for non-workspace installs, missing pnpm-lock.yaml returns Decision::Skipped with "wanted lockfile missing" reason.
Call site wiring in Install::run
pacquet/crates/package-manager/src/install.rs
Install::run passes workspace_manifest.is_some() to check_optimistic_repeat_install to provide workspace context for the gating decision.
Test infrastructure and helper functions
pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs
Test module imports Lockfile, adds write_empty_lockfile helper to seed minimal pnpm-lock.yaml, updates setup_fresh_install to call the helper, and refines comments describing lockfile-existence dependency.
Existing test updates and new regression tests
pacquet/crates/package-manager/src/optimistic_repeat_install/tests.rs, pacquet/crates/package-manager/src/install/tests.rs
Many existing test calls updated to pass false (single-project) or true (workspace) for is_workspace_install. Existing optimistic_repeat_install_skips_entire_pipeline_when_state_is_fresh test in install/tests.rs seeded with pnpm-lock.yaml. New regression test confirms single-project mode skips fast-path when lockfile is missing. New end-to-end round-trip test confirms complete optimistic flow succeeds on second install. New workspace-mode test confirms deletion of lockfile still yields UpToDate.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • pnpm/pnpm#11943: Introduces the optimisticRepeatInstall port that this PR builds upon by adding workspace-aware lockfile gating.
  • pnpm/pnpm#11605: Updates optimistic repeat-install eligibility based on pnpm-lock.yaml state; this PR gates single-project fast-path on lockfile presence while that PR prevents the path when the lockfile contains merge-conflict markers.

Poem

🐰 A rabbit checks the lockfile before the hop,
One path for projects, one for workspaces in a shop,
Fresh installs now validate with care,
The optimistic shortcut flies through the air! 🚀

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main fix: requiring pnpm-lock.yaml for the single-project optimistic fast path. It directly relates to the primary change across all modified files.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch opt-repeat

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Micro-Benchmark Results

Linux

group                          main                                   pr
-----                          ----                                   --
tarball/download_dependency    1.01      7.8±0.27ms   553.7 KB/sec    1.00      7.8±0.38ms   558.9 KB/sec

zkochan added 2 commits May 26, 2026 00:58
…ps end-to-end

Add `optimistic_repeat_install_round_trips_on_single_project_install`:
two real `Install::run` calls back-to-back on a non-workspace project
(no `pnpm-workspace.yaml`). The first install resolves through the
registry mock and writes `pnpm-lock.yaml` + `.pnpm-workspace-state-v1.json`
to disk. The second install must hit the optimistic fast path — emit
`Already up to date` and skip every install-setup event. Pairs with the
negative `..._does_not_short_circuit_when_lockfile_missing` test so the
gate's polarity is pinned in both directions.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.92%. Comparing base (6b3ba4d) to head (f9a2f36).

Additional details and impacted files
@@           Coverage Diff           @@
##             main   #11945   +/-   ##
=======================================
  Coverage   87.91%   87.92%           
=======================================
  Files         227      227           
  Lines       27736    27741    +5     
=======================================
+ Hits        24385    24392    +7     
+ Misses       3351     3349    -2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

Copy link
Copy Markdown
Contributor

Integrated-Benchmark Report (Linux)

Scenario: Isolated linker: fresh restore, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.641 ± 0.053 1.586 1.754 1.01 ± 0.05
pacquet@main 1.626 ± 0.067 1.555 1.745 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.6410764912600002,
      "stddev": 0.0529087904971523,
      "median": 1.6365262883600002,
      "user": 2.9540500399999994,
      "system": 2.01717498,
      "min": 1.58555848036,
      "max": 1.7536920923600001,
      "times": [
        1.64416442036,
        1.6288881563600002,
        1.7536920923600001,
        1.69499885436,
        1.58885214636,
        1.58679493236,
        1.6457557153600002,
        1.65930649736,
        1.58555848036,
        1.6227536173600001
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 1.6260175660599998,
      "stddev": 0.0672404621317466,
      "median": 1.59904334786,
      "user": 2.96137654,
      "system": 2.00993658,
      "min": 1.5547546923600002,
      "max": 1.7453371473600001,
      "times": [
        1.7453371473600001,
        1.58570122336,
        1.61238547236,
        1.55863839136,
        1.5756714203600002,
        1.6537663533600002,
        1.5547546923600002,
        1.68390367836,
        1.7068467763600002,
        1.58317050536
      ]
    }
  ]
}

Scenario: Isolated linker: fresh restore, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 469.1 ± 32.6 454.0 561.3 1.00 ± 0.07
pacquet@main 469.1 ± 12.9 456.8 502.8 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.46914293468000007,
      "stddev": 0.03256504224259272,
      "median": 0.45828411828000004,
      "user": 0.3534346599999999,
      "system": 0.79282758,
      "min": 0.45399295928000005,
      "max": 0.56129072528,
      "times": [
        0.56129072528,
        0.4675697092800001,
        0.45805426928000004,
        0.45953550228000006,
        0.45677328128000005,
        0.45809950628000007,
        0.4574204652800001,
        0.46022419828000005,
        0.45846873028000007,
        0.45399295928000005
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 0.46905583778000004,
      "stddev": 0.012928301049420811,
      "median": 0.46758836278000004,
      "user": 0.36024836000000005,
      "system": 0.8056173799999999,
      "min": 0.45683918128000006,
      "max": 0.50281538628,
      "times": [
        0.50281538628,
        0.47140991028000007,
        0.45683918128000006,
        0.46944615128000006,
        0.47037554328000003,
        0.46032885428000003,
        0.46573057428000003,
        0.46119457628000005,
        0.46159096228000007,
        0.47082723828000006
      ]
    }
  ]
}

Scenario: Isolated linker: fresh install, cold cache + cold store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.028 ± 0.040 1.947 2.083 1.01 ± 0.02
pacquet@main 2.001 ± 0.022 1.977 2.034 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.0281953272399997,
      "stddev": 0.040319029683009946,
      "median": 2.03323616994,
      "user": 4.12807276,
      "system": 1.9250203200000002,
      "min": 1.94677477044,
      "max": 2.08250102044,
      "times": [
        2.0259483934399998,
        1.94677477044,
        2.0707279814399997,
        2.04162900644,
        2.0201193424399997,
        2.0494735134399997,
        2.08250102044,
        2.0332872964399997,
        1.9783069044400001,
        2.03318504344
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 2.00115579704,
      "stddev": 0.021801412745734473,
      "median": 1.9954047969400002,
      "user": 4.117628259999999,
      "system": 1.91679252,
      "min": 1.9773600804400002,
      "max": 2.03423497344,
      "times": [
        1.9943991394400002,
        1.98240257244,
        1.9773600804400002,
        2.03423497344,
        1.98570844044,
        2.02520063844,
        1.99641045444,
        1.9800756974400002,
        2.00415985644,
        2.03160611744
      ]
    }
  ]
}

Scenario: Isolated linker: fresh install, hot cache + hot store

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.208 ± 0.009 1.196 1.223 1.00
pacquet@main 1.225 ± 0.021 1.195 1.258 1.01 ± 0.02
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.20758995934,
      "stddev": 0.009093811469568783,
      "median": 1.2078996158399997,
      "user": 1.68685094,
      "system": 1.12605804,
      "min": 1.19563411134,
      "max": 1.22253631634,
      "times": [
        1.2106664323399998,
        1.22253631634,
        1.21156526734,
        1.21709104634,
        1.19563411134,
        1.20237229434,
        1.19744075334,
        1.19883547034,
        1.2146251023399999,
        1.2051327993399998
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 1.2246726167400002,
      "stddev": 0.021344065275708757,
      "median": 1.22050435984,
      "user": 1.6917739400000003,
      "system": 1.14171454,
      "min": 1.19527679634,
      "max": 1.25837654334,
      "times": [
        1.21080626434,
        1.20106411534,
        1.21574948034,
        1.23029745934,
        1.2569529983399998,
        1.2221781783399999,
        1.19527679634,
        1.21883054134,
        1.25837654334,
        1.2371937903399999
      ]
    }
  ]
}

@github-actions

Copy link
Copy Markdown
Contributor

🐰 Bencher Report

Branchpr/11945
Testbedpacquet
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
milliseconds (ms)
(Result Δ%)
Upper Boundary
milliseconds (ms)
(Limit %)
isolated-linker.fresh-install.cold-cache.cold-store📈 view plot
🚷 view threshold
2,028.20 ms
(-42.18%)Baseline: 3,507.67 ms
4,209.21 ms
(48.18%)
isolated-linker.fresh-install.hot-cache.hot-store📈 view plot
🚷 view threshold
1,207.59 ms
(-53.06%)Baseline: 2,572.56 ms
3,087.07 ms
(39.12%)
isolated-linker.fresh-restore.cold-cache.cold-store📈 view plot
🚷 view threshold
1,641.08 ms
(-24.10%)Baseline: 2,162.27 ms
2,594.72 ms
(63.25%)
isolated-linker.fresh-restore.hot-cache.hot-store📈 view plot
🚷 view threshold
469.14 ms
(-28.50%)Baseline: 656.12 ms
787.35 ms
(59.59%)
🐰 View full continuous benchmarking report in Bencher

@zkochan zkochan merged commit 198c661 into main May 25, 2026
28 checks passed
@zkochan zkochan deleted the opt-repeat branch May 25, 2026 23:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants