Skip to content
This repository was archived by the owner on May 14, 2026. It is now read-only.

feat(lockfile): select_platform_variant + PlatformSelector (#437 slice B)#466

Merged
zkochan merged 2 commits into
mainfrom
feat/437-slice-b
May 13, 2026
Merged

feat(lockfile): select_platform_variant + PlatformSelector (#437 slice B)#466
zkochan merged 2 commits into
mainfrom
feat/437-slice-b

Conversation

@zkochan

@zkochan zkochan commented May 13, 2026

Copy link
Copy Markdown
Member

Summary

Slice B of #437. Adds the pure-logic variant-picker ahead of Slice D's install-pipeline dispatch. Builds on the lockfile types from #457 (slice A). No new workspace deps; logic lives in pacquet-lockfile next to the variant types.

  • PlatformSelector { os, cpu, libc: Option<String> } mirrors upstream's PlatformSelector. The libc tri-state encodes pnpm's string | null | undefined shape: None (macOS / Windows / BSD — libc constraint is irrelevant) and Some("glibc") collapse to the same matching arm (variant must have no libc: annotation); Some("musl") requires an exact libc: "musl" annotation, so the glibc-default variant doesn't silently win on a musl host.

  • select_platform_variant(variants, selector) -> Option<&PlatformAssetResolution> ports selectPlatformVariant. Declaration-order match; the targets-array scan is linear because real Node / Deno / Bun archives ship 1–3 target entries per variant.

  • libc_matches(variant_libc, requested_libc) -> bool is the asymmetric helper from libcMatches. Crate-private so the matching policy isn't part of the public API.

The host-platform side (constructing the PlatformSelector from pacquet-graph-hasher's existing host_platform/arch/libc helpers, plus --cpu / --os / --libc / supportedArchitectures overrides) lands at the install dispatcher in Slice D — keeps pacquet-lockfile free of the graph-hasher dep and lets the picker's tests drive synthetic hosts. The --cpu / --os / --libc CLI flags themselves belong to #453.

Test plan

  • just ready — 920 tests pass (2 skipped)
  • taplo format --check — clean
  • just dylint (perfectionist) — clean
  • 6 new picker tests cover: first-match wins, multi-target variant matches any host triple, no-match returns None, musl host rejects the glibc-default variant, musl host matches a musl-annotated variant, and a six-row libc_matches truth table (None / "glibc" / "musl" / unknown-future-libc on both sides) pinning the asymmetric contract.

Follow-up slices on #437

  • C: Binary fetcher (tarball with ignore_file_pattern; zip with zip = "5" workspace dep + path-traversal validation + NODE_EXTRAS_IGNORE_PATTERN).
  • D: Install-pipeline dispatch for Binary / Variations + bin linking via pacquet-cmd-shim + host-selector plumbing (pacquet-graph-hasherPlatformSelector).
  • E: --no-runtime CLI flag + Config.skip_runtimes.
  • F: Integration tests with recorded fixture archives + the 12 entries from plans/TEST_PORTING.md Installation Of Runtimes section.

Upstream

pnpm/pnpm@94240bc046.


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

Summary by CodeRabbit

  • New Features

    • Improved platform-aware variant selection: chooses the first matching variant for your OS/CPU/libc and clarifies libc compatibility semantics (special handling for unannotated vs. annotated libc). Lockfiles are expected not to nest variant groups.
  • Tests

    • Added unit tests verifying variant selection behavior and libc matching across scenarios.

Review Change Stack

…e B)

Add the variant-picking logic for `VariationsResolution` ahead of
Slice D's install-pipeline dispatch:

- `PlatformSelector { os, cpu, libc: Option<String> }` mirrors
  upstream's [`PlatformSelector`](https://github.com/pnpm/pnpm/blob/94240bc046/resolving/resolver-base/src/index.ts#L78-L83).
  The `libc` tri-state encodes pnpm's `string | null | undefined`
  shape: `None` (host doesn't care about libc — macOS/Windows/BSD)
  and `Some("glibc")` collapse to the same matching arm (variant
  must have no `libc:` annotation); `Some("musl")` requires an exact
  `libc: "musl"` annotation so the glibc default doesn't silently
  win on a musl host.

- `select_platform_variant(variants, selector)` ports
  [`selectPlatformVariant`](https://github.com/pnpm/pnpm/blob/94240bc046/resolving/resolver-base/src/index.ts#L92-L98).
  Iterates `variants` in declaration order and returns the first
  variant whose `targets[]` contains an `(os, cpu, libc)` triple
  matching the selector. Targets-array scan is linear because real
  archives ship 1–3 target entries per variant; quadratic cost is
  immaterial.

- `libc_matches(variant_libc, requested_libc)` is the asymmetric
  helper from
  [`libcMatches`](https://github.com/pnpm/pnpm/blob/94240bc046/resolving/resolver-base/src/index.ts#L100-L107).
  Crate-private so the matching policy isn't part of the public API.

Lives in `pacquet-lockfile` next to the variant types (mirrors
upstream's `resolver-base` package boundary). The host-platform side
(constructing the `PlatformSelector` from `pacquet-graph-hasher`'s
existing `host_platform/arch/libc` helpers) lands at the install
dispatcher in Slice D — keeps `pacquet-lockfile` free of the
`graph-hasher` dep and lets tests drive the picker with synthetic
hosts.

Tests: first-match wins, multi-target variant matches any host triple,
no-match returns `None`, musl-host rejects glibc-default variant,
musl-host matches musl-annotated variant, and a six-row `libc_matches`
truth table (None / "glibc" / "musl" / unknown-future-libc on both
sides) pinning the asymmetric contract from upstream.

Part of #437.

---
Written by an agent (Claude Code, claude-opus-4-7).
Copilot AI review requested due to automatic review settings May 13, 2026 16:06
@coderabbitai

coderabbitai Bot commented May 13, 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: 055a5245-d07f-496e-9024-160d65ebdf5a

📥 Commits

Reviewing files that changed from the base of the PR and between b0d8269 and b64618d.

📒 Files selected for processing (2)
  • crates/lockfile/src/resolution.rs
  • crates/lockfile/src/resolution/tests.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/lockfile/src/resolution.rs
  • crates/lockfile/src/resolution/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). (6)
  • GitHub Check: Lint and Test (macos-latest)
  • GitHub Check: Lint and Test (ubuntu-latest)
  • GitHub Check: Lint and Test (windows-latest)
  • GitHub Check: Dylint
  • GitHub Check: Run benchmark on ubuntu-latest
  • GitHub Check: Code Coverage

📝 Walkthrough

Walkthrough

Adds host-based platform variant selection to the lockfile resolver: a public PlatformSelector type, select_platform_variant that returns the first variant whose targets match the selector triple, and libc_matches with asymmetric libc compatibility. Tests cover ordering, per-target matches, no-match behavior, and libc truth table.

Changes

Platform Variant Selection

Layer / File(s) Summary
Platform selector types and matching implementation
crates/lockfile/src/resolution.rs
Adds PlatformSelector (os, cpu, optional libc), select_platform_variant which scans variants and returns the first variant with a matching target, and libc_matches implementing asymmetric libc matching (None/glibc -> only unannotated variants; specific values require exact equality).
Selection and matching tests
crates/lockfile/src/resolution/tests.rs
Adds test helpers and unit tests asserting selection picks the first matching variant, matches when any variant target fits, returns None when no match exists, rejects unannotated variants for musl selectors, selects musl-annotated variants only when requested, and a truth-table pinning libc_matches outcomes.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • pnpm/pacquet#457: Introduces PlatformAssetResolution / PlatformAssetTarget types that the variant-selection logic operates on.

Poem

🐇 I hop through variants, sniff the air—
I check os, cpu, and libc with care.
First match wins, order is prime,
Musl or glibc, I pick just in time.
Happy lockfiles, bounding through the night!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: introducing select_platform_variant and PlatformSelector for platform-based variant selection in the lockfile crate.
Description check ✅ Passed The description comprehensively covers the Summary section, linked upstream references, test plan verification, and follow-up slice roadmap; all required template sections are addressed.
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 feat/437-slice-b

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

@coderabbitai coderabbitai 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.

🧹 Nitpick comments (2)
crates/lockfile/src/resolution/tests.rs (2)

568-582: 💤 Low value

Consider using distinct URLs in test fixtures for clearer assertions.

The integrity check on lines 577-580 doesn't actually verify which variant was picked since both variants share the same hash. The targets assertion on line 581 is the real discriminator. Consider giving each variant a distinct URL to make the test intent clearer, or remove the redundant integrity assertion.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/lockfile/src/resolution/tests.rs` around lines 568 - 582, The test
pick_first_matching_variant uses two variants with identical integrity hashes so
the integrity assertion on picked.resolution.integrity() cannot distinguish
which variant was chosen; update the test fixture for variant("darwin-arm64",
...) and variant("linux-x64", ...) to use distinct download URLs (or distinct
integrity values) so the integrity assertion becomes meaningful, or
alternatively remove the redundant integrity assertion and rely on the existing
picked.targets assertion and select_platform_variant call to verify the chosen
variant.

638-661: 💤 Low value

Consider adding explicit (Some("glibc"), Some("glibc")) case to truth table.

The truth table is thorough, but adding an explicit assertion for libc_matches(Some("glibc"), Some("glibc")) returning false would document the perhaps-surprising behavior that a variant with explicit libc: "glibc" annotation is rejected even when the selector requests "glibc". This matches the "pnpm only annotates non-glibc builds" contract but is worth pinning.

📝 Suggested addition
     // Selector says "glibc" (Linux glibc host): same rule as None.
     assert!(libc_matches(None, Some("glibc")));
     assert!(!libc_matches(Some("musl"), Some("glibc")));
+    // Explicit "glibc" annotation on variant is rejected (pnpm never emits it).
+    assert!(!libc_matches(Some("glibc"), Some("glibc")));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/lockfile/src/resolution/tests.rs` around lines 638 - 661, Add an
explicit assertion in the libc_matches_truth_table test that
libc_matches(Some("glibc"), Some("glibc")) is false to document that an
explicitly annotated glibc variant is rejected when the selector is "glibc";
update the test function libc_matches_truth_table to include this case alongside
the existing assertions so the behavior of libc_matches is clearly pinned.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@crates/lockfile/src/resolution/tests.rs`:
- Around line 568-582: The test pick_first_matching_variant uses two variants
with identical integrity hashes so the integrity assertion on
picked.resolution.integrity() cannot distinguish which variant was chosen;
update the test fixture for variant("darwin-arm64", ...) and
variant("linux-x64", ...) to use distinct download URLs (or distinct integrity
values) so the integrity assertion becomes meaningful, or alternatively remove
the redundant integrity assertion and rely on the existing picked.targets
assertion and select_platform_variant call to verify the chosen variant.
- Around line 638-661: Add an explicit assertion in the libc_matches_truth_table
test that libc_matches(Some("glibc"), Some("glibc")) is false to document that
an explicitly annotated glibc variant is rejected when the selector is "glibc";
update the test function libc_matches_truth_table to include this case alongside
the existing assertions so the behavior of libc_matches is clearly pinned.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4cd39a10-3ad0-49de-8946-5af20db47c5c

📥 Commits

Reviewing files that changed from the base of the PR and between c614d64 and b0d8269.

📒 Files selected for processing (2)
  • crates/lockfile/src/resolution.rs
  • crates/lockfile/src/resolution/tests.rs
📜 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). (8)
  • GitHub Check: Agent
  • GitHub Check: Lint and Test (macos-latest)
  • GitHub Check: Lint and Test (windows-latest)
  • GitHub Check: Lint and Test (ubuntu-latest)
  • GitHub Check: Dylint
  • GitHub Check: Code Coverage
  • GitHub Check: Run benchmark on ubuntu-latest
  • GitHub Check: Run benchmark on ubuntu-latest
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Preserve existing method chains and pipe-trait chains; do not break them into intermediate let bindings unless there is a concrete justification such as a compilation failure, borrow checker rejection, meaningful performance improvement, or other technical necessity. Refactoring for style alone is not sufficient justification.
Choose owned vs. borrowed parameters to minimize copies; prefer borrowed types (&Path over &PathBuf, &str over &String) when it does not force extra copies.
Prefer Arc::clone(&x) and Rc::clone(&x) over x.clone() for reference-counted types to make the cost visible at the call site.
Do not use star imports inside module bodies. Write use super::{Foo, bar} instead of use super::*; for any glob whose target is a module you control. External-crate preludes (e.g., use rayon::prelude::*;) and root-of-module re-exports (e.g., pub use submodule::*; in lib.rs) are exceptions.
Follow Rust API Guidelines for naming, as documented in https://rust-lang.github.io/api-guidelines/naming.html.
Declare a newtype wrapper for any branded string type being ported from TypeScript pnpm. Do not collapse the brand into a plain String or &str; give the type its own struct so misuse is a type error.
When porting branded string types where upstream TypeScript always validates before construction, validate in the Rust port too. Construct the wrapper only via TryFrom<String> and/or FromStr; do not provide an infallible public constructor that takes an arbitrary string.
For branded string types where upstream TypeScript never validates (used purely for type-safety to prevent confusion between string slots), expose an infallible From<String> and From<&str> constructor in the Rust wrapper.
When upstream TypeScript occasionally constructs a branded type without validation (via bare as assertion), add a from_str_unchecked (or similarly named) constructor on the Rust side. Keep the validating constructor as well; `from_str_u...

Files:

  • crates/lockfile/src/resolution.rs
  • crates/lockfile/src/resolution/tests.rs
🧠 Learnings (2)
📚 Learning: 2026-05-07T23:19:08.272Z
Learnt from: KSXGitHub
Repo: pnpm/pacquet PR: 401
File: tasks/integrated-benchmark/src/work_env.rs:343-344
Timestamp: 2026-05-07T23:19:08.272Z
Learning: When reviewing Rust code in pnpm/pacquet for deprecated API usage, do not automatically treat `serde_saphyr::to_string` as deprecated. In `serde-saphyr` v0.0.25, `serde_saphyr::to_string` has no `#[deprecated]` attribute (the `#[deprecated]` later in `serde-saphyr-0.0.25/src/lib.rs` applies to a different function). Only flag `serde_saphyr::to_string` as deprecated if the resolved dependency version’s source shows `#[deprecated]` on that specific function.

Applied to files:

  • crates/lockfile/src/resolution.rs
  • crates/lockfile/src/resolution/tests.rs
📚 Learning: 2026-05-01T10:01:33.766Z
Learnt from: zkochan
Repo: pnpm/pacquet PR: 349
File: crates/reporter/src/tests.rs:121-121
Timestamp: 2026-05-01T10:01:33.766Z
Learning: In Rust test code, follow the repo’s CODE_STYLE_GUIDE test-logging rule: add logging (e.g., `eprintln!`/`eprintln!(...)`) so that useful diagnostic values are printed when a test fails, unless the assertion is `assert_eq!` (where the differing values are already included). Concretely, if you use assertions like `assert!`, `assert_ne!`, etc., ensure the test logs the relevant actual/expected values (or context) before/around the assertion so failures can be diagnosed without rerunning.

Applied to files:

  • crates/lockfile/src/resolution/tests.rs
🔇 Additional comments (7)
crates/lockfile/src/resolution.rs (3)

176-199: LGTM!

The PlatformSelector struct correctly models the tri-state libc semantics documented in the PR objectives. The doc comment thoroughly explains the None/Some("glibc")/Some("musl") behavior and links to upstream.


201-222: LGTM!

The function correctly implements declaration-order iteration with linear target scanning, matching upstream's selectPlatformVariant semantics. The borrowing is efficient with no unnecessary allocations.


233-238: 💤 Low value

No changes needed. The implementation is correct and already well-documented.

The doc comment at lines 224–232 and supporting comments at lines 132–136 and 186–190 clearly explain that pnpm only writes libc for non-glibc (musl) variants and never emits libc: "glibc" explicitly. The asymmetric matching logic—where None and Some("glibc") both require variant_libc.is_none()—is the intended behavior and faithfully ports upstream's libcMatches. The code is correct.

crates/lockfile/src/resolution/tests.rs (4)

1-6: LGTM!


540-562: LGTM!

Test helpers are concise and make the test cases readable.


588-596: LGTM!


601-631: LGTM!

Good coverage of the critical musl/glibc rejection semantics. The descriptive assertion message on line 617-618 clearly explains the expected behavior.

@codecov

codecov Bot commented May 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.67%. Comparing base (c614d64) to head (b64618d).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #466      +/-   ##
==========================================
+ Coverage   88.64%   88.67%   +0.02%     
==========================================
  Files         116      116              
  Lines        9952     9969      +17     
==========================================
+ Hits         8822     8840      +18     
+ Misses       1130     1129       -1     

☔ 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

github-actions Bot commented May 13, 2026

Copy link
Copy Markdown

Micro-Benchmark Results

Linux

group                          main                                   pr
-----                          ----                                   --
tarball/download_dependency    1.01     16.2±0.64ms   268.3 KB/sec    1.00     16.0±0.06ms   271.8 KB/sec

Copilot AI 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.

Pull request overview

Adds platform-variant selection logic to pacquet-lockfile to support pnpm v11 runtime dependency “variations” resolutions (to be wired into the install pipeline in later slices).

Changes:

  • Introduces PlatformSelector plus select_platform_variant() for declaration-order variant selection.
  • Adds libc_matches() implementing pnpm’s asymmetric libc matching semantics (glibc/none vs musl).
  • Adds unit tests covering variant selection and a libc matching truth table.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
crates/lockfile/src/resolution.rs Adds PlatformSelector, select_platform_variant, and libc_matches to pick a matching variant for a host triple.
crates/lockfile/src/resolution/tests.rs Adds unit tests for variant selection behavior and libc_matches truth table.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread crates/lockfile/src/resolution.rs
Comment thread crates/lockfile/src/resolution/tests.rs
Two follow-ups from Copilot review on PR #466:

- `resolution.rs:152-154` claimed "the variant picker checks at
  runtime that the resolved inner is atomic", but
  `select_platform_variant` does not. Reword to describe the actual
  contract: pacquet's `PlatformAssetResolution.resolution` is
  typed as the full `LockfileResolution` for serde uniformity, and
  the lockfile is trusted to honor upstream's atomic-inner
  invariant. No infinite-recursion risk because the install
  dispatcher doesn't call back into `select_platform_variant` for
  non-`Variations` inputs.

- `resolution.rs:169` referenced `pick_variant` in
  `pacquet-package-manager`, but the picker actually lives in this
  module as `select_platform_variant`. Updated the pointer.

- `pick_returns_first_when_multiple_variants_match` test: two
  variants both list the same `(darwin, arm64)` target; the test
  asserts the first one wins, pinning the `Array.prototype.find`
  semantics. Pnpm-written lockfiles can rely on declaration order
  (e.g., listing a preferred build before a fallback) — without
  this test, a future refactor that switched the iteration to a
  triple-keyed `BTreeMap` would silently break that.

No behavior change; doc-comment text + test addition.

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

Copy link
Copy Markdown

Integrated-Benchmark Report (Linux)

Scenario: Frozen Lockfile

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.534 ± 0.110 2.431 2.782 1.01 ± 0.05
pacquet@main 2.507 ± 0.069 2.380 2.618 1.00
pnpm 5.717 ± 0.082 5.613 5.918 2.28 ± 0.07
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.5340172155,
      "stddev": 0.10963977588197407,
      "median": 2.5164822383,
      "user": 2.6147036200000007,
      "system": 3.4788639199999998,
      "min": 2.4311761583,
      "max": 2.7824665832999997,
      "times": [
        2.4773330013,
        2.4313701262999996,
        2.7824665832999997,
        2.5794632043,
        2.5312517082999997,
        2.4391692023,
        2.5278384472999997,
        2.6349776943,
        2.5051260293,
        2.4311761583
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 2.5073567108,
      "stddev": 0.069179338497146,
      "median": 2.5044753452999995,
      "user": 2.61120632,
      "system": 3.4735682199999998,
      "min": 2.3802799633,
      "max": 2.6181038172999997,
      "times": [
        2.6181038172999997,
        2.5428317283,
        2.4651078912999997,
        2.5447016892999996,
        2.4781126243,
        2.5844229882999996,
        2.5154226082999998,
        2.4935280822999997,
        2.4510557153,
        2.3802799633
      ]
    },
    {
      "command": "pnpm",
      "mean": 5.7165902826999995,
      "stddev": 0.08160274211751391,
      "median": 5.697518129300001,
      "user": 8.231976819999998,
      "system": 4.25350042,
      "min": 5.6126869443,
      "max": 5.9181224143,
      "times": [
        5.6748836143000005,
        5.696908173300001,
        5.7390982713000005,
        5.6126869443,
        5.727785558300001,
        5.6981280853000005,
        5.6709963383,
        5.754415567300001,
        5.6728778603,
        5.9181224143
      ]
    }
  ]
}

Scenario: Frozen Lockfile (Hot Cache)

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 743.8 ± 36.6 713.0 831.6 1.00
pacquet@main 840.2 ± 61.8 761.0 987.5 1.13 ± 0.10
pnpm 2422.4 ± 178.8 2269.6 2808.1 3.26 ± 0.29
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.7438194066,
      "stddev": 0.0366374428046,
      "median": 0.7306011190000001,
      "user": 0.38341786000000005,
      "system": 1.6060912799999998,
      "min": 0.713017443,
      "max": 0.8316096700000001,
      "times": [
        0.8316096700000001,
        0.7327237160000001,
        0.761813846,
        0.7303984330000001,
        0.713017443,
        0.7191516450000001,
        0.720193696,
        0.7308038050000001,
        0.7227557400000001,
        0.7757260720000001
      ]
    },
    {
      "command": "pacquet@main",
      "mean": 0.8401774978000001,
      "stddev": 0.06180675785855487,
      "median": 0.8345190720000001,
      "user": 0.37649425999999997,
      "system": 1.6498870799999998,
      "min": 0.761033285,
      "max": 0.9875251770000001,
      "times": [
        0.8324675530000001,
        0.815393255,
        0.776402514,
        0.8374711890000001,
        0.761033285,
        0.9875251770000001,
        0.8365705910000001,
        0.8290418150000001,
        0.847371132,
        0.8784984670000001
      ]
    },
    {
      "command": "pnpm",
      "mean": 2.4223954651,
      "stddev": 0.17882402829440816,
      "median": 2.349069174,
      "user": 2.76740636,
      "system": 2.1537488799999993,
      "min": 2.2695770669999997,
      "max": 2.808101723,
      "times": [
        2.444223671,
        2.365849011,
        2.808101723,
        2.379809629,
        2.2695770669999997,
        2.331243712,
        2.3016782,
        2.3322893369999997,
        2.310555531,
        2.68062677
      ]
    }
  ]
}

@zkochan zkochan merged commit 3e45e92 into main May 13, 2026
23 of 24 checks passed
@zkochan zkochan deleted the feat/437-slice-b branch May 13, 2026 16:34
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants