From d3e5a1571ead8d80327f969044786e691c97379c Mon Sep 17 00:00:00 2001 From: Aaron Boodman Date: Tue, 16 Jun 2026 11:45:19 -1000 Subject: [PATCH 1/9] wip --- .agents/skills/release-notes/SKILL.md | 70 ++++++++++--- .releases/1.7/commits.md | 144 ++++++++++++++++++++++++++ contents/docs/otel.mdx | 19 ++-- contents/docs/release-notes/1.7.mdx | 66 ++++++++++++ 4 files changed, 277 insertions(+), 22 deletions(-) create mode 100644 .releases/1.7/commits.md create mode 100644 contents/docs/release-notes/1.7.mdx diff --git a/.agents/skills/release-notes/SKILL.md b/.agents/skills/release-notes/SKILL.md index 51f7439d..a8a63984 100644 --- a/.agents/skills/release-notes/SKILL.md +++ b/.agents/skills/release-notes/SKILL.md @@ -30,23 +30,67 @@ Produce a release note draft that is intentionally over-inclusive so a human can ## Workflow 1. Determine commit range between release tags: - - `git log --oneline --no-merges ..` -2. Classify commits using conventional commit prefixes: + - First list every non-merge commit in the raw range: + - `git log --reverse --oneline --no-merges ..` + - Keep this as the audit source until the human has reviewed categorization. +2. Remove commits already included in the previous release through cherry-picks: + - Find the common ancestor between previous release and target: + - `git merge-base ` + - Inspect commits on the previous-release side after that ancestor: + - `git log --reverse --format='%h%x09%s%n%b%n---END---' ..` + - Look for `-x` cherry-pick trailers such as `(cherry picked from commit )`. + - Also use patch-equivalence to catch cherry-picks whose lockfiles or package-manager files differ: + - `git log --right-only --no-merges --cherry-mark --format='%m%x09%h%x09%s' ...` + - Treat `=` commits as already present in the previous release and categorize them as `skip`, unless the target commit contains materially different user-facing changes. + - When a previous-release maintenance commit names a target commit in its cherry-pick trailer, categorize that target commit as `skip`. +3. Run the protocol compatibility check immediately: + - Find protocol constants in mono before drafting any notes. + - Check both previous release and target values, for example: + - `git show :packages/zero-protocol/src/protocol-version.ts` + - `git show :packages/zero-protocol/src/protocol-version.ts` + - Ensure the target version's minimum supported sync protocol is `<=` the previous release's `PROTOCOL_VERSION`. + - If compatibility fails, this is a release-blocking breaking change. Record it loudly in `.releases/./commits.md` with `BREAKING`, and mark the responsible commit `BREAKING` if it can be identified. + - If compatibility passes, still record the result in `.releases/./commits.md` so later release reviews do not need to rediscover it. +4. Categorize every commit and flag potential breaking changes before drafting. Use only these categories: + - `perf` + - `feature` + - `fix` + - `skip` + - Also identify potential breaking changes in every commit, including skipped/internal-looking commits. + - Look early for API renames/removals, env var/config changes, default behavior flips, migration requirements, protocol changes, package export/import changes, dependency/peer dependency changes that can affect install/runtime behavior, and commit text containing "breaking". + - Record breaking-change status separately from category. + - Use `-` for commits that are not believed breaking. + - Use `MAYBE` for commits that could be breaking and need human review; explain why in the note. + - If a commit is believed to be breaking, make it extremely visible with `BREAKING`. This should be rare; Zero release planning aims to avoid breaking changes. + - Treat breaking-change detection as an early warning system for ongoing release review, not something to defer until the final draft. +5. Present the categorization to the human for review before writing release notes: + - Use a Markdown table with `Commit`, `Category`, `Breaking?`, and `Note`. + - The note should be a few sentences when useful: summarize what changed, why the category was chosen, whether it was skipped due to cherry-pick, revert, internal-only scope, or lack of user-facing impact, and why it is or is not a potential breaking change. + - Prefer `skip` for CI, release tooling, benchmark-only, sample-only, dependency hygiene with no identified user-facing effect, reverted changes, and commits already in the previous release. + - Use `fix` for customer-observable behavior even when the commit is labeled `chore`, e.g. packaging changes that prevent duplicate runtime dependencies from breaking checks like `Pool instanceof`. + - Use `perf` for fixes whose primary user-facing value is measured speed/CPU/allocation improvement. + - Use `feature` for new user/operator/debugging capability. + - Reclassify suspicious commits while building the table: + - Include `chore` commits that look user-facing, behavior-changing, protocol-affecting, package/export-affecting, or crash/fix related. + - Check dependency update commits when they affect runtime, install, protocol, query correctness, or performance-critical packages. Look at upstream changelogs when needed. + - Treat the `Breaking?` column as the breaking-change pass: + - Look for API renames/removals, env var/config changes, behavior flips, migration requirements, protocol changes, package export/import changes, dependency/peer dependency changes, and semantically breaking behavior even if unlabeled. + - Also scan commit text for "breaking". + - Flag performance follow-ups early for commits that change query compilation, index use, dependency implementations, hot loops, or runtime semantics. Put the performance concern in the note or open questions even if the commit category is `fix`. +6. Save the reviewed categorization in the docs worktree before drafting: + - Use a stable release working-state directory under `.releases/./`, for example `.releases/1.7/commits.md`. + - Include release version, previous tag, target, merge base, the exact commands used, the reviewed table, potential breaking changes, and any unresolved questions. + - On later sessions, read this file first and evolve it instead of redoing the whole commit audit. +7. After human review of the categorization, classify the non-skipped commits using conventional commit prefixes as a starting point: - `feat` -> Features - `fix` -> Fixes - `perf` -> Performance (if meaningful) - `chore` -> ignored by default -3. Reclassify suspicious commits: - - Include chore commits that look user-facing, behavior-changing, protocol-affecting, or crash/fix related. - - Check dependency update commits (especially performance-critical packages like `compare-utf8`, `litestream`, etc.) - look at the upstream changelogs to see if they contain notable perf or fix items. -4. Breaking change pass (separate from type labels): - - Look for API renames/removals, env var/config changes, behavior flips, migration requirements, protocol changes. - - Also scan commit text for "breaking" or semantically breaking behavior even if unlabeled. -5. Protocol compatibility check: - - Find protocol constants in mono. - - Ensure `MIN_PROTOCOL_VERSION` in the version being documented is `<=` `PROTOCOL_VERSION` in the previous release version. - - Flag any mismatch in the draft. -6. Build draft release notes in the latest format used in this repo: +8. Before drafting, revisit the reviewed table: + - Confirm all non-skipped commits are represented or intentionally omitted. + - Re-check any `MAYBE` or `BREAKING` rows and summarize the decision in the draft or in the saved release state. + - Re-check any performance follow-ups recorded in `.releases/./commits.md`. +9. Build draft release notes in the latest format used in this repo: - Before drafting, read `contents/docs/release-notes/0.26.mdx` as the canonical long-form style reference to avoid format drift. - Frontmatter with `title` and `description` - `## Installation` diff --git a/.releases/1.7/commits.md b/.releases/1.7/commits.md new file mode 100644 index 00000000..08ca7502 --- /dev/null +++ b/.releases/1.7/commits.md @@ -0,0 +1,144 @@ +# Zero 1.7 Release Commit Categorization + +- Release: Zero 1.7 +- Previous release tag: `zero/v1.6.1` +- Target: `main` +- Monorepo path used: `/Users/aa/work/mono` +- Merge base: `9d447833ca69cedc9fd32e5a228ce285e3a8af91` + +## Commands Used + +```bash +git -C /Users/aa/work/mono log --reverse --format='%h%x09%s' --no-merges zero/v1.6.1..main +git -C /Users/aa/work/mono log --reverse --format='%h%x09%s%n%b%n---END---' 9d447833ca69cedc9fd32e5a228ce285e3a8af91..zero/v1.6.1 +git -C /Users/aa/work/mono log --right-only --no-merges --cherry-mark --format='%m%x09%h%x09%s' zero/v1.6.1...main +``` + +## Protocol Compatibility Check + +- Status: PASS +- Previous release `PROTOCOL_VERSION`: `51` +- Target `PROTOCOL_VERSION`: `51` +- Target `MIN_SERVER_SUPPORTED_SYNC_PROTOCOL`: `30` +- Compatibility rule: target minimum supported sync protocol must be `<=` previous release protocol version. +- Result: `30 <= 51`, so this is not a breaking change. +- Note: `393695512` updates protocol-version expectations in tests, but the actual protocol constants in `packages/zero-protocol/src/protocol-version.ts` are unchanged between `zero/v1.6.1` and `main`. + +## Categorization + +| Commit | Category | Breaking? | Note | +|---|---|---|---| +| `8916f8001` | perf | - | Batches flip-join requests instead of issuing many separate fetches. This improves relationship-heavy query performance substantially in the benchmark from the PR. | +| `aee683c2b` | fix | - | Handles WebSocket close code 1009 without reconnecting forever and resending the same oversized message. It surfaces a clearer error and abandons the stuck client group. | +| `e5bf8bd4f` | skip | - | Already in 1.6.1 as cherry-pick `e3e63d4ef`. Adds backoff when CVR purging fails, but should not be repeated in 1.7 notes. | +| `7a1d2fea7` | skip | - | Already in 1.6.1 as cherry-pick `df3aff288`. Makes zero-cache abort when ChangeDB CDC tables are missing. | +| `257da8234` | perf | - | Avoids O(N²) accumulation in `Debug.rowVended` by pushing into the existing array. This matters for large debug/analyze workloads. | +| `359db1416` | skip | - | Benchmark-only change to use ZQL for flip-join benchmarks. No direct product behavior change. | +| `fc56a7338` | fix | - | Inspector/analyze-query now uses the actual table-source query plan. This makes diagnostics more accurate. | +| `d10925ad2` | perf | - | Replaces queue `Array.shift`-style behavior with an O(1) ring buffer. This reduces CPU under heavy replication queue load. | +| `279df61ac` | skip | - | Removes unused production permissions helper. Internal cleanup. | +| `7954d6b49` | skip | - | npm audit fix. No specific Zero behavior called out. | +| `7bb253814` | skip | - | OpenTelemetry dependency bump. No specific user-facing change identified. | +| `10e727a03` | skip | - | Replaces Vercel node types with local interfaces in otel-proxy. Internal refactor. | +| `d2c9d4af8` | skip | - | Pins GitHub Actions. CI security hardening only. | +| `90df9a375` | skip | - | Dependency updates for Vite/database libraries. No specific product change identified. | +| `e7bda36db` | skip | - | Allows Vite minor upgrades. Dependency maintenance. | +| `63b52e775` | skip | - | Fixes Vite version in lockfile. Internal dependency consistency. | +| `4766675da` | skip | - | Adds vulnerability-detection script. Internal security tooling. | +| `01bd90fa8` | skip | - | npm audit fix. No specific Zero behavior called out. | +| `4ff19849b` | skip | - | Removes legacy assistant workflow. CI cleanup. | +| `cb75a03f4` | skip | - | Updates JS checks workflow. CI-only. | +| `68bb5f6a6` | skip | - | Updates file-size workflows. CI-only. | +| `4029bc22f` | skip | - | Updates benchmark workflows. CI-only. | +| `a05b2bb3c` | skip | - | Updates mirror workflow. CI-only. | +| `c37ac92b4` | skip | - | Updates deploy workflows. CI-only. | +| `052dda116` | skip | - | Updates canary release flow. Release infrastructure. | +| `c4e6db1ce` | skip | - | Migrates mono from npm to pnpm. Important internally, but not a published Zero behavior change. | +| `36f26d619` | skip | - | Removes package-lock helper script. Internal tooling. | +| `15e3d6b9f` | skip | - | Moves Replicache perf code. Internal benchmark organization. | +| `bd7465cf1` | skip | - | Updates Docker dependencies. Security/image maintenance. | +| `9f9f82660` | skip | - | Scopes canary-release OIDC token. CI security. | +| `7cc08742d` | skip | - | Moves SST into pnpm. Internal tooling. | +| `ba78376d9` | skip | - | Fixes CI permissions and pnpm install. CI-only. | +| `6e53b5b92` | skip | - | Removes `npx` usage from CI/scripts. Internal tooling. | +| `90159039a` | skip | - | Reworks canary release workflow with dry-run support. Release infrastructure. | +| `8e33dd079` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `9a0147315` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `b877b7abf` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `d44fa8ca3` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `66852ea85` | skip | - | Changes release process to clone instead of copy. Internal release tooling. | +| `d5d3d57a3` | skip | - | Adjusts release cloning behavior for CI/local. Internal release fix. | +| `3ba9f26e5` | skip | - | pnpm release-age exclusions/version overrides. Internal package-management setup. | +| `f02f76915` | skip | - | Adds benchmark JSON output and silent mode. Dev benchmark tooling. | +| `509f7b027` | skip | - | Updates npm references to pnpm. Internal config/docs. | +| `57b1a4b09` | skip | - | Singular flag query-hash attempt, later reverted. Do not note reverted behavior. | +| `257f2152a` | skip | - | Docker dependency/security cleanup. Image maintenance. | +| `e707eaf11` | skip | - | Stops release script from mutating app package manifests. Release-process fix. | +| `f35216528` | skip | - | Removes zbugs deploy. Internal sample app CI. | +| `7d260572c` | skip | - | Restores flat published `out/` layout after pnpm migration. Skipping after review because this was internal pnpm migration/build fallout rather than a 1.7 user-facing change to call out. | +| `f1ac318c0` | skip | - | Iterator helper for lint upgrade. Internal. | +| `035549bc6` | skip | - | Removes `tsx` usage. Internal tooling/runtime cleanup. | +| `31a027f1a` | fix | NO | Externalizes optional peer deps so `pg`, `react`, and `solid-js` are not bundled into Zero output. This prevents duplicate installed copies that can break customer-observable runtime behavior, including `Pool instanceof` checks and React single-instance assumptions. Reviewed as non-breaking: although package peer dependency/install behavior technically changed, the previous behavior was broken enough that users should not reasonably depend on it. | +| `820f17fa5` | feature | - | Adds `replication.last_total_lag` gauge. Gives operators a new metric to distinguish real lag from stalled lag-report delivery. | +| `b2474686b` | skip | - | Uses pnpm to gate transitive install scripts in Docker build. Security hardening. | +| `9bbb0509c` | skip | - | Docker pnpm 11 work. Build plumbing. | +| `cf1e3eb31` | skip | - | zbugs access-key debug logging. Sample/internal. | +| `e4358fb90` | skip | - | Adds GitHub Actions security analysis. CI security. | +| `b80cced16` | skip | - | Bumps Playwright. Test dependency maintenance. | +| `8b29a2d26` | skip | - | Hardens release asset workflow. CI/release security. | +| `a684c0c26` | skip | - | Hardens benchmark workflows. CI security. | +| `7e511179a` | skip | - | Fixes zizmor findings. CI security. | +| `16ec13edd` | skip | - | Scopes release/mirror workflow secrets. CI security. | +| `347abab47` | skip | - | Removes Bencher/file-size workflows. CI cleanup. | +| `3956a0b41` | skip | NO | Splits permissions internals into a private `zero-permissions` workspace package to break cycles. Public `@rocicorp/zero` exports for `definePermissions`, `ANYONE_CAN`, `NOBODY_CAN`, and permission types remained in place; the removed `zero-schema/src/mod.ts` was in a private workspace package, not a published public import path. | +| `811a1d9d0` | skip | - | Cross-package import refactor, later unwound. Internal. | +| `393695512` | skip | - | Protocol-version test expectation update. Verified separately in the protocol compatibility check: the actual protocol constants are unchanged between `zero/v1.6.1` and `main`, so this is not believed breaking. | +| `699728e84` | skip | - | pnpm 11.3 pins. Internal tooling. | +| `11a4c358d` | skip | - | Reverts singular query-hash fix. Revert bookkeeping. | +| `a39469416` | fix | - | Prevents singular and plural queries with the same AST from sharing a client view. That sharing was incorrect because the views have different semantics. | +| `9960407d6` | fix | - | Fixes a regression where removing a query could trigger an assertion. User-visible as a possible client crash/assert. | +| `ae6cf8b94` | skip | - | React 19 upgrade to fix Vercel build. Build maintenance. | +| `5d2fd7ef4` | skip | - | Already in 1.6.1 as cherry-pick `4ce15e597`. Inspector compatibility with older clients. | +| `2f466f6f6` | skip | - | zbugs import-path refactor. Sample/internal. | +| `91257a51e` | skip | - | Reverts/fixes cross-package import refactor. Internal. | +| `2ce4ee3e6` | skip | - | Removes unused Replicache CI workflow. CI cleanup. | +| `6126dc063` | skip | - | CODEOWNERS for zbugs. Repo governance. | +| `58bb5a9c0` | skip | - | Staged npm releases for maintainer approval. Release process. | +| `feee2be78` | fix | - | `LIKE`/`ILIKE` matching uses dotall behavior instead of multiline. Fixes query-result mismatches for strings containing newlines. | +| `517f29f30` | skip | - | Adds relationship-heavy ArrayView benchmark. Benchmark-only. | +| `79828be75` | skip | - | Import-path refactor, later reverted. Internal. | +| `e5f5a56b7` | skip | - | Reverts import-path refactor. Revert bookkeeping. | +| `8ec146799` | fix | - | Range filters now use UTF-8 ordering to match SQLite/Postgres ordering. Fixes string comparison correctness. | +| `8e46be85b` | skip | - | CODEOWNERS approval workflow hardening. CI/governance. | +| `5438a8bb1` | feature | NO | Relands immutable `applyChange` without the eager-expansion regression. Improves React/Solid reactivity and reference stability for unchanged subtrees. Reviewed as non-breaking: it could affect consumers relying on accidental mutation of query result objects or previous object identity behavior, but that behavior was not something users should reasonably rely on. Keep flagging similar result-semantics changes for review. | +| `ff587d7be` | fix | MAYBE | Makes SQLite replica `LIKE`/`ILIKE` behavior match Postgres/IVM more closely. Precise behavior changes: plain `LIKE`/`NOT LIKE` becomes case-sensitive on the SQLite replica, so patterns like `a%` no longer match uppercase `A...`; `ILIKE`/`NOT ILIKE` now compile as `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`; and all `LIKE`/`ILIKE` operators now emit `ESCAPE '\'`, so patterns like `100\%` and `a\_b` treat `%` and `_` literally. Might be breaking because query results can change for apps that relied on the previous SQLite-divergent matching behavior. Needs deeper follow-up before final release notes, including potential performance/index-use impact of `PRAGMA case_sensitive_like = ON`, `lower(...) LIKE lower(...)`, and explicit `ESCAPE`. | +| `3e6ed598c` | skip | - | Updates action pins. CI security. | +| `800f6acff` | skip | - | Already in 1.6.1 as cherry-pick `543e649f6`. Improves write worker errors for production debugging. | +| `fdd8278f3` | skip | - | Already in 1.6.1 as cherry-pick `9d3fb4303`, and release-tooling only. Uses worktrees for release clone. | +| `5a04230cd` | skip | - | Adds transaction-batching ArrayView benchmark. Benchmark-only. | +| `572f1ae4b` | perf | - | Adds transaction-scoped copy-on-write for multi-change transactions. Reduces allocation overhead and shows around 2x wins for large transactions. | +| `dc69d2232` | fix | MAYBE | Adopts `zero-sqlite3` with self-contained Unicode `lower()`/`upper()` mappings, which completes the `ILIKE` behavior introduced by `ff587d7be`. Precise behavior change: SQLite-replica `ILIKE` now matches non-ASCII case variants such as `MÜLLER` vs `müller`, accented Latin, Cyrillic, and Greek because both sides are lowered with Unicode-aware mappings. It is not full Unicode case folding; cases like `straße` vs `STRASSE` still do not match. Might be breaking because non-ASCII `ILIKE` query results can include rows that previously did not match. Needs performance follow-up because Unicode-aware `lower()` on both operands may affect `ILIKE` query cost and index use. | +| `2b76eee35` | skip | - | Already in 1.6.1 as cherry-pick `50bb87536`. Adds analyze CLI `--join-plans`, but not new for 1.7. | +| `4b447e11a` | skip | - | Already in 1.6.1 as cherry-pick `98a41b323`, though patch differs due lockfile/package-manager differences. `zero-sqlite3` 1.1.2 install/build fix. | +| `bfa64ab23` | skip | - | Already in 1.6.1 as cherry-pick `814288531`. Logs SQLite index creation during initial sync. | +| `1c3150de4` | skip | - | Already in 1.6.1 as cherry-pick `b59292a29`. Allows anonymous analyze CLI usage. | +| `f8571f0d4` | skip | - | Fixes latest promotion checks in release tooling. Not product release-note material. | + +## Current Release-Note Candidate Set + +- perf: `8916f8001`, `257da8234`, `d10925ad2`, `572f1ae4b` +- feature: `820f17fa5`, `5438a8bb1` +- fix: `aee683c2b`, `fc56a7338`, `31a027f1a`, `a39469416`, `9960407d6`, `feee2be78`, `8ec146799`, `ff587d7be`, `dc69d2232` + +## Potential Breaking Changes + +- `31a027f1a`: package peer dependency/install behavior changed to avoid duplicate bundled runtime dependencies. +- `ff587d7be`: `LIKE`/`ILIKE` query results can change to match Postgres/IVM semantics. +- `dc69d2232`: non-ASCII `ILIKE` query results can change due to Unicode-aware case mapping. + +## Open Questions + +- Confirm whether `5438a8bb1` should be framed as a feature, perf/reliability improvement, or omitted from the public release notes. +- Confirm whether inspector/analyze-query diagnostics should be grouped together or listed as separate fixes. +- Dig deeper into `ff587d7be` before final notes: decide whether SQLite replica `LIKE`/`ILIKE` correctness changes should be called out as a breaking-change risk, an upgrade note, or just a fix. +- Investigate performance impact of the LIKE/ILIKE changes in `ff587d7be` and `dc69d2232`, especially whether `lower(left) LIKE lower(right)`, explicit `ESCAPE`, or Unicode-aware `lower()` affects SQLite index use or hot query latency. diff --git a/contents/docs/otel.mdx b/contents/docs/otel.mdx index 4ba44b6c..2b902319 100644 --- a/contents/docs/otel.mdx +++ b/contents/docs/otel.mdx @@ -140,15 +140,16 @@ This callback is called before sending WebSocket messages that trigger API serve ### zero.replication -| Metric | Type | Unit | Description | -| ---------------------- | --------- | ---- | ------------------------------------------------------------------------------------------------------------------------------- | -| `upstream_lag` | Gauge | ms | Latency from sending a replication report to receiving it in the stream | -| `replica_lag` | Gauge | ms | Latency from receiving a replication report to it reaching the replica | -| `total_lag` | Gauge | ms | End-to-end replication latency. Grows as an estimate if the next report hasn't arrived | -| `events` | Counter | | Number of replication events processed | -| `transactions` | Counter | | Count of replicated transactions | -| `shadow-sync-runs` | Counter | | Number of [shadow initial-sync](/docs/zero-cache-config#shadow-sync-enabled) runs. Has a `result` attribute: `success`, `error` | -| `shadow-sync-duration` | Histogram | s | Wall-clock duration of a shadow initial-sync run. Has a `result` attribute: `success`, `error` | +| Metric | Type | Unit | Description | +| ---------------------- | --------- | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| `upstream_lag` | Gauge | ms | Latency from sending a replication report to receiving it in the stream | +| `replica_lag` | Gauge | ms | Latency from receiving a replication report to it reaching the replica | +| `total_lag` | Gauge | ms | End-to-end replication latency. Grows as an estimate if the next report hasn't arrived | +| `last_total_lag` | Gauge | ms | End-to-end latency from the most recently received replication report. Unlike `total_lag`, it does not grow when replication reports stop arriving. | +| `events` | Counter | | Number of replication events processed | +| `transactions` | Counter | | Count of replicated transactions | +| `shadow-sync-runs` | Counter | | Number of [shadow initial-sync](/docs/zero-cache-config#shadow-sync-enabled) runs. Has a `result` attribute: `success`, `error` | +| `shadow-sync-duration` | Histogram | s | Wall-clock duration of a shadow initial-sync run. Has a `result` attribute: `success`, `error` | ### zero.sync diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx new file mode 100644 index 00000000..266cb9ee --- /dev/null +++ b/contents/docs/release-notes/1.7.mdx @@ -0,0 +1,66 @@ +--- +title: Zero 1.7 +description: Query Correctness and Performance +--- + +## Installation + +```bash +npm install @rocicorp/zero@1.7 +``` + +## Overview + +Zero 1.7 is currently shaping up as a query correctness and performance +release. The largest user-visible changes are around making query evaluation +more consistent across Postgres, the SQLite replica, and the in-memory JS query +engine. + +There are still a few open review items before this note is final, especially +around the behavior and performance impact of the `LIKE`/`ILIKE` changes. + +## Features + +- [**Replication lag diagnostics:**](/docs/otel#zeroreplication) Added a `replication.last_total_lag` gauge so operators can distinguish actual replication lag from a stalled lag-report stream. ([#6042](https://github.com/rocicorp/mono/pull/6042)) +- [**Immutable query result updates:**](/docs/react#TODO) Query result updates now preserve references for unchanged subtrees, improving compatibility with React memoization and Solid reactivity without the earlier eager-expansion regression. ([#6093](https://github.com/rocicorp/mono/pull/6093)) + +## Performance + +- [Batched flip-join requests, with benchmarks showing large wins for high-cardinality relationship queries.](https://github.com/rocicorp/mono/pull/5928) +- [Avoided O(N²) debug row accumulation in `Debug.rowVended`, reducing overhead for large analyze/debug workloads.](https://github.com/rocicorp/mono/pull/5991) +- [Replaced queue dequeue behavior that could become O(N²) under heavy replication load with an O(1) ring buffer.](https://github.com/rocicorp/mono/pull/5986) +- [Added transaction-scoped copy-on-write for multi-change transactions, reducing allocation overhead and showing roughly 2x wins for large transactions.](https://github.com/rocicorp/mono/pull/6097) + +## Fixes + +- [WebSocket close code `1009` could trap a client in a reconnect loop by repeatedly resending the same oversized message.](https://github.com/rocicorp/mono/pull/5982) +- [Inspector/analyze-query could show a query plan different from the actual plan generated by the table source.](https://github.com/rocicorp/mono/pull/5990) +- [Duplicate bundled copies of runtime peer dependencies could break customer-observable behavior such as `Pool instanceof` checks and React single-instance assumptions.](https://github.com/rocicorp/mono/pull/6046) +- [Singular and plural queries with the same AST could incorrectly share a client view.](https://github.com/rocicorp/mono/pull/6065) +- [Removing a query could trigger an assertion.](https://github.com/rocicorp/mono/pull/6066) +- [`LIKE`/`ILIKE` matching in the JS query engine used multiline regex behavior instead of dotall behavior, causing mismatches for strings containing newlines.](https://github.com/rocicorp/mono/pull/6083) (thanks [@sravan27](https://github.com/sravan27)!) +- [Range filters (`<`, `<=`, `>`, `>=`) could use ordering that differed from SQLite/Postgres ordering.](https://github.com/rocicorp/mono/pull/6088) (thanks [@sravan27](https://github.com/sravan27)!) +- [SQLite replica `LIKE`/`ILIKE` behavior could diverge from Postgres and the in-memory JS matcher.](https://github.com/rocicorp/mono/pull/6095) +- [SQLite replica `ILIKE` did not match non-ASCII case variants such as `MÜLLER` and `müller`.](https://github.com/rocicorp/mono/pull/6098) + +## Breaking Changes + +None confirmed. + +The following query-correctness changes are still under review because they can +change which rows match a query: + +1. SQLite replica `LIKE`/`NOT LIKE` now matches Postgres by being + case-sensitive. Previously, SQLite's default `LIKE` behavior could match + case-insensitively. +1. SQLite replica `ILIKE`/`NOT ILIKE` now compiles as + `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`. +1. SQLite replica `LIKE`/`ILIKE` now emits `ESCAPE '\'`, so patterns like + `100\%` and `a\_b` treat `%` and `_` literally, matching Postgres and the JS + matcher. +1. SQLite replica `ILIKE` now uses Unicode-aware lowercasing, so non-ASCII case + variants such as `MÜLLER` and `müller` can match. This is not full Unicode + case folding; cases like `straße` and `STRASSE` still do not match. + +We also still need to investigate whether these `LIKE`/`ILIKE` changes affect +SQLite index use or hot-query latency. From b77cecc54ad5caf8a4b27b05098982ce60ab19b3 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Thu, 25 Jun 2026 12:31:28 -0700 Subject: [PATCH 2/9] docs: add Zero 1.7 release notes --- .releases/1.7/commits.md | 242 +++++++++++++++----------- contents/docs/otel.mdx | 32 ++-- contents/docs/postgres-support.mdx | 41 ++++- contents/docs/release-notes/1.7.mdx | 43 ++--- contents/docs/release-notes/index.mdx | 1 + contents/docs/zql.mdx | 19 +- 6 files changed, 218 insertions(+), 160 deletions(-) diff --git a/.releases/1.7/commits.md b/.releases/1.7/commits.md index 08ca7502..fb4cfb36 100644 --- a/.releases/1.7/commits.md +++ b/.releases/1.7/commits.md @@ -26,115 +26,155 @@ git -C /Users/aa/work/mono log --right-only --no-merges --cherry-mark --format=' ## Categorization -| Commit | Category | Breaking? | Note | -|---|---|---|---| -| `8916f8001` | perf | - | Batches flip-join requests instead of issuing many separate fetches. This improves relationship-heavy query performance substantially in the benchmark from the PR. | -| `aee683c2b` | fix | - | Handles WebSocket close code 1009 without reconnecting forever and resending the same oversized message. It surfaces a clearer error and abandons the stuck client group. | -| `e5bf8bd4f` | skip | - | Already in 1.6.1 as cherry-pick `e3e63d4ef`. Adds backoff when CVR purging fails, but should not be repeated in 1.7 notes. | -| `7a1d2fea7` | skip | - | Already in 1.6.1 as cherry-pick `df3aff288`. Makes zero-cache abort when ChangeDB CDC tables are missing. | -| `257da8234` | perf | - | Avoids O(N²) accumulation in `Debug.rowVended` by pushing into the existing array. This matters for large debug/analyze workloads. | -| `359db1416` | skip | - | Benchmark-only change to use ZQL for flip-join benchmarks. No direct product behavior change. | -| `fc56a7338` | fix | - | Inspector/analyze-query now uses the actual table-source query plan. This makes diagnostics more accurate. | -| `d10925ad2` | perf | - | Replaces queue `Array.shift`-style behavior with an O(1) ring buffer. This reduces CPU under heavy replication queue load. | -| `279df61ac` | skip | - | Removes unused production permissions helper. Internal cleanup. | -| `7954d6b49` | skip | - | npm audit fix. No specific Zero behavior called out. | -| `7bb253814` | skip | - | OpenTelemetry dependency bump. No specific user-facing change identified. | -| `10e727a03` | skip | - | Replaces Vercel node types with local interfaces in otel-proxy. Internal refactor. | -| `d2c9d4af8` | skip | - | Pins GitHub Actions. CI security hardening only. | -| `90df9a375` | skip | - | Dependency updates for Vite/database libraries. No specific product change identified. | -| `e7bda36db` | skip | - | Allows Vite minor upgrades. Dependency maintenance. | -| `63b52e775` | skip | - | Fixes Vite version in lockfile. Internal dependency consistency. | -| `4766675da` | skip | - | Adds vulnerability-detection script. Internal security tooling. | -| `01bd90fa8` | skip | - | npm audit fix. No specific Zero behavior called out. | -| `4ff19849b` | skip | - | Removes legacy assistant workflow. CI cleanup. | -| `cb75a03f4` | skip | - | Updates JS checks workflow. CI-only. | -| `68bb5f6a6` | skip | - | Updates file-size workflows. CI-only. | -| `4029bc22f` | skip | - | Updates benchmark workflows. CI-only. | -| `a05b2bb3c` | skip | - | Updates mirror workflow. CI-only. | -| `c37ac92b4` | skip | - | Updates deploy workflows. CI-only. | -| `052dda116` | skip | - | Updates canary release flow. Release infrastructure. | -| `c4e6db1ce` | skip | - | Migrates mono from npm to pnpm. Important internally, but not a published Zero behavior change. | -| `36f26d619` | skip | - | Removes package-lock helper script. Internal tooling. | -| `15e3d6b9f` | skip | - | Moves Replicache perf code. Internal benchmark organization. | -| `bd7465cf1` | skip | - | Updates Docker dependencies. Security/image maintenance. | -| `9f9f82660` | skip | - | Scopes canary-release OIDC token. CI security. | -| `7cc08742d` | skip | - | Moves SST into pnpm. Internal tooling. | -| `ba78376d9` | skip | - | Fixes CI permissions and pnpm install. CI-only. | -| `6e53b5b92` | skip | - | Removes `npx` usage from CI/scripts. Internal tooling. | -| `90159039a` | skip | - | Reworks canary release workflow with dry-run support. Release infrastructure. | -| `8e33dd079` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `9a0147315` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `b877b7abf` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `d44fa8ca3` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `66852ea85` | skip | - | Changes release process to clone instead of copy. Internal release tooling. | -| `d5d3d57a3` | skip | - | Adjusts release cloning behavior for CI/local. Internal release fix. | -| `3ba9f26e5` | skip | - | pnpm release-age exclusions/version overrides. Internal package-management setup. | -| `f02f76915` | skip | - | Adds benchmark JSON output and silent mode. Dev benchmark tooling. | -| `509f7b027` | skip | - | Updates npm references to pnpm. Internal config/docs. | -| `57b1a4b09` | skip | - | Singular flag query-hash attempt, later reverted. Do not note reverted behavior. | -| `257f2152a` | skip | - | Docker dependency/security cleanup. Image maintenance. | -| `e707eaf11` | skip | - | Stops release script from mutating app package manifests. Release-process fix. | -| `f35216528` | skip | - | Removes zbugs deploy. Internal sample app CI. | -| `7d260572c` | skip | - | Restores flat published `out/` layout after pnpm migration. Skipping after review because this was internal pnpm migration/build fallout rather than a 1.7 user-facing change to call out. | -| `f1ac318c0` | skip | - | Iterator helper for lint upgrade. Internal. | -| `035549bc6` | skip | - | Removes `tsx` usage. Internal tooling/runtime cleanup. | -| `31a027f1a` | fix | NO | Externalizes optional peer deps so `pg`, `react`, and `solid-js` are not bundled into Zero output. This prevents duplicate installed copies that can break customer-observable runtime behavior, including `Pool instanceof` checks and React single-instance assumptions. Reviewed as non-breaking: although package peer dependency/install behavior technically changed, the previous behavior was broken enough that users should not reasonably depend on it. | -| `820f17fa5` | feature | - | Adds `replication.last_total_lag` gauge. Gives operators a new metric to distinguish real lag from stalled lag-report delivery. | -| `b2474686b` | skip | - | Uses pnpm to gate transitive install scripts in Docker build. Security hardening. | -| `9bbb0509c` | skip | - | Docker pnpm 11 work. Build plumbing. | -| `cf1e3eb31` | skip | - | zbugs access-key debug logging. Sample/internal. | -| `e4358fb90` | skip | - | Adds GitHub Actions security analysis. CI security. | -| `b80cced16` | skip | - | Bumps Playwright. Test dependency maintenance. | -| `8b29a2d26` | skip | - | Hardens release asset workflow. CI/release security. | -| `a684c0c26` | skip | - | Hardens benchmark workflows. CI security. | -| `7e511179a` | skip | - | Fixes zizmor findings. CI security. | -| `16ec13edd` | skip | - | Scopes release/mirror workflow secrets. CI security. | -| `347abab47` | skip | - | Removes Bencher/file-size workflows. CI cleanup. | -| `3956a0b41` | skip | NO | Splits permissions internals into a private `zero-permissions` workspace package to break cycles. Public `@rocicorp/zero` exports for `definePermissions`, `ANYONE_CAN`, `NOBODY_CAN`, and permission types remained in place; the removed `zero-schema/src/mod.ts` was in a private workspace package, not a published public import path. | -| `811a1d9d0` | skip | - | Cross-package import refactor, later unwound. Internal. | -| `393695512` | skip | - | Protocol-version test expectation update. Verified separately in the protocol compatibility check: the actual protocol constants are unchanged between `zero/v1.6.1` and `main`, so this is not believed breaking. | -| `699728e84` | skip | - | pnpm 11.3 pins. Internal tooling. | -| `11a4c358d` | skip | - | Reverts singular query-hash fix. Revert bookkeeping. | -| `a39469416` | fix | - | Prevents singular and plural queries with the same AST from sharing a client view. That sharing was incorrect because the views have different semantics. | -| `9960407d6` | fix | - | Fixes a regression where removing a query could trigger an assertion. User-visible as a possible client crash/assert. | -| `ae6cf8b94` | skip | - | React 19 upgrade to fix Vercel build. Build maintenance. | -| `5d2fd7ef4` | skip | - | Already in 1.6.1 as cherry-pick `4ce15e597`. Inspector compatibility with older clients. | -| `2f466f6f6` | skip | - | zbugs import-path refactor. Sample/internal. | -| `91257a51e` | skip | - | Reverts/fixes cross-package import refactor. Internal. | -| `2ce4ee3e6` | skip | - | Removes unused Replicache CI workflow. CI cleanup. | -| `6126dc063` | skip | - | CODEOWNERS for zbugs. Repo governance. | -| `58bb5a9c0` | skip | - | Staged npm releases for maintainer approval. Release process. | -| `feee2be78` | fix | - | `LIKE`/`ILIKE` matching uses dotall behavior instead of multiline. Fixes query-result mismatches for strings containing newlines. | -| `517f29f30` | skip | - | Adds relationship-heavy ArrayView benchmark. Benchmark-only. | -| `79828be75` | skip | - | Import-path refactor, later reverted. Internal. | -| `e5f5a56b7` | skip | - | Reverts import-path refactor. Revert bookkeeping. | -| `8ec146799` | fix | - | Range filters now use UTF-8 ordering to match SQLite/Postgres ordering. Fixes string comparison correctness. | -| `8e46be85b` | skip | - | CODEOWNERS approval workflow hardening. CI/governance. | -| `5438a8bb1` | feature | NO | Relands immutable `applyChange` without the eager-expansion regression. Improves React/Solid reactivity and reference stability for unchanged subtrees. Reviewed as non-breaking: it could affect consumers relying on accidental mutation of query result objects or previous object identity behavior, but that behavior was not something users should reasonably rely on. Keep flagging similar result-semantics changes for review. | -| `ff587d7be` | fix | MAYBE | Makes SQLite replica `LIKE`/`ILIKE` behavior match Postgres/IVM more closely. Precise behavior changes: plain `LIKE`/`NOT LIKE` becomes case-sensitive on the SQLite replica, so patterns like `a%` no longer match uppercase `A...`; `ILIKE`/`NOT ILIKE` now compile as `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`; and all `LIKE`/`ILIKE` operators now emit `ESCAPE '\'`, so patterns like `100\%` and `a\_b` treat `%` and `_` literally. Might be breaking because query results can change for apps that relied on the previous SQLite-divergent matching behavior. Needs deeper follow-up before final release notes, including potential performance/index-use impact of `PRAGMA case_sensitive_like = ON`, `lower(...) LIKE lower(...)`, and explicit `ESCAPE`. | -| `3e6ed598c` | skip | - | Updates action pins. CI security. | -| `800f6acff` | skip | - | Already in 1.6.1 as cherry-pick `543e649f6`. Improves write worker errors for production debugging. | -| `fdd8278f3` | skip | - | Already in 1.6.1 as cherry-pick `9d3fb4303`, and release-tooling only. Uses worktrees for release clone. | -| `5a04230cd` | skip | - | Adds transaction-batching ArrayView benchmark. Benchmark-only. | -| `572f1ae4b` | perf | - | Adds transaction-scoped copy-on-write for multi-change transactions. Reduces allocation overhead and shows around 2x wins for large transactions. | -| `dc69d2232` | fix | MAYBE | Adopts `zero-sqlite3` with self-contained Unicode `lower()`/`upper()` mappings, which completes the `ILIKE` behavior introduced by `ff587d7be`. Precise behavior change: SQLite-replica `ILIKE` now matches non-ASCII case variants such as `MÜLLER` vs `müller`, accented Latin, Cyrillic, and Greek because both sides are lowered with Unicode-aware mappings. It is not full Unicode case folding; cases like `straße` vs `STRASSE` still do not match. Might be breaking because non-ASCII `ILIKE` query results can include rows that previously did not match. Needs performance follow-up because Unicode-aware `lower()` on both operands may affect `ILIKE` query cost and index use. | -| `2b76eee35` | skip | - | Already in 1.6.1 as cherry-pick `50bb87536`. Adds analyze CLI `--join-plans`, but not new for 1.7. | -| `4b447e11a` | skip | - | Already in 1.6.1 as cherry-pick `98a41b323`, though patch differs due lockfile/package-manager differences. `zero-sqlite3` 1.1.2 install/build fix. | -| `bfa64ab23` | skip | - | Already in 1.6.1 as cherry-pick `814288531`. Logs SQLite index creation during initial sync. | -| `1c3150de4` | skip | - | Already in 1.6.1 as cherry-pick `b59292a29`. Allows anonymous analyze CLI usage. | -| `f8571f0d4` | skip | - | Fixes latest promotion checks in release tooling. Not product release-note material. | +| Commit | Category | Breaking? | Note | +| ----------- | -------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `8916f8001` | perf | - | Batches flip-join requests instead of issuing many separate fetches. This improves relationship-heavy query performance substantially in the benchmark from the PR. | +| `aee683c2b` | fix | - | Handles WebSocket close code 1009 without reconnecting forever and resending the same oversized message. It surfaces a clearer error and abandons the stuck client group. | +| `e5bf8bd4f` | skip | - | Already in 1.6.1 as cherry-pick `e3e63d4ef`. Adds backoff when CVR purging fails, but should not be repeated in 1.7 notes. | +| `7a1d2fea7` | skip | - | Already in 1.6.1 as cherry-pick `df3aff288`. Makes zero-cache abort when ChangeDB CDC tables are missing. | +| `257da8234` | perf | - | Avoids O(N²) accumulation in `Debug.rowVended` by pushing into the existing array. This matters for large debug/analyze workloads. | +| `359db1416` | skip | - | Benchmark-only change to use ZQL for flip-join benchmarks. No direct product behavior change. | +| `fc56a7338` | fix | - | Inspector/analyze-query now uses the actual table-source query plan. This makes diagnostics more accurate. | +| `d10925ad2` | perf | - | Replaces queue `Array.shift`-style behavior with an O(1) ring buffer. This reduces CPU under heavy replication queue load. | +| `279df61ac` | skip | - | Removes unused production permissions helper. Internal cleanup. | +| `7954d6b49` | skip | - | npm audit fix. No specific Zero behavior called out. | +| `7bb253814` | skip | - | OpenTelemetry dependency bump. No specific user-facing change identified. | +| `10e727a03` | skip | - | Replaces Vercel node types with local interfaces in otel-proxy. Internal refactor. | +| `d2c9d4af8` | skip | - | Pins GitHub Actions. CI security hardening only. | +| `90df9a375` | skip | - | Dependency updates for Vite/database libraries. No specific product change identified. | +| `e7bda36db` | skip | - | Allows Vite minor upgrades. Dependency maintenance. | +| `63b52e775` | skip | - | Fixes Vite version in lockfile. Internal dependency consistency. | +| `4766675da` | skip | - | Adds vulnerability-detection script. Internal security tooling. | +| `01bd90fa8` | skip | - | npm audit fix. No specific Zero behavior called out. | +| `4ff19849b` | skip | - | Removes legacy assistant workflow. CI cleanup. | +| `cb75a03f4` | skip | - | Updates JS checks workflow. CI-only. | +| `68bb5f6a6` | skip | - | Updates file-size workflows. CI-only. | +| `4029bc22f` | skip | - | Updates benchmark workflows. CI-only. | +| `a05b2bb3c` | skip | - | Updates mirror workflow. CI-only. | +| `c37ac92b4` | skip | - | Updates deploy workflows. CI-only. | +| `052dda116` | skip | - | Updates canary release flow. Release infrastructure. | +| `c4e6db1ce` | skip | - | Migrates mono from npm to pnpm. Important internally, but not a published Zero behavior change. | +| `36f26d619` | skip | - | Removes package-lock helper script. Internal tooling. | +| `15e3d6b9f` | skip | - | Moves Replicache perf code. Internal benchmark organization. | +| `bd7465cf1` | skip | - | Updates Docker dependencies. Security/image maintenance. | +| `9f9f82660` | skip | - | Scopes canary-release OIDC token. CI security. | +| `7cc08742d` | skip | - | Moves SST into pnpm. Internal tooling. | +| `ba78376d9` | skip | - | Fixes CI permissions and pnpm install. CI-only. | +| `6e53b5b92` | skip | - | Removes `npx` usage from CI/scripts. Internal tooling. | +| `90159039a` | skip | - | Reworks canary release workflow with dry-run support. Release infrastructure. | +| `8e33dd079` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `9a0147315` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `b877b7abf` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `d44fa8ca3` | skip | - | Docker login/version parsing workflow work. Release plumbing. | +| `66852ea85` | skip | - | Changes release process to clone instead of copy. Internal release tooling. | +| `d5d3d57a3` | skip | - | Adjusts release cloning behavior for CI/local. Internal release fix. | +| `3ba9f26e5` | skip | - | pnpm release-age exclusions/version overrides. Internal package-management setup. | +| `f02f76915` | skip | - | Adds benchmark JSON output and silent mode. Dev benchmark tooling. | +| `509f7b027` | skip | - | Updates npm references to pnpm. Internal config/docs. | +| `57b1a4b09` | skip | - | Singular flag query-hash attempt, later reverted. Do not note reverted behavior. | +| `257f2152a` | skip | - | Docker dependency/security cleanup. Image maintenance. | +| `e707eaf11` | skip | - | Stops release script from mutating app package manifests. Release-process fix. | +| `f35216528` | skip | - | Removes zbugs deploy. Internal sample app CI. | +| `7d260572c` | skip | - | Restores flat published `out/` layout after pnpm migration. Skipping after review because this was internal pnpm migration/build fallout rather than a 1.7 user-facing change to call out. | +| `f1ac318c0` | skip | - | Iterator helper for lint upgrade. Internal. | +| `035549bc6` | skip | - | Removes `tsx` usage. Internal tooling/runtime cleanup. | +| `31a027f1a` | fix | NO | Externalizes optional peer deps so `pg`, `react`, and `solid-js` are not bundled into Zero output. This prevents duplicate installed copies that can break customer-observable runtime behavior, including `Pool instanceof` checks and React single-instance assumptions. Reviewed as non-breaking: although package peer dependency/install behavior technically changed, the previous behavior was broken enough that users should not reasonably depend on it. | +| `820f17fa5` | feature | - | Adds `replication.last_total_lag` gauge. Gives operators a new metric to distinguish real lag from stalled lag-report delivery. | +| `b2474686b` | skip | - | Uses pnpm to gate transitive install scripts in Docker build. Security hardening. | +| `9bbb0509c` | skip | - | Docker pnpm 11 work. Build plumbing. | +| `cf1e3eb31` | skip | - | zbugs access-key debug logging. Sample/internal. | +| `e4358fb90` | skip | - | Adds GitHub Actions security analysis. CI security. | +| `b80cced16` | skip | - | Bumps Playwright. Test dependency maintenance. | +| `8b29a2d26` | skip | - | Hardens release asset workflow. CI/release security. | +| `a684c0c26` | skip | - | Hardens benchmark workflows. CI security. | +| `7e511179a` | skip | - | Fixes zizmor findings. CI security. | +| `16ec13edd` | skip | - | Scopes release/mirror workflow secrets. CI security. | +| `347abab47` | skip | - | Removes Bencher/file-size workflows. CI cleanup. | +| `3956a0b41` | skip | NO | Splits permissions internals into a private `zero-permissions` workspace package to break cycles. Public `@rocicorp/zero` exports for `definePermissions`, `ANYONE_CAN`, `NOBODY_CAN`, and permission types remained in place; the removed `zero-schema/src/mod.ts` was in a private workspace package, not a published public import path. | +| `811a1d9d0` | skip | - | Cross-package import refactor, later unwound. Internal. | +| `393695512` | skip | - | Protocol-version test expectation update. Verified separately in the protocol compatibility check: the actual protocol constants are unchanged between `zero/v1.6.1` and `main`, so this is not believed breaking. | +| `699728e84` | skip | - | pnpm 11.3 pins. Internal tooling. | +| `11a4c358d` | skip | - | Reverts singular query-hash fix. Revert bookkeeping. | +| `a39469416` | fix | - | Prevents singular and plural queries with the same AST from sharing a client view. That sharing was incorrect because the views have different semantics. | +| `9960407d6` | fix | - | Fixes a regression where removing a query could trigger an assertion. User-visible as a possible client crash/assert. | +| `ae6cf8b94` | skip | - | React 19 upgrade to fix Vercel build. Build maintenance. | +| `5d2fd7ef4` | skip | - | Already in 1.6.1 as cherry-pick `4ce15e597`. Inspector compatibility with older clients. | +| `2f466f6f6` | skip | - | zbugs import-path refactor. Sample/internal. | +| `91257a51e` | skip | - | Reverts/fixes cross-package import refactor. Internal. | +| `2ce4ee3e6` | skip | - | Removes unused Replicache CI workflow. CI cleanup. | +| `6126dc063` | skip | - | CODEOWNERS for zbugs. Repo governance. | +| `58bb5a9c0` | skip | - | Staged npm releases for maintainer approval. Release process. | +| `feee2be78` | fix | - | `LIKE`/`ILIKE` matching uses dotall behavior instead of multiline. Fixes query-result mismatches for strings containing newlines. | +| `517f29f30` | skip | - | Adds relationship-heavy ArrayView benchmark. Benchmark-only. | +| `79828be75` | skip | - | Import-path refactor, later reverted. Internal. | +| `e5f5a56b7` | skip | - | Reverts import-path refactor. Revert bookkeeping. | +| `8ec146799` | fix | - | Range filters now use UTF-8 ordering to match SQLite/Postgres ordering. Fixes string comparison correctness. | +| `8e46be85b` | skip | - | CODEOWNERS approval workflow hardening. CI/governance. | +| `5438a8bb1` | feature | NO | Relands immutable `applyChange` without the eager-expansion regression. Improves React/Solid reactivity and reference stability for unchanged subtrees. Reviewed as non-breaking: it could affect consumers relying on accidental mutation of query result objects or previous object identity behavior, but that behavior was not something users should reasonably rely on. Keep flagging similar result-semantics changes for review. | +| `ff587d7be` | fix | MAYBE | Makes SQLite replica `LIKE`/`ILIKE` behavior match Postgres/IVM more closely. Precise behavior changes: plain `LIKE`/`NOT LIKE` becomes case-sensitive on the SQLite replica, so patterns like `a%` no longer match uppercase `A...`; `ILIKE`/`NOT ILIKE` now compile as `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`; and all `LIKE`/`ILIKE` operators now emit `ESCAPE '\'`, so patterns like `100\%` and `a\_b` treat `%` and `_` literally. Might be breaking because query results can change for apps that relied on the previous SQLite-divergent matching behavior. Needs deeper follow-up before final release notes, including potential performance/index-use impact of `PRAGMA case_sensitive_like = ON`, `lower(...) LIKE lower(...)`, and explicit `ESCAPE`. | +| `3e6ed598c` | skip | - | Updates action pins. CI security. | +| `800f6acff` | skip | - | Already in 1.6.1 as cherry-pick `543e649f6`. Improves write worker errors for production debugging. | +| `fdd8278f3` | skip | - | Already in 1.6.1 as cherry-pick `9d3fb4303`, and release-tooling only. Uses worktrees for release clone. | +| `5a04230cd` | skip | - | Adds transaction-batching ArrayView benchmark. Benchmark-only. | +| `572f1ae4b` | perf | - | Adds transaction-scoped copy-on-write for multi-change transactions. Reduces allocation overhead and shows around 2x wins for large transactions. | +| `dc69d2232` | fix | MAYBE | Adopts `zero-sqlite3` with self-contained Unicode `lower()`/`upper()` mappings, which completes the `ILIKE` behavior introduced by `ff587d7be`. Precise behavior change: SQLite-replica `ILIKE` now matches non-ASCII case variants such as `MÜLLER` vs `müller`, accented Latin, Cyrillic, and Greek because both sides are lowered with Unicode-aware mappings. It is not full Unicode case folding; cases like `straße` vs `STRASSE` still do not match. Might be breaking because non-ASCII `ILIKE` query results can include rows that previously did not match. Needs performance follow-up because Unicode-aware `lower()` on both operands may affect `ILIKE` query cost and index use. | +| `2b76eee35` | skip | - | Already in 1.6.1 as cherry-pick `50bb87536`. Adds analyze CLI `--join-plans`, but not new for 1.7. | +| `4b447e11a` | skip | - | Already in 1.6.1 as cherry-pick `98a41b323`, though patch differs due lockfile/package-manager differences. `zero-sqlite3` 1.1.2 install/build fix. | +| `bfa64ab23` | skip | - | Already in 1.6.1 as cherry-pick `814288531`. Logs SQLite index creation during initial sync. | +| `1c3150de4` | skip | - | Already in 1.6.1 as cherry-pick `b59292a29`. Allows anonymous analyze CLI usage. | +| `f8571f0d4` | skip | - | Fixes latest promotion checks in release tooling. Not product release-note material. | + +## Continuation Audit (current `main`) + +- Continuation monorepo path used: `/Users/chase/git/roci/mono` +- Continuation range reviewed: `f8571f0d4..main` +- Continuation review date: 2026-06-17 +- Continuation patch-equivalence result: all continuation commits are `>` in `git log --right-only --no-merges --cherry-mark`, so none were already present in `zero/v1.6.1` by patch equivalence. +- Continuation protocol compatibility: PASS. `zero/v1.6.1` and current `main` both have `PROTOCOL_VERSION = 51`; current `main` has `MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 30`; `30 <= 51`. + +### Continuation Commands Used + +```bash +git -C /Users/chase/git/roci/mono log --reverse --oneline --no-merges f8571f0d4..main +git -C /Users/chase/git/roci/mono log --right-only --no-merges --cherry-mark --format='%m%x09%h%x09%s' zero/v1.6.1...main +git -C /Users/chase/git/roci/mono show zero/v1.6.1:packages/zero-protocol/src/protocol-version.ts +git -C /Users/chase/git/roci/mono show main:packages/zero-protocol/src/protocol-version.ts +``` + +### Continuation Categorization + +| Commit | Category | Breaking? | Note | +| ----------- | -------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `cb5c46180` | fix | - | React and Solid view cache keys now include the full query result format, not just the top-level singular flag. This fixes nested relationship shape bugs where `.one()` and `.limit(1)` had the same AST hash but should return different nested shapes. | +| `fe0c28dd4` | skip | - | Release workflow security hardening. Important internally, but not Zero runtime release-note material. | +| `616697338` | skip | - | Removes stale Replicache editor config. Internal developer-environment cleanup. | +| `2d2928097` | skip | - | Adds a dev container. Developer-environment setup only. | +| `65eeff243` | skip | - | pnpm version bump across package manifests and workflows. Internal package-management maintenance. | +| `d58b2402e` | skip | - | Adds Dependabot updates for devcontainer features. Tooling-only. | +| `92cc76e32` | skip | - | Adds Docker-in-Docker to devcontainer for tests, later superseded by sibling Compose services. Developer-environment only. | +| `f814b1115` | skip | - | Devcontainer lockfile adjustment. Developer-environment only. | +| `307283ff1` | skip | - | Replaces Docker-in-Docker with sibling Compose services in the devcontainer. Developer/test-environment only. | +| `832c1b418` | feature | - | Supports text-represented Postgres scalar types as Zero `string` columns, including network/address-like types, `pg_lsn`, and the `isn` extension family. Also allows those supported string-like types to participate in Zero primary keys and improves unsupported-PK diagnostics. | +| `5dd4e6673` | skip | - | Updates devcontainer feature version to pick up 1Password support. Developer-environment only. | +| `78df00486` | perf | MAYBE | Upgrades Zero packages to `@rocicorp/logger` 6.0.0 to pick up object allocation optimizations. Included as a perf item, but marked MAYBE because it is a major runtime dependency bump and internal code had to avoid destructuring unbound log methods. No confirmed Zero API break identified. | +| `ee8d7e35e` | skip | - | Reduces allocation in `Catch.expandNode`, which is a test/benchmark helper rather than production code. Do not include as a product performance item. | +| `aece77a0f` | fix | NO | Verifies actual litestream backup state before purging change-log records and adds `replica.purge_blocked` for alerting. Reviewed as non-breaking, but operationally visible: stale backups now block purges and persistently wedged backups fail closed to avoid unsafe backup/purge behavior. Include as a fix with a visible caveat rather than a breaking change. | +| `21deecb34` | fix | - | Preserves the latest durable change-log transaction as the catchup boundary when backup watermark is ahead of the durable change log. Group with `aece77a0f` as a Litestream/change-log safety fix. | +| `a31448454` | fix | - | Query hydration and pipeline failures now log query hash, transformation hash, and custom query name when available. This improves production diagnostics for operators. | +| `7fa1d0816` | skip | - | Test-only text-semantics corpus. It should not be a release-note bullet, but it updates the `ILIKE` caveat: ZQLite/IVM Unicode `ILIKE` can still diverge from compiled Postgres SQL under `COLLATE "C"`. | ## Current Release-Note Candidate Set -- perf: `8916f8001`, `257da8234`, `d10925ad2`, `572f1ae4b` -- feature: `820f17fa5`, `5438a8bb1` -- fix: `aee683c2b`, `fc56a7338`, `31a027f1a`, `a39469416`, `9960407d6`, `feee2be78`, `8ec146799`, `ff587d7be`, `dc69d2232` +- perf: `8916f8001`, `257da8234`, `d10925ad2`, `572f1ae4b`, `78df00486` +- feature: `820f17fa5`, `5438a8bb1`, `832c1b418` +- fix: `aee683c2b`, `fc56a7338`, `31a027f1a`, `a39469416`, `9960407d6`, `feee2be78`, `8ec146799`, `ff587d7be`, `dc69d2232`, `cb5c46180`, `aece77a0f`, `21deecb34`, `a31448454` ## Potential Breaking Changes - `31a027f1a`: package peer dependency/install behavior changed to avoid duplicate bundled runtime dependencies. - `ff587d7be`: `LIKE`/`ILIKE` query results can change to match Postgres/IVM semantics. - `dc69d2232`: non-ASCII `ILIKE` query results can change due to Unicode-aware case mapping. +- `78df00486`: major `@rocicorp/logger` runtime dependency bump. No confirmed Zero API break, but direct logger consumers relying on unbound/destructured log methods may need review. ## Open Questions @@ -142,3 +182,5 @@ git -C /Users/aa/work/mono log --right-only --no-merges --cherry-mark --format=' - Confirm whether inspector/analyze-query diagnostics should be grouped together or listed as separate fixes. - Dig deeper into `ff587d7be` before final notes: decide whether SQLite replica `LIKE`/`ILIKE` correctness changes should be called out as a breaking-change risk, an upgrade note, or just a fix. - Investigate performance impact of the LIKE/ILIKE changes in `ff587d7be` and `dc69d2232`, especially whether `lower(left) LIKE lower(right)`, explicit `ESCAPE`, or Unicode-aware `lower()` affects SQLite index use or hot query latency. +- `aece77a0f` decision: keep as a fix with a visible operational caveat, not as a breaking change. +- `7fa1d0816` follow-up: final notes and ZQL docs should mention the remaining non-ASCII `ILIKE` divergence under Postgres `COLLATE "C"`. diff --git a/contents/docs/otel.mdx b/contents/docs/otel.mdx index 2b902319..d1af730c 100644 --- a/contents/docs/otel.mdx +++ b/contents/docs/otel.mdx @@ -131,25 +131,25 @@ This callback is called before sending WebSocket messages that trigger API serve ### zero.replica -| Metric | Type | Unit | Description | -| ------------ | ----- | ----- | ----------------------------------------------------------------------------------------------------------------------- | -| `db_size` | Gauge | bytes | Size of the replica's main db file (excludes WAL) | -| `wal_size` | Gauge | bytes | Size of the replica's WAL file | -| `wal2_size` | Gauge | bytes | Size of the replica's WAL2 file (only if using wal2 mode) | -| `backup_lag` | Gauge | ms | Time since last litestream backup. Expected to sawtooth from 0 to `ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES` | +| Metric | Type | Unit | Description | +| --------------- | ------- | ----- | ----------------------------------------------------------------------------------------------------------------------- | +| `db_size` | Gauge | bytes | Size of the replica's main db file (excludes WAL) | +| `wal_size` | Gauge | bytes | Size of the replica's WAL file | +| `wal2_size` | Gauge | bytes | Size of the replica's WAL2 file (only if using wal2 mode) | +| `backup_lag` | Gauge | ms | Time since last litestream backup. Expected to sawtooth from 0 to `ZERO_LITESTREAM_INCREMENTAL_BACKUP_INTERVAL_MINUTES` | +| `purge_blocked` | Counter | | Number of change-log purges blocked because the actual backup state could not be verified or is stale. | ### zero.replication -| Metric | Type | Unit | Description | -| ---------------------- | --------- | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| `upstream_lag` | Gauge | ms | Latency from sending a replication report to receiving it in the stream | -| `replica_lag` | Gauge | ms | Latency from receiving a replication report to it reaching the replica | -| `total_lag` | Gauge | ms | End-to-end replication latency. Grows as an estimate if the next report hasn't arrived | -| `last_total_lag` | Gauge | ms | End-to-end latency from the most recently received replication report. Unlike `total_lag`, it does not grow when replication reports stop arriving. | -| `events` | Counter | | Number of replication events processed | -| `transactions` | Counter | | Count of replicated transactions | -| `shadow-sync-runs` | Counter | | Number of [shadow initial-sync](/docs/zero-cache-config#shadow-sync-enabled) runs. Has a `result` attribute: `success`, `error` | -| `shadow-sync-duration` | Histogram | s | Wall-clock duration of a shadow initial-sync run. Has a `result` attribute: `success`, `error` | +| Metric | Type | Unit | Description | +| ---------------------- | --------- | ---- | ------------------------------------------------------------------------------------------------------------------------------- | +| `upstream_lag` | Gauge | ms | Latency from sending a replication report to receiving it in the stream | +| `replica_lag` | Gauge | ms | Latency from receiving a replication report to it reaching the replica | +| `total_lag` | Gauge | ms | End-to-end replication latency. Grows as an estimate if the next report hasn't arrived | +| `events` | Counter | | Number of replication events processed | +| `transactions` | Counter | | Count of replicated transactions | +| `shadow-sync-runs` | Counter | | Number of [shadow initial-sync](/docs/zero-cache-config#shadow-sync-enabled) runs. Has a `result` attribute: `success`, `error` | +| `shadow-sync-duration` | Histogram | s | Wall-clock duration of a shadow initial-sync run. Has a `result` attribute: `success`, `error` | ### zero.sync diff --git a/contents/docs/postgres-support.mdx b/contents/docs/postgres-support.mdx index 09702509..50654039 100644 --- a/contents/docs/postgres-support.mdx +++ b/contents/docs/postgres-support.mdx @@ -25,10 +25,8 @@ Postgres has a massive feature set, and Zero supports a growing subset of it. Postgres Type - - Type to put in `schema.ts` - - Resulting JS/TS Type + `schema.ts` Type + Resulting TS Type @@ -53,6 +51,41 @@ Postgres has a massive feature set, and Zero supports a growing subset of it. string + + + cidr, inet,{' '} + macaddr, macaddr8 + + + string + + + string + + + + + pg_lsn + + + string + + + string + + + + + isn extension types (ean13 + , isbn, etc.) + + + string + + + string + + bool diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx index 266cb9ee..3c18e59b 100644 --- a/contents/docs/release-notes/1.7.mdx +++ b/contents/docs/release-notes/1.7.mdx @@ -11,25 +11,21 @@ npm install @rocicorp/zero@1.7 ## Overview -Zero 1.7 is currently shaping up as a query correctness and performance -release. The largest user-visible changes are around making query evaluation -more consistent across Postgres, the SQLite replica, and the in-memory JS query -engine. - -There are still a few open review items before this note is final, especially -around the behavior and performance impact of the `LIKE`/`ILIKE` changes. +Zero 1.7 focuses on query correctness, performance, and operational safety. It improves consistency with different encodings across Postgres, the SQLite replica, and the in-memory JS query engine, as well as performance improvements under load. ## Features +- [**Immutable query result updates:**](/docs/zql#immutability) Query result updates now preserve references for unchanged subtrees, improving compatibility with React memoization and Solid reactivity without the earlier eager-expansion regression. ([#6093](https://github.com/rocicorp/mono/pull/6093)) +- [**Additional Postgres scalar types:**](/docs/postgres-support#column-types) Zero now syncs selected text-represented Postgres scalar types, including network/address types, `pg_lsn`, and the `isn` extension family, as `string` columns. These columns can also participate in Zero primary keys. ([#6099](https://github.com/rocicorp/mono/pull/6099)) - [**Replication lag diagnostics:**](/docs/otel#zeroreplication) Added a `replication.last_total_lag` gauge so operators can distinguish actual replication lag from a stalled lag-report stream. ([#6042](https://github.com/rocicorp/mono/pull/6042)) -- [**Immutable query result updates:**](/docs/react#TODO) Query result updates now preserve references for unchanged subtrees, improving compatibility with React memoization and Solid reactivity without the earlier eager-expansion regression. ([#6093](https://github.com/rocicorp/mono/pull/6093)) ## Performance -- [Batched flip-join requests, with benchmarks showing large wins for high-cardinality relationship queries.](https://github.com/rocicorp/mono/pull/5928) -- [Avoided O(N²) debug row accumulation in `Debug.rowVended`, reducing overhead for large analyze/debug workloads.](https://github.com/rocicorp/mono/pull/5991) -- [Replaced queue dequeue behavior that could become O(N²) under heavy replication load with an O(1) ring buffer.](https://github.com/rocicorp/mono/pull/5986) -- [Added transaction-scoped copy-on-write for multi-change transactions, reducing allocation overhead and showing roughly 2x wins for large transactions.](https://github.com/rocicorp/mono/pull/6097) +We benchmarked `zero/v1.6.2` against `maint/zero/v1.7` (`2698272ca`) on an M3 Max MacBook Pro with 36 GB RAM, macOS 26.5.1, and Node 22.22.1. The run used 84 comparable `zql-benchmarks` cases with the same benchmark definitions on both refs. + +Overall, the median benchmark was 1% faster. The geometric mean was 3% slower including one severe planned-`exists` hydration outlier, or 1% faster excluding that single case. 30 of 84 benchmarks improved by at least 5%, while 22 regressed by at least 5%. + +Wins were concentrated in Chinook hydration (+38% geomean), manual flip-join cases (+16%), and in-memory IVM hot-path benchmarks (+5%). Regressions were concentrated in planner hydration, transaction-heavy ArrayView updates, and Chinook push workloads. ## Fixes @@ -37,30 +33,15 @@ around the behavior and performance impact of the `LIKE`/`ILIKE` changes. - [Inspector/analyze-query could show a query plan different from the actual plan generated by the table source.](https://github.com/rocicorp/mono/pull/5990) - [Duplicate bundled copies of runtime peer dependencies could break customer-observable behavior such as `Pool instanceof` checks and React single-instance assumptions.](https://github.com/rocicorp/mono/pull/6046) - [Singular and plural queries with the same AST could incorrectly share a client view.](https://github.com/rocicorp/mono/pull/6065) +- [React and Solid queries with nested relationships using `one()` vs `limit(1)` could share a view cache entry and return the wrong nested shape.](https://github.com/rocicorp/mono/pull/6104) - [Removing a query could trigger an assertion.](https://github.com/rocicorp/mono/pull/6066) - [`LIKE`/`ILIKE` matching in the JS query engine used multiline regex behavior instead of dotall behavior, causing mismatches for strings containing newlines.](https://github.com/rocicorp/mono/pull/6083) (thanks [@sravan27](https://github.com/sravan27)!) - [Range filters (`<`, `<=`, `>`, `>=`) could use ordering that differed from SQLite/Postgres ordering.](https://github.com/rocicorp/mono/pull/6088) (thanks [@sravan27](https://github.com/sravan27)!) - [SQLite replica `LIKE`/`ILIKE` behavior could diverge from Postgres and the in-memory JS matcher.](https://github.com/rocicorp/mono/pull/6095) - [SQLite replica `ILIKE` did not match non-ASCII case variants such as `MÜLLER` and `müller`.](https://github.com/rocicorp/mono/pull/6098) +- [Litestream-backed deployments could purge change-log entries based on stale claimed backup progress rather than actual backup state.](https://github.com/rocicorp/mono/pull/6110) [#6123](https://github.com/rocicorp/mono/pull/6123) +- [Query hydration and pipeline failures now include the query hash, transformation hash, and custom query name when available.](https://github.com/rocicorp/mono/pull/6128) ## Breaking Changes -None confirmed. - -The following query-correctness changes are still under review because they can -change which rows match a query: - -1. SQLite replica `LIKE`/`NOT LIKE` now matches Postgres by being - case-sensitive. Previously, SQLite's default `LIKE` behavior could match - case-insensitively. -1. SQLite replica `ILIKE`/`NOT ILIKE` now compiles as - `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`. -1. SQLite replica `LIKE`/`ILIKE` now emits `ESCAPE '\'`, so patterns like - `100\%` and `a\_b` treat `%` and `_` literally, matching Postgres and the JS - matcher. -1. SQLite replica `ILIKE` now uses Unicode-aware lowercasing, so non-ASCII case - variants such as `MÜLLER` and `müller` can match. This is not full Unicode - case folding; cases like `straße` and `STRASSE` still do not match. - -We also still need to investigate whether these `LIKE`/`ILIKE` changes affect -SQLite index use or hot-query latency. +None. diff --git a/contents/docs/release-notes/index.mdx b/contents/docs/release-notes/index.mdx index 3cb0ddbb..b8105ea3 100644 --- a/contents/docs/release-notes/index.mdx +++ b/contents/docs/release-notes/index.mdx @@ -2,6 +2,7 @@ title: Release Notes --- +- [Zero 1.7: Query Correctness and Performance](/docs/release-notes/1.7) - [Zero 1.6: PlanetScale Failover Support](/docs/release-notes/1.6) - [Zero 1.5: Schema Change Improvements and Client Group Auth](/docs/release-notes/1.5) - [Zero 1.4: Performance and Reliability Improvements](/docs/release-notes/1.4) diff --git a/contents/docs/zql.mdx b/contents/docs/zql.mdx index 242ea33c..1a44893f 100644 --- a/contents/docs/zql.mdx +++ b/contents/docs/zql.mdx @@ -211,25 +211,26 @@ The first parameter is always a column name from the table being queried. TypeSc ### Comparison Operators -Where supports the following comparison operators: +`where()` supports the following comparison operators: | Operator | Allowed Operand Types | Description | | ---------------------------------------- | ----------------------------- | ------------------------------------------------------------------------ | | `=` , `!=` | boolean, number, string | JS strict equal (===) semantics | -| `<` , `<=`, `>`, `>=` | number | JS number compare semantics | +| `<` , `<=`, `>`, `>=` | number, string | Numeric or string ordering | | `LIKE`, `NOT LIKE`, `ILIKE`, `NOT ILIKE` | string | SQL-compatible `LIKE` / `ILIKE` | | `IN` , `NOT IN` | boolean, number, string | RHS must be array. Returns true if rhs contains lhs by JS strict equals. | | `IS` , `IS NOT` | boolean, number, string, null | Same as `=` but also works for `null` | TypeScript will restrict you from using operators with types that don’t make sense – you can’t use `>` with `boolean` for example. - - [Let us know](https://discord.rocicorp.dev/)! Many are - easy to add. + + +Zero can evaluate an `ILIKE` filter in three places: in-memory on the client, in ZQLite against the replica, or as SQL in Postgres. + +ZQLite and the in-memory query engine use Unicode-aware lowercasing before matching. This means common non-ASCII case variants, such as `MÜLLER` and `müller`, match in both. + +If you need non-ASCII text in PG to work with `ILIKE`, use a Unicode-aware collation for those text columns, such as the database's default UTF-8 locale. + ### Equals is the Default Comparison Operator From 381ddc17817983326c3f6ef944fd2af26be90249 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Thu, 25 Jun 2026 16:23:33 -0700 Subject: [PATCH 3/9] chore: work --- contents/docs/otel.mdx | 1 + contents/docs/zql.mdx | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contents/docs/otel.mdx b/contents/docs/otel.mdx index d1af730c..ab74bfbb 100644 --- a/contents/docs/otel.mdx +++ b/contents/docs/otel.mdx @@ -146,6 +146,7 @@ This callback is called before sending WebSocket messages that trigger API serve | `upstream_lag` | Gauge | ms | Latency from sending a replication report to receiving it in the stream | | `replica_lag` | Gauge | ms | Latency from receiving a replication report to it reaching the replica | | `total_lag` | Gauge | ms | End-to-end replication latency. Grows as an estimate if the next report hasn't arrived | +| `last_total_lag` | Gauge | ms | End-to-end latency of the most recently received report. Unlike `total_lag`, does not grow if reports stop arriving | | `events` | Counter | | Number of replication events processed | | `transactions` | Counter | | Count of replicated transactions | | `shadow-sync-runs` | Counter | | Number of [shadow initial-sync](/docs/zero-cache-config#shadow-sync-enabled) runs. Has a `result` attribute: `success`, `error` | diff --git a/contents/docs/zql.mdx b/contents/docs/zql.mdx index 1a44893f..d997abd2 100644 --- a/contents/docs/zql.mdx +++ b/contents/docs/zql.mdx @@ -42,9 +42,10 @@ zql.issue This is a design tradeoff that allows Zero to better reuse the row locally for future queries. This also makes it easier to share types between different parts of the code. -This means you should not modify the data directly. Instead, clone the data and modify the clone. -ZQL caches values and returns them multiple times. If you modify a value returned from ZQL, you will modify it everywhere it is used. This can lead to subtle bugs. +Do not directly modify JavaScript values returned from ZQL queries. + +ZQL caches values across queries to improve performance and reduce re-renders in frameworks like React and Solid. If you modify a value returned from ZQL, you will modify it everywhere it is used. This can lead to subtle bugs. JavaScript and TypeScript lack true immutable types so we use `readonly` to help enforce it. But it's easy to cast away the `readonly` accidentally. From c5f48ca144746d487a7899043935fb9303d4aafa Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Fri, 26 Jun 2026 11:26:42 -0700 Subject: [PATCH 4/9] docs: clean up perf --- contents/docs/release-notes/1.7.mdx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx index 3c18e59b..7fb1a9c9 100644 --- a/contents/docs/release-notes/1.7.mdx +++ b/contents/docs/release-notes/1.7.mdx @@ -21,11 +21,15 @@ Zero 1.7 focuses on query correctness, performance, and operational safety. It i ## Performance -We benchmarked `zero/v1.6.2` against `maint/zero/v1.7` (`2698272ca`) on an M3 Max MacBook Pro with 36 GB RAM, macOS 26.5.1, and Node 22.22.1. The run used 84 comparable `zql-benchmarks` cases with the same benchmark definitions on both refs. +Zero 1.7 is broadly performance-neutral with Zero 1.6 across client and query-engine workloads, with most benchmarks staying within +/-5%. -Overall, the median benchmark was 1% faster. The geometric mean was 3% slower including one severe planned-`exists` hydration outlier, or 1% faster excluding that single case. 30 of 84 benchmarks improved by at least 5%, while 22 regressed by at least 5%. +The clearest improvements are in replication and storage, especially when Zero is processing changes from Postgres: -Wins were concentrated in Chinook hydration (+38% geomean), manual flip-join cases (+16%), and in-memory IVM hot-path benchmarks (+5%). Regressions were concentrated in planner hydration, transaction-heavy ArrayView updates, and Chinook push workloads. +| What improved | Result | +| -------------------------------------------------- | -----------: | +| Processing a continuous stream of Postgres changes | 1.86x faster | +| Processing transactions that change many rows | 1.73x faster | +| Copying rows into Zero during initial sync | 1.07x faster | ## Fixes From 132e43380881aaf6c635fa3c5eb62d45dbd7a79f Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Sat, 27 Jun 2026 17:09:55 -0700 Subject: [PATCH 5/9] docs: added better benchmarking --- .agents/skills/benchmark-compare/SKILL.md | 127 ++++++ assets/search-index.json | 2 +- ...rk-results-zero-1.7-vs-1.6-full-results.md | 373 ++++++++++++++++++ components/BenchmarkComparisonChart.tsx | 187 +++++++++ contents/docs/release-notes/1.7.mdx | 170 +++++++- lib/mdx.ts | 2 + package.json | 1 + pnpm-lock.yaml | 298 ++++++++++++++ 8 files changed, 1152 insertions(+), 8 deletions(-) create mode 100644 .agents/skills/benchmark-compare/SKILL.md create mode 100644 benchmark-results-zero-1.7-vs-1.6-full-results.md create mode 100644 components/BenchmarkComparisonChart.tsx diff --git a/.agents/skills/benchmark-compare/SKILL.md b/.agents/skills/benchmark-compare/SKILL.md new file mode 100644 index 00000000..fa20523c --- /dev/null +++ b/.agents/skills/benchmark-compare/SKILL.md @@ -0,0 +1,127 @@ +--- +name: benchmark-compare +description: Compare benchmark results between two refs, branches, tags, or commits; produce aggregate before/after summaries and investigate major regressions. +--- + +# Benchmark Compare + +Use this skill when comparing benchmark performance across two code versions, especially for release notes or regression investigation. + +## Goal + +Produce a repeatable before/after benchmark comparison with raw evidence, clear aggregate results, and documented caveats. + +## Inputs + +Gather: + +- Repository path. +- Baseline ref. +- Target ref. +- Benchmark command or commands. +- Metric direction: higher-is-better or lower-is-better. +- Desired output: release-note summary, investigation, or raw report. + +Ask one short question if any required input is unclear. + +## Workflow + +1. Resolve baseline and target refs to exact SHAs. +2. Use separate temporary worktrees so active working trees are not touched. +3. Set up each worktree using that ref's normal project tooling. +4. Record environment details: machine, OS, runtime versions, package manager versions, and relevant env vars. +5. Run equivalent benchmark commands on both refs. +6. Save raw output and logs for both runs. +7. Confirm the benchmark commands succeeded before comparing results. +8. Normalize results into benchmark name, metric value, unit, and direction. +9. Compare matching benchmark names only. +10. Summarize aggregate results and investigate major outliers. + +## Comparison Rules + +Compare only benchmark cases that exist on both refs. + +Exclude changed benchmark definitions unless the same definition was intentionally run on both refs. + +If benchmark-only changes are backported for comparison, do that only in the temporary baseline worktree and document it. + +Do not backport production code when measuring a performance commit. Only backport benchmark files or benchmark harness changes needed to run the same benchmark definition on both refs. + +Before relying on a benchmark matrix for release notes, check whether important performance commits are actually covered: + +- Inspect the commit message, PR description, and changed files to identify the optimized path. +- Look for durable benchmark coverage, usually `*.bench.ts` files run by the normal benchmark command. +- Treat gated `PERF=1` tests, `*.perf.test.ts` files, one-off scripts, and custom console tables as evidence, not matrix coverage. +- Check whether the benchmark exists on both refs with `git ls-tree :` or an equivalent read-only check. +- If a target-only benchmark covers the path, temp-backport it into the baseline worktree and run it on both refs. +- If no durable benchmark exists, create the smallest benchmark that targets the optimized path using APIs available on both refs. +- Validate the benchmark once on each ref before starting multi-run batches. +- Record all benchmark-only temp backports: files changed, refs, SHAs, commands, and whether the benchmark definition was identical across refs. + +Examples: + +- A gated `zqlite/src/*.perf.test.ts` for flipped-join batching did not appear in the matrix because normal benchmark runs only picked up `*.bench.ts`. The fix was to add a standard `zql-benchmarks/src/*.bench.ts`, temp-backport it into both release worktrees, and report the result separately from the original matrix. +- `array-view-transaction.bench.ts` covered transaction copy-on-write on the target ref but did not exist on the baseline ref. The fix was to temp-backport that benchmark file to the baseline worktree and run the same benchmark on both refs. + +Use ratios consistently: + +- Higher-is-better: `target / baseline`. +- Lower-is-better: `baseline / target`. + +A ratio above `1.0` means target improved. A ratio below `1.0` means target regressed. + +## Summary + +Report: + +- Comparable benchmark count. +- Median ratio. +- Geometric mean ratio. +- Improved count above a chosen threshold, usually 5%. +- Regressed count above the same threshold. +- Top improvements. +- Top regressions. +- Exclusions or caveats. + +If one outlier dominates the aggregate, report both the full result and the result excluding that named outlier. Do not hide the outlier. + +## Troubleshooting + +If output is empty or partial, inspect raw logs before comparing. + +If benchmark output is piped through a converter, ensure benchmark failures are not hidden. + +If runtime-specific build artifacts fail, rebuild or reinstall using the project's documented tooling. + +If benchmark arguments are not forwarded correctly, run from the package or directory where the benchmark command is defined, or invoke the underlying runner directly. + +If results look noisy, rerun the affected benchmark subset and report uncertainty. + +## Regression Investigation + +For severe regressions: + +1. Verify the result from raw output or a rerun. +2. Confirm the benchmark definition did not change. +3. Inspect relevant code diffs. +4. Check tests for changed behavior or expectations. +5. Use commit history or blame to identify likely causes. +6. Link relevant commits or PRs when available. +7. State whether the cause appears proven or uncertain. + +## Release Notes + +Prefer aggregate performance summaries over listing every performance PR. + +Include: + +- Baseline ref and SHA. +- Target ref and SHA. +- Benchmark suite or command. +- Environment. +- Comparable benchmark count. +- Median and geometric mean results. +- Important wins and regressions. +- Caveats and exclusions. + +Keep claims scoped to the measured benchmark suite and environment. diff --git a/assets/search-index.json b/assets/search-index.json index 137d9ca8..94531218 100644 --- a/assets/search-index.json +++ b/assets/search-index.json @@ -8923,4 +8923,4 @@ "content": "Scalar subqueries are not currently integrated with Zero's planner. You need to manually choose when to use them.", "kind": "section" } -] \ No newline at end of file +] diff --git a/benchmark-results-zero-1.7-vs-1.6-full-results.md b/benchmark-results-zero-1.7-vs-1.6-full-results.md new file mode 100644 index 00000000..24a0f221 --- /dev/null +++ b/benchmark-results-zero-1.7-vs-1.6-full-results.md @@ -0,0 +1,373 @@ +# Zero 1.7 vs 1.6 Benchmark Results + +This report captures all benchmark results collected so far for the Zero 1.7 release comparison. + +## Inputs + +| Item | Value | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | +| 1.7 ref | `maint/zero/v1.7` at `2698272ca` | +| 1.6 ref | `maint/zero/v1.6` / `zero/v1.6.2` at `63673effe` | +| Benchmark commits applied for comparison | `9209d3880` and `7a6188a35` | +| 1.7 package manager | `pnpm` | +| 1.6 package manager | `npm` | +| Main aggregate | `/var/folders/1p/byzq05qd42zg5rg6__h69_7c0000gn/T/opencode/zero-pg-bench-9209d3880/benchmark-summary-10-runs.json` | + +## Important Caveat + +The full 116-row matrix below is the original 10-run matrix. After that full run, we found that one large planner-hydration regression was caused by a benchmark fixture issue: the benchmark created a Chinook SQLite database without the predicate indexes needed by that query before running `ANALYZE`. + +We did not rerun the entire 116-row suite after fixing that benchmark. Instead, we ran a targeted index experiment for the affected planner row, 10-run targeted backports for 1.7-only benchmark coverage, and focused 5-pass reruns for the remaining push-path concerns. The practical release read uses the adjusted interpretation, not the raw bad planner row. + +## Headline Summary + +| Summary | Count | +| ---------------------------------------------------------------- | ----: | +| Matched benchmark rows in original 10-run matrix | 116 | +| Original rows improved by at least 5% in 1.7 | 9 | +| Original rows regressed by at least 5% in 1.7 | 9 | +| Original rows flat within +/-5% | 98 | +| Adjusted rows improved by at least 5% after planner fixture fix | 10 | +| Adjusted rows regressed by at least 5% after planner fixture fix | 8 | +| Adjusted rows flat within +/-5% | 98 | + +## Release Read + +1.7 is broadly performance-neutral compared with 1.6 across client and query-engine benchmarks, with targeted wins in the paths that had specific 1.7 performance work. The strongest original matrix wins are in Postgres replication/storage paths. A newly backported logger allocation benchmark shows `LogContext` construction is ~1.3-1.6x faster in 1.7. Newly backported flipped-join benchmarks show a consistent ~2.8-3.3x 1.7 win for the direct batching shape and a scaling ~3.9-110x win for the ZQL-built merge-shaped query. A newly backported `Debug.rowVended` benchmark shows a scaling ~21-3,242x win for query-analysis runs that collect every vended row. The transaction benchmark for `572f1ae4b` shows 1.7's copy-on-write ArrayView transaction path stays close to 1.6's old mutable baseline for multi-edit transactions, with a small absolute single-edit overhead on wide lists. A newly backported relationship-heavy ArrayView guard benchmark shows 1.7 slower on those broader hydration/push cases, with most deltas around ~5-23% and one small baseline hydration row at 39% slower. The one huge apparent planner regression was a benchmark fixture issue and is fixed by adding `album(title)` and `genre(name)` before `ANALYZE`. Focused push-only reruns did not reproduce a broad in-memory IVM push regression. The remaining consistent regressions are small, microsecond-scale Chinook push cases and are not release-blocking. + +## Postgres Replication And Storage Benchmarks + +| Benchmark | 1.6 | 1.7 | Result | +| ------------------------------------------------- | --------: | --------: | -----------: | +| change-streamer/storer single transaction changes | 60.60 us | 35.10 us | 1.73x faster | +| change-streamer/storer sustained stream changes | 63.56 us | 34.16 us | 1.86x faster | +| change-streamer/storer sustained stream commits | 63.56 ms | 34.16 ms | 1.86x faster | +| replicator/logical replication end-to-end rows | 114.67 us | 113.59 us | 1.01x faster | +| zero-cache/initial-sync generated fixture rows | 6.17 us | 5.75 us | 1.07x faster | + +## Logger Allocation Benchmark + +This targeted benchmark came from local branch `0xcadams/logger-allocation-benchmark` as `packages/shared/src/logger.bench.ts`. It was temp-backported into both release comparison worktrees. The benchmark compares `@rocicorp/logger` `LogContext` construction and `withContext` allocation paths; v1.6 uses `@rocicorp/logger` `^5.4.0` and v1.7 uses `^6.1.0`. + +Each benchmark case constructs 1,000 contexts per measured iteration. Values below are median-of-medians across 10 completed process runs. + +| Benchmark | 1.6 | 1.7 | Result | +| ---------------------------------------------- | -------: | -------: | -----------: | +| LogContext construction > new debug context | 24.23 us | 15.23 us | 1.59x faster | +| LogContext construction > new info context | 27.86 us | 17.62 us | 1.58x faster | +| LogContext construction > new error context | 22.41 us | 16.94 us | 1.32x faster | +| LogContext construction > withContext on debug | 31.77 us | 22.15 us | 1.43x faster | + +Takeaway: 1.7 is consistently faster on logger context allocation, with the largest wins for fresh debug/info `LogContext` construction. These timings are per 1,000 constructed contexts. + +## Flipped Join Batching Benchmark + +This targeted benchmark was added after the original 116-row matrix to cover `8916f8001 feat(zql): batch flip join requests`. The improvement did not show up in the original run because no durable `*.bench.ts` benchmark exercised the large-N flipped-join shape optimized by that commit. The commit had a gated `zqlite` perf test, but our benchmark sweep only ran regular benchmark files from runnable benchmark packages, and `zqlite` contributed no rows. + +The benchmark was temp-backported into both release comparison worktrees as `packages/zql-benchmarks/src/flipped-join-batching.bench.ts`. It builds in-memory SQLite `parent` and `child` tables, wires them through `TableSource` and direct `FlippedJoin`, then measures fetching N one-to-one child/parent joins. Values below are median-of-medians across 10 completed process runs. + +| Rows | 1.6 | 1.7 | Result | +| -----: | -------: | --------: | -----------: | +| 100 | 2.37 ms | 718.92 us | 3.30x faster | +| 500 | 4.73 ms | 1.71 ms | 2.76x faster | +| 1,000 | 9.31 ms | 3.25 ms | 2.87x faster | +| 2,500 | 23.24 ms | 7.19 ms | 3.23x faster | +| 5,000 | 46.48 ms | 15.59 ms | 2.98x faster | +| 10,000 | 92.14 ms | 32.13 ms | 2.87x faster | + +Takeaway: `8916f8001` is a clear 1.7 performance win when measured directly. The effect is not visible in the original full matrix because the matrix lacked this benchmark shape, not because the optimization was ineffective. + +## Flipped Join Merge Benchmark + +This targeted benchmark was added after the original 116-row matrix by converting the remaining gated `packages/zqlite/src/flipped-join-merge.perf.test.ts` into `packages/zql-benchmarks/src/flipped-join-merge.bench.ts`. The old perf test was excluded from the release matrix for the same reason as the direct batching perf test: it was a gated `*.perf.test.ts` under `zqlite`, not a standard benchmark file that emits normal benchmark output. + +The benchmark builds in-memory SQLite `parent` and `child` tables, wires them through `TableSource`, constructs the query through ZQL as `parent.whereExists('children', {flip: true})`, then runs it through `buildPipeline(...)`. The join key is `bucket`, which is intentionally not schema-declared unique, preserving the merge-shaped flipped-join path from the original perf test. Values below are median-of-medians across 10 completed process runs. + +Important interpretation: `7f9aee2dc feat(zql): heap-based merge in #fetchMergeSort` is already present in both 1.6 and 1.7, so this is not a direct pre/post measurement of that commit. The 1.6-vs-1.7 delta here primarily shows how the later flipped-join batching work changes the ZQL-built merge-shaped query. + +| Rows | 1.6 | 1.7 | Result | +| -----: | --------: | --------: | -------------: | +| 100 | 2.73 ms | 699.58 us | 3.91x faster | +| 500 | 13.48 ms | 1.90 ms | 7.10x faster | +| 1,000 | 43.01 ms | 3.31 ms | 13.00x faster | +| 2,500 | 231.84 ms | 7.57 ms | 30.63x faster | +| 5,000 | 895.03 ms | 16.36 ms | 54.72x faster | +| 10,000 | 3.65 s | 33.22 ms | 109.78x faster | + +Takeaway: this benchmark is the strongest flipped-join signal. The direct batching benchmark shows a stable ~3x win on the unique-key shape; the ZQL-built merge-shaped query shows the scaling behavior that was hidden by the gated perf test and grows to ~110x faster at 10,000 rows. + +## Debug.rowVended Benchmark + +This targeted benchmark covers `257da8234 fix(zql): avoid O(N²) spread in Debug.rowVended`. The bug was in the query-analysis/debug path that records every row vended by a SQL query into one debug bucket. 1.6 appended by cloning the whole accumulated array for every row; 1.7 appends in place. + +This did not show up in normal query/materialization benchmarks because those benchmarks do not run through the query-analysis/debug path. Normal client query hydration and subscriptions do not return every vended row object. The affected path is used by analysis/debug tooling such as `analyze-query`, inspector analyze-query requests, `analyzeQuery(...)`, or equivalent project-specific query-analysis commands. Full vended rows are explicitly requested with options like `--output-vended-rows` / `vendedRows: true`, but the debug delegate also tracks vended-row arrays internally while producing row-count diagnostics, so high-fan-out analysis runs are the important case. + +The benchmark was temp-backported into both release comparison worktrees as `packages/zql-benchmarks/src/debug-row-vended.bench.ts`. It directly calls `Debug.rowVended` for N rows in one table/query bucket. Values below are median-of-medians across 10 completed process runs. + +| Rows | 1.6 | 1.7 | Result | +| -----: | --------: | --------: | --------------: | +| 1,000 | 496.75 us | 23.85 us | 20.82x faster | +| 5,000 | 10.65 ms | 62.54 us | 170.23x faster | +| 10,000 | 39.64 ms | 84.85 us | 467.19x faster | +| 20,000 | 418.16 ms | 129.00 us | 3241.57x faster | + +Takeaway: this is a major win for query-analysis/debug workflows with high-fan-out queries. It is not expected to affect ordinary customer query execution unless they are running analysis/debug tooling that installs the `Debug` delegate and records rows vended by the query. + +## ArrayView Transaction Copy-On-Write Benchmark + +This targeted benchmark covers `572f1ae4b chore: Optimize transaction performance with copy-on-write`. The benchmark existed on 1.7 but not 1.6, so it appeared as 1.7-only in the original matrix and did not produce matched rows. + +The benchmark was temp-backported into the 1.6 comparison worktree as `packages/zql-benchmarks/src/array-view-transaction.bench.ts`. It materializes a flat `ArrayView`, applies K edits inside one transaction, then calls one `delegate.commit()`. Values below are median-of-medians across 10 completed process runs. + +Important interpretation: this is a 1.7-vs-1.6 release comparison, not a direct pre/post comparison against the slow immutable implementation that `572f1ae4b` optimized. The 1.6 branch is the old mutable baseline, so the useful release question is whether 1.7's copy-on-write path stays close to that baseline. + +| N | Edits/Txn | 1.6 | 1.7 | Result | +| -----: | --------: | --------: | --------: | -----------: | +| 1,000 | 1 | 3.27 us | 3.86 us | 15.4% slower | +| 1,000 | 100 | 320.76 us | 342.82 us | 6.4% slower | +| 1,000 | 1,000 | 3.27 ms | 3.38 ms | 3.4% slower | +| 10,000 | 1 | 3.79 us | 7.29 us | 48.0% slower | +| 10,000 | 100 | 354.89 us | 381.79 us | 7.0% slower | +| 10,000 | 1,000 | 3.57 ms | 4.07 ms | 12.2% slower | + +Takeaway: `572f1ae4b` should not be presented as a 1.7-vs-1.6 throughput win, because v1.6 did not have the slow immutable path this commit optimized. For the release comparison, the fixed 1.7 copy-on-write implementation is close to v1.6's mutable baseline for batched edits. The largest relative delta is the single-edit wide-list case, but the absolute difference is about 3.5 us per transaction. + +## Relationship-Heavy ArrayView Benchmark + +This targeted benchmark was also added after the original 116-row matrix. `array-view-relationships.bench.ts` exists on 1.7 but not 1.6, so it originally appeared only as a 1.7-only benchmark and did not produce matched comparison rows. It is not the direct `572f1ae4b` transaction-copy-on-write benchmark; it is broader relationship-heavy ArrayView hydration/push coverage for the immutable ArrayView work. + +The benchmark was temp-backported into the v1.6 comparison worktree and run on both versions. Values below are median-of-medians across 10 completed process runs. + +| Benchmark | 1.6 | 1.7 | Result | +| ------------------------------------------------------------------------------ | --------: | --------: | -----------: | +| relationship hydration > hydrate: issues only (baseline) | 153.99 us | 253.66 us | 39.3% slower | +| relationship hydration > hydrate: issues + comments (wide, one level) | 1.79 ms | 1.88 ms | flat | +| relationship hydration > hydrate: issues + comments + emoji (wide, two levels) | 9.95 ms | 10.87 ms | 8.5% slower | +| relationship hydration > hydrate: heavy query (wide + deep) — regression case | 22.33 ms | 24.05 ms | 7.2% slower | +| relationship hydration > hydrate: heavy query limit(50) | 5.74 ms | 6.70 ms | 14.4% slower | +| push into relationship-heavy view > push: add issue into heavy view | 69.63 us | 83.07 us | 16.2% slower | +| push into relationship-heavy view > push: add comment (child) into heavy view | 13.83 us | 17.92 us | 22.8% slower | +| push into relationship-heavy view > push: edit issue title in heavy view | 12.11 us | 12.72 us | flat | + +Takeaway: this guard benchmark does not show a 1.7 win. Hydration cases are modestly slower in 1.7, while push regressions are microsecond-scale in absolute terms. This should be treated separately from the direct transaction-copy-on-write benchmark for `572f1ae4b`. + +## Planner-Hydration Fixture Correction + +The raw full matrix included this bad row: + +| Benchmark | 1.6 | 1.7 Raw | Raw Result | +| ------------------------------------------------------------------------------ | --------: | ------: | -----------: | +| `planner-hydration > track.exists(album).exists(genre) with filters > planned` | 103.33 us | 3.88 ms | 97.3% slower | + +Targeted testing showed this was caused by the benchmark missing `album(title)` before `ANALYZE`. With the correct indexes, 1.7 chooses the fast `album`-flipped plan and is slightly faster than 1.6. + +| Ref | Index variant | Album flip | Genre flip | Planned | Unplanned | Rows | +| --- | ---------------------------- | ---------- | ---------- | --------: | --------: | ---: | +| 1.6 | no extra indexes | true | false | 138.54 us | 10.57 ms | 15 | +| 1.6 | album(title) only | true | false | 115.17 us | 10.29 ms | 15 | +| 1.6 | genre(name) only | false | true | 3.89 ms | 10.36 ms | 15 | +| 1.6 | album(title) and genre(name) | true | false | 102.92 us | 10.70 ms | 15 | +| 1.7 | no extra indexes | false | true | 3.76 ms | 10.42 ms | 15 | +| 1.7 | album(title) only | true | false | 106.29 us | 10.35 ms | 15 | +| 1.7 | genre(name) only | false | true | 3.88 ms | 10.36 ms | 15 | +| 1.7 | album(title) and genre(name) | true | false | 92.75 us | 10.28 ms | 15 | + +## Focused Push-Only Rerun + +These are 5 focused reruns per version using only the push benchmarks from `ivm-memory.bench.ts` and `chinook-push.bench.ts`. They were run after the original full matrix to check whether the remaining push regressions reproduced. + +| Benchmark | 1.6 | 1.7 | Rerun Result | +| ------------------------------------------ | --------: | --------: | -----------: | +| Chinook push limited inside bound, zql | 5.64 us | 6.06 us | 6.9% slower | +| Chinook push limited inside bound, zqlite | 247.83 us | 248.33 us | flat | +| Chinook push limited outside bound, zql | 1.83 us | 1.83 us | flat | +| Chinook push limited outside bound, zqlite | 8.20 us | 8.28 us | flat | +| Chinook push unlimited, zql | 1.91 us | 2.27 us | 15.9% slower | +| Chinook push unlimited, zqlite | 5.48 us | 6.18 us | 11.3% slower | +| IVM push add comment | 9.10 us | 9.00 us | flat | +| IVM push add issue, no join | 56.02 us | 46.92 us | 1.19x faster | +| IVM push add issue, with creator join | 5.57 us | 6.57 us | 15.2% slower | +| IVM push add issue inside limit(50) | 3.53 us | 3.56 us | flat | +| IVM push add issue outside limit(50) | 2.58 us | 2.51 us | flat | +| IVM push edit issue title | 5.66 us | 5.77 us | flat | + +Takeaway: the original broad IVM push regression did not reproduce. Most IVM push rows were flat or faster in 1.7. Chinook push rows still show small regressions, but the absolute deltas are sub-microsecond to about one microsecond. + +## Original >=5% Improvements + +| Benchmark | 1.6 | 1.7 | Result | +| -------------------------------------------------------------------------------------------------------------------------------------------------- | -------: | -------: | -----------: | +| zero-cache:pg > change-streamer/storer sustained stream changes | 63.56 us | 34.16 us | 1.86x faster | +| zero-cache:pg > change-streamer/storer sustained stream commits | 63.56 ms | 34.16 ms | 1.86x faster | +| zero-cache:pg > change-streamer/storer single transaction changes | 60.60 us | 35.10 us | 1.73x faster | +| zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues limit 50 | 67.07 us | 40.48 us | 1.66x faster | +| zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > fetch 1000 issues -> 20 users | 1.26 ms | 1.04 ms | 1.20x faster | +| zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > planned: track.exists(album) where title="Big Ones" | 79.71 us | 69.21 us | 1.15x faster | +| zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push add/remove issue with owner | 6.95 us | 6.26 us | 1.11x faster | +| zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > planned: track.exists(album) OR exists(genre) | 3.42 ms | 3.16 ms | 1.08x faster | +| zero-cache:pg > zero-cache/initial-sync generated fixture rows | 6.17 us | 5.75 us | 1.07x faster | + +## Original >=5% Regressions Excluding Bad Planner Fixture + +| Benchmark | 1.6 | 1.7 | Result | +| --------------------------------------------------------------------------------------------------------------------------------------- | --------: | --------: | -----------: | +| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (no join) | 42.52 us | 52.94 us | 19.7% slower | +| zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zql: push into unlimited query | 1.74 us | 2.09 us | 16.8% slower | +| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (with creator join) | 5.99 us | 7.15 us | 16.1% slower | +| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add comment (child relation) | 8.65 us | 10.06 us | 14.0% slower | +| zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zqlite: push into unlimited query | 5.33 us | 5.91 us | 9.9% slower | +| zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zql: push into limited query, inside the bound | 5.37 us | 5.79 us | 7.2% slower | +| zero-client > src/client/zero.bench.ts > with filter > Lower rows 500 x 10 columns (numbers) | 237.63 us | 251.42 us | 5.5% slower | +| shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (old): add() loop after sort | 91.94 us | 97.21 us | 5.4% slower | + +## Full Original 10-Run Matrix + +Lower is better. Values are median-of-medians across 10 completed runs. + +| Suite | Benchmark | 1.6 | 1.7 | Result | +| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------: | --------: | -----------: | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > forward iterator next()` | 2.65 us | 2.63 us | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > forward iterator next() from mid` | 1.36 us | 1.37 us | 0.6% slower | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > reverse iterator next()` | 2.78 us | 2.77 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > reverse iterator next() from mid` | 1.42 us | 1.41 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > [Symbol.iterator]() full scan` | 2.49 us | 2.49 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > values() full scan` | 2.29 us | 2.29 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesFrom() from mid` | 1.35 us | 1.34 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesFromReversed() from mid` | 1.26 us | 1.26 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesReversed() full scan` | 2.47 us | 2.45 us | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > get() hit` | 62.36 ns | 62.15 ns | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > has() hit` | 63.48 ns | 63.47 ns | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > has() miss` | 44.54 ns | 44.49 ns | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() 100 sequential keys` | 4.63 us | 4.61 us | flat | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() 1000 sequential keys` | 55.82 us | 55.52 us | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() then delete() single key` | 85.64 ns | 85.13 ns | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > fromSorted() 100 sequential keys` | 463.54 ns | 458.74 ns | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > fromSorted() 1000 sequential keys` | 3.65 us | 3.61 us | 1.01x faster | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (new): sort + fromSorted()` | 13.19 us | 13.28 us | 0.7% slower | +| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (old): add() loop after sort` | 91.94 us | 97.21 us | 5.4% slower | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > arrays > large array (100 items)` | 374.43 ns | 365.26 ns | 1.03x faster | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > arrays > small array (10 items)` | 47.85 ns | 47.75 ns | flat | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > datasets > large dataset (100x512B)` | 13.77 us | 13.78 us | flat | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > datasets > small dataset (10x256B)` | 1.39 us | 1.40 us | 1.2% slower | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > nested object` | 158.41 ns | 159.86 ns | 0.9% slower | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > structured object (1KB)` | 138.11 ns | 140.89 ns | 2.0% slower | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > structured object (256B)` | 140.93 ns | 139.58 ns | 1.01x faster | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > boolean` | 7.07 ns | 7.05 ns | flat | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > integer` | 8.42 ns | 8.32 ns | 1.01x faster | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > null` | 7.03 ns | 7.17 ns | 1.8% slower | +| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > string (100 chars)` | 731.38 ns | 749.55 ns | 2.4% slower | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > add` | 248.87 ms | 250.31 ms | 0.6% slower | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > addCentroid` | 301.66 ms | 302.99 ms | flat | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > addCentroidList` | 306.93 ms | 309.21 ms | 0.7% slower | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > merge > addCentroid` | 25.33 us | 24.65 us | 1.03x faster | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > merge > merge` | 49.46 us | 49.48 us | flat | +| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > quantile` | 265.58 ms | 260.47 ms | 1.02x faster | +| root | `zero-cache > src/db/pg-copy.bench.ts > pg-copy benchmark > copy` | 14.91 ms | 15.02 ms | 0.7% slower | +| root | `zero-client > src/client/custom.bench.ts > big schema` | 5.33 us | 5.26 us | 1.01x faster | +| root | `zero-client > src/client/zero.bench.ts > basics > All 1000 rows x 10 columns (numbers)` | 334.08 us | 345.16 us | 3.2% slower | +| root | `zero-client > src/client/zero.bench.ts > pk compare > pk = N` | 9.50 us | 9.58 us | 0.9% slower | +| root | `zero-client > src/client/zero.bench.ts > with filter > Lower rows 500 x 10 columns (numbers)` | 237.63 us | 251.42 us | 5.5% slower | +| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zpg: all playlists` | 270.61 ms | 269.48 ms | flat | +| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zql: all playlists` | 70.86 ms | 70.39 ms | 1.01x faster | +| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zqlite: all playlists` | 409.30 ms | 410.72 ms | flat | +| root | `zql-benchmarks > src/chinook-manual-cases.bench.ts > tracks with artist name > flipped` | 89.69 us | 89.31 us | flat | +| root | `zql-benchmarks > src/chinook-manual-cases.bench.ts > tracks with artist name > not flipped` | 13.41 ms | 13.11 ms | 1.02x faster | +| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, inside the bound > zql: edit for limited query, inside the bound` | 3.28 us | 3.37 us | 2.7% slower | +| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, inside the bound > zqlite: edit for limited query, inside the bound` | 9.67 us | 9.62 us | 1.01x faster | +| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, outside the bound > zql: edit for limited query, outside the bound` | 2.86 us | 2.85 us | 1.01x faster | +| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, outside the bound > zqlite: edit for limited query, outside the bound` | 9.56 us | 9.33 us | 1.02x faster | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zql: push into limited query, inside the bound` | 5.37 us | 5.79 us | 7.2% slower | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zqlite: push into limited query, inside the bound` | 244.56 us | 243.16 us | 1.01x faster | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, outside the bound > zql: push into limited query, outside the bound` | 1.75 us | 1.76 us | 0.7% slower | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, outside the bound > zqlite: push into limited query, outside the bound` | 7.81 us | 7.83 us | flat | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zql: push into unlimited query` | 1.74 us | 2.09 us | 16.8% slower | +| root | `zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zqlite: push into unlimited query` | 5.33 us | 5.91 us | 9.9% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues filtered open` | 216.90 us | 227.44 us | 4.6% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues limit 50` | 67.07 us | 40.48 us | 1.66x faster | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues only` | 266.55 us | 256.97 us | 1.04x faster | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues with creator` | 1.01 ms | 1.04 ms | 2.9% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues with creator + comments` | 2.33 ms | 2.36 ms | 1.2% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add comment (child relation)` | 8.65 us | 10.06 us | 14.0% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (no join)` | 42.52 us | 52.94 us | 19.7% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (with creator join)` | 5.99 us | 7.15 us | 16.1% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue inside limit(50)` | 3.71 us | 3.71 us | flat | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue outside limit(50)` | 2.69 us | 2.72 us | 1.0% slower | +| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: edit issue title` | 6.08 us | 6.34 us | 4.1% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > fetch open issues (1000 total)` | 213.13 us | 209.91 us | 1.02x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > push add closed issue (filtered out)` | 3.70 us | 3.70 us | flat | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > push add open issue (passes filter)` | 4.10 us | 4.14 us | 0.9% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > fetch 1000 issues -> 20 users` | 1.26 ms | 1.04 ms | 1.20x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push add/remove issue with owner` | 6.95 us | 6.26 us | 1.11x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push edit issue title (non-key field)` | 6.04 us | 6.01 us | flat | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 1 key` | 151.13 us | 147.81 us | 1.02x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 2 keys` | 150.40 us | 147.54 us | 1.02x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 4 keys` | 150.81 us | 147.67 us | 1.02x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 1 key` | 3.77 us | 3.70 us | 1.02x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 2 keys` | 3.65 us | 3.68 us | 0.6% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 4 keys` | 3.67 us | 3.67 us | flat | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 1 key` | 5.59 us | 5.73 us | 2.5% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 2 keys` | 5.54 us | 5.71 us | 2.9% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 4 keys` | 5.54 us | 5.73 us | 3.4% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(mixed: string/number/bool/null)` | 31.62 ns | 31.89 ns | 0.8% slower | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(number, number)` | 184.31 ns | 181.58 ns | 1.01x faster | +| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(string, string)` | 275.83 ns | 273.46 ns | 1.01x faster | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 1 exists: track.exists(album)` | 39.67 us | 39.49 us | flat | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 10 exists (AND)` | 3.90 us | 3.93 us | 0.8% slower | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 10 exists (OR)` | 148.23 us | 149.23 us | 0.7% slower | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 exists (AND)` | 4.44 us | 4.51 us | 1.6% slower | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 exists (OR)` | 177.75 us | 177.29 us | flat | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 level nesting` | 190.67 us | 192.33 us | 0.9% slower | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 2 exists (AND): track.exists(album).exists(genre)` | 112.71 us | 113.21 us | flat | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 3 exists (AND)` | 290.42 us | 290.83 us | flat | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 3 exists (OR)` | 558.14 us | 551.50 us | 1.01x faster | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 5 exists (AND)` | 1.84 ms | 1.82 ms | 1.01x faster | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 5 exists (OR)` | 3.81 ms | 3.71 ms | 1.03x faster | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested 2 levels: track > album > artist` | 127.48 us | 126.38 us | 1.01x faster | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested 4 levels: playlist > tracks > album > artist` | 782.15 us | 782.95 us | flat | +| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested with filters: track > album > artist (filtered)` | 156.35 us | 157.69 us | 0.8% slower | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > playlist.exists(tracks) > planned: playlist.exists(tracks)` | 815.11 us | 828.32 us | 1.6% slower | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > playlist.exists(tracks) > unplanned: playlist.exists(tracks)` | 821.38 us | 823.16 us | flat | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > planned: track.exists(album) OR exists(genre)` | 3.42 ms | 3.16 ms | 1.08x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > unplanned: track.exists(album) OR exists(genre)` | 12.70 ms | 12.62 ms | 1.01x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > planned: track.exists(album) where title="Big Ones"` | 79.71 us | 69.21 us | 1.15x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > unplanned: track.exists(album) where title="Big Ones"` | 10.28 ms | 10.14 ms | 1.01x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) > planned: track.exists(album).exists(genre)` | 13.50 ms | 13.38 ms | 1.01x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) > unplanned: track.exists(album).exists(genre)` | 13.45 ms | 13.11 ms | 1.03x faster | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) with filters > planned: track.exists(album).exists(genre) with filters` | 103.33 us | 3.88 ms | 97.3% slower | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) with filters > unplanned: track.exists(album).exists(genre) with filters` | 10.61 ms | 10.61 ms | flat | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(playlists) > planned: track.exists(playlists)` | 151.77 ms | 151.82 ms | flat | +| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(playlists) > unplanned: track.exists(playlists)` | 151.24 ms | 153.74 ms | 1.6% slower | +| pg | `zero-cache:pg > change-streamer/storer single transaction changes` | 60.60 us | 35.10 us | 1.73x faster | +| pg | `zero-cache:pg > change-streamer/storer sustained stream changes` | 63.56 us | 34.16 us | 1.86x faster | +| pg | `zero-cache:pg > change-streamer/storer sustained stream commits` | 63.56 ms | 34.16 ms | 1.86x faster | +| pg | `zero-cache:pg > replicator/logical replication end-to-end rows` | 114.67 us | 113.59 us | 1.01x faster | +| pg | `zero-cache:pg > zero-cache/initial-sync generated fixture rows` | 6.17 us | 5.75 us | 1.07x faster | + +## 1.7-Only Root Benchmark Rows + +These benchmark names existed only in the 1.7 benchmark set used for this comparison, so they were not part of the matched-row calculations. + +| Benchmark | +| ----------------------------------------------------------------------------------------------------------------------------------------: | +| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: add comment (child) into heavy view` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: add issue into heavy view` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: edit issue title in heavy view` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: heavy query (wide + deep) - regression case` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: heavy query limit(50)` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues + comments (wide, one level)` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues + comments + emoji (wide, two levels)` | +| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues only (baseline)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 1 edit(s)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 100 edit(s)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 1000 edit(s)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 1 edit(s)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 100 edit(s)` | +| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 1000 edit(s)` | + +## Blocked Or Excluded + +`replicache:bench` was excluded because it did not complete within 2 hours after temp-only harness fixes. It first required Playwright Chromium installation, then exposed existing harness/runtime issues, and finally exceeded the timeout. + +## Final Recommendation + +Do not block Zero 1.7 on the benchmark results collected so far. Track the small Chinook push regressions as a follow-up, but the release-relevant result is that 1.7 is broadly flat, materially faster in Postgres replication/storage paths, and does not have a confirmed large regression after the planner benchmark fixture fix. diff --git a/components/BenchmarkComparisonChart.tsx b/components/BenchmarkComparisonChart.tsx new file mode 100644 index 00000000..74fbc1ad --- /dev/null +++ b/components/BenchmarkComparisonChart.tsx @@ -0,0 +1,187 @@ +'use client'; + +import {cn} from '@/lib/utils'; +import { + Bar, + BarChart, + CartesianGrid, + Legend, + Rectangle, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, + type BarShapeProps, + type TooltipContentProps, +} from 'recharts'; + +type BenchmarkDatum = { + name: string; + fullName?: string; + current: number; +}; + +type BenchmarkComparisonChartProps = { + title?: string; + description?: string; + data: BenchmarkDatum[]; + previousLabel?: string; + currentLabel?: string; + precision?: number; + height?: number; + className?: string; +}; + +function formatValue(value: unknown, precision: number) { + if (typeof value !== 'number' || !Number.isFinite(value)) { + return String(value); + } + + return `${value.toLocaleString(undefined, { + minimumFractionDigits: precision, + maximumFractionDigits: precision, + })}x`; +} + +function formatBenchmarkResult(point: BenchmarkDatum, precision: number) { + if (!Number.isFinite(point.current) || point.current <= 0) { + return formatValue(point.current, precision); + } + + if (point.current === 1) { + return 'flat'; + } + + const result = point.current > 1 ? point.current : 1 / point.current; + return `${formatValue(result, precision)} ${point.current > 1 ? 'faster' : 'slower'}`; +} + +export function BenchmarkComparisonChart({ + title, + description, + data, + previousLabel = 'Previous', + currentLabel = 'Current', + precision = 2, + height = 300, + className, +}: BenchmarkComparisonChartProps) { + const format = (value: unknown) => formatValue(value, precision); + const chartData = data.map(point => ({...point, previous: 1})); + const minChartWidth = 450; + const chartHeight = Math.max(height, data.length * 54 + 76); + const currentBarFill = (point: BenchmarkDatum | undefined) => + point && point.current < 1 + ? 'hsl(var(--destructive))' + : 'hsl(var(--primary-highlight))'; + const renderCurrentBar = (props: BarShapeProps) => { + const {payload, ...rectangleProps} = props; + const point = payload as BenchmarkDatum | undefined; + + return ( + + ); + }; + const renderTooltip = ({active, payload}: TooltipContentProps) => { + if (!active) return null; + + const point = payload?.[0]?.payload as BenchmarkDatum | undefined; + if (!point) return null; + + return ( +
+
+ {point.fullName ?? point.name} +
+
+ {formatBenchmarkResult(point, precision)} +
+
+ ); + }; + + return ( +
+ {(title || description) && ( +
+ {title && ( +

+ {title} +

+ )} + {description && ( +

+ {description} +

+ )} +
+ )} + +
+
+ + + + + + + ( + + {value} + + )} + height={30} + iconType="rect" + verticalAlign="top" + wrapperStyle={{fontSize: 11}} + /> + + + + +
+
+
+ ); +} diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx index 7fb1a9c9..2c450d8f 100644 --- a/contents/docs/release-notes/1.7.mdx +++ b/contents/docs/release-notes/1.7.mdx @@ -21,15 +21,171 @@ Zero 1.7 focuses on query correctness, performance, and operational safety. It i ## Performance -Zero 1.7 is broadly performance-neutral with Zero 1.6 across client and query-engine workloads, with most benchmarks staying within +/-5%. +Zero 1.7 is a targeted performance win. It makes several important hot paths faster in real applications: keeping up with busy Postgres databases, running relationship-heavy queries, and analyzing queries. -The clearest improvements are in replication and storage, especially when Zero is processing changes from Postgres: +### Postgres Change Processing -| What improved | Result | -| -------------------------------------------------- | -----------: | -| Processing a continuous stream of Postgres changes | 1.86x faster | -| Processing transactions that change many rows | 1.73x faster | -| Copying rows into Zero during initial sync | 1.07x faster | +Zero 1.7 makes the replication path noticeably faster: change streams process about **1.7x-1.9x faster** than 1.6. Initial sync is also modestly faster. + + + +### Flipped Joins + +Flipped joins help relationship and existence queries avoid work that used to scale poorly as result sets grew. In Zero 1.7, direct flipped-join batching is roughly **3x faster**, and large merge-shaped ZQL queries improve dramatically, reaching **109x faster** at 10,000 rows. + + + + + +### Query Analysis and Logging + +Zero 1.7 also removes overhead from `analyze-query` and the inspector. Query analysis tools that record many vended rows avoid the old O(N²) cost, making `Debug.rowVended` up to **3,241x faster**. Logger context allocation is also **1.32x-1.59x faster**, reducing overhead in logging-heavy code paths. + + + + ## Fixes diff --git a/lib/mdx.ts b/lib/mdx.ts index 6cdcd356..8db624b6 100644 --- a/lib/mdx.ts +++ b/lib/mdx.ts @@ -10,6 +10,7 @@ import remarkGfm from 'remark-gfm'; import {page_routes} from './routes-config'; // Custom components for MDX import CodeGroup from '@/components/CodeGroup'; +import {BenchmarkComparisonChart} from '@/components/BenchmarkComparisonChart'; import { InstallTableNameInput, InstallTableNameReplace, @@ -31,6 +32,7 @@ const components = { ImageLightbox, Video, Button, + BenchmarkComparisonChart, CodeGroup, StartingPointCards, InstallTableNameInput, diff --git a/package.json b/package.json index ec1f92df..a49d14bf 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "react-hotkeys-hook": "^5.1.0", + "recharts": "^3.9.0", "rehype-autolink-headings": "^7.1.0", "rehype-code-titles": "^1.2.0", "rehype-pretty-code": "^0.14.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bceef390..8f557e35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,6 +98,9 @@ importers: react-hotkeys-hook: specifier: ^5.1.0 version: 5.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + recharts: + specifier: ^3.9.0 + version: 3.9.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1) rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -1887,6 +1890,17 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@reduxjs/toolkit@2.12.0': + resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + '@resvg/resvg-wasm@2.4.0': resolution: {integrity: sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==} engines: {node: '>= 10'} @@ -1904,6 +1918,7 @@ packages: '@rocicorp/resolver@1.0.2': resolution: {integrity: sha512-TfjMTQp9cNNqNtHFfa+XHEGdA7NnmDRu+ZJH4YF3dso0Xk/b9DMhg/sl+b6CR4ThFZArXXDsG1j8Mwl34wcOZQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + deprecated: Use Promise.withResolvers instead '@rocicorp/zero-sqlite3@1.0.18': resolution: {integrity: sha512-JwHcCijxKj94NDij5UDCJsGHo/D8z4j5De/5zphQ+NctQ4TWr9Zx7L+Q1JBfie4ewVS82Ingu+QKbIwWvdNFXg==} @@ -2064,6 +2079,9 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -2102,6 +2120,33 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -2173,6 +2218,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@typescript-eslint/eslint-plugin@8.59.3': resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2883,6 +2931,50 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -2931,6 +3023,9 @@ packages: supports-color: optional: true + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} @@ -3081,6 +3176,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + esast-util-from-estree@2.0.0: resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} @@ -3614,6 +3712,12 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + + immer@11.1.8: + resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -3639,6 +3743,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + ipaddr.js@2.4.0: resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} @@ -4735,6 +4843,18 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-redux@9.3.0: + resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -4797,6 +4917,14 @@ packages: real-require@1.0.0: resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + recharts@3.9.0: + resolution: {integrity: sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -4811,6 +4939,14 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4885,6 +5021,9 @@ packages: resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5271,6 +5410,9 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -5479,6 +5621,11 @@ packages: '@types/react': optional: true + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + useragent@2.3.0: resolution: {integrity: sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==} @@ -5521,6 +5668,9 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + victory-vendor@37.3.6: + resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} + vite@8.0.13: resolution: {integrity: sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7439,6 +7589,18 @@ snapshots: '@radix-ui/rect@1.1.1': {} + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6)': + dependencies: + '@standard-schema/spec': 1.1.0 + '@standard-schema/utils': 0.3.0 + immer: 11.1.8 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.2.0 + optionalDependencies: + react: 19.2.6 + react-redux: 9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) + '@resvg/resvg-wasm@2.4.0': {} '@rocicorp/lock@1.0.4': @@ -7629,6 +7791,8 @@ snapshots: '@standard-schema/spec@1.1.0': {} + '@standard-schema/utils@0.3.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -7670,6 +7834,30 @@ snapshots: dependencies: '@types/node': 24.12.4 + '@types/d3-array@3.2.2': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -7748,6 +7936,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/use-sync-external-store@0.0.6': {} + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8485,6 +8675,44 @@ snapshots: csstype@3.2.3: {} + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + damerau-levenshtein@1.0.8: {} dashdash@1.14.1: @@ -8523,6 +8751,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js-light@2.5.1: {} + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -8731,6 +8961,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es-toolkit@1.49.0: {} + esast-util-from-estree@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -9458,6 +9690,10 @@ snapshots: ignore@7.0.5: {} + immer@10.2.0: {} + + immer@11.1.8: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -9484,6 +9720,8 @@ snapshots: hasown: 2.0.3 side-channel: 1.1.0 + internmap@2.0.3: {} + ipaddr.js@2.4.0: {} is-alphabetical@2.0.1: {} @@ -10814,6 +11052,15 @@ snapshots: react-is@16.13.1: {} + react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.6 + react: 19.2.6 + use-sync-external-store: 1.6.0(react@19.2.6) + optionalDependencies: + '@types/react': 19.2.14 + redux: 5.0.1 + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.6): dependencies: react: 19.2.6 @@ -10880,6 +11127,26 @@ snapshots: real-require@1.0.0: {} + recharts@3.9.0(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react-is@16.13.1)(react@19.2.6)(redux@5.0.1): + dependencies: + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1))(react@19.2.6) + clsx: 2.1.1 + decimal.js-light: 2.5.1 + es-toolkit: 1.49.0 + eventemitter3: 5.0.4 + immer: 10.2.0 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-is: 16.13.1 + react-redux: 9.3.0(@types/react@19.2.14)(react@19.2.6)(redux@5.0.1) + reselect: 5.2.0 + tiny-invariant: 1.3.3 + use-sync-external-store: 1.6.0(react@19.2.6) + victory-vendor: 37.3.6 + transitivePeerDependencies: + - '@types/react' + - redux + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.9 @@ -10909,6 +11176,12 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@5.0.1: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.9 @@ -11068,6 +11341,8 @@ snapshots: transitivePeerDependencies: - supports-color + reselect@5.2.0: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -11579,6 +11854,8 @@ snapshots: tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} tinyexec@1.1.2: {} @@ -11837,6 +12114,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + use-sync-external-store@1.6.0(react@19.2.6): + dependencies: + react: 19.2.6 + useragent@2.3.0: dependencies: lru-cache: 4.1.5 @@ -11889,6 +12170,23 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 + victory-vendor@37.3.6: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + vite@8.0.13(@types/node@24.12.4)(esbuild@0.28.0)(jiti@1.21.7)(tsx@4.22.1)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 From 773f787ade132e1a513ec6efc98e9ffaad214ff3 Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Sat, 27 Jun 2026 17:11:36 -0700 Subject: [PATCH 6/9] chore: fixup --- contents/docs/release-notes/1.7.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx index 2c450d8f..88b0b7c6 100644 --- a/contents/docs/release-notes/1.7.mdx +++ b/contents/docs/release-notes/1.7.mdx @@ -27,6 +27,8 @@ Zero 1.7 is a targeted performance win. It makes several important hot paths fas Zero 1.7 makes the replication path noticeably faster: change streams process about **1.7x-1.9x faster** than 1.6. Initial sync is also modestly faster. +We have seen customer workloads max sustainable replication throughput increase from ~750 writes/second to ~2500. + Date: Sat, 27 Jun 2026 23:42:17 -1000 Subject: [PATCH 7/9] Simplify writing of release notes --- contents/docs/release-notes/1.7.mdx | 112 ++++++++-------------------- 1 file changed, 30 insertions(+), 82 deletions(-) diff --git a/contents/docs/release-notes/1.7.mdx b/contents/docs/release-notes/1.7.mdx index 88b0b7c6..ee35e9f1 100644 --- a/contents/docs/release-notes/1.7.mdx +++ b/contents/docs/release-notes/1.7.mdx @@ -11,7 +11,7 @@ npm install @rocicorp/zero@1.7 ## Overview -Zero 1.7 focuses on query correctness, performance, and operational safety. It improves consistency with different encodings across Postgres, the SQLite replica, and the in-memory JS query engine, as well as performance improvements under load. +Zero 1.7 includes improvements to query correctness, performance, and operational safety. ## Features @@ -21,17 +21,17 @@ Zero 1.7 focuses on query correctness, performance, and operational safety. It i ## Performance -Zero 1.7 is a targeted performance win. It makes several important hot paths faster in real applications: keeping up with busy Postgres databases, running relationship-heavy queries, and analyzing queries. +Zero 1.7 improves the performance of replication and `exists` queries. -### Postgres Change Processing +### Replication -Zero 1.7 makes the replication path noticeably faster: change streams process about **1.7x-1.9x faster** than 1.6. Initial sync is also modestly faster. +Replication in Zero 1.7 is about **1.8x faster** than Zero 1.6 in benchmarks. Initial sync is also modestly faster. -We have seen customer workloads max sustainable replication throughput increase from ~750 writes/second to ~2500. +In real-world workloads we saw better results. One customer workload on Cloud Zero saw max sustainable replication increase from ~750 writes/second to ~2500 (> 3x faster). -### Flipped Joins +### Flipped Exists Queries -Flipped joins help relationship and existence queries avoid work that used to scale poorly as result sets grew. In Zero 1.7, direct flipped-join batching is roughly **3x faster**, and large merge-shaped ZQL queries improve dramatically, reaching **109x faster** at 10,000 rows. +In a query like `doc.where("id", id).whereExists('comment').limit(10)`, the order that tables are considered matters for performance. If there are only a few child rows per parent, it's much faster to find children first, then find the corresponding parents, then sort and limit. Zero does this automatically using a process called _[join flipping](/docs/zql#manually-flipping-joins)_. - +Flipped joins are very common since `exists` is used in permissions, and in many systems each user has access to only a small subset of total rows. + +These kinds of queries got faster in Zero 1.7. In simple cases where each child has a unique parent (e.g., `doc -> comment`), Zero 1.7 is roughly 3x faster. In cases where each child has multiple parents (e.g., `user -> doc_acl`), Zero 1.7 is dramatically faster – reaching ~100x faster at 10k results. -### Query Analysis and Logging - -Zero 1.7 also removes overhead from `analyze-query` and the inspector. Query analysis tools that record many vended rows avoid the old O(N²) cost, making `Debug.rowVended` up to **3,241x faster**. Logger context allocation is also **1.32x-1.59x faster**, reducing overhead in logging-heavy code paths. - - - @@ -203,6 +149,8 @@ Zero 1.7 also removes overhead from `analyze-query` and the inspector. Query ana - [SQLite replica `ILIKE` did not match non-ASCII case variants such as `MÜLLER` and `müller`.](https://github.com/rocicorp/mono/pull/6098) - [Litestream-backed deployments could purge change-log entries based on stale claimed backup progress rather than actual backup state.](https://github.com/rocicorp/mono/pull/6110) [#6123](https://github.com/rocicorp/mono/pull/6123) - [Query hydration and pipeline failures now include the query hash, transformation hash, and custom query name when available.](https://github.com/rocicorp/mono/pull/6128) +- ["vended rows" inspector feature was slow for large numbers of rows](https://github.com/rocicorp/mono/pull/5991) +- [Logging code created gc pressure throughout system](https://github.com/rocicorp/mono/pull/6125) ## Breaking Changes From c43826937ef8a6d4745a26dbf45ad390afed7acf Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Mon, 29 Jun 2026 17:10:20 -0700 Subject: [PATCH 8/9] chore: update Zero to 1.7.0 --- package.json | 2 +- pnpm-lock.yaml | 1065 ++++++++++++++++++++++++------------------- pnpm-workspace.yaml | 7 +- 3 files changed, 589 insertions(+), 485 deletions(-) diff --git a/package.json b/package.json index a49d14bf..1c165248 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.7", - "@rocicorp/zero": "^0.25.3", + "@rocicorp/zero": "1.7.0", "@shikijs/rehype": "^3.20.0", "@shikijs/twoslash": "^3.20.0", "@vercel/og": "^0.8.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f557e35..f5d95622 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: ^1.2.7 version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@rocicorp/zero': - specifier: ^0.25.3 - version: 0.25.13(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)) + specifier: 1.7.0 + version: 1.7.0(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(react@19.2.6) '@shikijs/rehype': specifier: ^3.20.0 version: 3.23.0 @@ -809,27 +809,23 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@opentelemetry/api-logs@0.203.0': - resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.217.0': - resolution: {integrity: sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==} + '@opentelemetry/api-logs@0.218.0': + resolution: {integrity: sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==} engines: {node: '>=8.0.0'} '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/auto-instrumentations-node@0.75.0': - resolution: {integrity: sha512-gu//UwgQo8DexE/g1+wDUHhHV5gvRku5rbA8EsubHSDXWPGDcdNy4wktDQ9wyX0EDdP80BRiRaSYLIPFKo2DQw==} + '@opentelemetry/auto-instrumentations-node@0.76.0': + resolution: {integrity: sha512-44KWgqsMuqfV4UhOcwwnDeK8CpB5LT1MmpZj6sKXFXu2q6rjKo622pWgOgn5Ntp5Qal9q1uBX2VS8mvTpsMeyw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.4.1 '@opentelemetry/core': ^2.0.0 - '@opentelemetry/configuration@0.217.0': - resolution: {integrity: sha512-xCtrYOhBqdy6ZOMfe0Oa73ZKF+2LMhoOv4L5vmwAHVvOXUg+V3fvKuEIr9ZyD0Ow+vxllEjWO6PV1wd0DOtyvw==} + '@opentelemetry/configuration@0.218.0': + resolution: {integrity: sha512-W8wIz7H2R1pufR5jfjb3gU2XkMpm2x/7b1RJcsuzvd70Il/rWWE+g5/Od7hQKrxRTSrTrOWlru101PWXz5I1EQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -840,80 +836,68 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.0.1': - resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.7.1': resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-logs-otlp-grpc@0.217.0': - resolution: {integrity: sha512-vC5S0Dc+noxD86CVtNu1+awCHPA5Kewi1Sg23ps+9lh4YifwsKXh3pe4XTNEKtUJiAcjpJ5dqStGakLbrSE+YQ==} + '@opentelemetry/exporter-logs-otlp-grpc@0.218.0': + resolution: {integrity: sha512-hoxrNH1l/Xy6F9WTJ5IK+6j1r9nQFlPOmrnTlhYHTySdunfXLmUCPv3bQtKYntxag9h3wLYBZQ2HI6FOx+BT2g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-http@0.217.0': - resolution: {integrity: sha512-KfLAdt1uilVE+3FxbgVnp2ZrzqbIawzcesnRoi+Kh9ckB5Ld5D8btUgoBvwTbdmuNx1j6b132Wsh72azq+pPNQ==} + '@opentelemetry/exporter-logs-otlp-http@0.218.0': + resolution: {integrity: sha512-Qx+4rpVHzgg89dawcWRHyt+XRXeLnhFz/qBtvggmjkcgPUdr+NAB0/u/eIPA8yAeJV0J80Vz43JZCh/XFvZFGw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-proto@0.217.0': - resolution: {integrity: sha512-Se0GG/ZO24mQTlQj7zprR4pNI0nKe4lPDPBsuJmi6508b9TlZEuUd3EfyuHk6oJxzL7fGyDFYAbxNigQvRP2ZQ==} + '@opentelemetry/exporter-logs-otlp-proto@0.218.0': + resolution: {integrity: sha512-1/noQNsp9gXD75HPzgjBrcF1+XTtry7pFAUfxVEJgg7mPv2AawKQuYkhMmJ8qjxz4Ubc3Y8bwvfxevXsKTq4cg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-grpc@0.217.0': - resolution: {integrity: sha512-0GpJKnCoVaVA1rKBMVPHziznfOQlXgH72S9ktjBAF1AnAVPzX7vVEBGrhwiSxxHDAiefXk+J8znApsMb/K6Z3w==} + '@opentelemetry/exporter-metrics-otlp-grpc@0.218.0': + resolution: {integrity: sha512-YapQ9vNMX0NSZF6LK5pWAFfjpJleV2O9uYWfYGeb/5F1Kb9rPGK8tZDMJFa/sOksgdFuflDvYuA0B4qjDB4fjQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.203.0': - resolution: {integrity: sha512-HFSW10y8lY6BTZecGNpV3GpoSy7eaO0Z6GATwZasnT4bEsILp8UJXNG5OmEsz4SdwCSYvyCbTJdNbZP3/8LGCQ==} + '@opentelemetry/exporter-metrics-otlp-http@0.218.0': + resolution: {integrity: sha512-bV7d2OuMpZu2+gAaxUAhzfZ0h3WVZk8ETQUEE3DNSntbTaMpuITjtm8I0rNyHFdm7Ax57K6ty7SgFXlBmOLIvQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.217.0': - resolution: {integrity: sha512-1zkMzzhiNJdVmLxuwkltqWGw4fOOam47bqRxmuQNjyKJe/9NmY5cIrZ4kiQV7sVGxoOgT0ZvGUfLcjvtpC/b9Q==} + '@opentelemetry/exporter-metrics-otlp-proto@0.218.0': + resolution: {integrity: sha512-ubLddKjWULhla9YZRCj/rTBeppjJYE4e9w0icx5mTu3eFhWjQzbV75NYjXuIlEG+NJsBl6d+sTFw5Qu+oej4oQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-proto@0.217.0': - resolution: {integrity: sha512-nfxt/KxVGFkjkO/M+58y1ugHu/dwPtxG4eYq0KApcQ7xk5CHzhdn+IuLZfDSvNDrJ3Uy5q++Fj/wbK7i8yryfQ==} + '@opentelemetry/exporter-prometheus@0.218.0': + resolution: {integrity: sha512-RT5oEyu1kddZJ1vt7/BUo5wV+P7hpNAESsR3dUd3+8deHuX7gWNoCOZn+SfDT+hJHlIJ5h/AxiCLXIrutswDJg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-prometheus@0.217.0': - resolution: {integrity: sha512-U9MCXxJu0sBCh5aEkylYRR4xVIL8D1CW6dGwvYXbfFr0qveSorfD0XJchCAWoW6QfAAIcY/yxjf4Dj8OgkHBPw==} + '@opentelemetry/exporter-trace-otlp-grpc@0.218.0': + resolution: {integrity: sha512-3fXxVQEj9TNAFaCi79JeFKfeLd0sDtInaR3gaZDVlzNSPHtz8PZuCV34JKWjD4XXzT20IdMe8IpX6mRVNDA4Tw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.217.0': - resolution: {integrity: sha512-fPZs2fw7veLH3pEKu8vSepUa2fQpAE2P7al6qU10aH9GrEJJ8YaPgsd5xON7by5rbcEVS71FOU2aWyK6nzB7VQ==} + '@opentelemetry/exporter-trace-otlp-http@0.218.0': + resolution: {integrity: sha512-8dqezsmPhtKitIK/eTipZhYl9EX2/gNQ5zUMhaz3uxEURwfkNf8IPvo6yNfrzbxdtpAOybS/+h7wmIWYqFSpiw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-http@0.217.0': - resolution: {integrity: sha512-38YQoqtYjglz2GV94LGUN/djLvxtvGIQO68o6qAFPVshjmwSdX1F2i0c7vn3lEl1L5B/YqjB/bgKXaVx7KO+RQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/exporter-trace-otlp-proto@0.217.0': - resolution: {integrity: sha512-nPV8gKHUiSuTZpQcnZU3/pBlK7crSyEGpZuh5MtWySB0vv6NNG0QvvfKitQt+Fc2Mc6qfyU54KlZcurwoTbrVg==} + '@opentelemetry/exporter-trace-otlp-proto@0.218.0': + resolution: {integrity: sha512-r1Msf8SNLRmwh9J6XQ5uh82D7CdDWMNHnPB7LAVHjzut0TkSeKc5KcIvr4SvHvfk/xwN5gxC+VLKQ1k0o8PSPw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -924,278 +908,266 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/instrumentation-amqplib@0.64.0': - resolution: {integrity: sha512-yiTkjF7bSGp25UmhIYqKkbxyxDDD8w3fFf0KHkpc0m+8DsEXqmuu5a5buERSoeoT7wGgUSCuFcsm+BwlKetK4w==} + '@opentelemetry/instrumentation-amqplib@0.65.0': + resolution: {integrity: sha512-fF7fNHA59n3y23ROfst2EbSxmP+L3E+snZO6aMU4w4xD84mfejAivspIAsqa9arX5HZlBK6dslHz5dWGNp5D0A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-aws-lambda@0.69.0': - resolution: {integrity: sha512-LhICbZcZZFXSIaSb1xztg6vU4oaSl1e87oc7NfWGzcsUx4EBqeteMXWRQNRvWMVu0p2HGl085oBoPOX93RJl1Q==} + '@opentelemetry/instrumentation-aws-lambda@0.70.0': + resolution: {integrity: sha512-HT74cQxi/iiVEz5dRdNdfGCFzPFbkxSiwHfFPHDwkRcr1JKQqI6hm8qeXEvEiJ+36xIU1KkQMDfeThJ1ifnUiA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-aws-sdk@0.72.0': - resolution: {integrity: sha512-E274IgU5FWknUEu4KYh1pF5jZTRHyrZcoRE8z2BMQZ1ywgE0cldi8hIGcmSbS+0yKynHCxigpr4iYowaJFWs0w==} + '@opentelemetry/instrumentation-aws-sdk@0.73.0': + resolution: {integrity: sha512-0INPkHbR6o4J3psE+ncwWaE7qtDpb2p+i+qfV82cfwYLCXavYCGosBZ/S4pOErDVJYIyQVIsNAHhaUgaL313SQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-bunyan@0.62.0': - resolution: {integrity: sha512-4PjSfgyzKzhnnczUkbh8ogDclQqInBsSK0J3BQX4wRueK7cCGUyQghLQYqPW1TbzrXUfM0kNtrnu1D5Xbk3LEA==} + '@opentelemetry/instrumentation-bunyan@0.63.0': + resolution: {integrity: sha512-z0xPSZ62d3I7sG2sUTyQ5/ES1RdESP2eOETiMLY9gPSp+HZwbsAyj7T/2sdZKYD+O2ajRHZEil+DBoUolf1ocQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-cassandra-driver@0.62.0': - resolution: {integrity: sha512-IdnVAJs4pJhJl5/fOey6hM7KTBjUBKRMtljdbSYTVmVkxQ35y1kTfq4EygxakUPYjcbG7JM6YV/Qy8NlX5vSCA==} + '@opentelemetry/instrumentation-cassandra-driver@0.63.0': + resolution: {integrity: sha512-jnVTOr3h/46UDalEwJ4ITux8UWwHmnsOik5WFs3JB/UrUj8Wad5eI+KpOEBuOUeOfPB9sce11qgVw3WXU2r+hg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-connect@0.60.0': - resolution: {integrity: sha512-55YFP5ae2tuivf2EENGVN+woYHmGZdmcU1BVCyMZQ0BRJCNLJ35+ouJSUKlMmF/zTv1gvdFXkTuC7c3/E3HRoQ==} + '@opentelemetry/instrumentation-connect@0.61.0': + resolution: {integrity: sha512-ZTQ0W3Lb7GJsOd+72cG8FJQKA5DqYfELJGLmChrJIezRSLfJIfofwKEGLX5rMtFJmwckpichQkBZWjid5dvnVQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-cucumber@0.33.0': - resolution: {integrity: sha512-9J1kBYXK6VZC0GDVCU8yGfWVM89WuYQCNORWI6JxuKcynGRSXHufHZ5NV2xpWlK5MsscAl9Ww5uTFRS37wNJew==} + '@opentelemetry/instrumentation-cucumber@0.34.0': + resolution: {integrity: sha512-VK63Cm8osAdsSZpULPk+qnNktQUJzmnIOv2wuh79fV41WuTM38uOFC3s978/24pDkSljhN4EYCbPRLrAhXfKSA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/instrumentation-dataloader@0.34.0': - resolution: {integrity: sha512-Pq49BecX5HE5betSxutz/wtWIIZTgrPO32ZSxEk6nYJ1H/LWkQAsR/fSd2LZ2fdw2kLbkqCnw2rjOB5T9yESNw==} + '@opentelemetry/instrumentation-dataloader@0.35.0': + resolution: {integrity: sha512-6x6UPP0tLzrdj15PIEN3qgp/WCcESCavHJfkIKoyLmy4UjGLF1KgEUMyD74xhbKGo426uvMbhvCgZC0ye8nO/A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-dns@0.60.0': - resolution: {integrity: sha512-UQ8ocJMLHWtZ6u+Y5JusHrYkFJnm2/S7+de1nbhrMyDyz8TV+HMBQ0cTWt6Wl9UkR5ad8mMql98xke0ysVVBRg==} + '@opentelemetry/instrumentation-dns@0.61.0': + resolution: {integrity: sha512-5D8xFaw9GXq9ZIOAvG7NPDivFfZWFAekLGFn1B7ppyhuAYBVHGybFpx4Q9BV1Uup3yzCdiD78KhyH7c3dKOYSw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-express@0.65.0': - resolution: {integrity: sha512-Z22sVuMYUKGnEFO1ovlC4iKQubSKv8AlP8NxvYHM3hlD023GaC6YV5WW4fapGyvIDUnN++Cll3ZjGT689T3YZQ==} + '@opentelemetry/instrumentation-express@0.66.0': + resolution: {integrity: sha512-G1xTh5M5shklMgIyUXWDjU2BakulKtcISaM4U5TyanvO7R4xbB3iC7YQ8QKegLXaOs81Ku8RlcIcbYRrz/82wQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fs@0.36.0': - resolution: {integrity: sha512-W7MhFtkZR4bnPi3GYivsH6RqwdtzTqkhZEJZ3YKuadncFhvNgEz6F/ZGkaNwuP/QbdcMhu9/lTDa+uJqzu4Mjg==} + '@opentelemetry/instrumentation-fs@0.37.0': + resolution: {integrity: sha512-5mxhFuwAK0FFvisUdvuywaZ9ySMZ15HfbN6IpLn0gwRh9s1/QBcpLznQ/A15cZs1QFtBJ+JXIHdwY7WOD0c4Eg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-generic-pool@0.60.0': - resolution: {integrity: sha512-W7NXzadxYr73yUuXQC7V/rfrzWGRhopeWiVXaNc6fZzq/ocTE4D+MZqunyC9vlbmY6GABofIuxxziesNtebMJQ==} + '@opentelemetry/instrumentation-generic-pool@0.61.0': + resolution: {integrity: sha512-tvp5PWnGRPHY/kz9Kg1IRLBL0qUAxMSNG623f+ZGEsvnCVEjr3tFyw1JGQzM+B3eZKkO+Dp/LYrtOSfb69D5lA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-graphql@0.65.0': - resolution: {integrity: sha512-Qj1R0+ltveYtXpUTI606O6mEKWqWPYv+9v5j6G8ypFf2sZHW9L4Z8NEuCxPufhIJhW6HsKGeEzP0B3QB8ZZntQ==} + '@opentelemetry/instrumentation-graphql@0.66.0': + resolution: {integrity: sha512-D4PN1tStj6rnOdofnt2xINJjtT1k2ockzaODrn76VEBZeqJ3QsEvKFfunB0EFAohO4xswVp14VAVmKNnGzA1Dw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-grpc@0.217.0': - resolution: {integrity: sha512-2kpvT5IueYstqiS5UsPu/fpRI6ae8166KdUbwLbZh8LN5YxWY3oWOy4ekjDPdJ/iqHQ9KFGY+NUjFMm78ODFNg==} + '@opentelemetry/instrumentation-grpc@0.218.0': + resolution: {integrity: sha512-kcDCNrC7IWNXEKQriGrwuh5jjbMFU5exOQzU9ufEY9UkACNcgYIdOd7XpX3IqZ3UPSnZyZtlwgfsbC5SNlEDbA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-hapi@0.63.0': - resolution: {integrity: sha512-8WlkrIkwtMP77PS7WXSwrPJY3yv1FUgDvNwje0KoZH8Dx7jxu5mEwn36fGnLCYkiUmJeMYhKydpShjY0XGs/8g==} + '@opentelemetry/instrumentation-hapi@0.64.0': + resolution: {integrity: sha512-PCHgCICCDz7p9BgCU9gQz2smbqu4V4P8QtWJ7DLjL3bmzSdrgy6EGvecDg1YuhjBsoN08SR+y36hgdHkqCgrzQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.217.0': - resolution: {integrity: sha512-B88Y7k5A9a60pHUboFoeJlgVwXq2T0rsZKj6dTwzSMKSOsNXR4Jz5ovwprVn3kHLAZrkyLEjQtBJ34DYHs1U4Q==} + '@opentelemetry/instrumentation-http@0.218.0': + resolution: {integrity: sha512-x9djaqdzpT8WAboep1H9nCAQ1E+MMsm08TNfA02TqM3bNNddZeiim+E3KMWVQFaX6JpUy7V0nm/wfN/K2Em+Zw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-ioredis@0.65.0': - resolution: {integrity: sha512-ZOy2m2JRTAsxA3Y02j0QsDm976PF8wA5LdjfbIrSWgACekJEt28uKFXoAc/ufqyVGvgsGACN/A8V92usset2qA==} + '@opentelemetry/instrumentation-ioredis@0.66.0': + resolution: {integrity: sha512-UfTAcaBKCzLUZ9opvfOLV4bH46XiNFqUsKykfPCIefDIxJ1iUYtMOucNaiZ+/kjQdPy5i6Ef5tk2IAjxol4X1w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-kafkajs@0.26.0': - resolution: {integrity: sha512-tukLaQ1bHYc3exhjEydkOdy2n4nklTOYN+vhJT2GgL19FZtz3Z9sdnslTsaoiBq5mXQII6nP9O+0wLIEimIK/g==} + '@opentelemetry/instrumentation-kafkajs@0.27.0': + resolution: {integrity: sha512-kl/C2AU4KZGHlMZD12nMFXcMjxSHvu5Q0UPSQ6IJeBfCadYuWgW+sWIa2JZVK/A0qRYm2cncekJyeBHQDyfUUg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-knex@0.61.0': - resolution: {integrity: sha512-gpSLnEhkKS65okAmne1NKiwXXQ/7Zh8AhMP5eNIVJjacyso73fEnYFT6yOlRxUPF0eZbJAAGIVPGMTGjaPCF+A==} + '@opentelemetry/instrumentation-knex@0.62.0': + resolution: {integrity: sha512-XgfhCAWwSqA0YnwaEKdpvQMavc90D3R65frhLCO9JNl867EulNps9tm6pjGIg+GiYuewn00gEzW4HQ5btgYxGQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-koa@0.65.0': - resolution: {integrity: sha512-3GgDktABVRmu25LLtIiCE62gZ5qKAo8d2z4WoBS+roQK/SlbJw4i5IlGWuzeCz/y6XgSmKR3yguPCY8c5nvI7A==} + '@opentelemetry/instrumentation-koa@0.66.0': + resolution: {integrity: sha512-04x/z21WTMEfy3lUSr4aTj8WsTN3OZF901hJ+ciOwdwf7AK8UJTpZCXw6KQ3G4Vag56q1HoMihCONeWZLeld1g==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@opentelemetry/instrumentation-lru-memoizer@0.61.0': - resolution: {integrity: sha512-p2oA8PDPTUE0wxRpeGmkr7B8M0aL+zkcX3jv3Ce+Z9zjYaEyWfOxpPiXQjZIGn0WTIo1ZPvyQi+3ZYui+Nmzsw==} + '@opentelemetry/instrumentation-lru-memoizer@0.62.0': + resolution: {integrity: sha512-AlGKIdk6ZT7WmIozfUb2LjOcI3AhQrvAXKX0zi1cVcnw2QlRbVYyV5GTa2Th9ebuczVfWPaoPrmZw61zCp/czw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-memcached@0.60.0': - resolution: {integrity: sha512-CkaiOa+/PHip+GEqV6FVgWi9MSYh27piPdIdfPUi9qmierax++ZB+r+YqLnozx3xUz1SUVuIKPzKMkW3W4P6MA==} + '@opentelemetry/instrumentation-memcached@0.61.0': + resolution: {integrity: sha512-qiCR9Wovf5AHzn6g+LXhvwMmv2I6zhHz2I2tEHZMmBuD8c18bkJzGFxHoSBlxdApRT+SW13r9472dDMm4BRjgQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongodb@0.70.0': - resolution: {integrity: sha512-9DeBe6SiOkguL5uRyj20ma0I1lXgW0EYc9mUnABlMzbxYC3b7sczUFSj37eWaLzZNzTVQNr+U8UZZP2LvlZ+vw==} + '@opentelemetry/instrumentation-mongodb@0.71.0': + resolution: {integrity: sha512-6rwfVjAUY69CKkyGqzL+F5X7Nzw0+Ke9pOxk9xUPJpy8vracZxuQYF7rWu02sV1xOgi4u52449SuVhD+zaSiIA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mongoose@0.63.0': - resolution: {integrity: sha512-UsttKQ02fp+FlEw+fQLUVqXLzoxSBpqdzOpKM4DVY8Jy4/53skDnVVDODk9CyUAzD3WSmlglf3Cnl7T5awwV+A==} + '@opentelemetry/instrumentation-mongoose@0.64.0': + resolution: {integrity: sha512-iCIqeUaERN8Uc5Rrtg4zvQ6d7z5JQ5iUmbnr/JHYPxAidDowmRc8/wDMJeMKRfLPTj336Zu0ec7rH/ak/4N9vw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql2@0.63.0': - resolution: {integrity: sha512-tQ8K4PbDUNKoCmCXcUtugidGXGqefG60S6sYH7BcOMvHZ40e3+zzMxI1GbkIEypCYNrtYJqxcQZlMO9guxJcdw==} + '@opentelemetry/instrumentation-mysql2@0.64.0': + resolution: {integrity: sha512-yTu0mYh/qJPSE86VmNLQww5uugDyvCS2KJIPfPtIk2ufoEUoHPsV6Iynnvmz588Moq04aBLxfTa/EtE4A2ykWA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-mysql@0.63.0': - resolution: {integrity: sha512-IFzZiZtLgQEzK74OHT921n1ARRUyRWWe/5oa5nezuwQF4XzLEXIqTP+vthrZ4QJc1qIkRLgPROVDcjz20gEKew==} + '@opentelemetry/instrumentation-mysql@0.64.0': + resolution: {integrity: sha512-W1w76AJkP7i0uzzAe7nsCMWq4+EMSA550f1lAmxDPdQC5FnreNbRIm/tod2OS9gVrYvRrQXNkFmZJKGo4kzCnw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-nestjs-core@0.63.0': - resolution: {integrity: sha512-uw27m1wSx4AjC+9qfKHlY4IZDQxB9+YR42jJoS5wZcAzhTD95vW8JKIt8oqfcCMBlzTk7LBlaO0J7PTdAVTWkA==} + '@opentelemetry/instrumentation-nestjs-core@0.64.0': + resolution: {integrity: sha512-PW1ArxryMwF8/IXq1nzlQs7tmr/fWd1tf71AHevZT3Fm0hW7jRX9JEfYgIAcKDvmbqcJEr5K1224NEimrRPbuQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-net@0.61.0': - resolution: {integrity: sha512-F1wtphTiaHCuwyvX1j5iLi8CJf64mWdCfpUvVkZuOrJ1Z5xf52s/akBaV2Kt8xc1h5WGUlqWw0gglE0R3bt8Yg==} + '@opentelemetry/instrumentation-net@0.62.0': + resolution: {integrity: sha512-Gt2kzpACpmIad+q3LQqe8UNHuoVvdLuFpB6SN/A6xLPKNllb+ksPUYQhj1kXdZOpcFZNGKDXHyN+TUCVCk1TRw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-openai@0.15.0': - resolution: {integrity: sha512-K9hcKD+9bYhEHJr7jz7OywoQtFkEN4mztP+tAKeoNjoT+ksSbBBOOXg4kaHlX6CR8uzdaoOFPqX6OWRvulxejA==} + '@opentelemetry/instrumentation-openai@0.16.0': + resolution: {integrity: sha512-I0KKybyqqFOxSBgYKQNdR/EF3LvzSaAUT7Y75xkjbgscY+V8UWDpUbY68POLhUC3SKMlGvZmrTSxcQ+Y0vRhNw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-oracledb@0.42.0': - resolution: {integrity: sha512-xM+tRZjw/XucOJO3ZuEedzcsEr/cAGMEH8KendrGJxtYOrsarhHlfi1K2p+qGjD7Zvox0JSoRdmpDa5AAG6eyQ==} + '@opentelemetry/instrumentation-oracledb@0.43.0': + resolution: {integrity: sha512-7Z4kOOdnrHX4S5gCeWhnnpWQwEd7weRjDhJA1nSrwTYtAcVWNjk5wsMKHBCTDCN0uJtA9T6PouZ+AKRYiS1Rrg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pg@0.69.0': - resolution: {integrity: sha512-5tHz2AOyuYaWJePxybooIHPlV8v1EPBwrgFlfuuGXBV/EFnnQME+KEPJ9u9e3oe2aKd0gi8CEkTzZ61VwuWo5g==} + '@opentelemetry/instrumentation-pg@0.70.0': + resolution: {integrity: sha512-g8WXwwOUXfjiEmATwjB/33QKE2AkIpNe4KIuJJh4djtXgCL0Wne+AzAfjuDIAspGvO1txQp8ibKsLd3SBmcvJA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-pino@0.63.0': - resolution: {integrity: sha512-3OIHBN/bGKXgqeqNYnXb+eXJJx+MhXLzolNiFZR0eR7HUXv+rqj6P3J5LFFhrQzrTTD/huePTYidhJl87vLdow==} + '@opentelemetry/instrumentation-pino@0.64.0': + resolution: {integrity: sha512-+vDL7tZMZjkp8BpYMx/cL2/HWGsNUqKcRmAIIEaQu/6F44oM6xGDMCSqMKHdKCsH1+WW52EYdHbWkVGTF0KVsQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-redis@0.65.0': - resolution: {integrity: sha512-NwEhtBXwIKvcPSEGyYqjWaUZB1vfda1aVbEOTjhtBSbNDsxSXnGF1/xlwBB2yYZtLC4oYzlc9FRS7wX//X4LTg==} + '@opentelemetry/instrumentation-redis@0.66.0': + resolution: {integrity: sha512-bVShkag6vP2VQO0cpA8CHjOohWbKNYLyjiwGkOnSAwou1TPc6pf9DssFUxwqN2XF1J4oqP0LVSvN9kZUzMecfA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-restify@0.62.0': - resolution: {integrity: sha512-xovdX+JIByMII9T4kC1mLJ7Fi74ziN+A7fHtubVbrDNAlc05ViM1isHHoBe14vr3sOLYtME65FxIFdiLIOlfJg==} + '@opentelemetry/instrumentation-restify@0.63.0': + resolution: {integrity: sha512-Z73YxZpt0Y56uRu2pRWOjO5wXHvZqF46K4czoKRTGlUifzzFmUZxyOeAAECACuMRSLZmZ394WJin0MDgU9iW9w==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-router@0.61.0': - resolution: {integrity: sha512-eHDJ+tIponMkzTMcQSZenQME+U1Iq7BpIoV0a4jJhJYchDJ5ALHuA5SOJCMs7HXGI2GiF4DtFAOfuEFzt0lXVQ==} + '@opentelemetry/instrumentation-router@0.62.0': + resolution: {integrity: sha512-0w8ok7GbXtYvX7TtLp72qQJKNyI7lD72Fy2NsNKIcQAv6TqGox5javFyXrIrCAtZHCONePxeAwAYj1Qd9si9OQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-runtime-node@0.30.0': - resolution: {integrity: sha512-5vq3SB9Nwoqbzv6QAFhzStAeR2ejFmH5fMS9KLzBR5Dqu8sMMPbhEU3fnJwFJONio4edx5BoU+QpMQ/UjiP2tg==} + '@opentelemetry/instrumentation-runtime-node@0.31.0': + resolution: {integrity: sha512-HkLsuEfUDahFiL/xFtEqJDMp7sp8ynOtA045bJi9nAH8CrPvljPW5SgJQb2mQqEYJQopbWYZ2lPqQEfj7bYgJg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-socket.io@0.64.0': - resolution: {integrity: sha512-BnCjj+WaV92kx/PJay4EwlYxqzynXH/7Bh+dnaVrchaAs9mWZKyrOKZSlVi6+1AMEqJ436n1JQMFu/teFRbe+g==} + '@opentelemetry/instrumentation-socket.io@0.65.0': + resolution: {integrity: sha512-dNvIbD40h0z69stQ9cIeAWRyy5WyQM1a1XnFthekc/oi/ipX4E6oYJBM4X2xKBxjZMTjdV5VshLoNeYMSBsnjw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-tedious@0.36.0': - resolution: {integrity: sha512-CP4el0m8YFGUAfzcAnzT2+kvlvs3EKeMFdhF43c4cgMPvZrKHl/9G9H81sgXciZZrw1avBQDQ/dlqLN1vFK6HQ==} + '@opentelemetry/instrumentation-tedious@0.37.0': + resolution: {integrity: sha512-cGLF46UsgeI1334atJxLO36yQlV7WXKg35Mp+e2NXo2vOTfIZTVqoKOzExVOTOwT4AQjfGVEDxyq5wXybUYXIA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-undici@0.27.0': - resolution: {integrity: sha512-W69Vjtj9ts16An94KrKO6OOxrEkEXOolhVjHK8qibtDhxtWrmaB/qnhVdk1qrSZ9p63cnabC8XSc3FsHxJd3Jw==} + '@opentelemetry/instrumentation-undici@0.28.0': + resolution: {integrity: sha512-7nh4Gw7PhYtQm82FIJtWUhx6iZQJj0bdkKe2RQb3XNIyxu0o9rM1J5Xt083SsG2tCbQZpX9/mlDxhTrK1Z/lVQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.7.0 - '@opentelemetry/instrumentation-winston@0.61.0': - resolution: {integrity: sha512-H600rWjFPFXK0UDGmWucEcbylXKI9i+7i2g8LGSkYqU44PCw09xFhKwv4VPTvyGmcEsCIlckbIKj/GvYy0UeEw==} + '@opentelemetry/instrumentation-winston@0.62.0': + resolution: {integrity: sha512-pr1U9ZV4RRy23qMVrRzebfxwDWjp44xA7sC0PAdeW9v4HDcfOr0ejdTJmIsBGvhkNHPBajfieaIF9b6/9wjErA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.217.0': - resolution: {integrity: sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==} + '@opentelemetry/instrumentation@0.218.0': + resolution: {integrity: sha512-mIZil8Es+sYDK5m+DQiwAwF57F14TF2YlEqvIjZ/RQWcxDBwRGsKfdK2Tv65OU9meQKCMzSIFS9mxAcnAb6Bkg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.203.0': - resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==} + '@opentelemetry/otlp-exporter-base@0.218.0': + resolution: {integrity: sha512-ZwqpkNL5W7RyGJPDZ9g06DvKp8KFTWPJPN12anpMQYSKpTSU0z3EIZuPq9vPGpS8siFyOqDYDAuCwlNO9FqgbA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.217.0': - resolution: {integrity: sha512-eYfqnB3UhKu/5frhd1R6+FprKygbhkomuaceMXDyzxbfXB9tKgZOVmjaJ02CkLA6Tdzumxl+e2H+vo2a8jiMPQ==} + '@opentelemetry/otlp-grpc-exporter-base@0.218.0': + resolution: {integrity: sha512-H/lCGJ536N98VpYJOaWTQOkv4Dx6TnmStK6Rqfu1W7KkFbPAx04hjdYEMZF/YbnHzPUSIK4kM6OE2GKGBTpV9A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-grpc-exporter-base@0.217.0': - resolution: {integrity: sha512-7RTAdZuOsCDnsyqTCG4+bDzrfnsWdzkRs7z0AVi/V3tEQx0oKeyc+OuRWYxnRsmaJXgxcmB8vb/lfxn58Dj6Ag==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.203.0': - resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/otlp-transformer@0.217.0': - resolution: {integrity: sha512-MKK8UHKFUOGAvbZRWh90MhwHG+Fxm6OROBdjKPCF+HQobjuJ/Kuf8Chs8CR45X1aqotxrMj7OxTdsXe8sXuGVA==} + '@opentelemetry/otlp-transformer@0.218.0': + resolution: {integrity: sha512-CFaKH87WAzjuJ4awowTTLzUvMfaRfiOFG5+qm5S5ncyalRtN4ecQ+YmuANJSCrVPuvZFEkUgKhBPBndxi3rHsQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -1228,8 +1200,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-azure@0.25.0': - resolution: {integrity: sha512-e/NRDC3W2NYfxXJIto38wF1qgEyWpelaKp6QPIHGn320EknobnHCI7gUuoOAB6J2EJaW9ewNTIoDWDhO3AbdKA==} + '@opentelemetry/resource-detector-azure@0.26.0': + resolution: {integrity: sha512-7KxF7mlwI2nKja/iEdwPqOaS0QAJbhT9ye4DeYZnXdOS/4phfonk5nSmyGDBYhBL7J30MPL91oZNuGYRKXZAXA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -1240,56 +1212,32 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resource-detector-gcp@0.52.0': - resolution: {integrity: sha512-6rOAZoUDqgrqHdR+JhIT5eBtLe5XkDoivQytDl0KvCSxF9Pq63ZdGfX90y9TJE1IlcoKF+pS1FQiO/0DCQGyBw==} + '@opentelemetry/resource-detector-gcp@0.53.0': + resolution: {integrity: sha512-RCV31v23ZwZfYR3LPkuORHTHIOvfm3hZBT7hAzSO0+oAIrG/Dm0ld5tV4lYNO05GjI7sHQdRcbSqzEYAvQcQuw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/resources@2.0.1': - resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.7.1': resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-logs@0.203.0': - resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==} + '@opentelemetry/sdk-logs@0.218.0': + resolution: {integrity: sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-logs@0.217.0': - resolution: {integrity: sha512-BB+PcHItcZDL63dPMW+mJvwN9rk37wuIDjRxbVlg6pPDvDR/7GL7UJHbGsllgoggOoTimsKgENaWPoGch/oE1A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.10.0' - - '@opentelemetry/sdk-metrics@2.0.1': - resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.7.1': resolution: {integrity: sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-node@0.217.0': - resolution: {integrity: sha512-K/60pSv42+NQiZKy1pAH18nYDkxltsDV4O3SJ233J0E9raU1ksyL9gsKuS8p30bYBb4AMPCfDuutHQaHYpcv0Q==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.0.1': - resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==} + '@opentelemetry/sdk-node@0.218.0': + resolution: {integrity: sha512-tPMjHrLV5gsfNdYqoRHjeGbCAZBXXD9c1Qo/2ut7VwnUABDNh76xNxrT0SEhkIIJuCN45bbN1vZnYL1gY0IkOg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -1319,6 +1267,128 @@ packages: '@oxc-project/types@0.130.0': resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} + '@oxfmt/binding-android-arm-eabi@0.45.0': + resolution: {integrity: sha512-A/UMxFob1fefCuMeGxQBulGfFE38g2Gm23ynr3u6b+b7fY7/ajGbNsa3ikMIkGMLJW/TRoQaMoP1kME7S+815w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.45.0': + resolution: {integrity: sha512-L63z4uZmHjgvvqvMJD7mwff8aSBkM0+X4uFr6l6U5t6+Qc9DCLVZWIunJ7Gm4fn4zHPdSq6FFQnhu9yqqobxIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.45.0': + resolution: {integrity: sha512-UV34dd623FzqT+outIGndsCA/RBB+qgB3XVQhgmmJ9PJwa37NzPC9qzgKeOhPKxVk2HW+JKldQrVL54zs4Noww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.45.0': + resolution: {integrity: sha512-pMNJv0CMa1pDefVPeNbuQxibh8ITpWDFEhMC/IBB9Zlu76EbgzYwrzI4Cb11mqX2+rIYN70UTrh3z06TM59ptQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.45.0': + resolution: {integrity: sha512-xTcRoxbbo61sW2+ZRPeH+vp/o9G8gkdhiVumFU+TpneiPm14c79l6GFlxPXlCE9bNWikigbsrvJw46zCVAQFfg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': + resolution: {integrity: sha512-hWL8Hdni+3U1mPFx1UtWeGp3tNb6EhBAUHRMbKUxVkOp3WwoJbpVO2bfUVbS4PfpledviXXNHSTl1veTa6FhkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.45.0': + resolution: {integrity: sha512-6Blt/0OBT7vvfQpqYuYbpbFLPqSiaYpEJzUUWhinPEuADypDbtV1+LdjM0vYBNGPvnj85ex7lTerEX6JGcPt9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.45.0': + resolution: {integrity: sha512-jLjoLfe+hGfjhA8hNBSdw85yCA8ePKq7ME4T+g6P9caQXvmt6IhE2X7iVjnVdkmYUWEzZrxlh4p6RkDmAMJY/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.45.0': + resolution: {integrity: sha512-XQKXZIKYJC3GQJ8FnD3iMntpw69Wd9kDDK/Xt79p6xnFYlGGxSNv2vIBvRTDg5CKByWFWWZLCRDOXoP/m6YN4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.45.0': + resolution: {integrity: sha512-+g5RiG+xOkdrCWkKodv407nTvMq4vYM18Uox2MhZBm/YoqFxxJpWKsloskFFG5NU13HGPw1wzYjjOVcyd9moCA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.45.0': + resolution: {integrity: sha512-V7dXKoSyEbWAkkSF4JJNtF+NJZDmJoSarSoP30WCsB3X636Rehd3CvxBj49FIJxEBFWhvcUjGSHVeU8Erck1bQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.45.0': + resolution: {integrity: sha512-Vdelft1sAEYojVGgcODEFXSWYQYlIvoyIGWebKCuUibd1tvS1TjTx413xG2ZLuHpYj45CkN/ztMLMX6jrgqpgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.45.0': + resolution: {integrity: sha512-RR7xKgNpqwENnK0aYCGYg0JycY2n93J0reNjHyes+I9Gq52dH95x+CBlnlAQHCPfz6FGnKA9HirgUl14WO6o7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.45.0': + resolution: {integrity: sha512-U/QQ0+BQNSHxjuXR/utvXnQ50Vu5kUuqEomZvQ1/3mhgbBiMc2WU9q5kZ5WwLp3gnFIx9ibkveoRSe2EZubkqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.45.0': + resolution: {integrity: sha512-o5TLOUCF0RWQjsIS06yVC+kFgp092/yLe6qBGSUvtnmTVw9gxjpdQSXc3VN5Cnive4K11HNstEZF8ROKHfDFSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.45.0': + resolution: {integrity: sha512-RnGcV3HgPuOjsGx/k9oyRNKmOp+NBLGzZTdPDYbc19r7NGeYPplnUU/BfU35bX2Y/O4ejvHxcfkvW2WoYL/gsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.45.0': + resolution: {integrity: sha512-v3Vj7iKKsUFwt9w5hsqIIoErKVoENC6LoqfDlteOQ5QMDCXihlqLoxpmviUhXnNncg4zV6U9BPwlBbwa+qm4wg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.45.0': + resolution: {integrity: sha512-N8yotPBX6ph0H3toF4AEpdCeVPrdcSetj+8eGiZGsrLsng3bs/Q5HPu4bbSxip5GBPx5hGbGHrZwH4+rcrjhHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.45.0': + resolution: {integrity: sha512-w5MMTRCK1dpQeRA+HHqXQXyN33DlG/N2LOYxJmaT4fJjcmZrbNnqw7SmIk7I2/a2493PPLZ+2E/Ar6t2iKVMug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxlint-tsgolint/darwin-arm64@0.8.6': resolution: {integrity: sha512-khvQiNpPVNkyz6vmN50v5j1X6r9anRDXy3htDBpObx4V5bp33BK94onh46e91GTEbBevmeUG/Zm/U3+np4gehw==} cpu: [arm64] @@ -1909,8 +1979,8 @@ packages: resolution: {integrity: sha512-FavTiO8ETXFXDVfA87IThGduTTTR8iqzBnr/c60gUUmbk7knGEXPmf2B+yiNuluJD0ku0fL2V2r62UXnsLXl6w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - '@rocicorp/logger@5.4.0': - resolution: {integrity: sha512-kmMR5iLrwRIsvPZ+UXnmyAM3Mlvz6rCHrYfMsrMPgFYKLfo7amUH1RwHo6tuuqJiAvUbeaCoDtc8e+V0Mr4PSA==} + '@rocicorp/logger@6.1.0': + resolution: {integrity: sha512-4jOOwem9veRxl7uH15PsmT48PRd3OzM7n3umkO8WCMt8M929MJml4kfeqAcga8feZAfUb/+DRjsvl4ySgPWqYQ==} '@rocicorp/prettier-config@0.3.0': resolution: {integrity: sha512-w5xyMZjy32Xb3kgcZs28u/T1Q8XWi4kwWstyvF9ROsa9hNsJxP8g7LeaxwGHFJ7tPx7OXV3bexp1J3XKtoBgPg==} @@ -1920,23 +1990,38 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} deprecated: Use Promise.withResolvers instead - '@rocicorp/zero-sqlite3@1.0.18': - resolution: {integrity: sha512-JwHcCijxKj94NDij5UDCJsGHo/D8z4j5De/5zphQ+NctQ4TWr9Zx7L+Q1JBfie4ewVS82Ingu+QKbIwWvdNFXg==} - engines: {bun: '>=1.1.0', node: 20.x || 22.x || 23.x || 24.x || 25.x} + '@rocicorp/zero-sqlite3@1.1.2': + resolution: {integrity: sha512-bpxeS/JXENp8Wgo68wHsiMJjy41zePI0tCX0va/T4wAlUGfQ+gy4/Fr0TTfWWwHgDkVkAiQn5nb2EdN9xdOQWQ==} + engines: {bun: '>=1.1.0', node: 22.x || 24.x} hasBin: true - '@rocicorp/zero@0.25.13': - resolution: {integrity: sha512-tZFvk1PId6/71vYcPTWkNuNhZ12P8SxGywy1FffcvevvCyaTKsW55t/mvtl1BUEzc5oNEkg2ASWALF2Fm4ixtw==} + '@rocicorp/zero@1.7.0': + resolution: {integrity: sha512-YwjgAy0UL/Xggz8iOM4GbnrN3mavepMBwwTsj010e/r16KzB3/QebpdY6fqFxKERdnjPka7mdnbNNDFYjc7ZYQ==} engines: {node: '>=22'} hasBin: true peerDependencies: '@op-engineering/op-sqlite': '>=15' + drizzle-orm: ^0.45.2 expo-sqlite: '>=15' + kysely: ^0.28.17 + pg: ^8.16.3 + react: ^19.2.6 + solid-js: ^1.9.4 peerDependenciesMeta: '@op-engineering/op-sqlite': optional: true + drizzle-orm: + optional: true expo-sqlite: optional: true + kysely: + optional: true + pg: + optional: true + react: + optional: true + solid-js: + optional: true '@rolldown/binding-android-arm64@1.0.1': resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} @@ -2195,9 +2280,6 @@ packages: '@types/pg-pool@2.0.7': resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} - '@types/pg@8.15.5': - resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} - '@types/pg@8.15.6': resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} @@ -2221,6 +2303,9 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@typescript-eslint/eslint-plugin@8.59.3': resolution: {integrity: sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2872,8 +2957,8 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - compare-utf8@0.1.1: - resolution: {integrity: sha512-bND8Irz+KrF96w4Tkm1m8u5q8iE2fnvP196sHGy7XNrGNXlhyl07VnsCRYrXgEhhf/lM7hyCKRnMeh8Icis4Sw==} + compare-utf8@0.2.0: + resolution: {integrity: sha512-5BjVs4Be9AwMm4le3Qb3crp44OAn+uuJhvrjPWA8Es/DfVPq5lSc8JaRg/clrrHOMCU+CdDfv/9eBSPh6OOiUQ==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4564,6 +4649,11 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxfmt@0.45.0: + resolution: {integrity: sha512-0o/COoN9fY50bjVeM7PQsNgbhndKurBIeTIcspW033OumksjJJmIVDKjAk5HMwU/GHTxSOdGDdhJ6BRzGPmsHg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + oxlint-tsgolint@0.8.6: resolution: {integrity: sha512-DC9rqwFyEb5RlxOjvXdqaqxM5PwK01002oh/fcdC05mNPiI04d6CPWtReHqX6Ig1dc5LYuVeh3wuPrrp6WTjtw==} hasBin: true @@ -4792,10 +4882,6 @@ packages: resolution: {integrity: sha512-Od4muIm3HW1AouyHF5lONOf1FWo3hY1NbFDoy191X9GzhpgW1clCoaFjfVs2rKJNFYpTNJbje4cbAIDBZJ63ZA==} engines: {node: '>=12.0.0'} - protobufjs@8.3.0: - resolution: {integrity: sha512-JpJpFaR7yKNb6WqKvJJ1MLbiuIQWQnbUUb06nDtf2/i8YWYYLEfP6xf9BwSJoJQg1wAy61EQB8dssQg64oX4aA==} - engines: {node: '>=12.0.0'} - prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -5424,6 +5510,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -6369,72 +6459,68 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@opentelemetry/api-logs@0.203.0': - dependencies: - '@opentelemetry/api': 1.9.1 - - '@opentelemetry/api-logs@0.217.0': + '@opentelemetry/api-logs@0.218.0': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api@1.9.1': {} - '@opentelemetry/auto-instrumentations-node@0.75.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))': + '@opentelemetry/auto-instrumentations-node@0.76.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-amqplib': 0.64.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-aws-lambda': 0.69.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-aws-sdk': 0.72.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-bunyan': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-cassandra-driver': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-connect': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-cucumber': 0.33.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-dataloader': 0.34.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-dns': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-express': 0.65.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-fs': 0.36.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-generic-pool': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-graphql': 0.65.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-grpc': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-hapi': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-ioredis': 0.65.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-kafkajs': 0.26.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-knex': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-koa': 0.65.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-lru-memoizer': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-memcached': 0.60.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongodb': 0.70.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mongoose': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-mysql2': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-nestjs-core': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-net': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-openai': 0.15.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-oracledb': 0.42.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-pg': 0.69.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-pino': 0.63.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-redis': 0.65.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-restify': 0.62.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-router': 0.61.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-runtime-node': 0.30.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-socket.io': 0.64.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-tedious': 0.36.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-undici': 0.27.0(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation-winston': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-amqplib': 0.65.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-aws-lambda': 0.70.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-aws-sdk': 0.73.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-bunyan': 0.63.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-cassandra-driver': 0.63.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-connect': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-cucumber': 0.34.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-dataloader': 0.35.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-dns': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-express': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-fs': 0.37.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-generic-pool': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-graphql': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-grpc': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-hapi': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-ioredis': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-kafkajs': 0.27.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-knex': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-koa': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-lru-memoizer': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-memcached': 0.61.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongodb': 0.71.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mongoose': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-mysql2': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-nestjs-core': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-net': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-openai': 0.16.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-oracledb': 0.43.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-pg': 0.70.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-pino': 0.64.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-redis': 0.66.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-restify': 0.63.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-router': 0.62.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-runtime-node': 0.31.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-socket.io': 0.65.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-tedious': 0.37.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-undici': 0.28.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation-winston': 0.62.0(@opentelemetry/api@1.9.1) '@opentelemetry/resource-detector-alibaba-cloud': 0.33.8(@opentelemetry/api@1.9.1) '@opentelemetry/resource-detector-aws': 2.18.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resource-detector-azure': 0.25.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-azure': 0.26.0(@opentelemetry/api@1.9.1) '@opentelemetry/resource-detector-container': 0.8.9(@opentelemetry/api@1.9.1) - '@opentelemetry/resource-detector-gcp': 0.52.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resource-detector-gcp': 0.53.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-node': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/configuration@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/configuration@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) @@ -6444,87 +6530,73 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/exporter-logs-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-logs-otlp-grpc@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.218.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-logs-otlp-http@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.218.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-logs-otlp-proto@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-metrics-otlp-grpc@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-http@0.203.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) - - '@opentelemetry/exporter-metrics-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-metrics-otlp-http@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-metrics-otlp-proto@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-prometheus@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-prometheus@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) @@ -6532,32 +6604,32 @@ snapshots: '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/exporter-trace-otlp-grpc@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-trace-otlp-grpc@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-grpc-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-http@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-trace-otlp-http@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-proto@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/exporter-trace-otlp-proto@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) @@ -6569,264 +6641,264 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/instrumentation-amqplib@0.64.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-amqplib@0.65.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-lambda@0.69.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-aws-lambda@0.70.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/aws-lambda': 8.10.161 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-aws-sdk@0.72.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-aws-sdk@0.73.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-bunyan@0.62.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-bunyan@0.63.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@types/bunyan': 1.8.11 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cassandra-driver@0.62.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-cassandra-driver@0.63.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-connect@0.60.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-connect@0.61.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-cucumber@0.33.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-cucumber@0.34.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dataloader@0.34.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-dataloader@0.35.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dns@0.60.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-dns@0.61.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.65.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-express@0.66.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fs@0.36.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-fs@0.37.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-generic-pool@0.60.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-generic-pool@0.61.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.65.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-graphql@0.66.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-grpc@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-grpc@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-hapi@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-http@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.65.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-ioredis@0.66.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/redis-common': 0.38.3 '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-kafkajs@0.26.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-kafkajs@0.27.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-knex@0.61.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-knex@0.62.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-koa@0.65.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-koa@0.66.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-lru-memoizer@0.61.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-lru-memoizer@0.62.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-memcached@0.60.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-memcached@0.61.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/memcached': 2.2.10 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongodb@0.70.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-mongodb@0.71.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongoose@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-mongoose@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql2@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-mysql2@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-mysql@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/mysql': 2.15.27 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-nestjs-core@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-net@0.61.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-net@0.62.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-openai@0.15.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-openai@0.16.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-oracledb@0.42.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-oracledb@0.43.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/oracledb': 6.5.2 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.69.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-pg@0.70.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.1) '@types/pg': 8.15.6 @@ -6834,131 +6906,115 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pino@0.63.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-pino@0.64.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-redis@0.65.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-redis@0.66.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/redis-common': 0.38.3 '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-restify@0.62.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-restify@0.63.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-router@0.61.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-router@0.62.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-runtime-node@0.30.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-runtime-node@0.31.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-socket.io@0.64.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-socket.io@0.65.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-tedious@0.36.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-tedious@0.37.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-undici@0.27.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-undici@0.28.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-winston@0.61.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation-winston@0.62.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/instrumentation@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 import-in-the-middle: 3.0.1 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.1) - - '@opentelemetry/otlp-exporter-base@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/otlp-exporter-base@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-grpc-exporter-base@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/otlp-grpc-exporter-base@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@grpc/grpc-js': 1.14.3 '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer': 0.217.0(@opentelemetry/api@1.9.1) - - '@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.1) - protobufjs: 7.5.9 + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.218.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-transformer@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/otlp-transformer@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - protobufjs: 8.3.0 '@opentelemetry/propagator-b3@2.7.1(@opentelemetry/api@1.9.1)': dependencies: @@ -6985,7 +7041,7 @@ snapshots: '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/resource-detector-azure@0.25.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/resource-detector-azure@0.26.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) @@ -6998,7 +7054,7 @@ snapshots: '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resource-detector-gcp@0.52.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/resource-detector-gcp@0.53.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) @@ -7007,69 +7063,50 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-logs@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) - - '@opentelemetry/sdk-logs@0.217.0(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 + '@opentelemetry/api-logs': 0.218.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-metrics@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-node@0.217.0(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-node@0.218.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.217.0 - '@opentelemetry/configuration': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/configuration': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/context-async-hooks': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-logs-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-metrics-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-prometheus': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-grpc': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-http': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/exporter-trace-otlp-proto': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-grpc': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-proto': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/exporter-zipkin': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/instrumentation': 0.217.0(@opentelemetry/api@1.9.1) - '@opentelemetry/otlp-exporter-base': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.218.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/propagator-b3': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/propagator-jaeger': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-logs': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-node': 2.7.1(@opentelemetry/api@1.9.1) @@ -7077,13 +7114,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.1)': - dependencies: - '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 @@ -7107,6 +7137,63 @@ snapshots: '@oxc-project/types@0.130.0': {} + '@oxfmt/binding-android-arm-eabi@0.45.0': + optional: true + + '@oxfmt/binding-android-arm64@0.45.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.45.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.45.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.45.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.45.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.45.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.45.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.45.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.45.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.45.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.45.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.45.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.45.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.45.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.45.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.45.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.45.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.45.0': + optional: true + '@oxlint-tsgolint/darwin-arm64@0.8.6': optional: true @@ -7607,7 +7694,7 @@ snapshots: dependencies: '@rocicorp/resolver': 1.0.2 - '@rocicorp/logger@5.4.0': {} + '@rocicorp/logger@6.1.0': {} '@rocicorp/prettier-config@0.3.0': dependencies: @@ -7615,12 +7702,12 @@ snapshots: '@rocicorp/resolver@1.0.2': {} - '@rocicorp/zero-sqlite3@1.0.18': + '@rocicorp/zero-sqlite3@1.1.2': dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 - '@rocicorp/zero@0.25.13(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))': + '@rocicorp/zero@1.7.0(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(react@19.2.6)': dependencies: '@badrap/valita': 0.3.11 '@databases/escape-identifier': 1.0.3 @@ -7631,28 +7718,29 @@ snapshots: '@fastify/websocket': 11.2.0 '@google-cloud/precise-date': 4.0.0 '@opentelemetry/api': 1.9.1 - '@opentelemetry/api-logs': 0.203.0 - '@opentelemetry/auto-instrumentations-node': 0.75.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)) - '@opentelemetry/exporter-metrics-otlp-http': 0.203.0(@opentelemetry/api@1.9.1) + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/auto-instrumentations-node': 0.76.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)) + '@opentelemetry/exporter-metrics-otlp-http': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-node': 0.217.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.218.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-node': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.41.1 '@postgresql-typed/oids': 0.2.0 '@rocicorp/lock': 1.0.4 - '@rocicorp/logger': 5.4.0 + '@rocicorp/logger': 6.1.0 '@rocicorp/resolver': 1.0.2 - '@rocicorp/zero-sqlite3': 1.0.18 + '@rocicorp/zero-sqlite3': 1.1.2 '@standard-schema/spec': 1.1.0 '@types/basic-auth': 1.1.8 + '@types/ws': 8.18.1 basic-auth: 2.0.1 - chalk: 5.6.2 chalk-template: 1.1.2 chokidar: 4.0.3 cloudevents: 10.0.0 command-line-args: 6.0.2 command-line-usage: 7.0.4 - compare-utf8: 0.1.1 + compare-utf8: 0.2.0 defu: 6.1.7 eventemitter3: 5.0.4 fastify: 5.8.5 @@ -7662,15 +7750,16 @@ snapshots: json-custom-numbers: 3.1.1 kasi: 1.1.2 nanoid: 5.1.11 + oxfmt: 0.45.0 parse-prometheus-text-format: 1.1.1 pg-format: pg-format-fix@1.0.5 postgres: 3.4.7 - prettier: 3.8.3 semver: 7.8.0 - tsx: 4.22.1 url-pattern: 1.0.3 urlpattern-polyfill: 10.1.0 ws: 8.20.1 + optionalDependencies: + react: 19.2.6 transitivePeerDependencies: - '@75lb/nature' - '@opentelemetry/core' @@ -7906,13 +7995,7 @@ snapshots: '@types/pg-pool@2.0.7': dependencies: - '@types/pg': 8.15.5 - - '@types/pg@8.15.5': - dependencies: - '@types/node': 24.12.4 - pg-protocol: 1.13.0 - pg-types: 2.2.0 + '@types/pg': 8.15.6 '@types/pg@8.15.6': dependencies: @@ -7938,6 +8021,10 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.12.4 + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -8628,7 +8715,7 @@ snapshots: commander@4.1.1: {} - compare-utf8@0.1.1: {} + compare-utf8@0.2.0: {} concat-map@0.0.1: {} @@ -10759,6 +10846,30 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxfmt@0.45.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.45.0 + '@oxfmt/binding-android-arm64': 0.45.0 + '@oxfmt/binding-darwin-arm64': 0.45.0 + '@oxfmt/binding-darwin-x64': 0.45.0 + '@oxfmt/binding-freebsd-x64': 0.45.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.45.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.45.0 + '@oxfmt/binding-linux-arm64-gnu': 0.45.0 + '@oxfmt/binding-linux-arm64-musl': 0.45.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.45.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.45.0 + '@oxfmt/binding-linux-riscv64-musl': 0.45.0 + '@oxfmt/binding-linux-s390x-gnu': 0.45.0 + '@oxfmt/binding-linux-x64-gnu': 0.45.0 + '@oxfmt/binding-linux-x64-musl': 0.45.0 + '@oxfmt/binding-openharmony-arm64': 0.45.0 + '@oxfmt/binding-win32-arm64-msvc': 0.45.0 + '@oxfmt/binding-win32-ia32-msvc': 0.45.0 + '@oxfmt/binding-win32-x64-msvc': 0.45.0 + oxlint-tsgolint@0.8.6: optionalDependencies: '@oxlint-tsgolint/darwin-arm64': 0.8.6 @@ -11004,10 +11115,6 @@ snapshots: '@types/node': 24.12.4 long: 5.3.2 - protobufjs@8.3.0: - dependencies: - long: 5.3.2 - prr@1.0.1: {} pseudomap@1.0.2: {} @@ -11865,6 +11972,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinypool@2.1.0: {} + tinyrainbow@3.1.0: {} tmp@0.0.33: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a6d141ee..672158e7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,9 +17,4 @@ overrides: semver@>=2.0.0-alpha <5.7.2: ^5.7.2 minimumReleaseAgeExclude: - - robots-txt-guard@1.0.2 - - semver@5.7.2 - - '@opentelemetry/auto-instrumentations-node@0.75.0' - - '@opentelemetry/sdk-node@0.217.0' - - '@opentelemetry/exporter-prometheus@0.217.0' - - protobufjs@8.0.2 + - '@rocicorp/zero' From ddc916497808f2f34e360557952392fef15f966f Mon Sep 17 00:00:00 2001 From: Chase Adams Date: Mon, 29 Jun 2026 18:08:45 -0700 Subject: [PATCH 9/9] chore: cleanup --- .releases/1.7/commits.md | 186 --------- ...rk-results-zero-1.7-vs-1.6-full-results.md | 373 ------------------ 2 files changed, 559 deletions(-) delete mode 100644 .releases/1.7/commits.md delete mode 100644 benchmark-results-zero-1.7-vs-1.6-full-results.md diff --git a/.releases/1.7/commits.md b/.releases/1.7/commits.md deleted file mode 100644 index fb4cfb36..00000000 --- a/.releases/1.7/commits.md +++ /dev/null @@ -1,186 +0,0 @@ -# Zero 1.7 Release Commit Categorization - -- Release: Zero 1.7 -- Previous release tag: `zero/v1.6.1` -- Target: `main` -- Monorepo path used: `/Users/aa/work/mono` -- Merge base: `9d447833ca69cedc9fd32e5a228ce285e3a8af91` - -## Commands Used - -```bash -git -C /Users/aa/work/mono log --reverse --format='%h%x09%s' --no-merges zero/v1.6.1..main -git -C /Users/aa/work/mono log --reverse --format='%h%x09%s%n%b%n---END---' 9d447833ca69cedc9fd32e5a228ce285e3a8af91..zero/v1.6.1 -git -C /Users/aa/work/mono log --right-only --no-merges --cherry-mark --format='%m%x09%h%x09%s' zero/v1.6.1...main -``` - -## Protocol Compatibility Check - -- Status: PASS -- Previous release `PROTOCOL_VERSION`: `51` -- Target `PROTOCOL_VERSION`: `51` -- Target `MIN_SERVER_SUPPORTED_SYNC_PROTOCOL`: `30` -- Compatibility rule: target minimum supported sync protocol must be `<=` previous release protocol version. -- Result: `30 <= 51`, so this is not a breaking change. -- Note: `393695512` updates protocol-version expectations in tests, but the actual protocol constants in `packages/zero-protocol/src/protocol-version.ts` are unchanged between `zero/v1.6.1` and `main`. - -## Categorization - -| Commit | Category | Breaking? | Note | -| ----------- | -------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `8916f8001` | perf | - | Batches flip-join requests instead of issuing many separate fetches. This improves relationship-heavy query performance substantially in the benchmark from the PR. | -| `aee683c2b` | fix | - | Handles WebSocket close code 1009 without reconnecting forever and resending the same oversized message. It surfaces a clearer error and abandons the stuck client group. | -| `e5bf8bd4f` | skip | - | Already in 1.6.1 as cherry-pick `e3e63d4ef`. Adds backoff when CVR purging fails, but should not be repeated in 1.7 notes. | -| `7a1d2fea7` | skip | - | Already in 1.6.1 as cherry-pick `df3aff288`. Makes zero-cache abort when ChangeDB CDC tables are missing. | -| `257da8234` | perf | - | Avoids O(N²) accumulation in `Debug.rowVended` by pushing into the existing array. This matters for large debug/analyze workloads. | -| `359db1416` | skip | - | Benchmark-only change to use ZQL for flip-join benchmarks. No direct product behavior change. | -| `fc56a7338` | fix | - | Inspector/analyze-query now uses the actual table-source query plan. This makes diagnostics more accurate. | -| `d10925ad2` | perf | - | Replaces queue `Array.shift`-style behavior with an O(1) ring buffer. This reduces CPU under heavy replication queue load. | -| `279df61ac` | skip | - | Removes unused production permissions helper. Internal cleanup. | -| `7954d6b49` | skip | - | npm audit fix. No specific Zero behavior called out. | -| `7bb253814` | skip | - | OpenTelemetry dependency bump. No specific user-facing change identified. | -| `10e727a03` | skip | - | Replaces Vercel node types with local interfaces in otel-proxy. Internal refactor. | -| `d2c9d4af8` | skip | - | Pins GitHub Actions. CI security hardening only. | -| `90df9a375` | skip | - | Dependency updates for Vite/database libraries. No specific product change identified. | -| `e7bda36db` | skip | - | Allows Vite minor upgrades. Dependency maintenance. | -| `63b52e775` | skip | - | Fixes Vite version in lockfile. Internal dependency consistency. | -| `4766675da` | skip | - | Adds vulnerability-detection script. Internal security tooling. | -| `01bd90fa8` | skip | - | npm audit fix. No specific Zero behavior called out. | -| `4ff19849b` | skip | - | Removes legacy assistant workflow. CI cleanup. | -| `cb75a03f4` | skip | - | Updates JS checks workflow. CI-only. | -| `68bb5f6a6` | skip | - | Updates file-size workflows. CI-only. | -| `4029bc22f` | skip | - | Updates benchmark workflows. CI-only. | -| `a05b2bb3c` | skip | - | Updates mirror workflow. CI-only. | -| `c37ac92b4` | skip | - | Updates deploy workflows. CI-only. | -| `052dda116` | skip | - | Updates canary release flow. Release infrastructure. | -| `c4e6db1ce` | skip | - | Migrates mono from npm to pnpm. Important internally, but not a published Zero behavior change. | -| `36f26d619` | skip | - | Removes package-lock helper script. Internal tooling. | -| `15e3d6b9f` | skip | - | Moves Replicache perf code. Internal benchmark organization. | -| `bd7465cf1` | skip | - | Updates Docker dependencies. Security/image maintenance. | -| `9f9f82660` | skip | - | Scopes canary-release OIDC token. CI security. | -| `7cc08742d` | skip | - | Moves SST into pnpm. Internal tooling. | -| `ba78376d9` | skip | - | Fixes CI permissions and pnpm install. CI-only. | -| `6e53b5b92` | skip | - | Removes `npx` usage from CI/scripts. Internal tooling. | -| `90159039a` | skip | - | Reworks canary release workflow with dry-run support. Release infrastructure. | -| `8e33dd079` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `9a0147315` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `b877b7abf` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `d44fa8ca3` | skip | - | Docker login/version parsing workflow work. Release plumbing. | -| `66852ea85` | skip | - | Changes release process to clone instead of copy. Internal release tooling. | -| `d5d3d57a3` | skip | - | Adjusts release cloning behavior for CI/local. Internal release fix. | -| `3ba9f26e5` | skip | - | pnpm release-age exclusions/version overrides. Internal package-management setup. | -| `f02f76915` | skip | - | Adds benchmark JSON output and silent mode. Dev benchmark tooling. | -| `509f7b027` | skip | - | Updates npm references to pnpm. Internal config/docs. | -| `57b1a4b09` | skip | - | Singular flag query-hash attempt, later reverted. Do not note reverted behavior. | -| `257f2152a` | skip | - | Docker dependency/security cleanup. Image maintenance. | -| `e707eaf11` | skip | - | Stops release script from mutating app package manifests. Release-process fix. | -| `f35216528` | skip | - | Removes zbugs deploy. Internal sample app CI. | -| `7d260572c` | skip | - | Restores flat published `out/` layout after pnpm migration. Skipping after review because this was internal pnpm migration/build fallout rather than a 1.7 user-facing change to call out. | -| `f1ac318c0` | skip | - | Iterator helper for lint upgrade. Internal. | -| `035549bc6` | skip | - | Removes `tsx` usage. Internal tooling/runtime cleanup. | -| `31a027f1a` | fix | NO | Externalizes optional peer deps so `pg`, `react`, and `solid-js` are not bundled into Zero output. This prevents duplicate installed copies that can break customer-observable runtime behavior, including `Pool instanceof` checks and React single-instance assumptions. Reviewed as non-breaking: although package peer dependency/install behavior technically changed, the previous behavior was broken enough that users should not reasonably depend on it. | -| `820f17fa5` | feature | - | Adds `replication.last_total_lag` gauge. Gives operators a new metric to distinguish real lag from stalled lag-report delivery. | -| `b2474686b` | skip | - | Uses pnpm to gate transitive install scripts in Docker build. Security hardening. | -| `9bbb0509c` | skip | - | Docker pnpm 11 work. Build plumbing. | -| `cf1e3eb31` | skip | - | zbugs access-key debug logging. Sample/internal. | -| `e4358fb90` | skip | - | Adds GitHub Actions security analysis. CI security. | -| `b80cced16` | skip | - | Bumps Playwright. Test dependency maintenance. | -| `8b29a2d26` | skip | - | Hardens release asset workflow. CI/release security. | -| `a684c0c26` | skip | - | Hardens benchmark workflows. CI security. | -| `7e511179a` | skip | - | Fixes zizmor findings. CI security. | -| `16ec13edd` | skip | - | Scopes release/mirror workflow secrets. CI security. | -| `347abab47` | skip | - | Removes Bencher/file-size workflows. CI cleanup. | -| `3956a0b41` | skip | NO | Splits permissions internals into a private `zero-permissions` workspace package to break cycles. Public `@rocicorp/zero` exports for `definePermissions`, `ANYONE_CAN`, `NOBODY_CAN`, and permission types remained in place; the removed `zero-schema/src/mod.ts` was in a private workspace package, not a published public import path. | -| `811a1d9d0` | skip | - | Cross-package import refactor, later unwound. Internal. | -| `393695512` | skip | - | Protocol-version test expectation update. Verified separately in the protocol compatibility check: the actual protocol constants are unchanged between `zero/v1.6.1` and `main`, so this is not believed breaking. | -| `699728e84` | skip | - | pnpm 11.3 pins. Internal tooling. | -| `11a4c358d` | skip | - | Reverts singular query-hash fix. Revert bookkeeping. | -| `a39469416` | fix | - | Prevents singular and plural queries with the same AST from sharing a client view. That sharing was incorrect because the views have different semantics. | -| `9960407d6` | fix | - | Fixes a regression where removing a query could trigger an assertion. User-visible as a possible client crash/assert. | -| `ae6cf8b94` | skip | - | React 19 upgrade to fix Vercel build. Build maintenance. | -| `5d2fd7ef4` | skip | - | Already in 1.6.1 as cherry-pick `4ce15e597`. Inspector compatibility with older clients. | -| `2f466f6f6` | skip | - | zbugs import-path refactor. Sample/internal. | -| `91257a51e` | skip | - | Reverts/fixes cross-package import refactor. Internal. | -| `2ce4ee3e6` | skip | - | Removes unused Replicache CI workflow. CI cleanup. | -| `6126dc063` | skip | - | CODEOWNERS for zbugs. Repo governance. | -| `58bb5a9c0` | skip | - | Staged npm releases for maintainer approval. Release process. | -| `feee2be78` | fix | - | `LIKE`/`ILIKE` matching uses dotall behavior instead of multiline. Fixes query-result mismatches for strings containing newlines. | -| `517f29f30` | skip | - | Adds relationship-heavy ArrayView benchmark. Benchmark-only. | -| `79828be75` | skip | - | Import-path refactor, later reverted. Internal. | -| `e5f5a56b7` | skip | - | Reverts import-path refactor. Revert bookkeeping. | -| `8ec146799` | fix | - | Range filters now use UTF-8 ordering to match SQLite/Postgres ordering. Fixes string comparison correctness. | -| `8e46be85b` | skip | - | CODEOWNERS approval workflow hardening. CI/governance. | -| `5438a8bb1` | feature | NO | Relands immutable `applyChange` without the eager-expansion regression. Improves React/Solid reactivity and reference stability for unchanged subtrees. Reviewed as non-breaking: it could affect consumers relying on accidental mutation of query result objects or previous object identity behavior, but that behavior was not something users should reasonably rely on. Keep flagging similar result-semantics changes for review. | -| `ff587d7be` | fix | MAYBE | Makes SQLite replica `LIKE`/`ILIKE` behavior match Postgres/IVM more closely. Precise behavior changes: plain `LIKE`/`NOT LIKE` becomes case-sensitive on the SQLite replica, so patterns like `a%` no longer match uppercase `A...`; `ILIKE`/`NOT ILIKE` now compile as `lower(left) LIKE lower(right)` instead of reusing bare SQLite `LIKE`; and all `LIKE`/`ILIKE` operators now emit `ESCAPE '\'`, so patterns like `100\%` and `a\_b` treat `%` and `_` literally. Might be breaking because query results can change for apps that relied on the previous SQLite-divergent matching behavior. Needs deeper follow-up before final release notes, including potential performance/index-use impact of `PRAGMA case_sensitive_like = ON`, `lower(...) LIKE lower(...)`, and explicit `ESCAPE`. | -| `3e6ed598c` | skip | - | Updates action pins. CI security. | -| `800f6acff` | skip | - | Already in 1.6.1 as cherry-pick `543e649f6`. Improves write worker errors for production debugging. | -| `fdd8278f3` | skip | - | Already in 1.6.1 as cherry-pick `9d3fb4303`, and release-tooling only. Uses worktrees for release clone. | -| `5a04230cd` | skip | - | Adds transaction-batching ArrayView benchmark. Benchmark-only. | -| `572f1ae4b` | perf | - | Adds transaction-scoped copy-on-write for multi-change transactions. Reduces allocation overhead and shows around 2x wins for large transactions. | -| `dc69d2232` | fix | MAYBE | Adopts `zero-sqlite3` with self-contained Unicode `lower()`/`upper()` mappings, which completes the `ILIKE` behavior introduced by `ff587d7be`. Precise behavior change: SQLite-replica `ILIKE` now matches non-ASCII case variants such as `MÜLLER` vs `müller`, accented Latin, Cyrillic, and Greek because both sides are lowered with Unicode-aware mappings. It is not full Unicode case folding; cases like `straße` vs `STRASSE` still do not match. Might be breaking because non-ASCII `ILIKE` query results can include rows that previously did not match. Needs performance follow-up because Unicode-aware `lower()` on both operands may affect `ILIKE` query cost and index use. | -| `2b76eee35` | skip | - | Already in 1.6.1 as cherry-pick `50bb87536`. Adds analyze CLI `--join-plans`, but not new for 1.7. | -| `4b447e11a` | skip | - | Already in 1.6.1 as cherry-pick `98a41b323`, though patch differs due lockfile/package-manager differences. `zero-sqlite3` 1.1.2 install/build fix. | -| `bfa64ab23` | skip | - | Already in 1.6.1 as cherry-pick `814288531`. Logs SQLite index creation during initial sync. | -| `1c3150de4` | skip | - | Already in 1.6.1 as cherry-pick `b59292a29`. Allows anonymous analyze CLI usage. | -| `f8571f0d4` | skip | - | Fixes latest promotion checks in release tooling. Not product release-note material. | - -## Continuation Audit (current `main`) - -- Continuation monorepo path used: `/Users/chase/git/roci/mono` -- Continuation range reviewed: `f8571f0d4..main` -- Continuation review date: 2026-06-17 -- Continuation patch-equivalence result: all continuation commits are `>` in `git log --right-only --no-merges --cherry-mark`, so none were already present in `zero/v1.6.1` by patch equivalence. -- Continuation protocol compatibility: PASS. `zero/v1.6.1` and current `main` both have `PROTOCOL_VERSION = 51`; current `main` has `MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 30`; `30 <= 51`. - -### Continuation Commands Used - -```bash -git -C /Users/chase/git/roci/mono log --reverse --oneline --no-merges f8571f0d4..main -git -C /Users/chase/git/roci/mono log --right-only --no-merges --cherry-mark --format='%m%x09%h%x09%s' zero/v1.6.1...main -git -C /Users/chase/git/roci/mono show zero/v1.6.1:packages/zero-protocol/src/protocol-version.ts -git -C /Users/chase/git/roci/mono show main:packages/zero-protocol/src/protocol-version.ts -``` - -### Continuation Categorization - -| Commit | Category | Breaking? | Note | -| ----------- | -------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `cb5c46180` | fix | - | React and Solid view cache keys now include the full query result format, not just the top-level singular flag. This fixes nested relationship shape bugs where `.one()` and `.limit(1)` had the same AST hash but should return different nested shapes. | -| `fe0c28dd4` | skip | - | Release workflow security hardening. Important internally, but not Zero runtime release-note material. | -| `616697338` | skip | - | Removes stale Replicache editor config. Internal developer-environment cleanup. | -| `2d2928097` | skip | - | Adds a dev container. Developer-environment setup only. | -| `65eeff243` | skip | - | pnpm version bump across package manifests and workflows. Internal package-management maintenance. | -| `d58b2402e` | skip | - | Adds Dependabot updates for devcontainer features. Tooling-only. | -| `92cc76e32` | skip | - | Adds Docker-in-Docker to devcontainer for tests, later superseded by sibling Compose services. Developer-environment only. | -| `f814b1115` | skip | - | Devcontainer lockfile adjustment. Developer-environment only. | -| `307283ff1` | skip | - | Replaces Docker-in-Docker with sibling Compose services in the devcontainer. Developer/test-environment only. | -| `832c1b418` | feature | - | Supports text-represented Postgres scalar types as Zero `string` columns, including network/address-like types, `pg_lsn`, and the `isn` extension family. Also allows those supported string-like types to participate in Zero primary keys and improves unsupported-PK diagnostics. | -| `5dd4e6673` | skip | - | Updates devcontainer feature version to pick up 1Password support. Developer-environment only. | -| `78df00486` | perf | MAYBE | Upgrades Zero packages to `@rocicorp/logger` 6.0.0 to pick up object allocation optimizations. Included as a perf item, but marked MAYBE because it is a major runtime dependency bump and internal code had to avoid destructuring unbound log methods. No confirmed Zero API break identified. | -| `ee8d7e35e` | skip | - | Reduces allocation in `Catch.expandNode`, which is a test/benchmark helper rather than production code. Do not include as a product performance item. | -| `aece77a0f` | fix | NO | Verifies actual litestream backup state before purging change-log records and adds `replica.purge_blocked` for alerting. Reviewed as non-breaking, but operationally visible: stale backups now block purges and persistently wedged backups fail closed to avoid unsafe backup/purge behavior. Include as a fix with a visible caveat rather than a breaking change. | -| `21deecb34` | fix | - | Preserves the latest durable change-log transaction as the catchup boundary when backup watermark is ahead of the durable change log. Group with `aece77a0f` as a Litestream/change-log safety fix. | -| `a31448454` | fix | - | Query hydration and pipeline failures now log query hash, transformation hash, and custom query name when available. This improves production diagnostics for operators. | -| `7fa1d0816` | skip | - | Test-only text-semantics corpus. It should not be a release-note bullet, but it updates the `ILIKE` caveat: ZQLite/IVM Unicode `ILIKE` can still diverge from compiled Postgres SQL under `COLLATE "C"`. | - -## Current Release-Note Candidate Set - -- perf: `8916f8001`, `257da8234`, `d10925ad2`, `572f1ae4b`, `78df00486` -- feature: `820f17fa5`, `5438a8bb1`, `832c1b418` -- fix: `aee683c2b`, `fc56a7338`, `31a027f1a`, `a39469416`, `9960407d6`, `feee2be78`, `8ec146799`, `ff587d7be`, `dc69d2232`, `cb5c46180`, `aece77a0f`, `21deecb34`, `a31448454` - -## Potential Breaking Changes - -- `31a027f1a`: package peer dependency/install behavior changed to avoid duplicate bundled runtime dependencies. -- `ff587d7be`: `LIKE`/`ILIKE` query results can change to match Postgres/IVM semantics. -- `dc69d2232`: non-ASCII `ILIKE` query results can change due to Unicode-aware case mapping. -- `78df00486`: major `@rocicorp/logger` runtime dependency bump. No confirmed Zero API break, but direct logger consumers relying on unbound/destructured log methods may need review. - -## Open Questions - -- Confirm whether `5438a8bb1` should be framed as a feature, perf/reliability improvement, or omitted from the public release notes. -- Confirm whether inspector/analyze-query diagnostics should be grouped together or listed as separate fixes. -- Dig deeper into `ff587d7be` before final notes: decide whether SQLite replica `LIKE`/`ILIKE` correctness changes should be called out as a breaking-change risk, an upgrade note, or just a fix. -- Investigate performance impact of the LIKE/ILIKE changes in `ff587d7be` and `dc69d2232`, especially whether `lower(left) LIKE lower(right)`, explicit `ESCAPE`, or Unicode-aware `lower()` affects SQLite index use or hot query latency. -- `aece77a0f` decision: keep as a fix with a visible operational caveat, not as a breaking change. -- `7fa1d0816` follow-up: final notes and ZQL docs should mention the remaining non-ASCII `ILIKE` divergence under Postgres `COLLATE "C"`. diff --git a/benchmark-results-zero-1.7-vs-1.6-full-results.md b/benchmark-results-zero-1.7-vs-1.6-full-results.md deleted file mode 100644 index 24a0f221..00000000 --- a/benchmark-results-zero-1.7-vs-1.6-full-results.md +++ /dev/null @@ -1,373 +0,0 @@ -# Zero 1.7 vs 1.6 Benchmark Results - -This report captures all benchmark results collected so far for the Zero 1.7 release comparison. - -## Inputs - -| Item | Value | -| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -| 1.7 ref | `maint/zero/v1.7` at `2698272ca` | -| 1.6 ref | `maint/zero/v1.6` / `zero/v1.6.2` at `63673effe` | -| Benchmark commits applied for comparison | `9209d3880` and `7a6188a35` | -| 1.7 package manager | `pnpm` | -| 1.6 package manager | `npm` | -| Main aggregate | `/var/folders/1p/byzq05qd42zg5rg6__h69_7c0000gn/T/opencode/zero-pg-bench-9209d3880/benchmark-summary-10-runs.json` | - -## Important Caveat - -The full 116-row matrix below is the original 10-run matrix. After that full run, we found that one large planner-hydration regression was caused by a benchmark fixture issue: the benchmark created a Chinook SQLite database without the predicate indexes needed by that query before running `ANALYZE`. - -We did not rerun the entire 116-row suite after fixing that benchmark. Instead, we ran a targeted index experiment for the affected planner row, 10-run targeted backports for 1.7-only benchmark coverage, and focused 5-pass reruns for the remaining push-path concerns. The practical release read uses the adjusted interpretation, not the raw bad planner row. - -## Headline Summary - -| Summary | Count | -| ---------------------------------------------------------------- | ----: | -| Matched benchmark rows in original 10-run matrix | 116 | -| Original rows improved by at least 5% in 1.7 | 9 | -| Original rows regressed by at least 5% in 1.7 | 9 | -| Original rows flat within +/-5% | 98 | -| Adjusted rows improved by at least 5% after planner fixture fix | 10 | -| Adjusted rows regressed by at least 5% after planner fixture fix | 8 | -| Adjusted rows flat within +/-5% | 98 | - -## Release Read - -1.7 is broadly performance-neutral compared with 1.6 across client and query-engine benchmarks, with targeted wins in the paths that had specific 1.7 performance work. The strongest original matrix wins are in Postgres replication/storage paths. A newly backported logger allocation benchmark shows `LogContext` construction is ~1.3-1.6x faster in 1.7. Newly backported flipped-join benchmarks show a consistent ~2.8-3.3x 1.7 win for the direct batching shape and a scaling ~3.9-110x win for the ZQL-built merge-shaped query. A newly backported `Debug.rowVended` benchmark shows a scaling ~21-3,242x win for query-analysis runs that collect every vended row. The transaction benchmark for `572f1ae4b` shows 1.7's copy-on-write ArrayView transaction path stays close to 1.6's old mutable baseline for multi-edit transactions, with a small absolute single-edit overhead on wide lists. A newly backported relationship-heavy ArrayView guard benchmark shows 1.7 slower on those broader hydration/push cases, with most deltas around ~5-23% and one small baseline hydration row at 39% slower. The one huge apparent planner regression was a benchmark fixture issue and is fixed by adding `album(title)` and `genre(name)` before `ANALYZE`. Focused push-only reruns did not reproduce a broad in-memory IVM push regression. The remaining consistent regressions are small, microsecond-scale Chinook push cases and are not release-blocking. - -## Postgres Replication And Storage Benchmarks - -| Benchmark | 1.6 | 1.7 | Result | -| ------------------------------------------------- | --------: | --------: | -----------: | -| change-streamer/storer single transaction changes | 60.60 us | 35.10 us | 1.73x faster | -| change-streamer/storer sustained stream changes | 63.56 us | 34.16 us | 1.86x faster | -| change-streamer/storer sustained stream commits | 63.56 ms | 34.16 ms | 1.86x faster | -| replicator/logical replication end-to-end rows | 114.67 us | 113.59 us | 1.01x faster | -| zero-cache/initial-sync generated fixture rows | 6.17 us | 5.75 us | 1.07x faster | - -## Logger Allocation Benchmark - -This targeted benchmark came from local branch `0xcadams/logger-allocation-benchmark` as `packages/shared/src/logger.bench.ts`. It was temp-backported into both release comparison worktrees. The benchmark compares `@rocicorp/logger` `LogContext` construction and `withContext` allocation paths; v1.6 uses `@rocicorp/logger` `^5.4.0` and v1.7 uses `^6.1.0`. - -Each benchmark case constructs 1,000 contexts per measured iteration. Values below are median-of-medians across 10 completed process runs. - -| Benchmark | 1.6 | 1.7 | Result | -| ---------------------------------------------- | -------: | -------: | -----------: | -| LogContext construction > new debug context | 24.23 us | 15.23 us | 1.59x faster | -| LogContext construction > new info context | 27.86 us | 17.62 us | 1.58x faster | -| LogContext construction > new error context | 22.41 us | 16.94 us | 1.32x faster | -| LogContext construction > withContext on debug | 31.77 us | 22.15 us | 1.43x faster | - -Takeaway: 1.7 is consistently faster on logger context allocation, with the largest wins for fresh debug/info `LogContext` construction. These timings are per 1,000 constructed contexts. - -## Flipped Join Batching Benchmark - -This targeted benchmark was added after the original 116-row matrix to cover `8916f8001 feat(zql): batch flip join requests`. The improvement did not show up in the original run because no durable `*.bench.ts` benchmark exercised the large-N flipped-join shape optimized by that commit. The commit had a gated `zqlite` perf test, but our benchmark sweep only ran regular benchmark files from runnable benchmark packages, and `zqlite` contributed no rows. - -The benchmark was temp-backported into both release comparison worktrees as `packages/zql-benchmarks/src/flipped-join-batching.bench.ts`. It builds in-memory SQLite `parent` and `child` tables, wires them through `TableSource` and direct `FlippedJoin`, then measures fetching N one-to-one child/parent joins. Values below are median-of-medians across 10 completed process runs. - -| Rows | 1.6 | 1.7 | Result | -| -----: | -------: | --------: | -----------: | -| 100 | 2.37 ms | 718.92 us | 3.30x faster | -| 500 | 4.73 ms | 1.71 ms | 2.76x faster | -| 1,000 | 9.31 ms | 3.25 ms | 2.87x faster | -| 2,500 | 23.24 ms | 7.19 ms | 3.23x faster | -| 5,000 | 46.48 ms | 15.59 ms | 2.98x faster | -| 10,000 | 92.14 ms | 32.13 ms | 2.87x faster | - -Takeaway: `8916f8001` is a clear 1.7 performance win when measured directly. The effect is not visible in the original full matrix because the matrix lacked this benchmark shape, not because the optimization was ineffective. - -## Flipped Join Merge Benchmark - -This targeted benchmark was added after the original 116-row matrix by converting the remaining gated `packages/zqlite/src/flipped-join-merge.perf.test.ts` into `packages/zql-benchmarks/src/flipped-join-merge.bench.ts`. The old perf test was excluded from the release matrix for the same reason as the direct batching perf test: it was a gated `*.perf.test.ts` under `zqlite`, not a standard benchmark file that emits normal benchmark output. - -The benchmark builds in-memory SQLite `parent` and `child` tables, wires them through `TableSource`, constructs the query through ZQL as `parent.whereExists('children', {flip: true})`, then runs it through `buildPipeline(...)`. The join key is `bucket`, which is intentionally not schema-declared unique, preserving the merge-shaped flipped-join path from the original perf test. Values below are median-of-medians across 10 completed process runs. - -Important interpretation: `7f9aee2dc feat(zql): heap-based merge in #fetchMergeSort` is already present in both 1.6 and 1.7, so this is not a direct pre/post measurement of that commit. The 1.6-vs-1.7 delta here primarily shows how the later flipped-join batching work changes the ZQL-built merge-shaped query. - -| Rows | 1.6 | 1.7 | Result | -| -----: | --------: | --------: | -------------: | -| 100 | 2.73 ms | 699.58 us | 3.91x faster | -| 500 | 13.48 ms | 1.90 ms | 7.10x faster | -| 1,000 | 43.01 ms | 3.31 ms | 13.00x faster | -| 2,500 | 231.84 ms | 7.57 ms | 30.63x faster | -| 5,000 | 895.03 ms | 16.36 ms | 54.72x faster | -| 10,000 | 3.65 s | 33.22 ms | 109.78x faster | - -Takeaway: this benchmark is the strongest flipped-join signal. The direct batching benchmark shows a stable ~3x win on the unique-key shape; the ZQL-built merge-shaped query shows the scaling behavior that was hidden by the gated perf test and grows to ~110x faster at 10,000 rows. - -## Debug.rowVended Benchmark - -This targeted benchmark covers `257da8234 fix(zql): avoid O(N²) spread in Debug.rowVended`. The bug was in the query-analysis/debug path that records every row vended by a SQL query into one debug bucket. 1.6 appended by cloning the whole accumulated array for every row; 1.7 appends in place. - -This did not show up in normal query/materialization benchmarks because those benchmarks do not run through the query-analysis/debug path. Normal client query hydration and subscriptions do not return every vended row object. The affected path is used by analysis/debug tooling such as `analyze-query`, inspector analyze-query requests, `analyzeQuery(...)`, or equivalent project-specific query-analysis commands. Full vended rows are explicitly requested with options like `--output-vended-rows` / `vendedRows: true`, but the debug delegate also tracks vended-row arrays internally while producing row-count diagnostics, so high-fan-out analysis runs are the important case. - -The benchmark was temp-backported into both release comparison worktrees as `packages/zql-benchmarks/src/debug-row-vended.bench.ts`. It directly calls `Debug.rowVended` for N rows in one table/query bucket. Values below are median-of-medians across 10 completed process runs. - -| Rows | 1.6 | 1.7 | Result | -| -----: | --------: | --------: | --------------: | -| 1,000 | 496.75 us | 23.85 us | 20.82x faster | -| 5,000 | 10.65 ms | 62.54 us | 170.23x faster | -| 10,000 | 39.64 ms | 84.85 us | 467.19x faster | -| 20,000 | 418.16 ms | 129.00 us | 3241.57x faster | - -Takeaway: this is a major win for query-analysis/debug workflows with high-fan-out queries. It is not expected to affect ordinary customer query execution unless they are running analysis/debug tooling that installs the `Debug` delegate and records rows vended by the query. - -## ArrayView Transaction Copy-On-Write Benchmark - -This targeted benchmark covers `572f1ae4b chore: Optimize transaction performance with copy-on-write`. The benchmark existed on 1.7 but not 1.6, so it appeared as 1.7-only in the original matrix and did not produce matched rows. - -The benchmark was temp-backported into the 1.6 comparison worktree as `packages/zql-benchmarks/src/array-view-transaction.bench.ts`. It materializes a flat `ArrayView`, applies K edits inside one transaction, then calls one `delegate.commit()`. Values below are median-of-medians across 10 completed process runs. - -Important interpretation: this is a 1.7-vs-1.6 release comparison, not a direct pre/post comparison against the slow immutable implementation that `572f1ae4b` optimized. The 1.6 branch is the old mutable baseline, so the useful release question is whether 1.7's copy-on-write path stays close to that baseline. - -| N | Edits/Txn | 1.6 | 1.7 | Result | -| -----: | --------: | --------: | --------: | -----------: | -| 1,000 | 1 | 3.27 us | 3.86 us | 15.4% slower | -| 1,000 | 100 | 320.76 us | 342.82 us | 6.4% slower | -| 1,000 | 1,000 | 3.27 ms | 3.38 ms | 3.4% slower | -| 10,000 | 1 | 3.79 us | 7.29 us | 48.0% slower | -| 10,000 | 100 | 354.89 us | 381.79 us | 7.0% slower | -| 10,000 | 1,000 | 3.57 ms | 4.07 ms | 12.2% slower | - -Takeaway: `572f1ae4b` should not be presented as a 1.7-vs-1.6 throughput win, because v1.6 did not have the slow immutable path this commit optimized. For the release comparison, the fixed 1.7 copy-on-write implementation is close to v1.6's mutable baseline for batched edits. The largest relative delta is the single-edit wide-list case, but the absolute difference is about 3.5 us per transaction. - -## Relationship-Heavy ArrayView Benchmark - -This targeted benchmark was also added after the original 116-row matrix. `array-view-relationships.bench.ts` exists on 1.7 but not 1.6, so it originally appeared only as a 1.7-only benchmark and did not produce matched comparison rows. It is not the direct `572f1ae4b` transaction-copy-on-write benchmark; it is broader relationship-heavy ArrayView hydration/push coverage for the immutable ArrayView work. - -The benchmark was temp-backported into the v1.6 comparison worktree and run on both versions. Values below are median-of-medians across 10 completed process runs. - -| Benchmark | 1.6 | 1.7 | Result | -| ------------------------------------------------------------------------------ | --------: | --------: | -----------: | -| relationship hydration > hydrate: issues only (baseline) | 153.99 us | 253.66 us | 39.3% slower | -| relationship hydration > hydrate: issues + comments (wide, one level) | 1.79 ms | 1.88 ms | flat | -| relationship hydration > hydrate: issues + comments + emoji (wide, two levels) | 9.95 ms | 10.87 ms | 8.5% slower | -| relationship hydration > hydrate: heavy query (wide + deep) — regression case | 22.33 ms | 24.05 ms | 7.2% slower | -| relationship hydration > hydrate: heavy query limit(50) | 5.74 ms | 6.70 ms | 14.4% slower | -| push into relationship-heavy view > push: add issue into heavy view | 69.63 us | 83.07 us | 16.2% slower | -| push into relationship-heavy view > push: add comment (child) into heavy view | 13.83 us | 17.92 us | 22.8% slower | -| push into relationship-heavy view > push: edit issue title in heavy view | 12.11 us | 12.72 us | flat | - -Takeaway: this guard benchmark does not show a 1.7 win. Hydration cases are modestly slower in 1.7, while push regressions are microsecond-scale in absolute terms. This should be treated separately from the direct transaction-copy-on-write benchmark for `572f1ae4b`. - -## Planner-Hydration Fixture Correction - -The raw full matrix included this bad row: - -| Benchmark | 1.6 | 1.7 Raw | Raw Result | -| ------------------------------------------------------------------------------ | --------: | ------: | -----------: | -| `planner-hydration > track.exists(album).exists(genre) with filters > planned` | 103.33 us | 3.88 ms | 97.3% slower | - -Targeted testing showed this was caused by the benchmark missing `album(title)` before `ANALYZE`. With the correct indexes, 1.7 chooses the fast `album`-flipped plan and is slightly faster than 1.6. - -| Ref | Index variant | Album flip | Genre flip | Planned | Unplanned | Rows | -| --- | ---------------------------- | ---------- | ---------- | --------: | --------: | ---: | -| 1.6 | no extra indexes | true | false | 138.54 us | 10.57 ms | 15 | -| 1.6 | album(title) only | true | false | 115.17 us | 10.29 ms | 15 | -| 1.6 | genre(name) only | false | true | 3.89 ms | 10.36 ms | 15 | -| 1.6 | album(title) and genre(name) | true | false | 102.92 us | 10.70 ms | 15 | -| 1.7 | no extra indexes | false | true | 3.76 ms | 10.42 ms | 15 | -| 1.7 | album(title) only | true | false | 106.29 us | 10.35 ms | 15 | -| 1.7 | genre(name) only | false | true | 3.88 ms | 10.36 ms | 15 | -| 1.7 | album(title) and genre(name) | true | false | 92.75 us | 10.28 ms | 15 | - -## Focused Push-Only Rerun - -These are 5 focused reruns per version using only the push benchmarks from `ivm-memory.bench.ts` and `chinook-push.bench.ts`. They were run after the original full matrix to check whether the remaining push regressions reproduced. - -| Benchmark | 1.6 | 1.7 | Rerun Result | -| ------------------------------------------ | --------: | --------: | -----------: | -| Chinook push limited inside bound, zql | 5.64 us | 6.06 us | 6.9% slower | -| Chinook push limited inside bound, zqlite | 247.83 us | 248.33 us | flat | -| Chinook push limited outside bound, zql | 1.83 us | 1.83 us | flat | -| Chinook push limited outside bound, zqlite | 8.20 us | 8.28 us | flat | -| Chinook push unlimited, zql | 1.91 us | 2.27 us | 15.9% slower | -| Chinook push unlimited, zqlite | 5.48 us | 6.18 us | 11.3% slower | -| IVM push add comment | 9.10 us | 9.00 us | flat | -| IVM push add issue, no join | 56.02 us | 46.92 us | 1.19x faster | -| IVM push add issue, with creator join | 5.57 us | 6.57 us | 15.2% slower | -| IVM push add issue inside limit(50) | 3.53 us | 3.56 us | flat | -| IVM push add issue outside limit(50) | 2.58 us | 2.51 us | flat | -| IVM push edit issue title | 5.66 us | 5.77 us | flat | - -Takeaway: the original broad IVM push regression did not reproduce. Most IVM push rows were flat or faster in 1.7. Chinook push rows still show small regressions, but the absolute deltas are sub-microsecond to about one microsecond. - -## Original >=5% Improvements - -| Benchmark | 1.6 | 1.7 | Result | -| -------------------------------------------------------------------------------------------------------------------------------------------------- | -------: | -------: | -----------: | -| zero-cache:pg > change-streamer/storer sustained stream changes | 63.56 us | 34.16 us | 1.86x faster | -| zero-cache:pg > change-streamer/storer sustained stream commits | 63.56 ms | 34.16 ms | 1.86x faster | -| zero-cache:pg > change-streamer/storer single transaction changes | 60.60 us | 35.10 us | 1.73x faster | -| zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues limit 50 | 67.07 us | 40.48 us | 1.66x faster | -| zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > fetch 1000 issues -> 20 users | 1.26 ms | 1.04 ms | 1.20x faster | -| zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > planned: track.exists(album) where title="Big Ones" | 79.71 us | 69.21 us | 1.15x faster | -| zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push add/remove issue with owner | 6.95 us | 6.26 us | 1.11x faster | -| zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > planned: track.exists(album) OR exists(genre) | 3.42 ms | 3.16 ms | 1.08x faster | -| zero-cache:pg > zero-cache/initial-sync generated fixture rows | 6.17 us | 5.75 us | 1.07x faster | - -## Original >=5% Regressions Excluding Bad Planner Fixture - -| Benchmark | 1.6 | 1.7 | Result | -| --------------------------------------------------------------------------------------------------------------------------------------- | --------: | --------: | -----------: | -| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (no join) | 42.52 us | 52.94 us | 19.7% slower | -| zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zql: push into unlimited query | 1.74 us | 2.09 us | 16.8% slower | -| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (with creator join) | 5.99 us | 7.15 us | 16.1% slower | -| zql-benchmarks > src/ivm-memory.bench.ts > push > push: add comment (child relation) | 8.65 us | 10.06 us | 14.0% slower | -| zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zqlite: push into unlimited query | 5.33 us | 5.91 us | 9.9% slower | -| zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zql: push into limited query, inside the bound | 5.37 us | 5.79 us | 7.2% slower | -| zero-client > src/client/zero.bench.ts > with filter > Lower rows 500 x 10 columns (numbers) | 237.63 us | 251.42 us | 5.5% slower | -| shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (old): add() loop after sort | 91.94 us | 97.21 us | 5.4% slower | - -## Full Original 10-Run Matrix - -Lower is better. Values are median-of-medians across 10 completed runs. - -| Suite | Benchmark | 1.6 | 1.7 | Result | -| ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------: | --------: | -----------: | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > forward iterator next()` | 2.65 us | 2.63 us | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > forward iterator next() from mid` | 1.36 us | 1.37 us | 0.6% slower | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > reverse iterator next()` | 2.78 us | 2.77 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterator next() in isolation > reverse iterator next() from mid` | 1.42 us | 1.41 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > [Symbol.iterator]() full scan` | 2.49 us | 2.49 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > values() full scan` | 2.29 us | 2.29 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesFrom() from mid` | 1.35 us | 1.34 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesFromReversed() from mid` | 1.26 us | 1.26 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet iterators > valuesReversed() full scan` | 2.47 us | 2.45 us | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > get() hit` | 62.36 ns | 62.15 ns | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > has() hit` | 63.48 ns | 63.47 ns | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet lookups > has() miss` | 44.54 ns | 44.49 ns | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() 100 sequential keys` | 4.63 us | 4.61 us | flat | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() 1000 sequential keys` | 55.82 us | 55.52 us | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > add() then delete() single key` | 85.64 ns | 85.13 ns | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > fromSorted() 100 sequential keys` | 463.54 ns | 458.74 ns | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > fromSorted() 1000 sequential keys` | 3.65 us | 3.61 us | 1.01x faster | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (new): sort + fromSorted()` | 13.19 us | 13.28 us | 0.7% slower | -| root | `shared > src/btree-set.bench.ts > BTreeSet mutations > getOrCreateIndex pattern (old): add() loop after sort` | 91.94 us | 97.21 us | 5.4% slower | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > arrays > large array (100 items)` | 374.43 ns | 365.26 ns | 1.03x faster | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > arrays > small array (10 items)` | 47.85 ns | 47.75 ns | flat | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > datasets > large dataset (100x512B)` | 13.77 us | 13.78 us | flat | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > datasets > small dataset (10x256B)` | 1.39 us | 1.40 us | 1.2% slower | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > nested object` | 158.41 ns | 159.86 ns | 0.9% slower | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > structured object (1KB)` | 138.11 ns | 140.89 ns | 2.0% slower | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > objects > structured object (256B)` | 140.93 ns | 139.58 ns | 1.01x faster | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > boolean` | 7.07 ns | 7.05 ns | flat | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > integer` | 8.42 ns | 8.32 ns | 1.01x faster | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > null` | 7.03 ns | 7.17 ns | 1.8% slower | -| root | `shared > src/size-of-value.bench.ts > getSizeOfValue performance > primitives > string (100 chars)` | 731.38 ns | 749.55 ns | 2.4% slower | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > add` | 248.87 ms | 250.31 ms | 0.6% slower | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > addCentroid` | 301.66 ms | 302.99 ms | flat | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > addCentroidList` | 306.93 ms | 309.21 ms | 0.7% slower | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > merge > addCentroid` | 25.33 us | 24.65 us | 1.03x faster | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > merge > merge` | 49.46 us | 49.48 us | flat | -| root | `shared > src/tdigest.bench.ts > TDigest Benchmarks > quantile` | 265.58 ms | 260.47 ms | 1.02x faster | -| root | `zero-cache > src/db/pg-copy.bench.ts > pg-copy benchmark > copy` | 14.91 ms | 15.02 ms | 0.7% slower | -| root | `zero-client > src/client/custom.bench.ts > big schema` | 5.33 us | 5.26 us | 1.01x faster | -| root | `zero-client > src/client/zero.bench.ts > basics > All 1000 rows x 10 columns (numbers)` | 334.08 us | 345.16 us | 3.2% slower | -| root | `zero-client > src/client/zero.bench.ts > pk compare > pk = N` | 9.50 us | 9.58 us | 0.9% slower | -| root | `zero-client > src/client/zero.bench.ts > with filter > Lower rows 500 x 10 columns (numbers)` | 237.63 us | 251.42 us | 5.5% slower | -| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zpg: all playlists` | 270.61 ms | 269.48 ms | flat | -| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zql: all playlists` | 70.86 ms | 70.39 ms | 1.01x faster | -| root | `zql-benchmarks > src/chinook-hydration.bench.ts > all playlists > zqlite: all playlists` | 409.30 ms | 410.72 ms | flat | -| root | `zql-benchmarks > src/chinook-manual-cases.bench.ts > tracks with artist name > flipped` | 89.69 us | 89.31 us | flat | -| root | `zql-benchmarks > src/chinook-manual-cases.bench.ts > tracks with artist name > not flipped` | 13.41 ms | 13.11 ms | 1.02x faster | -| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, inside the bound > zql: edit for limited query, inside the bound` | 3.28 us | 3.37 us | 2.7% slower | -| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, inside the bound > zqlite: edit for limited query, inside the bound` | 9.67 us | 9.62 us | 1.01x faster | -| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, outside the bound > zql: edit for limited query, outside the bound` | 2.86 us | 2.85 us | 1.01x faster | -| root | `zql-benchmarks > src/chinook-push.bench.ts > edit for limited query, outside the bound > zqlite: edit for limited query, outside the bound` | 9.56 us | 9.33 us | 1.02x faster | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zql: push into limited query, inside the bound` | 5.37 us | 5.79 us | 7.2% slower | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, inside the bound > zqlite: push into limited query, inside the bound` | 244.56 us | 243.16 us | 1.01x faster | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, outside the bound > zql: push into limited query, outside the bound` | 1.75 us | 1.76 us | 0.7% slower | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into limited query, outside the bound > zqlite: push into limited query, outside the bound` | 7.81 us | 7.83 us | flat | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zql: push into unlimited query` | 1.74 us | 2.09 us | 16.8% slower | -| root | `zql-benchmarks > src/chinook-push.bench.ts > push into unlimited query > zqlite: push into unlimited query` | 5.33 us | 5.91 us | 9.9% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues filtered open` | 216.90 us | 227.44 us | 4.6% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues limit 50` | 67.07 us | 40.48 us | 1.66x faster | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues only` | 266.55 us | 256.97 us | 1.04x faster | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues with creator` | 1.01 ms | 1.04 ms | 2.9% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > hydration > hydrate: issues with creator + comments` | 2.33 ms | 2.36 ms | 1.2% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add comment (child relation)` | 8.65 us | 10.06 us | 14.0% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (no join)` | 42.52 us | 52.94 us | 19.7% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue (with creator join)` | 5.99 us | 7.15 us | 16.1% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue inside limit(50)` | 3.71 us | 3.71 us | flat | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: add issue outside limit(50)` | 2.69 us | 2.72 us | 1.0% slower | -| root | `zql-benchmarks > src/ivm-memory.bench.ts > push > push: edit issue title` | 6.08 us | 6.34 us | 4.1% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > fetch open issues (1000 total)` | 213.13 us | 209.91 us | 1.02x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > push add closed issue (filtered out)` | 3.70 us | 3.70 us | flat | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Filter > push add open issue (passes filter)` | 4.10 us | 4.14 us | 0.9% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > fetch 1000 issues -> 20 users` | 1.26 ms | 1.04 ms | 1.20x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push add/remove issue with owner` | 6.95 us | 6.26 us | 1.11x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > Join > push edit issue title (non-key field)` | 6.04 us | 6.01 us | flat | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 1 key` | 151.13 us | 147.81 us | 1.02x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 2 keys` | 150.40 us | 147.54 us | 1.02x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource fetch > scan 1000 rows, sort 4 keys` | 150.81 us | 147.67 us | 1.02x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 1 key` | 3.77 us | 3.70 us | 1.02x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 2 keys` | 3.65 us | 3.68 us | 0.6% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > add/remove over 1000 rows, sort 4 keys` | 3.67 us | 3.67 us | flat | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 1 key` | 5.59 us | 5.73 us | 2.5% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 2 keys` | 5.54 us | 5.71 us | 2.9% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > MemorySource push > edit over 1000 rows, sort 4 keys` | 5.54 us | 5.73 us | 3.4% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(mixed: string/number/bool/null)` | 31.62 ns | 31.89 ns | 0.8% slower | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(number, number)` | 184.31 ns | 181.58 ns | 1.01x faster | -| root | `zql-benchmarks > src/memory-ivm-deopt.bench.ts > compareValues > compareValues(string, string)` | 275.83 ns | 273.46 ns | 1.01x faster | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 1 exists: track.exists(album)` | 39.67 us | 39.49 us | flat | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 10 exists (AND)` | 3.90 us | 3.93 us | 0.8% slower | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 10 exists (OR)` | 148.23 us | 149.23 us | 0.7% slower | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 exists (AND)` | 4.44 us | 4.51 us | 1.6% slower | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 exists (OR)` | 177.75 us | 177.29 us | flat | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 12 level nesting` | 190.67 us | 192.33 us | 0.9% slower | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 2 exists (AND): track.exists(album).exists(genre)` | 112.71 us | 113.21 us | flat | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 3 exists (AND)` | 290.42 us | 290.83 us | flat | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 3 exists (OR)` | 558.14 us | 551.50 us | 1.01x faster | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 5 exists (AND)` | 1.84 ms | 1.82 ms | 1.01x faster | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > 5 exists (OR)` | 3.81 ms | 3.71 ms | 1.03x faster | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested 2 levels: track > album > artist` | 127.48 us | 126.38 us | 1.01x faster | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested 4 levels: playlist > tracks > album > artist` | 782.15 us | 782.95 us | flat | -| root | `zql-benchmarks > src/planner-cost.bench.ts > planner cost > Nested with filters: track > album > artist (filtered)` | 156.35 us | 157.69 us | 0.8% slower | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > playlist.exists(tracks) > planned: playlist.exists(tracks)` | 815.11 us | 828.32 us | 1.6% slower | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > playlist.exists(tracks) > unplanned: playlist.exists(tracks)` | 821.38 us | 823.16 us | flat | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > planned: track.exists(album) OR exists(genre)` | 3.42 ms | 3.16 ms | 1.08x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) OR exists(genre) > unplanned: track.exists(album) OR exists(genre)` | 12.70 ms | 12.62 ms | 1.01x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > planned: track.exists(album) where title="Big Ones"` | 79.71 us | 69.21 us | 1.15x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album) where title="Big Ones" > unplanned: track.exists(album) where title="Big Ones"` | 10.28 ms | 10.14 ms | 1.01x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) > planned: track.exists(album).exists(genre)` | 13.50 ms | 13.38 ms | 1.01x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) > unplanned: track.exists(album).exists(genre)` | 13.45 ms | 13.11 ms | 1.03x faster | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) with filters > planned: track.exists(album).exists(genre) with filters` | 103.33 us | 3.88 ms | 97.3% slower | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(album).exists(genre) with filters > unplanned: track.exists(album).exists(genre) with filters` | 10.61 ms | 10.61 ms | flat | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(playlists) > planned: track.exists(playlists)` | 151.77 ms | 151.82 ms | flat | -| root | `zql-benchmarks > src/planner-hydration.bench.ts > track.exists(playlists) > unplanned: track.exists(playlists)` | 151.24 ms | 153.74 ms | 1.6% slower | -| pg | `zero-cache:pg > change-streamer/storer single transaction changes` | 60.60 us | 35.10 us | 1.73x faster | -| pg | `zero-cache:pg > change-streamer/storer sustained stream changes` | 63.56 us | 34.16 us | 1.86x faster | -| pg | `zero-cache:pg > change-streamer/storer sustained stream commits` | 63.56 ms | 34.16 ms | 1.86x faster | -| pg | `zero-cache:pg > replicator/logical replication end-to-end rows` | 114.67 us | 113.59 us | 1.01x faster | -| pg | `zero-cache:pg > zero-cache/initial-sync generated fixture rows` | 6.17 us | 5.75 us | 1.07x faster | - -## 1.7-Only Root Benchmark Rows - -These benchmark names existed only in the 1.7 benchmark set used for this comparison, so they were not part of the matched-row calculations. - -| Benchmark | -| ----------------------------------------------------------------------------------------------------------------------------------------: | -| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: add comment (child) into heavy view` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: add issue into heavy view` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > push into relationship-heavy view > push: edit issue title in heavy view` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: heavy query (wide + deep) - regression case` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: heavy query limit(50)` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues + comments (wide, one level)` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues + comments + emoji (wide, two levels)` | -| `zql-benchmarks > src/array-view-relationships.bench.ts > relationship hydration > hydrate: issues only (baseline)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 1 edit(s)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 100 edit(s)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=10000: K edits per transaction > N=10000: txn of 1000 edit(s)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 1 edit(s)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 100 edit(s)` | -| `zql-benchmarks > src/array-view-transaction.bench.ts > flat list N=1000: K edits per transaction > N=1000: txn of 1000 edit(s)` | - -## Blocked Or Excluded - -`replicache:bench` was excluded because it did not complete within 2 hours after temp-only harness fixes. It first required Playwright Chromium installation, then exposed existing harness/runtime issues, and finally exceeded the timeout. - -## Final Recommendation - -Do not block Zero 1.7 on the benchmark results collected so far. Track the small Chinook push regressions as a follow-up, but the release-relevant result is that 1.7 is broadly flat, materially faster in Postgres replication/storage paths, and does not have a confirmed large regression after the planner benchmark fixture fix.