Skip to content

feat(pnpr): keep metadata in libSQL, read through an embedded replica - #17583

Merged
zkochan merged 9 commits into
mainfrom
pnpr/libsql-metadata
Nov 3, 2026
Merged

zkochan merged 9 commits into
mainfrom
pnpr/libsql-metadata

Conversation

@zkochan

@zkochan zkochan commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Summary

Fourth of the SQL metadata adapter stack (pnpm/tasks#244, design in pnpm/rfcs#66 "Shared deployments"). Builds on #17577, #17578 and #17580, now merged.

Adds the libSQL metadata adapter, so several pnpr instances share one metadata database such as Turso. The schema and queries are the same as for SQLite.

s3:
  bucket: my-pnpr-packages      # archives stay in object storage
metadata:
  url: libsql://my-db.turso.io  # or http(s):// for a self-hosted sqld
  authToken: ${TURSO_AUTH_TOKEN}
  replicaPath: ./metadata-replica.db
  syncInterval: 10s

Where each read goes. The shared layer decides freshness, and the adapter decides the source:

Read Freshness libSQL source
read-for-update (CAS), recorded outcome of a retried publish, catalog generation Current primary
authorization (is_package_owner, which now reads for update) Current primary
package views, listings, publications, notes, tag history Bounded replica, if its last sync is within syncInterval and no write of this process came after it; else sync, else primary
a client's minimum generation (Storage::read_hosted_package_view_at_least) AtLeast(g) replica once it reaches g (synced on demand), else primary

A replica read runs in one BEGIN READONLY transaction, which keeps it on the replica; a plain BEGIN on a replica connection goes to the primary. Every write of this process marks the replica stale, so the next replica read syncs first, and an instance always reads its own writes. That includes release-note edits, which advance no generation. An AtLeast(g) read also checks the catalog's generation in its snapshot; a replica found behind is synced once, and if still behind the read goes to the primary.

Writes go to the primary as BEGIN IMMEDIATE, one at a time per process. A busy primary (SQLITE_BUSY/SQLITE_LOCKED, including the Hrana error codes) is a retryable conflict, and the whole transaction runs again.

Replica sync. The adapter syncs the replica itself every syncInterval and records when each sync finished, because libsql's background sync doesn't report that. That timestamp is what the freshness bound checks. syncInterval: 0 is refused together with a replicaPath.

Opening. The shared layer is synchronous on the blocking pool, so the libSQL database opens on first use (under a 5-minute startup deadline) and its statements wait for libsql's async client with Handle::block_on. Every Storage of a process that names the same settings shares one handle. Storage::from_config runs several times at startup, and a replica file must have one owner.

Smaller changes:

  • catalog_generation/tag_history are async. The tests that call them now await.
  • The schema runs its statements one at a time, because libsql's remote execute_batch re-renders statements and drops the comma in STRICT, WITHOUT ROWID.
  • The runners moved to sql/transactions.rs and the view to sql/view.rs (file-length lint).
  • pnpr-libsql: ConnectionPool::checkout. The mock primary now gives each Hrana stream its own connection, serves /v3/cursor, carries blobs, and reports SQLITE_BUSY.
  • The Sqlite/Libsql error displays no longer say "Token database"/"Auth database".

Not done here: a request header carrying the client's minimum generation (the RFC leaves the name open), and switching the cloud trial.

Squash Commit Body

Add the libSQL metadata adapter that pnpm/rfcs#66 describes under "Shared
deployments", so several pnpr instances share one metadata database such
as Turso. `metadata.url` takes `libsql://` (or `http(s)://` for a
self-hosted sqld), with `authToken`, `replicaPath`, `syncInterval`, and
`maxConnections` beside it. A libSQL URL works with an `s3:` hosted store,
so archives stay in object storage. Those keys without a metadata URL are
refused.

Writes run on the primary as `BEGIN IMMEDIATE` transactions, one at a time
per process; a busy primary is a retryable conflict. Reads that decide a
write, answer a retried publish, or authorize go to the primary. Views read
the embedded replica in a `BEGIN READONLY` transaction while its last sync
is within `syncInterval` and no write of this process came after it; any
other replica syncs first, and one that cannot sync leaves the read to the
primary. A read with a minimum generation, which a client may send, checks
the catalog's generation in the replica's snapshot, syncing or falling back
to the primary when the replica is behind. The adapter syncs the replica itself,
since libsql's background sync does not report when it last finished.

A replica read that fails in the database runs again on the primary. A
read's statements stop at the operation deadline; a write's have none,
since a write cut off after it reached the primary leaves its commit state
unknown. A replica's freshness counts from when its last sync started,
and a sync that a write of this process overtakes leaves it stale. An operation that passes its deadline fails as storage
unavailable, naming the metadata database. A token sent over plain HTTP to a host other than
loopback is refused, naming `metadata.authToken`.

The database opens on first use, because the shared layer is synchronous
on the blocking pool. Every `Storage` of a process that names the same
settings shares one handle, so one replica file has one owner.

`is_package_owner` reads the current document. `catalog_generation` and
`tag_history` are async. The schema's statements run one at a time,
because libsql's remote `execute_batch` re-renders statements and drops
the comma in `STRICT, WITHOUT ROWID`.

Related to pnpm/tasks#244.

Checklist

  • I checked the referenced issue and verified that none of the PRs
    already linked to it solves it.
  • Added a changeset (pnpm changeset) if this PR changes any published
    package. Keep it short and written for pnpm users — it becomes a release note.
  • Added or updated tests.
  • Updated the documentation if needed.

Tests: pnpm test:rust over every pnpr-* crate plus pnpm-registry-mock (1824 passed). New tests in metadata/sql/tests/libsql.rs run against the local primary that serves libsql's sync protocol. They cover: the primary shared by two instances; replica reads served locally (no statement reaches the primary) and lagging another instance's commit within the sync interval; current and at-least reads bypassing or syncing the replica; an instance reading its own commits and note edits from its replica; a replica past its interval syncing before it serves; one handle per process. Config tests cover the new keys. The existing SQLite conformance tests run against libSQL in the next PR.

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

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Hosted package metadata can now use a shared libSQL database, including with S3 archive storage.
    • Optional local replicas can serve package documents and listings, with synchronization configurable by interval. Reads requiring current data use the primary, and reads fall back to it if replica synchronization fails. Instances can see their own changes.
    • Metadata settings now support libSQL URLs, authentication tokens, and connection limits.
  • Documentation
    • Added guidance on libSQL configuration, authentication, connection limits, replica behavior, and token security requirements.

@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Walkthrough

This change adds libSQL as a metadata backend, with optional embedded replicas. SQL metadata operations now use asynchronous transactions and freshness-aware reads. It also adds connection-pool support, configuration validation, and local integration tests.

Changes: libSQL metadata backend

Layer / File(s) Summary
Metadata configuration
.changeset/libsql-metadata.md, pnpr/crates/config/src/*, pnpr/crates/config/src/tests/storage.rs, pnpr/docs/configuration.md
Metadata settings accept libSQL URLs, authentication tokens, replica paths, sync intervals, and connection limits. Validation checks URL and replica-setting combinations. Secret validation checks metadata auth-token references.
Shared SQL metadata transactions and views
pnpr/crates/storage/src/metadata.rs, pnpr/crates/storage/src/metadata/sql.rs, pnpr/crates/storage/src/metadata/sql/*, pnpr/crates/storage/src/journal/tests.rs
SQL metadata reads and writes run through asynchronous transaction paths. Reads support current, bounded, and minimum-generation freshness. Package views, schema preparation, and related tests use the updated interfaces.
libSQL connection and test protocol support
pnpr/crates/libsql/Cargo.toml, pnpr/crates/libsql/src/*
The pool exposes connection checkouts. The local test primary handles baton-based stream connections, cursor requests, base64 blobs, and transaction-conflict errors.
libSQL storage and replica integration
pnpr/crates/storage/Cargo.toml, pnpr/crates/storage/src/metadata/sql/libsql.rs, pnpr/crates/storage/src/metadata/sql/tests/libsql.rs, pnpr/crates/pnpr/Cargo.toml, pnpr/crates/pnpr/src/server/authentication.rs, pnpr/crates/error/src/lib.rs, pnpr/docs/storage.md
The feature-gated adapter connects SQL metadata to libSQL. Writes use the primary; replica reads can synchronize and fall back to the primary. Tests cover shared metadata and replica behavior.

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant SqlView
  participant SqlMetadata
  participant Transactions
  participant LibsqlAdapter
  participant Replica
  participant Primary
  SqlView->>SqlMetadata: Request package read with freshness
  SqlMetadata->>Transactions: Run read transaction
  Transactions->>LibsqlAdapter: Select read source
  LibsqlAdapter->>Replica: Read when freshness permits
  LibsqlAdapter->>Replica: Sync when required
  LibsqlAdapter->>Primary: Read when replica is unavailable or stale
  SqlView->>SqlMetadata: Submit metadata write
  SqlMetadata->>Transactions: Run write transaction
  Transactions->>LibsqlAdapter: Execute write
  LibsqlAdapter->>Primary: Commit metadata changes
Loading

Possibly related PRs

  • pnpm/pnpm#17578: Defines the metadata URL contract and SQLite default extended by this change.
  • pnpm/pnpm#17577: Introduces the SQL metadata and adapter layers extended here.
  • pnpm/pnpm#17580: Moves shared libSQL connection infrastructure into pnpr-libsql, which this change uses for metadata storage.

Suggested labels: product: pnpr

Merge Risk: Minimal · up to 3b49c

The reviewed test updates preserve the intended freshness behavior and avoid platform-dependent timestamp assumptions; the change is mergeable.

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 80d47db and 3b49c62.

Files selected for processing: 1
  • pnpr/crates/storage/src/metadata/sql/libsql/tests.rs

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Micro-Benchmark Results

Linux

group                                            main                                   pr
-----                                            ----                                   --
lockfile/parse_pnpm_lock                         1.00     11.3±0.08ms    33.2 MB/sec    1.03     11.7±0.07ms    32.1 MB/sec
packument/parse                                  1.03     39.4±0.26µs  1685.0 MB/sec    1.00     38.2±0.47µs  1736.5 MB/sec
tarball/download_dependency                      1.00   677.1±42.58µs     6.3 MB/sec    1.01   686.5±70.99µs     6.2 MB/sec
tarball_batch/cold_store_many_medium_tarballs    1.01    165.8±2.75ms 96.5 KElem/sec    1.00    164.8±2.19ms 97.1 KElem/sec
version_pick/repeated_ranges_file                1.04      4.1±0.11ms  7.6 KElem/sec    1.00      3.9±0.02ms  7.9 KElem/sec
version_pick/repeated_ranges_raw                 1.05      4.1±0.11ms  7.6 KElem/sec    1.00      3.9±0.02ms  7.9 KElem/sec
workspace_resolution/hoist_heavy                 1.00    214.5±1.14ms        ? ?/sec    1.01    217.0±0.83ms        ? ?/sec
workspace_sort/chained_projects                  1.00     11.6±0.50ms        ? ?/sec    1.04     12.0±1.09ms        ? ?/sec

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Same-run regression check

HEAD and main are measured on the same runner. The tolerance is 5% of the main median or 2 ms, whichever is larger. A regression requires both the median slowdown and the gap between the fastest retained HEAD sample and slowest retained main sample to exceed this tolerance, after trimming up to 10% from each tail. Suspected regressions are rerun once with target order reversed and only fail if reproduced. This conservative noise guard is not a statistical confidence interval.

Inconclusive rows do not fail the check. They remain visible for performance review. Bencher retains absolute minimum timings for historical tracking; historical alerts do not gate this PR. Sequential measurements can still be affected by runner drift.

Scenario Engine main median HEAD median Change Tolerance Result
isolated-fresh-restore-cold-cache-cold-store pacquet 2378.97 ms 2294.25 ms -3.6% 118.95 ms Within tolerance
isolated-fresh-restore-cold-cache-cold-store pnpr 1381.73 ms 1344.47 ms -2.7% 69.09 ms Within tolerance
isolated-fresh-restore-hot-cache-hot-store pacquet 229.61 ms 276.03 ms 20.2% 11.48 ms Inconclusive (overlapping samples)
isolated-fresh-restore-hot-cache-hot-store pnpr 226.24 ms 235.15 ms 3.9% 11.31 ms Within tolerance
isolated-repeat-install-hot-cache-hot-store pacquet 13.69 ms 12.99 ms -5.1% 2.00 ms Within tolerance
isolated-repeat-install-hot-cache-hot-store pnpr 11.37 ms 12.84 ms 12.9% 2.00 ms Within tolerance
isolated-repeat-install-cold-cache-hot-store pacquet 11.56 ms 11.44 ms -1.0% 2.00 ms Within tolerance
isolated-repeat-install-cold-cache-hot-store pnpr 12.10 ms 11.83 ms -2.2% 2.00 ms Within tolerance
isolated-fresh-install-cold-cache-cold-store pacquet 2506.55 ms 2517.27 ms 0.4% 125.33 ms Within tolerance
isolated-fresh-install-cold-cache-cold-store pnpr 1434.97 ms 1576.00 ms 9.8% 71.75 ms Inconclusive (overlapping samples)
isolated-fresh-install-hot-cache-hot-store pacquet 506.79 ms 526.64 ms 3.9% 25.34 ms Within tolerance
isolated-fresh-install-hot-cache-hot-store pnpr 315.20 ms 330.34 ms 4.8% 15.76 ms Within tolerance
isolated-fresh-install-cold-cache-hot-store pacquet 1674.98 ms 1632.19 ms -2.6% 83.75 ms Within tolerance
isolated-fresh-install-cold-cache-hot-store pnpr 317.30 ms 309.82 ms -2.4% 15.87 ms Within tolerance
isolated-fresh-resolve-hot-cache-offline pacquet 268.58 ms 264.93 ms -1.4% 13.43 ms Within tolerance
isolated-fresh-resolve-hot-cache-offline pnpr 92.81 ms 92.98 ms 0.2% 4.64 ms Within tolerance
isolated-peer-heavy-resolve-hot-cache-offline pacquet 228.29 ms 218.22 ms -4.4% 11.41 ms Within tolerance
isolated-linked-workspace-resolve-hot-cache-offline pacquet 79.28 ms 105.10 ms 32.6% 3.96 ms Inconclusive (overlapping samples)
isolated-injected-workspace-repeat-install-hot-cache-hot-store pacquet 92.94 ms 100.06 ms 7.7% 4.65 ms Inconclusive (overlapping samples)
isolated-fresh-restore-cold-cache-cold-store-cold-pnpr pacquet 4501.31 ms 4615.11 ms 2.5% 225.07 ms Within tolerance
isolated-fresh-restore-cold-cache-cold-store-cold-pnpr pnpr 3567.91 ms 3547.17 ms -0.6% 178.40 ms Within tolerance
gvs-fresh-restore-hot-cache-hot-store pacquet 143.10 ms 146.10 ms 2.1% 7.15 ms Within tolerance
gvs-fresh-restore-hot-cache-hot-store pnpr 164.06 ms 165.49 ms 0.9% 8.20 ms Within tolerance
store-only-unlocked-direct-deps-cold-cache-hot-store pacquet 1282.31 ms 1326.40 ms 3.4% 64.12 ms Within tolerance
cargo-repeat-install-hot-cache-hot-store pacquet 38.88 ms 38.23 ms -1.7% 2.00 ms Within tolerance

Same-run syscall check

Each install runs 2 more times per revision, untimed, under strace --follow-forks --summary-only. A file syscall regresses when HEAD's fewest calls exceed main's most by more than 2% of main or 50 calls, whichever is larger. mkdir and mkdirat count only the calls that created a directory, since concurrent installs fail a varying number with EEXIST. A syscall whose identical runs differ by more than that tolerance is reported unstable and not gated, unless HEAD's fewest calls also exceed main's most by more than the tolerance plus that difference. Each scenario lists its largest change relative to its tolerance and every row that is not within tolerance.

Scenario Engine Syscall main calls (max) HEAD calls (min) Change Tolerance Identical-run spread Result
isolated-fresh-restore-cold-cache-cold-store pacquet readlink 15250 15319 +0.5% 305 29 Within tolerance
isolated-fresh-restore-cold-cache-cold-store pnpr access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-restore-hot-cache-hot-store pacquet statx 48341 48344 +0.0% 966 10 Within tolerance
isolated-fresh-restore-hot-cache-hot-store pnpr access 11 11 +0.0% 50 0 Within tolerance
isolated-repeat-install-hot-cache-hot-store pacquet access 8 8 +0.0% 50 0 Within tolerance
isolated-repeat-install-hot-cache-hot-store pnpr access 8 8 +0.0% 50 0 Within tolerance
isolated-repeat-install-cold-cache-hot-store pacquet access 8 8 +0.0% 50 0 Within tolerance
isolated-repeat-install-cold-cache-hot-store pnpr access 8 8 +0.0% 50 0 Within tolerance
isolated-fresh-install-cold-cache-cold-store pacquet readlink 16389 16511 +0.7% 327 90 Within tolerance
isolated-fresh-install-cold-cache-cold-store pnpr access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-install-hot-cache-hot-store pacquet access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-install-hot-cache-hot-store pnpr access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-install-cold-cache-hot-store pacquet readlink 15587 15632 +0.3% 311 96 Within tolerance
isolated-fresh-install-cold-cache-hot-store pnpr access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-resolve-hot-cache-offline pacquet access 8 8 +0.0% 50 0 Within tolerance
isolated-fresh-resolve-hot-cache-offline pnpr access 8 8 +0.0% 50 0 Within tolerance
isolated-peer-heavy-resolve-hot-cache-offline pacquet access 8 8 +0.0% 50 0 Within tolerance
isolated-linked-workspace-resolve-hot-cache-offline pacquet access 8 8 +0.0% 50 0 Within tolerance
isolated-injected-workspace-repeat-install-hot-cache-hot-store pacquet access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-restore-cold-cache-cold-store-cold-pnpr pacquet access 11 11 +0.0% 50 0 Within tolerance
isolated-fresh-restore-cold-cache-cold-store-cold-pnpr pnpr symlink 3889 3891 +0.1% 77 5 Within tolerance
gvs-fresh-restore-hot-cache-hot-store pacquet access 11 11 +0.0% 50 0 Within tolerance
gvs-fresh-restore-hot-cache-hot-store pnpr access 11 11 +0.0% 50 0 Within tolerance
store-only-unlocked-direct-deps-cold-cache-hot-store pacquet access 8 8 +0.0% 50 0 Within tolerance
cargo-repeat-install-hot-cache-hot-store pacquet access 22 22 +0.0% 50 0 Within tolerance

Integrated-Benchmark Report (Linux)

Commit: 3b49c6260fc2

Compared against main at: 7c514d13d4df

Regular scenarios report direct and pnpr installs. The peer-heavy resolver scenario compares current Rust, main Rust, and TypeScript pnpm; the linked, injected, and Cargo workspace scenarios compare current Rust against main Rust. Bencher consumes pacquet@HEAD and pnpr@HEAD.

The tables below show mean ± σ. Bencher tracks absolute minimum latency; PR regression checks compare HEAD and main samples from the same runner. Historical timing alerts do not gate PRs.

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

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.350 ± 0.157 2.227 2.647 1.67 ± 0.18
pacquet@main 2.416 ± 0.140 2.243 2.633 1.72 ± 0.18
pnpr@HEAD 1.407 ± 0.122 1.269 1.587 1.00
pnpr@main 1.419 ± 0.119 1.308 1.660 1.01 ± 0.12
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.35027352916,
      "stddev": 0.15707005630300178,
      "median": 2.29425268706,
      "user": 1.9743862599999997,
      "system": 1.44373102,
      "min": 2.2272305565600004,
      "max": 2.64675641456
    },
    {
      "command": "pacquet@main",
      "mean": 2.4161547154600003,
      "stddev": 0.14003465675674567,
      "median": 2.3789651760600004,
      "user": 2.1029097599999997,
      "system": 1.5517197200000001,
      "min": 2.2430321705600003,
      "max": 2.6329619065600003
    },
    {
      "command": "pnpr@HEAD",
      "mean": 1.4070767336599999,
      "stddev": 0.12195899296735385,
      "median": 1.3444693715599998,
      "user": 1.7289994600000003,
      "system": 1.3209152200000003,
      "min": 1.26852658956,
      "max": 1.5868794695600001
    },
    {
      "command": "pnpr@main",
      "mean": 1.41865129036,
      "stddev": 0.119265869883788,
      "median": 1.3817262935599999,
      "user": 1.8635163599999998,
      "system": 1.3908376199999999,
      "min": 1.3084182465599998,
      "max": 1.65969221256
    }
  ]
}

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

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 267.7 ± 35.3 212.4 311.4 1.16 ± 0.16
pacquet@main 234.1 ± 18.0 209.5 265.5 1.01 ± 0.09
pnpr@HEAD 242.3 ± 19.7 218.9 289.6 1.05 ± 0.10
pnpr@main 231.5 ± 10.5 220.2 252.7 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.26774812688000005,
      "stddev": 0.03528584626110027,
      "median": 0.27603106728000004,
      "user": 0.31052854,
      "system": 0.6297571399999999,
      "min": 0.21236748078,
      "max": 0.31142187278000005
    },
    {
      "command": "pacquet@main",
      "mean": 0.23412796578,
      "stddev": 0.01797904685379347,
      "median": 0.22960638528,
      "user": 0.27404654000000006,
      "system": 0.56859164,
      "min": 0.20950906378,
      "max": 0.26546733378000004
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.24225661817999997,
      "stddev": 0.019738487671810315,
      "median": 0.23515171228,
      "user": 0.26619984,
      "system": 0.5723533399999999,
      "min": 0.21889695878,
      "max": 0.28958308078000006
    },
    {
      "command": "pnpr@main",
      "mean": 0.23152426338,
      "stddev": 0.010536269430586439,
      "median": 0.22624037028,
      "user": 0.26196584,
      "system": 0.5419087399999999,
      "min": 0.22022202278,
      "max": 0.25272377378000005
    }
  ]
}

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

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 13.1 ± 1.2 10.3 17.2 1.13 ± 0.16
pacquet@main 13.7 ± 1.6 10.6 17.5 1.19 ± 0.19
pnpr@HEAD 12.9 ± 1.0 10.6 15.4 1.12 ± 0.15
pnpr@main 11.5 ± 1.2 9.6 21.7 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.013057511657499996,
      "stddev": 0.0012345800067114512,
      "median": 0.01299450712,
      "user": 0.007863228249999996,
      "system": 0.00663086375,
      "min": 0.01033811712,
      "max": 0.01716703312
    },
    {
      "command": "pacquet@main",
      "mean": 0.013746503605207093,
      "stddev": 0.0015573181405636298,
      "median": 0.013685779120000002,
      "user": 0.008531398343195263,
      "system": 0.006727874556213016,
      "min": 0.010588588120000002,
      "max": 0.01752063512
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.012903762017321432,
      "stddev": 0.0010371388998940488,
      "median": 0.012836376120000001,
      "user": 0.0077476907142857085,
      "system": 0.006592629464285712,
      "min": 0.01060219712,
      "max": 0.01535910612
    },
    {
      "command": "pnpr@main",
      "mean": 0.01150444964991452,
      "stddev": 0.0012324946259612975,
      "median": 0.011369855620000001,
      "user": 0.006648544957264961,
      "system": 0.005859118974358972,
      "min": 0.00956627312,
      "max": 0.02174366112
    }
  ]
}

Scenario: Isolated linker: repeat install, cold cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 11.8 ± 1.3 9.3 15.3 1.00
pacquet@main 11.8 ± 1.8 9.4 33.3 1.00 ± 0.19
pnpr@HEAD 12.2 ± 1.7 9.3 20.3 1.04 ± 0.19
pnpr@main 12.5 ± 2.0 9.7 19.1 1.06 ± 0.20
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.011755698302407405,
      "stddev": 0.0013250962879117454,
      "median": 0.011436828020000001,
      "user": 0.006725662777777773,
      "system": 0.006096652407407406,
      "min": 0.009287287020000002,
      "max": 0.015287840020000002
    },
    {
      "command": "pacquet@main",
      "mean": 0.0117708538148718,
      "stddev": 0.0017941647672057024,
      "median": 0.011556404020000001,
      "user": 0.007066986495726497,
      "system": 0.0056708011965811945,
      "min": 0.009396804020000002,
      "max": 0.03329446102
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.012167491740164614,
      "stddev": 0.0017012085747999124,
      "median": 0.011829212020000002,
      "user": 0.007145329958847734,
      "system": 0.006055038024691359,
      "min": 0.009302096020000001,
      "max": 0.020328548020000003
    },
    {
      "command": "pnpr@main",
      "mean": 0.012471110547777773,
      "stddev": 0.001950108475739375,
      "median": 0.012099806020000003,
      "user": 0.0074745146296296295,
      "system": 0.006124237777777778,
      "min": 0.009655941020000001,
      "max": 0.019071072020000003
    }
  ]
}

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

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 2.516 ± 0.033 2.443 2.552 1.72 ± 0.09
pacquet@main 2.508 ± 0.023 2.468 2.554 1.72 ± 0.09
pnpr@HEAD 1.573 ± 0.105 1.393 1.761 1.08 ± 0.09
pnpr@main 1.461 ± 0.073 1.377 1.583 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 2.5161767779600006,
      "stddev": 0.033179165181082076,
      "median": 2.5172677404600003,
      "user": 2.3130892199999997,
      "system": 1.5930076999999998,
      "min": 2.44329552146,
      "max": 2.55197577746
    },
    {
      "command": "pacquet@main",
      "mean": 2.50791574946,
      "stddev": 0.023088201308936365,
      "median": 2.5065485034600004,
      "user": 2.3312655199999996,
      "system": 1.5160543999999996,
      "min": 2.46780404246,
      "max": 2.55399973346
    },
    {
      "command": "pnpr@HEAD",
      "mean": 1.5731410078599999,
      "stddev": 0.10454570672964712,
      "median": 1.57599513546,
      "user": 1.8186266200000003,
      "system": 1.3550787,
      "min": 1.39324721046,
      "max": 1.76065779246
    },
    {
      "command": "pnpr@main",
      "mean": 1.4609020857600001,
      "stddev": 0.07325200145340931,
      "median": 1.4349659724600001,
      "user": 1.81270022,
      "system": 1.3073973,
      "min": 1.37668455346,
      "max": 1.5825519294600001
    }
  ]
}

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

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 533.8 ± 46.2 473.8 614.0 1.69 ± 0.16
pacquet@main 505.7 ± 21.4 464.1 533.7 1.60 ± 0.08
pnpr@HEAD 330.8 ± 11.2 318.0 354.0 1.05 ± 0.05
pnpr@main 315.5 ± 9.5 299.8 327.5 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.5338324308,
      "stddev": 0.046195280725173565,
      "median": 0.5266358191,
      "user": 0.79750844,
      "system": 0.9559890799999999,
      "min": 0.4737621836,
      "max": 0.6139991546
    },
    {
      "command": "pacquet@main",
      "mean": 0.5057418559,
      "stddev": 0.021387632173500343,
      "median": 0.5067870005999999,
      "user": 0.7565603399999999,
      "system": 0.9169418800000001,
      "min": 0.4641114756,
      "max": 0.5336508526
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.3308057887,
      "stddev": 0.01118210093859611,
      "median": 0.3303362971,
      "user": 0.30293524000000005,
      "system": 0.6480319800000001,
      "min": 0.3179879326,
      "max": 0.3540433886
    },
    {
      "command": "pnpr@main",
      "mean": 0.3155115596,
      "stddev": 0.00954114623122776,
      "median": 0.3151990086,
      "user": 0.29096863999999995,
      "system": 0.6354698799999999,
      "min": 0.2997922786,
      "max": 0.3275196976
    }
  ]
}

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

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.624 ± 0.024 1.590 1.658 5.20 ± 0.22
pacquet@main 1.675 ± 0.025 1.624 1.712 5.37 ± 0.22
pnpr@HEAD 0.312 ± 0.012 0.297 0.330 1.00
pnpr@main 0.319 ± 0.008 0.309 0.334 1.02 ± 0.05
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.62446878662,
      "stddev": 0.02368256551674043,
      "median": 1.63218895662,
      "user": 0.86144254,
      "system": 0.8387753799999998,
      "min": 1.58998516162,
      "max": 1.65776817562
    },
    {
      "command": "pacquet@main",
      "mean": 1.6753243014199999,
      "stddev": 0.025084542878074316,
      "median": 1.6749809511200002,
      "user": 0.9401493399999998,
      "system": 0.9534007799999997,
      "min": 1.6237989086200002,
      "max": 1.71224688462
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.31210887162,
      "stddev": 0.012081823910543403,
      "median": 0.30982447162000004,
      "user": 0.30562603999999993,
      "system": 0.6066478799999999,
      "min": 0.29689058562,
      "max": 0.33032883462
    },
    {
      "command": "pnpr@main",
      "mean": 0.31853187802,
      "stddev": 0.007699494974297146,
      "median": 0.31730068362,
      "user": 0.29515364,
      "system": 0.6549324799999999,
      "min": 0.30932148162,
      "max": 0.33426405462000003
    }
  ]
}

Scenario: Isolated linker: fresh resolve, hot cache, offline

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 265.0 ± 14.7 239.6 287.6 2.83 ± 0.17
pacquet@main 272.0 ± 24.4 237.9 314.2 2.90 ± 0.27
pnpr@HEAD 93.7 ± 2.5 90.6 101.4 1.00
pnpr@main 93.9 ± 3.0 90.5 102.1 1.00 ± 0.04
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.26498338652000003,
      "stddev": 0.014697774233953817,
      "median": 0.26492841042000004,
      "user": 0.25604523999999995,
      "system": 0.1826982,
      "min": 0.23955539642,
      "max": 0.28761677142000003
    },
    {
      "command": "pacquet@main",
      "mean": 0.2720467623200001,
      "stddev": 0.02442182306600725,
      "median": 0.26858064442,
      "user": 0.26085714,
      "system": 0.1921062,
      "min": 0.23793837542000001,
      "max": 0.31419325642
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.09371111888666668,
      "stddev": 0.0024969115024503262,
      "median": 0.09298094992,
      "user": 0.03965047333333333,
      "system": 0.017085899999999998,
      "min": 0.09058305842000001,
      "max": 0.10141696842000002
    },
    {
      "command": "pnpr@main",
      "mean": 0.09392987477483873,
      "stddev": 0.002963159431947895,
      "median": 0.09280750042000001,
      "user": 0.036745249677419364,
      "system": 0.017709596774193554,
      "min": 0.09045561842000001,
      "max": 0.10209240842000002
    }
  ]
}

Scenario: Isolated linker: peer-heavy resolve, hot cache, offline

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 209.4 ± 16.3 189.0 230.2 1.00
pacquet@main 230.0 ± 10.4 215.3 246.1 1.10 ± 0.10
pnpm@HEAD 4336.8 ± 318.2 3876.2 4971.9 20.71 ± 2.22
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.2094095178555556,
      "stddev": 0.016332827449604462,
      "median": 0.2182179083,
      "user": 0.22318481333333334,
      "system": 0.04176326444444444,
      "min": 0.1889849103,
      "max": 0.23024258030000003
    },
    {
      "command": "pacquet@main",
      "mean": 0.22998267763333333,
      "stddev": 0.010411792717755004,
      "median": 0.22829499830000002,
      "user": 0.24637081333333333,
      "system": 0.04408582,
      "min": 0.2152872063,
      "max": 0.24606057530000003
    },
    {
      "command": "pnpm@HEAD",
      "mean": 4.336835884188888,
      "stddev": 0.31819845392305013,
      "median": 4.3204735573,
      "user": 6.686554257777776,
      "system": 0.40388482000000003,
      "min": 3.8761828113,
      "max": 4.9718565173
    }
  ]
}

Scenario: Isolated linker: linked-workspace resolve, hot cache, offline

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 101.9 ± 14.8 77.2 132.4 1.19 ± 0.27
pacquet@main 85.8 ± 14.6 69.9 132.8 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.10186351528702704,
      "stddev": 0.014764271176127925,
      "median": 0.10510092726,
      "user": 0.09555517513513512,
      "system": 0.06525362216216216,
      "min": 0.07717730426000001,
      "max": 0.13238601926000002
    },
    {
      "command": "pacquet@main",
      "mean": 0.08575271451000002,
      "stddev": 0.014626053057368171,
      "median": 0.07927940526,
      "user": 0.07901109555555555,
      "system": 0.05594943222222223,
      "min": 0.06988354726,
      "max": 0.13278227626
    }
  ]
}

Scenario: Isolated linker: injected workspace repeat install, hot cache + hot store

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 101.3 ± 5.5 93.3 112.8 1.05 ± 0.09
pacquet@main 96.8 ± 6.3 90.4 109.5 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.10125476626000002,
      "stddev": 0.005490621989057935,
      "median": 0.10005777046,
      "user": 0.037780173333333326,
      "system": 0.07100319999999999,
      "min": 0.09333491346,
      "max": 0.11284913146
    },
    {
      "command": "pacquet@main",
      "mean": 0.09678466549124999,
      "stddev": 0.006261665810473412,
      "median": 0.09293747846,
      "user": 0.03576244624999998,
      "system": 0.06813505624999999,
      "min": 0.09042770146,
      "max": 0.10946426846
    }
  ]
}

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

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 4.679 ± 0.167 4.504 4.965 1.32 ± 0.05
pacquet@main 4.552 ± 0.138 4.407 4.826 1.28 ± 0.05
pnpr@HEAD 3.545 ± 0.065 3.438 3.677 1.00
pnpr@main 3.602 ± 0.137 3.460 3.899 1.02 ± 0.04
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 4.67880826918,
      "stddev": 0.16654313448960814,
      "median": 4.615114480379999,
      "user": 2.6241430399999994,
      "system": 1.7889284799999998,
      "min": 4.504416540379999,
      "max": 4.96509255238
    },
    {
      "command": "pacquet@main",
      "mean": 4.552266510279999,
      "stddev": 0.13763826448353408,
      "median": 4.501307304379999,
      "user": 2.39608674,
      "system": 1.7651564799999995,
      "min": 4.40713458638,
      "max": 4.82560339438
    },
    {
      "command": "pnpr@HEAD",
      "mean": 3.54517575828,
      "stddev": 0.06528604299570451,
      "median": 3.5471672188800003,
      "user": 2.21024464,
      "system": 1.5839012799999999,
      "min": 3.43776197638,
      "max": 3.67706668838
    },
    {
      "command": "pnpr@main",
      "mean": 3.602345303880001,
      "stddev": 0.13709868886901344,
      "median": 3.56790596138,
      "user": 2.23011734,
      "system": 1.6137452799999998,
      "min": 3.46030315938,
      "max": 3.8989712833800003
    }
  ]
}

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

Same install as the isolated fresh-restore hot/hot scenario, into the shared virtual store, the layout pnpm 12 installs into by default. Scenarios run on separate machines, so compare main and branch within each table.

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 150.3 ± 11.9 132.9 176.2 1.03 ± 0.12
pacquet@main 146.3 ± 12.1 133.7 187.2 1.00
pnpr@HEAD 168.6 ± 12.3 154.1 199.2 1.15 ± 0.13
pnpr@main 164.9 ± 10.6 149.2 185.4 1.13 ± 0.12
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.1502716154047059,
      "stddev": 0.01189308753136457,
      "median": 0.14610081264,
      "user": 0.19941134352941178,
      "system": 0.1705629023529412,
      "min": 0.13289105164,
      "max": 0.17624790864
    },
    {
      "command": "pacquet@main",
      "mean": 0.14626616547333335,
      "stddev": 0.012070532485068316,
      "median": 0.14309578964,
      "user": 0.17903902,
      "system": 0.17359763111111112,
      "min": 0.13365317463999998,
      "max": 0.18721082264
    },
    {
      "command": "pnpr@HEAD",
      "mean": 0.16858684045250003,
      "stddev": 0.012309887934378004,
      "median": 0.16549267914,
      "user": 0.19480451999999998,
      "system": 0.18897745750000003,
      "min": 0.15407009464,
      "max": 0.19920794164
    },
    {
      "command": "pnpr@main",
      "mean": 0.16491977332750002,
      "stddev": 0.010592793873108963,
      "median": 0.16405871814,
      "user": 0.20414814499999998,
      "system": 0.16585745749999997,
      "min": 0.14924312464,
      "max": 0.18536893764
    }
  ]
}

Scenario: Store only: unlocked direct deps, cold cache + hot store

Store-only install (enableModulesDir: false, per-file store index, trusted lockfile) against a lockfile missing the direct dependencies that have peers, with the metadata cache wiped per iteration: the install resolves those from the registry, reuses their subtrees from the lockfile and checks the store, linking nothing. Direct installs only.

Command Mean [s] Min [s] Max [s] Relative
pacquet@HEAD 1.338 ± 0.059 1.257 1.440 1.04 ± 0.06
pacquet@main 1.281 ± 0.045 1.228 1.384 1.00
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 1.33818664902,
      "stddev": 0.05913818946830415,
      "median": 1.32640017102,
      "user": 0.7282128199999999,
      "system": 0.30109184,
      "min": 1.25685470402,
      "max": 1.43955349002
    },
    {
      "command": "pacquet@main",
      "mean": 1.28072183552,
      "stddev": 0.044979532583167704,
      "median": 1.28230518802,
      "user": 0.6456415200000001,
      "system": 0.25880413999999996,
      "min": 1.22835001102,
      "max": 1.38350075202
    }
  ]
}

Scenario: Cargo: repeat install, hot cache + hot store

Frozen repeat install of a Cargo workspace (cargo.enabled: true) whose crates are already materialized in <storeDir>/v11/crates/ and linked into .pnpm/crates/crates-io. Direct installs only.

Command Mean [ms] Min [ms] Max [ms] Relative
pacquet@HEAD 39.0 ± 3.7 32.1 47.7 1.00
pacquet@main 39.6 ± 3.8 31.8 51.5 1.01 ± 0.14
BENCHMARK_REPORT.json
{
  "results": [
    {
      "command": "pacquet@HEAD",
      "mean": 0.03902185305999999,
      "stddev": 0.0037428100070243508,
      "median": 0.03822686306,
      "user": 0.028718663478260863,
      "system": 0.022097249855072464,
      "min": 0.03206414706,
      "max": 0.04771765406
    },
    {
      "command": "pacquet@main",
      "mean": 0.0396038817725,
      "stddev": 0.003760686667096805,
      "median": 0.03888042406,
      "user": 0.03019892,
      "system": 0.0217057175,
      "min": 0.03178082406,
      "max": 0.05146687006
    }
  ]
}

@codecov-commenter

codecov-commenter commented Nov 2, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.12676% with 63 lines in your changes missing coverage. Please review.
✅ Project coverage is 92.72%. Comparing base (7c514d1) to head (3b49c62).

Files with missing lines Patch % Lines
pnpr/crates/storage/src/metadata/sql/libsql.rs 88.94% 24 Missing ⚠️
...pr/crates/storage/src/metadata/sql/transactions.rs 88.46% 15 Missing ⚠️
pnpr/crates/storage/src/metadata.rs 60.86% 9 Missing ⚠️
pnpr/crates/libsql/src/testing.rs 94.73% 5 Missing ⚠️
pnpr/crates/storage/src/metadata/sql/adapter.rs 63.63% 4 Missing ⚠️
pnpr/crates/config/src/storage_config.rs 97.22% 2 Missing ⚠️
pnpr/crates/storage/src/metadata/sql.rs 96.00% 2 Missing ⚠️
pnpr/crates/config/src/backend_config.rs 83.33% 1 Missing ⚠️
pnpr/crates/storage/src/metadata/sql/view.rs 97.91% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #17583      +/-   ##
==========================================
- Coverage   92.73%   92.72%   -0.01%     
==========================================
  Files        2011     2014       +3     
  Lines      260008   260506     +498     
==========================================
+ Hits       241108   241564     +456     
- Misses      18900    18942      +42     

☔ View full report in Codecov by Harness.
📢 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.

@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch from bb53c81 to 774eb17 Compare November 2, 2026 23:53
@garnet-runtime-review

garnet-runtime-review Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Nothing new recorded

0 of 1 recorded job changed
Garnet records 1 of 19 TS CI jobs
At 3b49c62, compared with the last 10 recorded runs on main (latest 7c514d1)
Recorded at the kernel (best-effort capture)

TS CI / Test / ubuntu (24.0.0, 2) / Node 24 / chunk 2/3 · nothing new

Workload · 7c514d1 → 3b49c62

  bash
  ├─ rustup
  │  └─ dualstack.k.sni.global.fastly[.]net
  └─ MainThread › pn
     ├─ dash › node
     │  ├─ node › node › git
     │  │  ├─ git › git › git-remote-http
     │  │  │  └─ github[.]com
     │  │  └─ 192.168.127[.]1
     │  └─ pn › node
     │     ├─ dash
     │     │  ├─ dash › node
     │     │  │  └─ nodejs[.]org
     │     │  └─ node
     │     │     └─ registry.npmjs[.]org
     │     ├─ git
     │     │  ├─ git › git › git-remote-http
     │     │  │  └─ github[.]com
     │     │  └─ 192.168.127[.]1
     │     ├─ node
     │     │  ├─ git › git › git-remote-http
     │     │  │  └─ github[.]com
     │     │  ├─ node
     │     │  │  └─ registry.npmjs[.]org
     │     │  ├─ codeload.github[.]com
     │     │  ├─ github[.]com
     │     │  └─ unofficial-builds.nodejs[.]org
     │     ├─ pnpr
     │     │  └─ registry.npmjs[.]org
     │     ├─ codeload.github[.]com
     │     ├─ github[.]com
     │     ├─ nodejs[.]org
     │     ├─ registry.npmjs[.]org
     │     └─ unofficial-builds.nodejs[.]org
     └─ nodejs[.]org

  node
  ├─ pnpm
  │  ├─ dash › node › dash › node
  │  │  └─ nodejs[.]org
  │  ├─ git
  │  │  ├─ git › git › git-remote-http
  │  │  │  └─ github[.]com
  │  │  └─ 192.168.127[.]1
  │  ├─ dualstack.k.sni.global.fastly[.]net
  │  ├─ nodejs[.]org
  │  ├─ registry.npmjs[.]org
  │  └─ unofficial-builds.nodejs[.]org
  ├─ node
  │  └─ registry.npmjs[.]org
  ├─ blacksmith.blob.core.windows[.]net
  └─ registry.npmjs[.]org

  systemd
  ├─ bash › bash › bash › bash › bash › bash › bash
  │  ├─ gh
  │  │  └─ api.github[.]com
  │  └─ node
  │     ├─ git
  │     │  ├─ git › git › git-remote-http
  │     │  │  └─ github[.]com
  │     │  └─ 192.168.127[.]1
  │     └─ pn
  │        ├─ dash › node › pn
  │        │  ├─ dash › pn › dash › pnpm › dash › node
  │        │  │  ├─ codeload.github[.]com
  │        │  │  └─ registry.npmjs[.]org
  │        │  └─ node
  │        │     ├─ node
  │        │     │  └─ registry.npmjs[.]org
  │        │     └─ pnpr
  │        │        └─ registry.npmjs[.]org
  │        └─ nodejs[.]org
  └─ git
     └─ 192.168.127[.]1

Runner & GitHub's own traffic · blacksmith-8vcpu-ubuntu-2404 · Linux X64

  node
  └─ productionresultssa4.blob.core.windows[.]net (github infra)

  MainThread
  └─ productionresultssa16.blob.core[.]windows (github infra)

  systemd
  ├─ chronyd
  │  ├─ 144.202.62[.]209
  │  ├─ 162.159.200[.]123
  │  ├─ 169[.]254[.]169[.]123
  │  ├─ 172.233.157[.]223
  │  ├─ 172.235.60[.]8
  │  ├─ 185.125.190[.]56
  │  ├─ 185.125.190[.]57
  │  ├─ 185.125.190[.]58
  │  ├─ 23.157.100[.]123
  │  ├─ 5.254.77[.]191
  │  ├─ 50.205.57[.]38
  │  ├─ 66.118.231[.]14
  │  └─ 91.189.91[.]157
  ├─ nginx › nginx
  │  ├─ 140.82.112[.]21
  │  ├─ 140.82.112[.]22
  │  ├─ 140.82.113[.]22
  │  ├─ 140.82.114[.]21
  │  ├─ 140.82.114[.]22
  │  ├─ 192.168.127[.]1
  │  └─ 8.8.8[.]8
  ├─ snapd
  │  └─ api.snapcraft[.]io
  ├─ sudo › sudo
  │  └─ 192.168.127[.]1
  └─ systemd-resolve
     └─ 8.8.8[.]8

Job log · Full record in Garnet ↗


How to read this
bash › curl                 ← ancestry as captured, then the process that acted
└─ example[.]com            ← what it reached

Read down: what ran, then what it reached. + only in this commit · − only in the compared run · unmarked in both. Runner & GitHub's own traffic is activity outside your steps and never counts. · Docs ↗

Recorded by Garnet · Add it to your CI ↗

@blacksmith-sh

This comment has been minimized.

@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch 2 times, most recently from 1bc2274 to d8d62c5 Compare November 3, 2026 00:58
@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch from d8d62c5 to ad386c0 Compare November 3, 2026 01:11
@zkochan
zkochan force-pushed the pnpr/libsql-crate branch 2 times, most recently from 3d7f5b8 to 70e8fc8 Compare November 3, 2026 01:26
@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch 2 times, most recently from 1c5ff60 to faa3293 Compare November 3, 2026 01:36
@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch from faa3293 to 3bb5200 Compare November 3, 2026 01:43
@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch from 3bb5200 to c820060 Compare November 3, 2026 01:56
@zkochan
zkochan force-pushed the pnpr/libsql-crate branch 2 times, most recently from b168ce5 to d6ea9a9 Compare November 3, 2026 02:07
@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch from c820060 to aa7f334 Compare November 3, 2026 02:07
@blacksmith-sh

This comment has been minimized.

@zkochan
zkochan force-pushed the pnpr/libsql-metadata branch 2 times, most recently from f922337 to 65b8f36 Compare November 3, 2026 03:06
@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 80d47db

@qodo-code-review

Copy link
Copy Markdown

PR Code Suggestions ✨

Warning

/improve is deprecated. Use /agentic_review instead (removal date not yet scheduled).

No code suggestions found for the PR.

@zkochan
zkochan added this pull request to the merge queue Nov 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 3, 2026
…e clock

Two readings of `Instant::now` can be equal on macOS, so a request read
just after a sync started could tie with it and count as answered. The
test now builds the request time from the sync's start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings November 3, 2026 05:16
@zkochan

zkochan commented Nov 3, 2026

Copy link
Copy Markdown
Member Author

The merge queue run failed on macOS in a_sync_started_before_a_request_does_not_answer_it, a test added in this round. It read the clock twice and expected the second reading to be later, but on macOS two readings can be equal, so the request tied with the sync's start and counted as answered. The code's rule (a sync that started at or after the request answers it) is unchanged. 3b49c62 builds the request time from the sync's start instead of reading the clock.

@coderabbitai resume

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

@greptile-apps greptile-apps Bot 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

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.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

@zkochan

zkochan commented Nov 3, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

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

@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

@zkochan I’ll resume automatic reviews. Thanks for explaining the macOS timing fix.


Learnings used
Learnt from: CR
Repo: pnpm/pnpm PR: 0
File: .agents/skills/review-code/references/REVIEW_GUIDE.md:0-0
Timestamp: 2026-10-31T08:00:41.948Z
Learning: Applicability reference:
AGENTS.md: # Agent Guide to pnpm Repository
## AI Review Guidance
The repository's review framework lives in **[review-code review guide](./.agents/skills/review-code/references/REVIEW_GUIDE.md)** — how changes are accepted or rejected, the security-first / performance-second priorities, the security checklist and advisory regression themes, and the test/changeset/version-coverage expectations. Apply it when reviewing pull requests. (TypeScript-specific code style and engineering conventions for the CLI are documented in the "Code Style" section of this file; pacquet and pnpr follow their own `AGENTS.md` and style guides.)

Source excerpt:
# pnpm Code Review Guide

## 9. pnpm v12 and v11 coverage

- For a bug fix, establish whether the bug is present in v11, v12, or both.
Learnt from: CR
Repo: pnpm/pnpm PR: 0
File: .agents/skills/review-code/references/REVIEW_GUIDE.md:0-0
Timestamp: 2026-10-21T05:21:21.922Z
Learning: Applicability reference:
AGENTS.md: # Agent Guide to pnpm Repository
## AI Review Guidance
The repository's review framework lives in **[review-code review guide](./.agents/skills/review-code/references/REVIEW_GUIDE.md)** — how changes are accepted or rejected, the security-first / performance-second priorities, the security checklist and advisory regression themes, and the test/changeset/version-coverage expectations. Apply it when reviewing pull requests. (TypeScript-specific code style and engineering conventions for the CLI are documented in the "Code Style" section of this file; pacquet and pnpr follow their own `AGENTS.md` and style guides.)

Source excerpt:
# pnpm Code Review Guide

## 7. Test expectations

- A **regression test that fails without the fix**.
Learnt from: CR
Repo: pnpm/pnpm PR: 0
File: .agents/skills/review-code/references/REVIEW_GUIDE.md:0-0
Timestamp: 2026-10-31T07:49:09.420Z
Learning: Applicability reference:
AGENTS.md: # Agent Guide to pnpm Repository
## AI Review Guidance
The repository's review framework lives in **[review-code review guide](./.agents/skills/review-code/references/REVIEW_GUIDE.md)** — how changes are accepted or rejected, the security-first / performance-second priorities, the security checklist and advisory regression themes, and the test/changeset/version-coverage expectations. Apply it when reviewing pull requests. (TypeScript-specific code style and engineering conventions for the CLI are documented in the "Code Style" section of this file; pacquet and pnpr follow their own `AGENTS.md` and style guides.)

Source excerpt:
# pnpm Code Review Guide

## 7. Test expectations

Tests must prove the changed behavior, not just execute nearby code.
Learnt from: CR
Repo: pnpm/pnpm PR: 0
File: .agents/skills/review-code/references/REVIEW_GUIDE.md:0-0
Timestamp: 2026-10-31T07:49:09.420Z
Learning: Applicability reference:
AGENTS.md: # Agent Guide to pnpm Repository
## AI Review Guidance
The repository's review framework lives in **[review-code review guide](./.agents/skills/review-code/references/REVIEW_GUIDE.md)** — how changes are accepted or rejected, the security-first / performance-second priorities, the security checklist and advisory regression themes, and the test/changeset/version-coverage expectations. Apply it when reviewing pull requests. (TypeScript-specific code style and engineering conventions for the CLI are documented in the "Code Style" section of this file; pacquet and pnpr follow their own `AGENTS.md` and style guides.)

Source excerpt:
# pnpm Code Review Guide

## 7. Test expectations

- **Meaningful, not vacuous**: assert the effect actually happened, so the test can't pass on
  an empty array or unchanged fixture.
Action performed

Reviews resumed and review finished.

@qodo-code-review

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 3b49c62

@qodo-code-review

Copy link
Copy Markdown

PR Code Suggestions ✨

Warning

/improve is deprecated. Use /agentic_review instead (removal date not yet scheduled).

No code suggestions found for the PR.

Auto-approved notes - no code suggestions found
- 'approve_pr_on_self_review' flag enabled

@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor
Action not completed

Already reviewed the last commit. Use @coderabbitai full review to rerun a review of the entire changeset.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@zkochan
zkochan added this pull request to the merge queue Nov 3, 2026
Merged via the queue into main with commit 79870bb Nov 3, 2026
76 checks passed
@zkochan
zkochan deleted the pnpr/libsql-metadata branch November 3, 2026 05:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

product: pnpr reviewed: coderabbit CodeRabbit submitted an approving review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants